Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 69cd291c authored by Len Brown's avatar Len Brown
Browse files

Pull acpi_bus_register_driver into release branch

Conflicts:

	drivers/acpi/asus_acpi.c
	drivers/acpi/scan.c
parents 35a5d9ed 06ea8e08
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -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;
@@ -1180,6 +1182,8 @@ static int asus_hotk_add(struct acpi_device *device)
		}
	}

	asus_hotk_found = 1;

      end:
	if (result) {
		kfree(hotk);
@@ -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;
+9 −25
Original line number Diff line number Diff line
@@ -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) {
@@ -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)
@@ -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");

@@ -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));
@@ -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;

@@ -591,7 +587,6 @@ static int acpi_driver_detach(struct acpi_driver *drv)
		}
	}
	spin_unlock(&acpi_device_lock);
	return_VALUE(0);
}

/**
@@ -599,28 +594,22 @@ static int acpi_driver_detach(struct acpi_driver *drv)
 * @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);
@@ -632,13 +621,8 @@ 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)) {
@@ -646,7 +630,7 @@ int acpi_bus_unregister_driver(struct acpi_driver *driver)
		list_del_init(&driver->node);
		spin_unlock(&acpi_device_lock);
	}
	return_VALUE(0);
	return;
}

EXPORT_SYMBOL(acpi_bus_unregister_driver);
+5 −5
Original line number Diff line number Diff line
@@ -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)
@@ -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

@@ -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;
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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);