rpmsg: Introduce "poll" to endpoint ops
This allows rpmsg backends to implement polling of the outgoing buffer, which provides poll support to user space when using the rpmsg character device. Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
This commit is contained in:
parent
5e53c42c33
commit
84d58132d2
3 changed files with 36 additions and 0 deletions
|
@ -239,6 +239,26 @@ int rpmsg_trysendto(struct rpmsg_endpoint *ept, void *data, int len, u32 dst)
|
|||
}
|
||||
EXPORT_SYMBOL(rpmsg_trysendto);
|
||||
|
||||
/**
|
||||
* rpmsg_poll() - poll the endpoint's send buffers
|
||||
* @ept: the rpmsg endpoint
|
||||
* @filp: file for poll_wait()
|
||||
* @wait: poll_table for poll_wait()
|
||||
*
|
||||
* Returns mask representing the current state of the endpoint's send buffers
|
||||
*/
|
||||
unsigned int rpmsg_poll(struct rpmsg_endpoint *ept, struct file *filp,
|
||||
poll_table *wait)
|
||||
{
|
||||
if (WARN_ON(!ept))
|
||||
return 0;
|
||||
if (!ept->ops->poll)
|
||||
return 0;
|
||||
|
||||
return ept->ops->poll(ept, filp, wait);
|
||||
}
|
||||
EXPORT_SYMBOL(rpmsg_poll);
|
||||
|
||||
/**
|
||||
* rpmsg_send_offchannel() - send a message using explicit src/dst addresses
|
||||
* @ept: the rpmsg endpoint
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#define __RPMSG_INTERNAL_H__
|
||||
|
||||
#include <linux/rpmsg.h>
|
||||
#include <linux/poll.h>
|
||||
|
||||
#define to_rpmsg_device(d) container_of(d, struct rpmsg_device, dev)
|
||||
#define to_rpmsg_driver(d) container_of(d, struct rpmsg_driver, drv)
|
||||
|
@ -70,6 +71,8 @@ struct rpmsg_endpoint_ops {
|
|||
int (*trysendto)(struct rpmsg_endpoint *ept, void *data, int len, u32 dst);
|
||||
int (*trysend_offchannel)(struct rpmsg_endpoint *ept, u32 src, u32 dst,
|
||||
void *data, int len);
|
||||
unsigned int (*poll)(struct rpmsg_endpoint *ept, struct file *filp,
|
||||
poll_table *wait);
|
||||
};
|
||||
|
||||
int rpmsg_register_device(struct rpmsg_device *rpdev);
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/poll.h>
|
||||
|
||||
#define RPMSG_ADDR_ANY 0xFFFFFFFF
|
||||
|
||||
|
@ -156,6 +157,9 @@ int rpmsg_trysendto(struct rpmsg_endpoint *ept, void *data, int len, u32 dst);
|
|||
int rpmsg_trysend_offchannel(struct rpmsg_endpoint *ept, u32 src, u32 dst,
|
||||
void *data, int len);
|
||||
|
||||
unsigned int rpmsg_poll(struct rpmsg_endpoint *ept, struct file *filp,
|
||||
poll_table *wait);
|
||||
|
||||
#else
|
||||
|
||||
static inline int register_rpmsg_device(struct rpmsg_device *dev)
|
||||
|
@ -254,6 +258,15 @@ static inline int rpmsg_trysend_offchannel(struct rpmsg_endpoint *ept, u32 src,
|
|||
return -ENXIO;
|
||||
}
|
||||
|
||||
static inline unsigned int rpmsg_poll(struct rpmsg_endpoint *ept,
|
||||
struct file *filp, poll_table *wait)
|
||||
{
|
||||
/* This shouldn't be possible */
|
||||
WARN_ON(1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* IS_ENABLED(CONFIG_RPMSG) */
|
||||
|
||||
/* use a macro to avoid include chaining to get THIS_MODULE */
|
||||
|
|
Loading…
Reference in a new issue