aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-05-18 20:17:20 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-05-18 20:17:20 -0400
commit676d9735cd010fc439566e2b6e9b6adc3e1179ef (patch)
tree069b84dda1a4cfa92a9d2e4b2b20ca507f589f49
parent888dae5361e605efc553b645a7c95bbcc5e904db (diff)
parentb4f78259d593858feb85e02c195cf374f932feef (diff)
Merge tag 'rpmsg-v4.7' of git://github.com/andersson/remoteproc
Pull rpmsg updates from Bjorn Andersson: "Refactor rpmsg module registration to follow other subsystems; by introduction of module_rpmsg_driver and hiding of THIS_MODULE from clients" * tag 'rpmsg-v4.7' of git://github.com/andersson/remoteproc: rpmsg: use module_rpmsg_driver in existing drivers and examples rpmsg: add helper macro module_rpmsg_driver rpmsg: drop owner assignment from rpmsg_drivers rpmsg: add THIS_MODULE to rpmsg_driver in rpmsg core
-rw-r--r--Documentation/rpmsg.txt14
-rw-r--r--drivers/rpmsg/virtio_rpmsg_bus.c8
-rw-r--r--include/linux/rpmsg.h18
-rw-r--r--samples/rpmsg/rpmsg_client_sample.c14
4 files changed, 24 insertions, 30 deletions
diff --git a/Documentation/rpmsg.txt b/Documentation/rpmsg.txt
index f7edc3aa1e92..a95e36a43288 100644
--- a/Documentation/rpmsg.txt
+++ b/Documentation/rpmsg.txt
@@ -249,24 +249,12 @@ MODULE_DEVICE_TABLE(rpmsg, rpmsg_driver_sample_id_table);
249 249
250static struct rpmsg_driver rpmsg_sample_client = { 250static struct rpmsg_driver rpmsg_sample_client = {
251 .drv.name = KBUILD_MODNAME, 251 .drv.name = KBUILD_MODNAME,
252 .drv.owner = THIS_MODULE,
253 .id_table = rpmsg_driver_sample_id_table, 252 .id_table = rpmsg_driver_sample_id_table,
254 .probe = rpmsg_sample_probe, 253 .probe = rpmsg_sample_probe,
255 .callback = rpmsg_sample_cb, 254 .callback = rpmsg_sample_cb,
256 .remove = rpmsg_sample_remove, 255 .remove = rpmsg_sample_remove,
257}; 256};
258 257module_rpmsg_driver(rpmsg_sample_client);
259static int __init init(void)
260{
261 return register_rpmsg_driver(&rpmsg_sample_client);
262}
263module_init(init);
264
265static void __exit fini(void)
266{
267 unregister_rpmsg_driver(&rpmsg_sample_client);
268}
269module_exit(fini);
270 258
271Note: a similar sample which can be built and loaded can be found 259Note: a similar sample which can be built and loaded can be found
272in samples/rpmsg/. 260in samples/rpmsg/.
diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c
index 1fcd27c1f183..fe03b2aef450 100644
--- a/drivers/rpmsg/virtio_rpmsg_bus.c
+++ b/drivers/rpmsg/virtio_rpmsg_bus.c
@@ -436,17 +436,19 @@ static struct bus_type rpmsg_bus = {
436}; 436};
437 437
438/** 438/**
439 * register_rpmsg_driver() - register an rpmsg driver with the rpmsg bus 439 * __register_rpmsg_driver() - register an rpmsg driver with the rpmsg bus
440 * @rpdrv: pointer to a struct rpmsg_driver 440 * @rpdrv: pointer to a struct rpmsg_driver
441 * @owner: owning module/driver
441 * 442 *
442 * Returns 0 on success, and an appropriate error value on failure. 443 * Returns 0 on success, and an appropriate error value on failure.
443 */ 444 */
444int register_rpmsg_driver(struct rpmsg_driver *rpdrv) 445int __register_rpmsg_driver(struct rpmsg_driver *rpdrv, struct module *owner)
445{ 446{
446 rpdrv->drv.bus = &rpmsg_bus; 447 rpdrv->drv.bus = &rpmsg_bus;
448 rpdrv->drv.owner = owner;
447 return driver_register(&rpdrv->drv); 449 return driver_register(&rpdrv->drv);
448} 450}
449EXPORT_SYMBOL(register_rpmsg_driver); 451EXPORT_SYMBOL(__register_rpmsg_driver);
450 452
451/** 453/**
452 * unregister_rpmsg_driver() - unregister an rpmsg driver from the rpmsg bus 454 * unregister_rpmsg_driver() - unregister an rpmsg driver from the rpmsg bus
diff --git a/include/linux/rpmsg.h b/include/linux/rpmsg.h
index 82a673905edb..ada50ff36da0 100644
--- a/include/linux/rpmsg.h
+++ b/include/linux/rpmsg.h
@@ -169,7 +169,7 @@ struct rpmsg_driver {
169 169
170int register_rpmsg_device(struct rpmsg_channel *dev); 170int register_rpmsg_device(struct rpmsg_channel *dev);
171void unregister_rpmsg_device(struct rpmsg_channel *dev); 171void unregister_rpmsg_device(struct rpmsg_channel *dev);
172int register_rpmsg_driver(struct rpmsg_driver *drv); 172int __register_rpmsg_driver(struct rpmsg_driver *drv, struct module *owner);
173void unregister_rpmsg_driver(struct rpmsg_driver *drv); 173void unregister_rpmsg_driver(struct rpmsg_driver *drv);
174void rpmsg_destroy_ept(struct rpmsg_endpoint *); 174void rpmsg_destroy_ept(struct rpmsg_endpoint *);
175struct rpmsg_endpoint *rpmsg_create_ept(struct rpmsg_channel *, 175struct rpmsg_endpoint *rpmsg_create_ept(struct rpmsg_channel *,
@@ -177,6 +177,22 @@ struct rpmsg_endpoint *rpmsg_create_ept(struct rpmsg_channel *,
177int 177int
178rpmsg_send_offchannel_raw(struct rpmsg_channel *, u32, u32, void *, int, bool); 178rpmsg_send_offchannel_raw(struct rpmsg_channel *, u32, u32, void *, int, bool);
179 179
180/* use a macro to avoid include chaining to get THIS_MODULE */
181#define register_rpmsg_driver(drv) \
182 __register_rpmsg_driver(drv, THIS_MODULE)
183
184/**
185 * module_rpmsg_driver() - Helper macro for registering an rpmsg driver
186 * @__rpmsg_driver: rpmsg_driver struct
187 *
188 * Helper macro for rpmsg drivers which do not do anything special in module
189 * init/exit. This eliminates a lot of boilerplate. Each module may only
190 * use this macro once, and calling it replaces module_init() and module_exit()
191 */
192#define module_rpmsg_driver(__rpmsg_driver) \
193 module_driver(__rpmsg_driver, register_rpmsg_driver, \
194 unregister_rpmsg_driver)
195
180/** 196/**
181 * rpmsg_send() - send a message across to the remote processor 197 * rpmsg_send() - send a message across to the remote processor
182 * @rpdev: the rpmsg channel 198 * @rpdev: the rpmsg channel
diff --git a/samples/rpmsg/rpmsg_client_sample.c b/samples/rpmsg/rpmsg_client_sample.c
index 59b13440813d..d0e249c90668 100644
--- a/samples/rpmsg/rpmsg_client_sample.c
+++ b/samples/rpmsg/rpmsg_client_sample.c
@@ -77,24 +77,12 @@ MODULE_DEVICE_TABLE(rpmsg, rpmsg_driver_sample_id_table);
77 77
78static struct rpmsg_driver rpmsg_sample_client = { 78static struct rpmsg_driver rpmsg_sample_client = {
79 .drv.name = KBUILD_MODNAME, 79 .drv.name = KBUILD_MODNAME,
80 .drv.owner = THIS_MODULE,
81 .id_table = rpmsg_driver_sample_id_table, 80 .id_table = rpmsg_driver_sample_id_table,
82 .probe = rpmsg_sample_probe, 81 .probe = rpmsg_sample_probe,
83 .callback = rpmsg_sample_cb, 82 .callback = rpmsg_sample_cb,
84 .remove = rpmsg_sample_remove, 83 .remove = rpmsg_sample_remove,
85}; 84};
86 85module_rpmsg_driver(rpmsg_sample_client);
87static int __init rpmsg_client_sample_init(void)
88{
89 return register_rpmsg_driver(&rpmsg_sample_client);
90}
91module_init(rpmsg_client_sample_init);
92
93static void __exit rpmsg_client_sample_fini(void)
94{
95 unregister_rpmsg_driver(&rpmsg_sample_client);
96}
97module_exit(rpmsg_client_sample_fini);
98 86
99MODULE_DESCRIPTION("Remote processor messaging sample client driver"); 87MODULE_DESCRIPTION("Remote processor messaging sample client driver");
100MODULE_LICENSE("GPL v2"); 88MODULE_LICENSE("GPL v2");