diff --git a/[refs] b/[refs] index 7d16c97dd000..634a8e5cfab6 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d7553a86b5cd18d46ad3eabebadedcb45eda3ab1 +refs/heads/master: 091930a2e612a02debe8694b41f96e33fe45bba2 diff --git a/trunk/drivers/acpi/glue.c b/trunk/drivers/acpi/glue.c index 40a84cc6740c..ef6f155469b5 100644 --- a/trunk/drivers/acpi/glue.c +++ b/trunk/drivers/acpi/glue.c @@ -36,11 +36,12 @@ int register_acpi_bus_type(struct acpi_bus_type *type) { if (acpi_disabled) return -ENODEV; - if (type && type->match && type->find_device) { + if (type && type->bus && 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->name); + printk(KERN_INFO PREFIX "bus type %s registered\n", + type->bus->name); return 0; } return -ENODEV; @@ -55,21 +56,24 @@ 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 "bus type %s unregistered\n", - type->name); + printk(KERN_INFO PREFIX "ACPI bus type %s unregistered\n", + type->bus->name); return 0; } return -ENODEV; } EXPORT_SYMBOL_GPL(unregister_acpi_bus_type); -static struct acpi_bus_type *acpi_get_bus_type(struct device *dev) +static struct acpi_bus_type *acpi_get_bus_type(struct bus_type *type) { 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->match(dev)) { + if (tmp->bus == type) { ret = tmp; break; } @@ -78,6 +82,22 @@ static struct acpi_bus_type *acpi_get_bus_type(struct device *dev) return ret; } +static int acpi_find_bridge_device(struct device *dev, acpi_handle * handle) +{ + struct acpi_bus_type *tmp; + int ret = -ENODEV; + + down_read(&bus_type_sem); + list_for_each_entry(tmp, &bus_type_list, list) { + if (tmp->find_bridge && !tmp->find_bridge(dev, handle)) { + ret = 0; + break; + } + } + up_read(&bus_type_sem); + return ret; +} + static acpi_status do_acpi_find_child(acpi_handle handle, u32 lvl_not_used, void *addr_p, void **ret_p) { @@ -241,12 +261,29 @@ static int acpi_unbind_one(struct device *dev) static int acpi_platform_notify(struct device *dev) { - struct acpi_bus_type *type = acpi_get_bus_type(dev); + struct acpi_bus_type *type; acpi_handle handle; int ret; ret = acpi_bind_one(dev, NULL); - if (ret && type) { + 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; + goto out; + } + ret = type->find_device(dev, &handle); if (ret) { DBG("Unable to get handle for %s\n", dev_name(dev)); @@ -279,7 +316,7 @@ static int acpi_platform_notify_remove(struct device *dev) { struct acpi_bus_type *type; - type = acpi_get_bus_type(dev); + type = acpi_get_bus_type(dev->bus); if (type && type->cleanup) type->cleanup(dev); diff --git a/trunk/drivers/acpi/processor_core.c b/trunk/drivers/acpi/processor_core.c index 164d49569aeb..eff722278ff5 100644 --- a/trunk/drivers/acpi/processor_core.c +++ b/trunk/drivers/acpi/processor_core.c @@ -158,7 +158,8 @@ static int map_mat_entry(acpi_handle handle, int type, u32 acpi_id) } exit: - kfree(buffer.pointer); + if (buffer.pointer) + kfree(buffer.pointer); return apic_id; } diff --git a/trunk/drivers/acpi/processor_driver.c b/trunk/drivers/acpi/processor_driver.c index bec717ffd25f..df34bd04ae62 100644 --- a/trunk/drivers/acpi/processor_driver.c +++ b/trunk/drivers/acpi/processor_driver.c @@ -559,7 +559,7 @@ static int __cpuinit acpi_processor_add(struct acpi_device *device) return 0; #endif - BUG_ON(pr->id >= nr_cpu_ids); + BUG_ON((pr->id >= nr_cpu_ids) || (pr->id < 0)); /* * Buggy BIOS check diff --git a/trunk/drivers/acpi/sleep.c b/trunk/drivers/acpi/sleep.c index 24213033fbae..6d3a06a629a1 100644 --- a/trunk/drivers/acpi/sleep.c +++ b/trunk/drivers/acpi/sleep.c @@ -599,6 +599,7 @@ static void acpi_sleep_suspend_setup(void) status = acpi_get_sleep_type_data(i, &type_a, &type_b); if (ACPI_SUCCESS(status)) { sleep_states[i] = 1; + pr_cont(" S%d", i); } } @@ -741,6 +742,7 @@ static void acpi_sleep_hibernate_setup(void) hibernation_set_ops(old_suspend_ordering ? &acpi_hibernation_ops_old : &acpi_hibernation_ops); sleep_states[ACPI_STATE_S4] = 1; + pr_cont(KERN_CONT " S4"); if (nosigcheck) return; @@ -786,9 +788,6 @@ int __init acpi_sleep_init(void) { acpi_status status; u8 type_a, type_b; - char supported[ACPI_S_STATE_COUNT * 3 + 1]; - char *pos = supported; - int i; if (acpi_disabled) return 0; @@ -796,6 +795,7 @@ int __init acpi_sleep_init(void) acpi_sleep_dmi_check(); sleep_states[ACPI_STATE_S0] = 1; + pr_info(PREFIX "(supports S0"); acpi_sleep_suspend_setup(); acpi_sleep_hibernate_setup(); @@ -803,17 +803,11 @@ int __init acpi_sleep_init(void) status = acpi_get_sleep_type_data(ACPI_STATE_S5, &type_a, &type_b); if (ACPI_SUCCESS(status)) { sleep_states[ACPI_STATE_S5] = 1; + pr_cont(" S5"); pm_power_off_prepare = acpi_power_off_prepare; pm_power_off = acpi_power_off; } - - supported[0] = 0; - for (i = 0; i < ACPI_S_STATE_COUNT; i++) { - if (sleep_states[i]) - pos += sprintf(pos, " S%d", i); - } - pr_info(PREFIX "(supports%s)\n", supported); - + pr_cont(")\n"); /* * Register the tts_notifier to reboot notifier list so that the _TTS * object can also be evaluated when the system enters S5. diff --git a/trunk/drivers/ata/libata-acpi.c b/trunk/drivers/ata/libata-acpi.c index beea3115577e..0ea1018280bd 100644 --- a/trunk/drivers/ata/libata-acpi.c +++ b/trunk/drivers/ata/libata-acpi.c @@ -1144,8 +1144,13 @@ static int ata_acpi_find_device(struct device *dev, acpi_handle *handle) return -ENODEV; } +static int ata_acpi_find_dummy(struct device *dev, acpi_handle *handle) +{ + return -ENODEV; +} + static struct acpi_bus_type ata_acpi_bus = { - .name = "ATA", + .find_bridge = ata_acpi_find_dummy, .find_device = ata_acpi_find_device, }; diff --git a/trunk/drivers/mailbox/pl320-ipc.c b/trunk/drivers/mailbox/pl320-ipc.c index c45b3aedafba..d873cbae2fbb 100644 --- a/trunk/drivers/mailbox/pl320-ipc.c +++ b/trunk/drivers/mailbox/pl320-ipc.c @@ -138,8 +138,7 @@ int pl320_ipc_unregister_notifier(struct notifier_block *nb) } EXPORT_SYMBOL_GPL(pl320_ipc_unregister_notifier); -static int __init pl320_probe(struct amba_device *adev, - const struct amba_id *id) +static int pl320_probe(struct amba_device *adev, const struct amba_id *id) { int ret; diff --git a/trunk/drivers/pci/pci-acpi.c b/trunk/drivers/pci/pci-acpi.c index dee5dddaa292..39c937f9b426 100644 --- a/trunk/drivers/pci/pci-acpi.c +++ b/trunk/drivers/pci/pci-acpi.c @@ -331,14 +331,8 @@ static void pci_acpi_cleanup(struct device *dev) } } -static bool pci_acpi_bus_match(struct device *dev) -{ - return dev->bus == &pci_bus_type; -} - static struct acpi_bus_type acpi_pci_bus = { - .name = "PCI", - .match = pci_acpi_bus_match, + .bus = &pci_bus_type, .find_device = acpi_pci_find_device, .setup = pci_acpi_setup, .cleanup = pci_acpi_cleanup, diff --git a/trunk/drivers/pnp/pnpacpi/core.c b/trunk/drivers/pnp/pnpacpi/core.c index 55cd459a3908..8813fc03aa09 100644 --- a/trunk/drivers/pnp/pnpacpi/core.c +++ b/trunk/drivers/pnp/pnpacpi/core.c @@ -353,14 +353,8 @@ static int __init acpi_pnp_find_device(struct device *dev, acpi_handle * handle) /* complete initialization of a PNPACPI device includes having * pnpdev->dev.archdata.acpi_handle point to its ACPI sibling. */ -static bool acpi_pnp_bus_match(struct device *dev) -{ - return dev->bus == &pnp_bus_type; -} - static struct acpi_bus_type __initdata acpi_pnp_bus = { - .name = "PNP", - .match = acpi_pnp_bus_match, + .bus = &pnp_bus_type, .find_device = acpi_pnp_find_device, }; diff --git a/trunk/drivers/scsi/scsi_lib.c b/trunk/drivers/scsi/scsi_lib.c index c31187d79343..765398c063c7 100644 --- a/trunk/drivers/scsi/scsi_lib.c +++ b/trunk/drivers/scsi/scsi_lib.c @@ -71,14 +71,9 @@ struct kmem_cache *scsi_sdb_cache; #ifdef CONFIG_ACPI #include -static bool acpi_scsi_bus_match(struct device *dev) -{ - return dev->bus == &scsi_bus_type; -} - int scsi_register_acpi_bus_type(struct acpi_bus_type *bus) { - bus->match = acpi_scsi_bus_match; + bus->bus = &scsi_bus_type; return register_acpi_bus_type(bus); } EXPORT_SYMBOL_GPL(scsi_register_acpi_bus_type); diff --git a/trunk/drivers/usb/core/usb-acpi.c b/trunk/drivers/usb/core/usb-acpi.c index b6f4bad3f756..cef4252bb31a 100644 --- a/trunk/drivers/usb/core/usb-acpi.c +++ b/trunk/drivers/usb/core/usb-acpi.c @@ -210,14 +210,9 @@ static int usb_acpi_find_device(struct device *dev, acpi_handle *handle) return 0; } -static bool usb_acpi_bus_match(struct device *dev) -{ - return is_usb_device(dev) || is_usb_port(dev); -} - static struct acpi_bus_type usb_acpi_bus = { - .name = "USB", - .match = usb_acpi_bus_match, + .bus = &usb_bus_type, + .find_bridge = usb_acpi_find_device, .find_device = usb_acpi_find_device, }; diff --git a/trunk/include/acpi/acpi_bus.h b/trunk/include/acpi/acpi_bus.h index 22ba56e834e2..e65278f560c4 100644 --- a/trunk/include/acpi/acpi_bus.h +++ b/trunk/include/acpi/acpi_bus.h @@ -437,9 +437,11 @@ void acpi_remove_dir(struct acpi_device *); */ struct acpi_bus_type { struct list_head list; - const char *name; - bool (*match)(struct device *dev); + struct bus_type *bus; + /* For general devices under the bus */ int (*find_device) (struct device *, acpi_handle *); + /* For bridges, such as PCI root bridge, IDE controller */ + int (*find_bridge) (struct device *, acpi_handle *); void (*setup)(struct device *); void (*cleanup)(struct device *); };