Commit 46c6685e authored by Krzysztof Kozlowski's avatar Krzysztof Kozlowski Committed by Tzung-Bi Shih

firmware: coreboot: store owner from modules with coreboot_driver_register()

Modules registering driver with coreboot_driver_register() might
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
code, just like we did for platform_driver in
commit 9447057e ("platform_device: use a macro instead of
platform_driver_register").

Moving the .owner setting code to the core this effectively fixes
missing .owner in framebuffer-coreboot, memconsole-coreboot and vpd
drivers.
Signed-off-by: default avatarKrzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Link: https://lore.kernel.org/r/20240330-module-owner-coreboot-v1-1-ddba098b6dcf@linaro.orgSigned-off-by: default avatarTzung-Bi Shih <tzungbi@kernel.org>
parent 4cece764
...@@ -85,13 +85,15 @@ static void coreboot_device_release(struct device *dev) ...@@ -85,13 +85,15 @@ static void coreboot_device_release(struct device *dev)
kfree(device); kfree(device);
} }
int coreboot_driver_register(struct coreboot_driver *driver) int __coreboot_driver_register(struct coreboot_driver *driver,
struct module *owner)
{ {
driver->drv.bus = &coreboot_bus_type; driver->drv.bus = &coreboot_bus_type;
driver->drv.owner = owner;
return driver_register(&driver->drv); return driver_register(&driver->drv);
} }
EXPORT_SYMBOL(coreboot_driver_register); EXPORT_SYMBOL(__coreboot_driver_register);
void coreboot_driver_unregister(struct coreboot_driver *driver) void coreboot_driver_unregister(struct coreboot_driver *driver)
{ {
......
...@@ -97,8 +97,12 @@ struct coreboot_driver { ...@@ -97,8 +97,12 @@ struct coreboot_driver {
const struct coreboot_device_id *id_table; const struct coreboot_device_id *id_table;
}; };
/* use a macro to avoid include chaining to get THIS_MODULE */
#define coreboot_driver_register(driver) \
__coreboot_driver_register(driver, THIS_MODULE)
/* Register a driver that uses the data from a coreboot table. */ /* Register a driver that uses the data from a coreboot table. */
int coreboot_driver_register(struct coreboot_driver *driver); int __coreboot_driver_register(struct coreboot_driver *driver,
struct module *owner);
/* Unregister a driver that uses the data from a coreboot table. */ /* Unregister a driver that uses the data from a coreboot table. */
void coreboot_driver_unregister(struct coreboot_driver *driver); void coreboot_driver_unregister(struct coreboot_driver *driver);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment