@@ -26,6 +26,20 @@ struct rpmsg_ctrl_dev {
struct device dev;
};
+/**
+ * struct rpmsg_ctl_info - control info list node
+ * @ctrl: control driver info
+ * @node: list node
+ *
+ * This structure is used by rpmsg_ctl to list the registered drivers services
+ */
+struct rpmsg_ctl_info {
+ const struct rpmsg_drv_ctrl_info *ctrl;
+ struct list_head node;
+};
+
+static LIST_HEAD(rpmsg_drv_list);
+
static DEFINE_IDA(rpmsg_ctrl_ida);
static DEFINE_IDA(rpmsg_minor_ida);
@@ -176,6 +190,49 @@ static struct rpmsg_driver rpmsg_ctrl_driver = {
},
};
+/**
+ * rpmsg_ctrl_register_ctl() -register control for the associated service
+ * @ctrl: rpmsg driver information
+ *
+ * This function is called by the rpmsg driver to register a service that will
+ * be exposed to be instantiate by the application.
+ */
+int rpmsg_ctrl_register_ctl(const struct rpmsg_drv_ctrl_info *ctrl)
+{
+ struct rpmsg_ctl_info *drv_info;
+
+ drv_info = kzalloc(sizeof(*drv_info), GFP_KERNEL);
+ if (!drv_info)
+ return -ENOMEM;
+
+ drv_info->ctrl = ctrl;
+
+ list_add_tail(&drv_info->node, &rpmsg_drv_list);
+
+ return 0;
+}
+EXPORT_SYMBOL(rpmsg_ctrl_register_ctl);
+
+/**
+ * rpmsg_ctrl_unregister_ctl() -unregister control for the associated service
+ * @ctrl: the rpmsg control information
+ *
+ * This function is called by the rpmsg driver to unregister the associated
+ * service.
+ */
+void rpmsg_ctrl_unregister_ctl(const struct rpmsg_drv_ctrl_info *ctrl)
+{
+ struct rpmsg_ctl_info *drv_info, *tmp;
+
+ list_for_each_entry_safe(drv_info, tmp, &rpmsg_drv_list, node) {
+ if (drv_info->ctrl == ctrl) {
+ list_del(&drv_info->node);
+ kfree(drv_info);
+ }
+ }
+}
+EXPORT_SYMBOL(rpmsg_ctrl_unregister_ctl);
+
static int rpmsg_ctrl_init(void)
{
int ret;
@@ -137,4 +137,7 @@ static inline int rpmsg_ctl_register_device(struct rpmsg_device *rpdev)
int rpmsg_ns_announce_create(struct rpmsg_device *rpdev);
int rpmsg_ns_announce_destroy(struct rpmsg_device *rpdev);
+int rpmsg_ctrl_register_ctl(const struct rpmsg_drv_ctrl_info *ctrl);
+void rpmsg_ctrl_unregister_ctl(const struct rpmsg_drv_ctrl_info *ctrl);
+
#endif
Add API for RPMsg driver to register the supported service. This API has to be called during RPMsg driver init to declare the service. Then the RPMsg control will be able to instantiate associated device. Signed-off-by: Arnaud Pouliquen <arnaud.pouliquen@st.com> --- drivers/rpmsg/rpmsg_ctrl.c | 57 ++++++++++++++++++++++++++++++++++ drivers/rpmsg/rpmsg_internal.h | 3 ++ 2 files changed, 60 insertions(+)