Browse Source

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>
Bjorn Andersson 8 years ago
parent
commit
84d58132d2
3 changed files with 36 additions and 0 deletions
  1. 20 0
      drivers/rpmsg/rpmsg_core.c
  2. 3 0
      drivers/rpmsg/rpmsg_internal.h
  3. 13 0
      include/linux/rpmsg.h

+ 20 - 0
drivers/rpmsg/rpmsg_core.c

@@ -239,6 +239,26 @@ int rpmsg_trysendto(struct rpmsg_endpoint *ept, void *data, int len, u32 dst)
 }
 }
 EXPORT_SYMBOL(rpmsg_trysendto);
 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
  * rpmsg_send_offchannel() - send a message using explicit src/dst addresses
  * @ept: the rpmsg endpoint
  * @ept: the rpmsg endpoint

+ 3 - 0
drivers/rpmsg/rpmsg_internal.h

@@ -21,6 +21,7 @@
 #define __RPMSG_INTERNAL_H__
 #define __RPMSG_INTERNAL_H__
 
 
 #include <linux/rpmsg.h>
 #include <linux/rpmsg.h>
+#include <linux/poll.h>
 
 
 #define to_rpmsg_device(d) container_of(d, struct rpmsg_device, dev)
 #define to_rpmsg_device(d) container_of(d, struct rpmsg_device, dev)
 #define to_rpmsg_driver(d) container_of(d, struct rpmsg_driver, drv)
 #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 (*trysendto)(struct rpmsg_endpoint *ept, void *data, int len, u32 dst);
 	int (*trysend_offchannel)(struct rpmsg_endpoint *ept, u32 src, u32 dst,
 	int (*trysend_offchannel)(struct rpmsg_endpoint *ept, u32 src, u32 dst,
 			     void *data, int len);
 			     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);
 int rpmsg_register_device(struct rpmsg_device *rpdev);

+ 13 - 0
include/linux/rpmsg.h

@@ -41,6 +41,7 @@
 #include <linux/mod_devicetable.h>
 #include <linux/mod_devicetable.h>
 #include <linux/kref.h>
 #include <linux/kref.h>
 #include <linux/mutex.h>
 #include <linux/mutex.h>
+#include <linux/poll.h>
 
 
 #define RPMSG_ADDR_ANY		0xFFFFFFFF
 #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,
 int rpmsg_trysend_offchannel(struct rpmsg_endpoint *ept, u32 src, u32 dst,
 			     void *data, int len);
 			     void *data, int len);
 
 
+unsigned int rpmsg_poll(struct rpmsg_endpoint *ept, struct file *filp,
+			poll_table *wait);
+
 #else
 #else
 
 
 static inline int register_rpmsg_device(struct rpmsg_device *dev)
 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;
 	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) */
 #endif /* IS_ENABLED(CONFIG_RPMSG) */
 
 
 /* use a macro to avoid include chaining to get THIS_MODULE */
 /* use a macro to avoid include chaining to get THIS_MODULE */