diff options
| -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"); |
