ARM: 9361/1: amba: store owner from modules with amba_driver_register()
authorKrzysztof Kozlowski <k.kozlowski@samsung.com>
Tue, 2 Apr 2024 09:51:08 +0000 (10:51 +0100)
committerRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Thu, 18 Apr 2024 11:09:14 +0000 (12:09 +0100)
Modules registering driver with amba_driver_register() often forget to
set .owner field.  The field is used by some of other kernel parts for
reference counting (try_module_get()), so it is expected that drivers
will set it.

Solve the problem by moving this task away from the drivers to the core
amba bus code, just like we did for platform_driver in
commit 9447057eaff8 ("platform_device: use a macro instead of
platform_driver_register").

Link: https://lore.kernel.org/r/20240326-module-owner-amba-v1-1-4517b091385b@linaro.org
Reviewed-by: Andi Shyti <andi.shyti@kernel.org>
Acked-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
drivers/amba/bus.c
include/linux/amba/bus.h

index a24c152bfaac6ec05c146154e0e8e9e2937e96b5..aba3aa95b224b8d305d4ab0a772c7b1188de3d81 100644 (file)
@@ -488,28 +488,31 @@ static int __init amba_stub_drv_init(void)
         * waiting on amba_match(). So, register a stub driver to make sure
         * amba_match() is called even if no amba driver has been registered.
         */
-       return amba_driver_register(&amba_proxy_drv);
+       return __amba_driver_register(&amba_proxy_drv, NULL);
 }
 late_initcall_sync(amba_stub_drv_init);
 
 /**
- *     amba_driver_register - register an AMBA device driver
+ *     __amba_driver_register - register an AMBA device driver
  *     @drv: amba device driver structure
+ *     @owner: owning module/driver
  *
  *     Register an AMBA device driver with the Linux device model
  *     core.  If devices pre-exist, the drivers probe function will
  *     be called.
  */
-int amba_driver_register(struct amba_driver *drv)
+int __amba_driver_register(struct amba_driver *drv,
+                          struct module *owner)
 {
        if (!drv->probe)
                return -EINVAL;
 
+       drv->drv.owner = owner;
        drv->drv.bus = &amba_bustype;
 
        return driver_register(&drv->drv);
 }
-EXPORT_SYMBOL(amba_driver_register);
+EXPORT_SYMBOL(__amba_driver_register);
 
 /**
  *     amba_driver_unregister - remove an AMBA device driver
index c60a6a14638caa0163ffe0ea20d376b54b1b95ba..958a55bcc7080825e433f8fca3ef60cabf29b41d 100644 (file)
@@ -112,11 +112,18 @@ extern struct bus_type amba_bustype;
 #define amba_get_drvdata(d)    dev_get_drvdata(&d->dev)
 #define amba_set_drvdata(d,p)  dev_set_drvdata(&d->dev, p)
 
+/*
+ * use a macro to avoid include chaining to get THIS_MODULE
+ */
+#define amba_driver_register(drv) \
+       __amba_driver_register(drv, THIS_MODULE)
+
 #ifdef CONFIG_ARM_AMBA
-int amba_driver_register(struct amba_driver *);
+int __amba_driver_register(struct amba_driver *, struct module *);
 void amba_driver_unregister(struct amba_driver *);
 #else
-static inline int amba_driver_register(struct amba_driver *drv)
+static inline int __amba_driver_register(struct amba_driver *drv,
+                                        struct module *owner)
 {
        return -EINVAL;
 }