|
@@ -36,12 +36,11 @@ int register_acpi_bus_type(struct acpi_bus_type *type)
|
|
|
{
|
|
|
if (acpi_disabled)
|
|
|
return -ENODEV;
|
|
|
- if (type && type->bus && type->find_device) {
|
|
|
+ if (type && type->match && type->find_device) {
|
|
|
down_write(&bus_type_sem);
|
|
|
list_add_tail(&type->list, &bus_type_list);
|
|
|
up_write(&bus_type_sem);
|
|
|
- printk(KERN_INFO PREFIX "bus type %s registered\n",
|
|
|
- type->bus->name);
|
|
|
+ printk(KERN_INFO PREFIX "bus type %s registered\n", type->name);
|
|
|
return 0;
|
|
|
}
|
|
|
return -ENODEV;
|
|
@@ -56,24 +55,21 @@ int unregister_acpi_bus_type(struct acpi_bus_type *type)
|
|
|
down_write(&bus_type_sem);
|
|
|
list_del_init(&type->list);
|
|
|
up_write(&bus_type_sem);
|
|
|
- printk(KERN_INFO PREFIX "ACPI bus type %s unregistered\n",
|
|
|
- type->bus->name);
|
|
|
+ printk(KERN_INFO PREFIX "bus type %s unregistered\n",
|
|
|
+ type->name);
|
|
|
return 0;
|
|
|
}
|
|
|
return -ENODEV;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(unregister_acpi_bus_type);
|
|
|
|
|
|
-static struct acpi_bus_type *acpi_get_bus_type(struct bus_type *type)
|
|
|
+static struct acpi_bus_type *acpi_get_bus_type(struct device *dev)
|
|
|
{
|
|
|
struct acpi_bus_type *tmp, *ret = NULL;
|
|
|
|
|
|
- if (!type)
|
|
|
- return NULL;
|
|
|
-
|
|
|
down_read(&bus_type_sem);
|
|
|
list_for_each_entry(tmp, &bus_type_list, list) {
|
|
|
- if (tmp->bus == type) {
|
|
|
+ if (tmp->match(dev)) {
|
|
|
ret = tmp;
|
|
|
break;
|
|
|
}
|
|
@@ -261,26 +257,17 @@ err:
|
|
|
|
|
|
static int acpi_platform_notify(struct device *dev)
|
|
|
{
|
|
|
- struct acpi_bus_type *type;
|
|
|
+ struct acpi_bus_type *type = acpi_get_bus_type(dev);
|
|
|
acpi_handle handle;
|
|
|
int ret;
|
|
|
|
|
|
ret = acpi_bind_one(dev, NULL);
|
|
|
- if (ret && (!dev->bus || !dev->parent)) {
|
|
|
- /* bridge devices genernally haven't bus or parent */
|
|
|
- ret = acpi_find_bridge_device(dev, &handle);
|
|
|
- if (!ret) {
|
|
|
- ret = acpi_bind_one(dev, handle);
|
|
|
- if (ret)
|
|
|
- goto out;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- type = acpi_get_bus_type(dev->bus);
|
|
|
if (ret) {
|
|
|
- if (!type || !type->find_device) {
|
|
|
- DBG("No ACPI bus support for %s\n", dev_name(dev));
|
|
|
- ret = -EINVAL;
|
|
|
+ if (!type) {
|
|
|
+ ret = acpi_find_bridge_device(dev, &handle);
|
|
|
+ if (!ret)
|
|
|
+ ret = acpi_bind_one(dev, handle);
|
|
|
+
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
@@ -316,7 +303,7 @@ static int acpi_platform_notify_remove(struct device *dev)
|
|
|
{
|
|
|
struct acpi_bus_type *type;
|
|
|
|
|
|
- type = acpi_get_bus_type(dev->bus);
|
|
|
+ type = acpi_get_bus_type(dev);
|
|
|
if (type && type->cleanup)
|
|
|
type->cleanup(dev);
|
|
|
|