public inbox for linux-acpi@vger.kernel.org
 help / color / mirror / Atom feed
* [05/15] acpi: change registeration interface to follow driver model
@ 2006-09-22  9:26 Zhang Rui
  2006-09-22  9:39 ` Zhang Rui
  0 siblings, 1 reply; 2+ messages in thread
From: Zhang Rui @ 2006-09-22  9:26 UTC (permalink / raw)
  To: linux-acpi; +Cc: len.brown

From: Patrick Mochel <mochel@linux.intel.com>
From: Li Shaohua <shaohua.li@intel.com>

ACPI device/driver registeration Interfaces are modified 
to follow Linux driver model.

Signed-off-by: Zhang Rui <rui.zhang@intel.com>

---
 drivers/acpi/scan.c     |  175 +++++++-----------------------------------------
 include/acpi/acpi_bus.h |    3 
 2 files changed, 30 insertions(+), 148 deletions(-)

Index: linux-2.6.18/drivers/acpi/scan.c
===================================================================
--- linux-2.6.18.orig/drivers/acpi/scan.c	2006-09-21 15:01:39.000000000 +0800
+++ linux-2.6.18/drivers/acpi/scan.c	2006-09-21 15:32:16.000000000 +0800
@@ -25,7 +25,7 @@ DEFINE_SPINLOCK(acpi_device_lock);
 LIST_HEAD(acpi_wakeup_device_list);
 
 
-static void acpi_device_release(struct kobject *kobj)
+static void acpi_device_release_legacy(struct kobject *kobj)
 {
 	struct acpi_device *dev = container_of(kobj, struct acpi_device, kobj);
 	kfree(dev->pnp.cid_list);
@@ -75,7 +75,7 @@ static struct sysfs_ops acpi_device_sysf
 
 static struct kobj_type ktype_acpi_ns = {
 	.sysfs_ops = &acpi_device_sysfs_ops,
-	.release = acpi_device_release,
+	.release = acpi_device_release_legacy,
 };
 
 static int namespace_uevent(struct kset *kset, struct kobject *kobj,
@@ -222,6 +222,14 @@ acpi_eject_store(struct acpi_device *dev
 /* --------------------------------------------------------------------------
 			ACPI Bus operations
    -------------------------------------------------------------------------- */
+static void acpi_device_release(struct device *dev)
+{
+	struct acpi_device *acpi_dev = to_acpi_device(dev);
+
+	kfree(acpi_dev->pnp.cid_list);
+	kfree(acpi_dev);
+}
+
 static int acpi_device_suspend(struct device *dev, pm_message_t state)
 {
 	struct acpi_device *acpi_dev = to_acpi_device(dev);
@@ -377,6 +385,14 @@ static void acpi_device_register(struct 
 		printk(KERN_WARNING "%s: kobject_register error: %d\n",
 			__FUNCTION__, err);
 	create_sysfs_device_files(device);
+
+	if (device->parent)
+		device->dev.parent = &parent->dev;
+	device->dev.bus = &acpi_bus_type;
+	device_initialize(&device->dev);
+	sprintf(device->dev.bus_id, "%s", device->pnp.bus_id);
+	device->dev.release = &acpi_device_release;
+	device_add(&device->dev);
 }
 
 static void acpi_device_unregister(struct acpi_device *device, int type)
@@ -395,20 +411,20 @@ static void acpi_device_unregister(struc
 	acpi_detach_data(device->handle, acpi_bus_data_handler);
 	remove_sysfs_device_files(device);
 	kobject_unregister(&device->kobj);
+
+	device_unregister(&device->dev);
 }
 
 /* --------------------------------------------------------------------------
                                  Driver Management
    -------------------------------------------------------------------------- */
-static LIST_HEAD(acpi_bus_drivers);
-
 /**
  * acpi_bus_driver_init - add a device to a driver
  * @device: the device to add and initialize
  * @driver: driver for the device
  *
  * Used to initialize a device via its device driver.  Called whenever a 
- * driver is bound to a device.  Invokes the driver's add() and start() ops.
+ * driver is bound to a device.  Invokes the driver's add() ops.
  */
 static int
 acpi_bus_driver_init(struct acpi_device *device, struct acpi_driver *driver)
@@ -459,57 +475,6 @@ static int acpi_start_single_object(stru
 	return result;
 }
 
-static void acpi_driver_attach(struct acpi_driver *drv)
-{
-	struct list_head *node, *next;
-
-
-	spin_lock(&acpi_device_lock);
-	list_for_each_safe(node, next, &acpi_device_list) {
-		struct acpi_device *dev =
-		    container_of(node, struct acpi_device, g_list);
-
-		if (dev->driver || !dev->status.present)
-			continue;
-		spin_unlock(&acpi_device_lock);
-
-		if (!acpi_bus_match(&(dev->dev), &(drv->drv))) {
-			if (!acpi_bus_driver_init(dev, drv)) {
-				acpi_start_single_object(dev);
-				atomic_inc(&drv->references);
-				ACPI_DEBUG_PRINT((ACPI_DB_INFO,
-						  "Found driver [%s] for device [%s]\n",
-						  drv->name, dev->pnp.bus_id));
-			}
-		}
-		spin_lock(&acpi_device_lock);
-	}
-	spin_unlock(&acpi_device_lock);
-}
-
-static void acpi_driver_detach(struct acpi_driver *drv)
-{
-	struct list_head *node, *next;
-
-
-	spin_lock(&acpi_device_lock);
-	list_for_each_safe(node, next, &acpi_device_list) {
-		struct acpi_device *dev =
-		    container_of(node, struct acpi_device, g_list);
-
-		if (dev->driver == drv) {
-			spin_unlock(&acpi_device_lock);
-			if (drv->ops.remove)
-				drv->ops.remove(dev, ACPI_BUS_REMOVAL_NORMAL);
-			spin_lock(&acpi_device_lock);
-			dev->driver = NULL;
-			dev->driver_data = NULL;
-			atomic_dec(&drv->references);
-		}
-	}
-	spin_unlock(&acpi_device_lock);
-}
-
 /**
  * acpi_bus_register_driver - register a driver with the ACPI bus
  * @driver: driver being registered
@@ -520,16 +485,16 @@ static void acpi_driver_detach(struct ac
  */
 int acpi_bus_register_driver(struct acpi_driver *driver)
 {
+	int ret;
 
 	if (acpi_disabled)
 		return -ENODEV;
+	driver->drv.name = driver->name;
+	driver->drv.bus = &acpi_bus_type;
+	driver->drv.owner = driver->owner;
 
-	spin_lock(&acpi_device_lock);
-	list_add_tail(&driver->node, &acpi_bus_drivers);
-	spin_unlock(&acpi_device_lock);
-	acpi_driver_attach(driver);
-
-	return 0;
+	ret = driver_register(&driver->drv);
+	return ret;
 }
 
 EXPORT_SYMBOL(acpi_bus_register_driver);
@@ -543,52 +508,11 @@ EXPORT_SYMBOL(acpi_bus_register_driver);
  */
 void acpi_bus_unregister_driver(struct acpi_driver *driver)
 {
-	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;
+	driver_unregister(&driver->drv);
 }
 
 EXPORT_SYMBOL(acpi_bus_unregister_driver);
 
-/**
- * acpi_bus_find_driver - check if there is a driver installed for the device
- * @device: device that we are trying to find a supporting driver for
- *
- * Parses the list of registered drivers looking for a driver applicable for
- * the specified device.
- */
-static int acpi_bus_find_driver(struct acpi_device *device)
-{
-	int result = 0;
-	struct list_head *node, *next;
-
-
-	spin_lock(&acpi_device_lock);
-	list_for_each_safe(node, next, &acpi_bus_drivers) {
-		struct acpi_driver *driver =
-		    container_of(node, struct acpi_driver, node);
-
-		atomic_inc(&driver->references);
-		spin_unlock(&acpi_device_lock);
-		if (!acpi_bus_match(&(device->dev), &(driver->drv))) {
-			result = acpi_bus_driver_init(device, driver);
-			if (!result)
-				goto Done;
-		}
-		atomic_dec(&driver->references);
-		spin_lock(&acpi_device_lock);
-	}
-	spin_unlock(&acpi_device_lock);
-
-      Done:
-	return result;
-}
-
 /* --------------------------------------------------------------------------
                                  Device Enumeration
    -------------------------------------------------------------------------- */
@@ -1033,32 +957,10 @@ static void acpi_device_get_debug_info(s
 
 static int acpi_bus_remove(struct acpi_device *dev, int rmdevice)
 {
-	int result = 0;
-	struct acpi_driver *driver;
-
-
 	if (!dev)
 		return -EINVAL;
 
-	driver = dev->driver;
-
-	if ((driver) && (driver->ops.remove)) {
-
-		if (driver->ops.stop) {
-			result = driver->ops.stop(dev, ACPI_BUS_REMOVAL_EJECT);
-			if (result)
-				return result;
-		}
-
-		result = dev->driver->ops.remove(dev, ACPI_BUS_REMOVAL_EJECT);
-		if (result) {
-			return result;
-		}
-
-		atomic_dec(&dev->driver->references);
-		dev->driver = NULL;
-		acpi_driver_data(dev) = NULL;
-	}
+	device_release_driver(&dev->dev);
 
 	if (!rmdevice)
 		return 0;
@@ -1193,17 +1095,6 @@ acpi_add_single_object(struct acpi_devic
 			device->parent->ops.bind(device);
 	}
 
-	/*
-	 * Locate & Attach Driver
-	 * ----------------------
-	 * If there's a hardware id (_HID) or compatible ids (_CID) we check
-	 * to see if there's a driver installed for this kind of device.  Note
-	 * that drivers can install before or after a device is enumerated.
-	 *
-	 * TBD: Assumes LDM provides driver hot-plug capability.
-	 */
-	acpi_bus_find_driver(device);
-
       end:
 	if (!result)
 		*child = device;
@@ -1484,14 +1375,6 @@ static int __init acpi_scan_init(void)
 	if (result)
 		goto Done;
 
-	acpi_root->dev.bus = &acpi_bus_type;
-	snprintf(acpi_root->dev.bus_id, BUS_ID_SIZE, "%s", acpi_bus_type.name);
-	result = device_register(&acpi_root->dev);
-	if (result) {
-		/* We don't want to quit even if we failed to add suspend/resume */
-		printk(KERN_ERR PREFIX "Could not register device\n");
-	}
-
 	/*
 	 * Enumerate devices in the ACPI namespace.
 	 */
Index: linux-2.6.18/include/acpi/acpi_bus.h
===================================================================
--- linux-2.6.18.orig/include/acpi/acpi_bus.h	2006-09-21 15:01:39.000000000 +0800
+++ linux-2.6.18/include/acpi/acpi_bus.h	2006-09-21 15:50:51.000000000 +0800
@@ -133,13 +133,12 @@ struct acpi_device_ops {
 };
 
 struct acpi_driver {
-	struct list_head node;
 	char name[80];
 	char class[80];
-	atomic_t references;
 	char *ids;		/* Supported Hardware IDs */
 	struct acpi_device_ops ops;
 	struct device_driver drv;
+	struct module *owner;
 };
 
 /*

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [05/15] acpi: change registeration interface to follow driver model
  2006-09-22  9:26 [05/15] acpi: change registeration interface to follow driver model Zhang Rui
@ 2006-09-22  9:39 ` Zhang Rui
  0 siblings, 0 replies; 2+ messages in thread
From: Zhang Rui @ 2006-09-22  9:39 UTC (permalink / raw)
  To: linux-acpi; +Cc: len.brown

I'm sorry but the subject should be 
[05/12] acpi: change registration interface to follow driver model

On Fri, 2006-09-22 at 17:26 +0800, Zhang Rui wrote:
> From: Patrick Mochel <mochel@linux.intel.com>
> From: Li Shaohua <shaohua.li@intel.com>
> 
> ACPI device/driver registeration Interfaces are modified 
> to follow Linux driver model.
> 
> Signed-off-by: Zhang Rui <rui.zhang@intel.com>
> 
> ---
>  drivers/acpi/scan.c     |  175 +++++++-----------------------------------------
>  include/acpi/acpi_bus.h |    3 
>  2 files changed, 30 insertions(+), 148 deletions(-)
> 
> Index: linux-2.6.18/drivers/acpi/scan.c
> ===================================================================
> --- linux-2.6.18.orig/drivers/acpi/scan.c	2006-09-21 15:01:39.000000000 +0800
> +++ linux-2.6.18/drivers/acpi/scan.c	2006-09-21 15:32:16.000000000 +0800
> @@ -25,7 +25,7 @@ DEFINE_SPINLOCK(acpi_device_lock);
>  LIST_HEAD(acpi_wakeup_device_list);
>  
> 
> -static void acpi_device_release(struct kobject *kobj)
> +static void acpi_device_release_legacy(struct kobject *kobj)
>  {
>  	struct acpi_device *dev = container_of(kobj, struct acpi_device, kobj);
>  	kfree(dev->pnp.cid_list);
> @@ -75,7 +75,7 @@ static struct sysfs_ops acpi_device_sysf
>  
>  static struct kobj_type ktype_acpi_ns = {
>  	.sysfs_ops = &acpi_device_sysfs_ops,
> -	.release = acpi_device_release,
> +	.release = acpi_device_release_legacy,
>  };
>  
>  static int namespace_uevent(struct kset *kset, struct kobject *kobj,
> @@ -222,6 +222,14 @@ acpi_eject_store(struct acpi_device *dev
>  /* --------------------------------------------------------------------------
>  			ACPI Bus operations
>     -------------------------------------------------------------------------- */
> +static void acpi_device_release(struct device *dev)
> +{
> +	struct acpi_device *acpi_dev = to_acpi_device(dev);
> +
> +	kfree(acpi_dev->pnp.cid_list);
> +	kfree(acpi_dev);
> +}
> +
>  static int acpi_device_suspend(struct device *dev, pm_message_t state)
>  {
>  	struct acpi_device *acpi_dev = to_acpi_device(dev);
> @@ -377,6 +385,14 @@ static void acpi_device_register(struct 
>  		printk(KERN_WARNING "%s: kobject_register error: %d\n",
>  			__FUNCTION__, err);
>  	create_sysfs_device_files(device);
> +
> +	if (device->parent)
> +		device->dev.parent = &parent->dev;
> +	device->dev.bus = &acpi_bus_type;
> +	device_initialize(&device->dev);
> +	sprintf(device->dev.bus_id, "%s", device->pnp.bus_id);
> +	device->dev.release = &acpi_device_release;
> +	device_add(&device->dev);
>  }
>  
>  static void acpi_device_unregister(struct acpi_device *device, int type)
> @@ -395,20 +411,20 @@ static void acpi_device_unregister(struc
>  	acpi_detach_data(device->handle, acpi_bus_data_handler);
>  	remove_sysfs_device_files(device);
>  	kobject_unregister(&device->kobj);
> +
> +	device_unregister(&device->dev);
>  }
>  
>  /* --------------------------------------------------------------------------
>                                   Driver Management
>     -------------------------------------------------------------------------- */
> -static LIST_HEAD(acpi_bus_drivers);
> -
>  /**
>   * acpi_bus_driver_init - add a device to a driver
>   * @device: the device to add and initialize
>   * @driver: driver for the device
>   *
>   * Used to initialize a device via its device driver.  Called whenever a 
> - * driver is bound to a device.  Invokes the driver's add() and start() ops.
> + * driver is bound to a device.  Invokes the driver's add() ops.
>   */
>  static int
>  acpi_bus_driver_init(struct acpi_device *device, struct acpi_driver *driver)
> @@ -459,57 +475,6 @@ static int acpi_start_single_object(stru
>  	return result;
>  }
>  
> -static void acpi_driver_attach(struct acpi_driver *drv)
> -{
> -	struct list_head *node, *next;
> -
> -
> -	spin_lock(&acpi_device_lock);
> -	list_for_each_safe(node, next, &acpi_device_list) {
> -		struct acpi_device *dev =
> -		    container_of(node, struct acpi_device, g_list);
> -
> -		if (dev->driver || !dev->status.present)
> -			continue;
> -		spin_unlock(&acpi_device_lock);
> -
> -		if (!acpi_bus_match(&(dev->dev), &(drv->drv))) {
> -			if (!acpi_bus_driver_init(dev, drv)) {
> -				acpi_start_single_object(dev);
> -				atomic_inc(&drv->references);
> -				ACPI_DEBUG_PRINT((ACPI_DB_INFO,
> -						  "Found driver [%s] for device [%s]\n",
> -						  drv->name, dev->pnp.bus_id));
> -			}
> -		}
> -		spin_lock(&acpi_device_lock);
> -	}
> -	spin_unlock(&acpi_device_lock);
> -}
> -
> -static void acpi_driver_detach(struct acpi_driver *drv)
> -{
> -	struct list_head *node, *next;
> -
> -
> -	spin_lock(&acpi_device_lock);
> -	list_for_each_safe(node, next, &acpi_device_list) {
> -		struct acpi_device *dev =
> -		    container_of(node, struct acpi_device, g_list);
> -
> -		if (dev->driver == drv) {
> -			spin_unlock(&acpi_device_lock);
> -			if (drv->ops.remove)
> -				drv->ops.remove(dev, ACPI_BUS_REMOVAL_NORMAL);
> -			spin_lock(&acpi_device_lock);
> -			dev->driver = NULL;
> -			dev->driver_data = NULL;
> -			atomic_dec(&drv->references);
> -		}
> -	}
> -	spin_unlock(&acpi_device_lock);
> -}
> -
>  /**
>   * acpi_bus_register_driver - register a driver with the ACPI bus
>   * @driver: driver being registered
> @@ -520,16 +485,16 @@ static void acpi_driver_detach(struct ac
>   */
>  int acpi_bus_register_driver(struct acpi_driver *driver)
>  {
> +	int ret;
>  
>  	if (acpi_disabled)
>  		return -ENODEV;
> +	driver->drv.name = driver->name;
> +	driver->drv.bus = &acpi_bus_type;
> +	driver->drv.owner = driver->owner;
>  
> -	spin_lock(&acpi_device_lock);
> -	list_add_tail(&driver->node, &acpi_bus_drivers);
> -	spin_unlock(&acpi_device_lock);
> -	acpi_driver_attach(driver);
> -
> -	return 0;
> +	ret = driver_register(&driver->drv);
> +	return ret;
>  }
>  
>  EXPORT_SYMBOL(acpi_bus_register_driver);
> @@ -543,52 +508,11 @@ EXPORT_SYMBOL(acpi_bus_register_driver);
>   */
>  void acpi_bus_unregister_driver(struct acpi_driver *driver)
>  {
> -	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;
> +	driver_unregister(&driver->drv);
>  }
>  
>  EXPORT_SYMBOL(acpi_bus_unregister_driver);
>  
> -/**
> - * acpi_bus_find_driver - check if there is a driver installed for the device
> - * @device: device that we are trying to find a supporting driver for
> - *
> - * Parses the list of registered drivers looking for a driver applicable for
> - * the specified device.
> - */
> -static int acpi_bus_find_driver(struct acpi_device *device)
> -{
> -	int result = 0;
> -	struct list_head *node, *next;
> -
> -
> -	spin_lock(&acpi_device_lock);
> -	list_for_each_safe(node, next, &acpi_bus_drivers) {
> -		struct acpi_driver *driver =
> -		    container_of(node, struct acpi_driver, node);
> -
> -		atomic_inc(&driver->references);
> -		spin_unlock(&acpi_device_lock);
> -		if (!acpi_bus_match(&(device->dev), &(driver->drv))) {
> -			result = acpi_bus_driver_init(device, driver);
> -			if (!result)
> -				goto Done;
> -		}
> -		atomic_dec(&driver->references);
> -		spin_lock(&acpi_device_lock);
> -	}
> -	spin_unlock(&acpi_device_lock);
> -
> -      Done:
> -	return result;
> -}
> -
>  /* --------------------------------------------------------------------------
>                                   Device Enumeration
>     -------------------------------------------------------------------------- */
> @@ -1033,32 +957,10 @@ static void acpi_device_get_debug_info(s
>  
>  static int acpi_bus_remove(struct acpi_device *dev, int rmdevice)
>  {
> -	int result = 0;
> -	struct acpi_driver *driver;
> -
> -
>  	if (!dev)
>  		return -EINVAL;
>  
> -	driver = dev->driver;
> -
> -	if ((driver) && (driver->ops.remove)) {
> -
> -		if (driver->ops.stop) {
> -			result = driver->ops.stop(dev, ACPI_BUS_REMOVAL_EJECT);
> -			if (result)
> -				return result;
> -		}
> -
> -		result = dev->driver->ops.remove(dev, ACPI_BUS_REMOVAL_EJECT);
> -		if (result) {
> -			return result;
> -		}
> -
> -		atomic_dec(&dev->driver->references);
> -		dev->driver = NULL;
> -		acpi_driver_data(dev) = NULL;
> -	}
> +	device_release_driver(&dev->dev);
>  
>  	if (!rmdevice)
>  		return 0;
> @@ -1193,17 +1095,6 @@ acpi_add_single_object(struct acpi_devic
>  			device->parent->ops.bind(device);
>  	}
>  
> -	/*
> -	 * Locate & Attach Driver
> -	 * ----------------------
> -	 * If there's a hardware id (_HID) or compatible ids (_CID) we check
> -	 * to see if there's a driver installed for this kind of device.  Note
> -	 * that drivers can install before or after a device is enumerated.
> -	 *
> -	 * TBD: Assumes LDM provides driver hot-plug capability.
> -	 */
> -	acpi_bus_find_driver(device);
> -
>        end:
>  	if (!result)
>  		*child = device;
> @@ -1484,14 +1375,6 @@ static int __init acpi_scan_init(void)
>  	if (result)
>  		goto Done;
>  
> -	acpi_root->dev.bus = &acpi_bus_type;
> -	snprintf(acpi_root->dev.bus_id, BUS_ID_SIZE, "%s", acpi_bus_type.name);
> -	result = device_register(&acpi_root->dev);
> -	if (result) {
> -		/* We don't want to quit even if we failed to add suspend/resume */
> -		printk(KERN_ERR PREFIX "Could not register device\n");
> -	}
> -
>  	/*
>  	 * Enumerate devices in the ACPI namespace.
>  	 */
> Index: linux-2.6.18/include/acpi/acpi_bus.h
> ===================================================================
> --- linux-2.6.18.orig/include/acpi/acpi_bus.h	2006-09-21 15:01:39.000000000 +0800
> +++ linux-2.6.18/include/acpi/acpi_bus.h	2006-09-21 15:50:51.000000000 +0800
> @@ -133,13 +133,12 @@ struct acpi_device_ops {
>  };
>  
>  struct acpi_driver {
> -	struct list_head node;
>  	char name[80];
>  	char class[80];
> -	atomic_t references;
>  	char *ids;		/* Supported Hardware IDs */
>  	struct acpi_device_ops ops;
>  	struct device_driver drv;
> +	struct module *owner;
>  };
>  
>  /*
> -
> To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2006-09-22  9:37 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-09-22  9:26 [05/15] acpi: change registeration interface to follow driver model Zhang Rui
2006-09-22  9:39 ` Zhang Rui

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox