diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-05-18 20:17:20 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-05-18 20:17:20 -0400 |
commit | 676d9735cd010fc439566e2b6e9b6adc3e1179ef (patch) | |
tree | 069b84dda1a4cfa92a9d2e4b2b20ca507f589f49 | |
parent | 888dae5361e605efc553b645a7c95bbcc5e904db (diff) | |
parent | b4f78259d593858feb85e02c195cf374f932feef (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.txt | 14 | ||||
-rw-r--r-- | drivers/rpmsg/virtio_rpmsg_bus.c | 8 | ||||
-rw-r--r-- | include/linux/rpmsg.h | 18 | ||||
-rw-r--r-- | samples/rpmsg/rpmsg_client_sample.c | 14 |
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 | ||
250 | static struct rpmsg_driver rpmsg_sample_client = { | 250 | static 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 | 257 | module_rpmsg_driver(rpmsg_sample_client); | |
259 | static int __init init(void) | ||
260 | { | ||
261 | return register_rpmsg_driver(&rpmsg_sample_client); | ||
262 | } | ||
263 | module_init(init); | ||
264 | |||
265 | static void __exit fini(void) | ||
266 | { | ||
267 | unregister_rpmsg_driver(&rpmsg_sample_client); | ||
268 | } | ||
269 | module_exit(fini); | ||
270 | 258 | ||
271 | Note: a similar sample which can be built and loaded can be found | 259 | Note: a similar sample which can be built and loaded can be found |
272 | in samples/rpmsg/. | 260 | in 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 | */ |
444 | int register_rpmsg_driver(struct rpmsg_driver *rpdrv) | 445 | int __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 | } |
449 | EXPORT_SYMBOL(register_rpmsg_driver); | 451 | EXPORT_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 | ||
170 | int register_rpmsg_device(struct rpmsg_channel *dev); | 170 | int register_rpmsg_device(struct rpmsg_channel *dev); |
171 | void unregister_rpmsg_device(struct rpmsg_channel *dev); | 171 | void unregister_rpmsg_device(struct rpmsg_channel *dev); |
172 | int register_rpmsg_driver(struct rpmsg_driver *drv); | 172 | int __register_rpmsg_driver(struct rpmsg_driver *drv, struct module *owner); |
173 | void unregister_rpmsg_driver(struct rpmsg_driver *drv); | 173 | void unregister_rpmsg_driver(struct rpmsg_driver *drv); |
174 | void rpmsg_destroy_ept(struct rpmsg_endpoint *); | 174 | void rpmsg_destroy_ept(struct rpmsg_endpoint *); |
175 | struct rpmsg_endpoint *rpmsg_create_ept(struct rpmsg_channel *, | 175 | struct rpmsg_endpoint *rpmsg_create_ept(struct rpmsg_channel *, |
@@ -177,6 +177,22 @@ struct rpmsg_endpoint *rpmsg_create_ept(struct rpmsg_channel *, | |||
177 | int | 177 | int |
178 | rpmsg_send_offchannel_raw(struct rpmsg_channel *, u32, u32, void *, int, bool); | 178 | rpmsg_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 | ||
78 | static struct rpmsg_driver rpmsg_sample_client = { | 78 | static 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 | 85 | module_rpmsg_driver(rpmsg_sample_client); | |
87 | static int __init rpmsg_client_sample_init(void) | ||
88 | { | ||
89 | return register_rpmsg_driver(&rpmsg_sample_client); | ||
90 | } | ||
91 | module_init(rpmsg_client_sample_init); | ||
92 | |||
93 | static void __exit rpmsg_client_sample_fini(void) | ||
94 | { | ||
95 | unregister_rpmsg_driver(&rpmsg_sample_client); | ||
96 | } | ||
97 | module_exit(rpmsg_client_sample_fini); | ||
98 | 86 | ||
99 | MODULE_DESCRIPTION("Remote processor messaging sample client driver"); | 87 | MODULE_DESCRIPTION("Remote processor messaging sample client driver"); |
100 | MODULE_LICENSE("GPL v2"); | 88 | MODULE_LICENSE("GPL v2"); |