Skip to content

Commit

Permalink
Pull acpi_bus_register_driver into release branch
Browse files Browse the repository at this point in the history
Conflicts:

	drivers/acpi/asus_acpi.c
	drivers/acpi/scan.c
  • Loading branch information
Len Brown committed Jun 16, 2006
2 parents 35a5d9e + 06ea8e0 commit 69cd291
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 32 deletions.
18 changes: 17 additions & 1 deletion drivers/acpi/asus_acpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -1119,6 +1119,8 @@ static int asus_hotk_check(void)
return result;
}

static int asus_hotk_found;

static int asus_hotk_add(struct acpi_device *device)
{
acpi_status status = AE_OK;
Expand Down Expand Up @@ -1180,6 +1182,8 @@ static int asus_hotk_add(struct acpi_device *device)
}
}

asus_hotk_found = 1;

end:
if (result) {
kfree(hotk);
Expand Down Expand Up @@ -1226,7 +1230,19 @@ static int __init asus_acpi_init(void)
asus_proc_dir->owner = THIS_MODULE;

result = acpi_bus_register_driver(&asus_hotk_driver);
if (result < 1) {
if (result < 0) {
remove_proc_entry(PROC_ASUS, acpi_root_dir);
return -ENODEV;
}

/*
* This is a bit of a kludge. We only want this module loaded
* for ASUS systems, but there's currently no way to probe the
* ACPI namespace for ASUS HIDs. So we just return failure if
* we didn't find one, which will cause the module to be
* unloaded.
*/
if (!asus_hotk_found) {
acpi_bus_unregister_driver(&asus_hotk_driver);
remove_proc_entry(PROC_ASUS, acpi_root_dir);
return -ENODEV;
Expand Down
34 changes: 9 additions & 25 deletions drivers/acpi/scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ static void acpi_device_register(struct acpi_device *device,
create_sysfs_device_files(device);
}

static int acpi_device_unregister(struct acpi_device *device, int type)
static void acpi_device_unregister(struct acpi_device *device, int type)
{
spin_lock(&acpi_device_lock);
if (device->parent) {
Expand All @@ -158,7 +158,6 @@ static int acpi_device_unregister(struct acpi_device *device, int type)
acpi_detach_data(device->handle, acpi_bus_data_handler);
remove_sysfs_device_files(device);
kobject_unregister(&device->kobj);
return 0;
}

void acpi_bus_data_handler(acpi_handle handle, u32 function, void *context)
Expand Down Expand Up @@ -537,10 +536,9 @@ static int acpi_start_single_object(struct acpi_device *device)
return_VALUE(result);
}

static int acpi_driver_attach(struct acpi_driver *drv)
static void acpi_driver_attach(struct acpi_driver *drv)
{
struct list_head *node, *next;
int count = 0;

ACPI_FUNCTION_TRACE("acpi_driver_attach");

Expand All @@ -557,7 +555,6 @@ static int acpi_driver_attach(struct acpi_driver *drv)
if (!acpi_bus_driver_init(dev, drv)) {
acpi_start_single_object(dev);
atomic_inc(&drv->references);
count++;
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"Found driver [%s] for device [%s]\n",
drv->name, dev->pnp.bus_id));
Expand All @@ -566,10 +563,9 @@ static int acpi_driver_attach(struct acpi_driver *drv)
spin_lock(&acpi_device_lock);
}
spin_unlock(&acpi_device_lock);
return_VALUE(count);
}

static int acpi_driver_detach(struct acpi_driver *drv)
static void acpi_driver_detach(struct acpi_driver *drv)
{
struct list_head *node, *next;

Expand All @@ -591,36 +587,29 @@ static int acpi_driver_detach(struct acpi_driver *drv)
}
}
spin_unlock(&acpi_device_lock);
return_VALUE(0);
}

/**
* acpi_bus_register_driver - register a driver with the ACPI bus
* @driver: driver being registered
*
* Registers a driver with the ACPI bus. Searches the namespace for all
* devices that match the driver's criteria and binds. Returns the
* number of devices that were claimed by the driver, or a negative
* error status for failure.
* devices that match the driver's criteria and binds. Returns zero for
* success or a negative error status for failure.
*/
int acpi_bus_register_driver(struct acpi_driver *driver)
{
int count;

ACPI_FUNCTION_TRACE("acpi_bus_register_driver");

if (acpi_disabled)
return_VALUE(-ENODEV);

if (!driver)
return_VALUE(-EINVAL);

spin_lock(&acpi_device_lock);
list_add_tail(&driver->node, &acpi_bus_drivers);
spin_unlock(&acpi_device_lock);
count = acpi_driver_attach(driver);
acpi_driver_attach(driver);

return_VALUE(count);
return_VALUE(0);
}

EXPORT_SYMBOL(acpi_bus_register_driver);
Expand All @@ -632,21 +621,16 @@ EXPORT_SYMBOL(acpi_bus_register_driver);
* Unregisters a driver with the ACPI bus. Searches the namespace for all
* devices that match the driver's criteria and unbinds.
*/
int acpi_bus_unregister_driver(struct acpi_driver *driver)
void acpi_bus_unregister_driver(struct acpi_driver *driver)
{
ACPI_FUNCTION_TRACE("acpi_bus_unregister_driver");

if (!driver)
return_VALUE(-EINVAL);

acpi_driver_detach(driver);

if (!atomic_read(&driver->references)) {
spin_lock(&acpi_device_lock);
list_del_init(&driver->node);
spin_unlock(&acpi_device_lock);
}
return_VALUE(0);
return;
}

EXPORT_SYMBOL(acpi_bus_unregister_driver);
Expand Down
10 changes: 5 additions & 5 deletions drivers/char/sonypi.c
Original file line number Diff line number Diff line change
Expand Up @@ -512,7 +512,7 @@ static struct sonypi_device {

#ifdef CONFIG_ACPI
static struct acpi_device *sonypi_acpi_device;
static int acpi_enabled;
static int acpi_driver_registered;
#endif

static int sonypi_ec_write(u8 addr, u8 value)
Expand Down Expand Up @@ -869,7 +869,7 @@ static irqreturn_t sonypi_irq(int irq, void *dev_id, struct pt_regs *regs)
sonypi_report_input_event(event);

#ifdef CONFIG_ACPI
if (acpi_enabled)
if (sonypi_acpi_device)
acpi_bus_generate_event(sonypi_acpi_device, 1, event);
#endif

Expand Down Expand Up @@ -1551,8 +1551,8 @@ static int __init sonypi_init(void)
goto err_free_device;

#ifdef CONFIG_ACPI
if (acpi_bus_register_driver(&sonypi_acpi_driver) > 0)
acpi_enabled = 1;
if (acpi_bus_register_driver(&sonypi_acpi_driver) >= 0)
acpi_driver_registered = 1;
#endif

return 0;
Expand All @@ -1567,7 +1567,7 @@ static int __init sonypi_init(void)
static void __exit sonypi_exit(void)
{
#ifdef CONFIG_ACPI
if (acpi_enabled)
if (acpi_driver_registered)
acpi_bus_unregister_driver(&sonypi_acpi_driver);
#endif
platform_device_unregister(sonypi_platform_device);
Expand Down
2 changes: 1 addition & 1 deletion include/acpi/acpi_bus.h
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,7 @@ int acpi_bus_set_power(acpi_handle handle, int state);
int acpi_bus_generate_event(struct acpi_device *device, u8 type, int data);
int acpi_bus_receive_event(struct acpi_bus_event *event);
int acpi_bus_register_driver(struct acpi_driver *driver);
int acpi_bus_unregister_driver(struct acpi_driver *driver);
void acpi_bus_unregister_driver(struct acpi_driver *driver);
int acpi_bus_add(struct acpi_device **child, struct acpi_device *parent,
acpi_handle handle, int type);
int acpi_bus_trim(struct acpi_device *start, int rmdevice);
Expand Down

0 comments on commit 69cd291

Please sign in to comment.