mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
ACPI: store owner from modules with acpi_bus_register_driver()
Modules registering driver with acpi_bus_register_driver() 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
ACPI bus code, just like we did for platform_driver in
commit 9447057eaf
("platform_device: use a macro instead of
platform_driver_register").
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
403ad17c06
commit
48b9c4862b
@ -995,25 +995,26 @@ EXPORT_SYMBOL_GPL(acpi_driver_match_device);
|
|||||||
-------------------------------------------------------------------------- */
|
-------------------------------------------------------------------------- */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* acpi_bus_register_driver - register a driver with the ACPI bus
|
* __acpi_bus_register_driver - register a driver with the ACPI bus
|
||||||
* @driver: driver being registered
|
* @driver: driver being registered
|
||||||
|
* @owner: owning module/driver
|
||||||
*
|
*
|
||||||
* Registers a driver with the ACPI bus. Searches the namespace for all
|
* Registers a driver with the ACPI bus. Searches the namespace for all
|
||||||
* devices that match the driver's criteria and binds. Returns zero for
|
* devices that match the driver's criteria and binds. Returns zero for
|
||||||
* success or a negative error status for failure.
|
* success or a negative error status for failure.
|
||||||
*/
|
*/
|
||||||
int acpi_bus_register_driver(struct acpi_driver *driver)
|
int __acpi_bus_register_driver(struct acpi_driver *driver, struct module *owner)
|
||||||
{
|
{
|
||||||
if (acpi_disabled)
|
if (acpi_disabled)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
driver->drv.name = driver->name;
|
driver->drv.name = driver->name;
|
||||||
driver->drv.bus = &acpi_bus_type;
|
driver->drv.bus = &acpi_bus_type;
|
||||||
driver->drv.owner = driver->owner;
|
driver->drv.owner = owner;
|
||||||
|
|
||||||
return driver_register(&driver->drv);
|
return driver_register(&driver->drv);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(acpi_bus_register_driver);
|
EXPORT_SYMBOL(__acpi_bus_register_driver);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* acpi_bus_unregister_driver - unregisters a driver with the ACPI bus
|
* acpi_bus_unregister_driver - unregisters a driver with the ACPI bus
|
||||||
|
@ -656,7 +656,12 @@ void acpi_scan_lock_release(void);
|
|||||||
void acpi_lock_hp_context(void);
|
void acpi_lock_hp_context(void);
|
||||||
void acpi_unlock_hp_context(void);
|
void acpi_unlock_hp_context(void);
|
||||||
int acpi_scan_add_handler(struct acpi_scan_handler *handler);
|
int acpi_scan_add_handler(struct acpi_scan_handler *handler);
|
||||||
int acpi_bus_register_driver(struct acpi_driver *driver);
|
/*
|
||||||
|
* use a macro to avoid include chaining to get THIS_MODULE
|
||||||
|
*/
|
||||||
|
#define acpi_bus_register_driver(drv) \
|
||||||
|
__acpi_bus_register_driver(drv, THIS_MODULE)
|
||||||
|
int __acpi_bus_register_driver(struct acpi_driver *driver, struct module *owner);
|
||||||
void acpi_bus_unregister_driver(struct acpi_driver *driver);
|
void acpi_bus_unregister_driver(struct acpi_driver *driver);
|
||||||
int acpi_bus_scan(acpi_handle handle);
|
int acpi_bus_scan(acpi_handle handle);
|
||||||
void acpi_bus_trim(struct acpi_device *start);
|
void acpi_bus_trim(struct acpi_device *start);
|
||||||
|
Loading…
Reference in New Issue
Block a user