]> Git Repo - linux.git/commitdiff
Merge branch 'bjorn-start-stop-2.6.32' into release
authorLen Brown <[email protected]>
Sat, 19 Sep 2009 05:56:39 +0000 (01:56 -0400)
committerLen Brown <[email protected]>
Sat, 19 Sep 2009 05:56:39 +0000 (01:56 -0400)
1  2 
drivers/acpi/acpi_memhotplug.c
drivers/acpi/ec.c
drivers/acpi/processor_core.c
drivers/acpi/scan.c
include/acpi/acpi_bus.h

index 80eacbe157e23d0e28756f9c4bcd2bf479f687b3,a8d9d8fac5d4142201d2cc9e5abb545cdcf6e8ef..28ccdbc05ac8326420c76488fd85782cb18560c8
@@@ -38,9 -38,6 +38,9 @@@
  
  #define _COMPONENT            ACPI_MEMORY_DEVICE_COMPONENT
  
 +#undef PREFIX
 +#define       PREFIX          "ACPI:memory_hp:"
 +
  ACPI_MODULE_NAME("acpi_memhotplug");
  MODULE_AUTHOR("Naveen B S <[email protected]>");
  MODULE_DESCRIPTION("Hotplug Mem Driver");
@@@ -53,7 -50,6 +53,6 @@@ MODULE_LICENSE("GPL")
  
  static int acpi_memory_device_add(struct acpi_device *device);
  static int acpi_memory_device_remove(struct acpi_device *device, int type);
- static int acpi_memory_device_start(struct acpi_device *device);
  
  static const struct acpi_device_id memory_device_ids[] = {
        {ACPI_MEMORY_DEVICE_HID, 0},
@@@ -68,7 -64,6 +67,6 @@@ static struct acpi_driver acpi_memory_d
        .ops = {
                .add = acpi_memory_device_add,
                .remove = acpi_memory_device_remove,
-               .start = acpi_memory_device_start,
                },
  };
  
@@@ -156,7 -151,6 +154,7 @@@ acpi_memory_get_device(acpi_handle hand
        acpi_handle phandle;
        struct acpi_device *device = NULL;
        struct acpi_device *pdevice = NULL;
 +      int result;
  
  
        if (!acpi_bus_get_device(handle, &device) && device)
        }
  
        /* Get the parent device */
 -      status = acpi_bus_get_device(phandle, &pdevice);
 -      if (ACPI_FAILURE(status)) {
 -              ACPI_EXCEPTION((AE_INFO, status, "Cannot get acpi bus device"));
 +      result = acpi_bus_get_device(phandle, &pdevice);
 +      if (result) {
 +              printk(KERN_WARNING PREFIX "Cannot get acpi bus device");
                return -EINVAL;
        }
  
         * Now add the notified device.  This creates the acpi_device
         * and invokes .add function
         */
 -      status = acpi_bus_add(&device, pdevice, handle, ACPI_BUS_TYPE_DEVICE);
 -      if (ACPI_FAILURE(status)) {
 -              ACPI_EXCEPTION((AE_INFO, status, "Cannot add acpi bus"));
 +      result = acpi_bus_add(&device, pdevice, handle, ACPI_BUS_TYPE_DEVICE);
 +      if (result) {
 +              printk(KERN_WARNING PREFIX "Cannot add acpi bus");
                return -EINVAL;
        }
  
@@@ -242,12 -236,7 +240,12 @@@ static int acpi_memory_enable_device(st
                        num_enabled++;
                        continue;
                }
 -
 +              /*
 +               * If the memory block size is zero, please ignore it.
 +               * Don't try to do the following memory hotplug flowchart.
 +               */
 +              if (!info->length)
 +                      continue;
                if (node < 0)
                        node = memory_add_physaddr_to_nid(info->start_addr);
  
                mem_device->state = MEMORY_INVALID_STATE;
                return -EINVAL;
        }
 -
 -      return result;
 +      /*
 +       * Sometimes the memory device will contain several memory blocks.
 +       * When one memory block is hot-added to the system memory, it will
 +       * be regarded as a success.
 +       * Otherwise if the last memory block can't be hot-added to the system
 +       * memory, it will be failure and the memory device can't be bound with
 +       * driver.
 +       */
 +      return 0;
  }
  
  static int acpi_memory_powerdown_device(struct acpi_memory_device *mem_device)
@@@ -431,28 -413,6 +429,6 @@@ static int acpi_memory_device_add(struc
  
        printk(KERN_DEBUG "%s \n", acpi_device_name(device));
  
-       return result;
- }
- static int acpi_memory_device_remove(struct acpi_device *device, int type)
- {
-       struct acpi_memory_device *mem_device = NULL;
-       if (!device || !acpi_driver_data(device))
-               return -EINVAL;
-       mem_device = acpi_driver_data(device);
-       kfree(mem_device);
-       return 0;
- }
- static int acpi_memory_device_start (struct acpi_device *device)
- {
-       struct acpi_memory_device *mem_device;
-       int result = 0;
        /*
         * Early boot code has recognized memory area by EFI/E820.
         * If DSDT shows these memory devices on boot, hotplug is not necessary
        if (!acpi_hotmem_initialized)
                return 0;
  
-       mem_device = acpi_driver_data(device);
        if (!acpi_memory_check_device(mem_device)) {
                /* call add_memory func */
                result = acpi_memory_enable_device(mem_device);
        return result;
  }
  
+ static int acpi_memory_device_remove(struct acpi_device *device, int type)
+ {
+       struct acpi_memory_device *mem_device = NULL;
+       if (!device || !acpi_driver_data(device))
+               return -EINVAL;
+       mem_device = acpi_driver_data(device);
+       kfree(mem_device);
+       return 0;
+ }
  /*
   * Helper function to check for memory device
   */
@@@ -481,23 -453,26 +469,23 @@@ static acpi_status is_memory_device(acp
  {
        char *hardware_id;
        acpi_status status;
 -      struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
        struct acpi_device_info *info;
  
 -
 -      status = acpi_get_object_info(handle, &buffer);
 +      status = acpi_get_object_info(handle, &info);
        if (ACPI_FAILURE(status))
                return status;
  
 -      info = buffer.pointer;
        if (!(info->valid & ACPI_VALID_HID)) {
 -              kfree(buffer.pointer);
 +              kfree(info);
                return AE_ERROR;
        }
  
 -      hardware_id = info->hardware_id.value;
 +      hardware_id = info->hardware_id.string;
        if ((hardware_id == NULL) ||
            (strcmp(hardware_id, ACPI_MEMORY_DEVICE_HID)))
                status = AE_ERROR;
  
 -      kfree(buffer.pointer);
 +      kfree(info);
        return status;
  }
  
diff --combined drivers/acpi/ec.c
index 5180f0f1dd02ddc1f70d414f9a4b5bbc73baa129,d6bf0578737b7aa4b1215348b6575275be28d0fb..f28619d658f70e58fff7e4b55a0a93353ceb6033
@@@ -47,6 -47,7 +47,6 @@@
  #define ACPI_EC_DEVICE_NAME           "Embedded Controller"
  #define ACPI_EC_FILE_INFO             "info"
  
 -#undef PREFIX
  #define PREFIX                                "ACPI: EC: "
  
  /* EC status register */
@@@ -787,6 -788,42 +787,42 @@@ ec_parse_device(acpi_handle handle, u3
        return AE_CTRL_TERMINATE;
  }
  
+ static int ec_install_handlers(struct acpi_ec *ec)
+ {
+       acpi_status status;
+       if (test_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags))
+               return 0;
+       status = acpi_install_gpe_handler(NULL, ec->gpe,
+                                 ACPI_GPE_EDGE_TRIGGERED,
+                                 &acpi_ec_gpe_handler, ec);
+       if (ACPI_FAILURE(status))
+               return -ENODEV;
+       acpi_set_gpe_type(NULL, ec->gpe, ACPI_GPE_TYPE_RUNTIME);
+       acpi_enable_gpe(NULL, ec->gpe);
+       status = acpi_install_address_space_handler(ec->handle,
+                                                   ACPI_ADR_SPACE_EC,
+                                                   &acpi_ec_space_handler,
+                                                   NULL, ec);
+       if (ACPI_FAILURE(status)) {
+               if (status == AE_NOT_FOUND) {
+                       /*
+                        * Maybe OS fails in evaluating the _REG object.
+                        * The AE_NOT_FOUND error will be ignored and OS
+                        * continue to initialize EC.
+                        */
+                       printk(KERN_ERR "Fail in evaluating the _REG object"
+                               " of EC device. Broken bios is suspected.\n");
+               } else {
+                       acpi_remove_gpe_handler(NULL, ec->gpe,
+                               &acpi_ec_gpe_handler);
+                       return -ENODEV;
+               }
+       }
+       set_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags);
+       return 0;
+ }
  static void ec_remove_handlers(struct acpi_ec *ec)
  {
        if (ACPI_FAILURE(acpi_remove_address_space_handler(ec->handle,
  static int acpi_ec_add(struct acpi_device *device)
  {
        struct acpi_ec *ec = NULL;
+       int ret;
  
-       if (!device)
-               return -EINVAL;
        strcpy(acpi_device_name(device), ACPI_EC_DEVICE_NAME);
        strcpy(acpi_device_class(device), ACPI_EC_CLASS);
  
                          ec->gpe, ec->command_addr, ec->data_addr);
        pr_info(PREFIX "driver started in %s mode\n",
                (test_bit(EC_FLAGS_GPE_MODE, &ec->flags))?"interrupt":"poll");
-       return 0;
+       ret = ec_install_handlers(ec);
+       /* EC is fully operational, allow queries */
+       clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags);
+       return ret;
  }
  
  static int acpi_ec_remove(struct acpi_device *device, int type)
                return -EINVAL;
  
        ec = acpi_driver_data(device);
+       ec_remove_handlers(ec);
        mutex_lock(&ec->lock);
        list_for_each_entry_safe(handler, tmp, &ec->list, node) {
                list_del(&handler->node);
@@@ -887,75 -929,6 +928,6 @@@ ec_parse_io_ports(struct acpi_resource 
        return AE_OK;
  }
  
- static int ec_install_handlers(struct acpi_ec *ec)
- {
-       acpi_status status;
-       if (test_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags))
-               return 0;
-       status = acpi_install_gpe_handler(NULL, ec->gpe,
-                                 ACPI_GPE_EDGE_TRIGGERED,
-                                 &acpi_ec_gpe_handler, ec);
-       if (ACPI_FAILURE(status))
-               return -ENODEV;
-       acpi_set_gpe_type(NULL, ec->gpe, ACPI_GPE_TYPE_RUNTIME);
-       acpi_enable_gpe(NULL, ec->gpe);
-       status = acpi_install_address_space_handler(ec->handle,
-                                                   ACPI_ADR_SPACE_EC,
-                                                   &acpi_ec_space_handler,
-                                                   NULL, ec);
-       if (ACPI_FAILURE(status)) {
-               if (status == AE_NOT_FOUND) {
-                       /*
-                        * Maybe OS fails in evaluating the _REG object.
-                        * The AE_NOT_FOUND error will be ignored and OS
-                        * continue to initialize EC.
-                        */
-                       printk(KERN_ERR "Fail in evaluating the _REG object"
-                               " of EC device. Broken bios is suspected.\n");
-               } else {
-                       acpi_remove_gpe_handler(NULL, ec->gpe,
-                               &acpi_ec_gpe_handler);
-                       return -ENODEV;
-               }
-       }
-       set_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags);
-       return 0;
- }
- static int acpi_ec_start(struct acpi_device *device)
- {
-       struct acpi_ec *ec;
-       int ret = 0;
-       if (!device)
-               return -EINVAL;
-       ec = acpi_driver_data(device);
-       if (!ec)
-               return -EINVAL;
-       ret = ec_install_handlers(ec);
-       /* EC is fully operational, allow queries */
-       clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags);
-       return ret;
- }
- static int acpi_ec_stop(struct acpi_device *device, int type)
- {
-       struct acpi_ec *ec;
-       if (!device)
-               return -EINVAL;
-       ec = acpi_driver_data(device);
-       if (!ec)
-               return -EINVAL;
-       ec_remove_handlers(ec);
-       return 0;
- }
  int __init acpi_boot_ec_enable(void)
  {
        if (!boot_ec || test_bit(EC_FLAGS_HANDLERS_INSTALLED, &boot_ec->flags))
@@@ -1076,8 -1049,6 +1048,6 @@@ static struct acpi_driver acpi_ec_drive
        .ops = {
                .add = acpi_ec_add,
                .remove = acpi_ec_remove,
-               .start = acpi_ec_start,
-               .stop = acpi_ec_stop,
                .suspend = acpi_ec_suspend,
                .resume = acpi_ec_resume,
                },
index b4a1ab297e7b95cdad2a7b0306ee4f812c5de0cd,8014e2a3b261cd124e46e46ad4314ab911e46e3f..b972107a1ef2f28a418c672df2cf27f046af670a
@@@ -59,8 -59,6 +59,8 @@@
  #include <acpi/acpi_drivers.h>
  #include <acpi/processor.h>
  
 +#define PREFIX "ACPI: "
 +
  #define ACPI_PROCESSOR_CLASS          "processor"
  #define ACPI_PROCESSOR_DEVICE_NAME    "Processor"
  #define ACPI_PROCESSOR_FILE_INFO      "info"
@@@ -81,7 -79,6 +81,6 @@@ MODULE_DESCRIPTION("ACPI Processor Driv
  MODULE_LICENSE("GPL");
  
  static int acpi_processor_add(struct acpi_device *device);
- static int acpi_processor_start(struct acpi_device *device);
  static int acpi_processor_remove(struct acpi_device *device, int type);
  static int acpi_processor_info_open_fs(struct inode *inode, struct file *file);
  static void acpi_processor_notify(struct acpi_device *device, u32 event);
@@@ -103,7 -100,6 +102,6 @@@ static struct acpi_driver acpi_processo
        .ops = {
                .add = acpi_processor_add,
                .remove = acpi_processor_remove,
-               .start = acpi_processor_start,
                .suspend = acpi_processor_suspend,
                .resume = acpi_processor_resume,
                .notify = acpi_processor_notify,
@@@ -700,92 -696,6 +698,6 @@@ static int acpi_processor_get_info(stru
  
  static DEFINE_PER_CPU(void *, processor_device_array);
  
- static int __cpuinit acpi_processor_start(struct acpi_device *device)
- {
-       int result = 0;
-       struct acpi_processor *pr;
-       struct sys_device *sysdev;
-       pr = acpi_driver_data(device);
-       result = acpi_processor_get_info(device);
-       if (result) {
-               /* Processor is physically not present */
-               return 0;
-       }
-       BUG_ON((pr->id >= nr_cpu_ids) || (pr->id < 0));
-       /*
-        * Buggy BIOS check
-        * ACPI id of processors can be reported wrongly by the BIOS.
-        * Don't trust it blindly
-        */
-       if (per_cpu(processor_device_array, pr->id) != NULL &&
-           per_cpu(processor_device_array, pr->id) != device) {
-               printk(KERN_WARNING "BIOS reported wrong ACPI id "
-                       "for the processor\n");
-               return -ENODEV;
-       }
-       per_cpu(processor_device_array, pr->id) = device;
-       per_cpu(processors, pr->id) = pr;
-       result = acpi_processor_add_fs(device);
-       if (result)
-               goto end;
-       sysdev = get_cpu_sysdev(pr->id);
-       if (sysfs_create_link(&device->dev.kobj, &sysdev->kobj, "sysdev"))
-               return -EFAULT;
-       /* _PDC call should be done before doing anything else (if reqd.). */
-       arch_acpi_processor_init_pdc(pr);
-       acpi_processor_set_pdc(pr);
-       arch_acpi_processor_cleanup_pdc(pr);
- #ifdef CONFIG_CPU_FREQ
-       acpi_processor_ppc_has_changed(pr);
- #endif
-       acpi_processor_get_throttling_info(pr);
-       acpi_processor_get_limit_info(pr);
-       acpi_processor_power_init(pr, device);
-       pr->cdev = thermal_cooling_device_register("Processor", device,
-                                               &processor_cooling_ops);
-       if (IS_ERR(pr->cdev)) {
-               result = PTR_ERR(pr->cdev);
-               goto end;
-       }
-       dev_info(&device->dev, "registered as cooling_device%d\n",
-                pr->cdev->id);
-       result = sysfs_create_link(&device->dev.kobj,
-                                  &pr->cdev->device.kobj,
-                                  "thermal_cooling");
-       if (result)
-               printk(KERN_ERR PREFIX "Create sysfs link\n");
-       result = sysfs_create_link(&pr->cdev->device.kobj,
-                                  &device->dev.kobj,
-                                  "device");
-       if (result)
-               printk(KERN_ERR PREFIX "Create sysfs link\n");
-       if (pr->flags.throttling) {
-               printk(KERN_INFO PREFIX "%s [%s] (supports",
-                      acpi_device_name(device), acpi_device_bid(device));
-               printk(" %d throttling states", pr->throttling.state_count);
-               printk(")\n");
-       }
-       end:
-       return result;
- }
  static void acpi_processor_notify(struct acpi_device *device, u32 event)
  {
        struct acpi_processor *pr = acpi_driver_data(device);
@@@ -848,10 -758,8 +760,8 @@@ static struct notifier_block acpi_cpu_n
  static int acpi_processor_add(struct acpi_device *device)
  {
        struct acpi_processor *pr = NULL;
-       if (!device)
-               return -EINVAL;
+       int result = 0;
+       struct sys_device *sysdev;
  
        pr = kzalloc(sizeof(struct acpi_processor), GFP_KERNEL);
        if (!pr)
        strcpy(acpi_device_class(device), ACPI_PROCESSOR_CLASS);
        device->driver_data = pr;
  
+       result = acpi_processor_get_info(device);
+       if (result) {
+               /* Processor is physically not present */
+               return 0;
+       }
+       BUG_ON((pr->id >= nr_cpu_ids) || (pr->id < 0));
+       /*
+        * Buggy BIOS check
+        * ACPI id of processors can be reported wrongly by the BIOS.
+        * Don't trust it blindly
+        */
+       if (per_cpu(processor_device_array, pr->id) != NULL &&
+           per_cpu(processor_device_array, pr->id) != device) {
+               printk(KERN_WARNING "BIOS reported wrong ACPI id "
+                       "for the processor\n");
+               result = -ENODEV;
+               goto err_free_cpumask;
+       }
+       per_cpu(processor_device_array, pr->id) = device;
+       per_cpu(processors, pr->id) = pr;
+       result = acpi_processor_add_fs(device);
+       if (result)
+               goto err_free_cpumask;
+       sysdev = get_cpu_sysdev(pr->id);
+       if (sysfs_create_link(&device->dev.kobj, &sysdev->kobj, "sysdev")) {
+               result = -EFAULT;
+               goto err_remove_fs;
+       }
+       /* _PDC call should be done before doing anything else (if reqd.). */
+       arch_acpi_processor_init_pdc(pr);
+       acpi_processor_set_pdc(pr);
+       arch_acpi_processor_cleanup_pdc(pr);
+ #ifdef CONFIG_CPU_FREQ
+       acpi_processor_ppc_has_changed(pr);
+ #endif
+       acpi_processor_get_throttling_info(pr);
+       acpi_processor_get_limit_info(pr);
+       acpi_processor_power_init(pr, device);
+       pr->cdev = thermal_cooling_device_register("Processor", device,
+                                               &processor_cooling_ops);
+       if (IS_ERR(pr->cdev)) {
+               result = PTR_ERR(pr->cdev);
+               goto err_power_exit;
+       }
+       dev_info(&device->dev, "registered as cooling_device%d\n",
+                pr->cdev->id);
+       result = sysfs_create_link(&device->dev.kobj,
+                                  &pr->cdev->device.kobj,
+                                  "thermal_cooling");
+       if (result) {
+               printk(KERN_ERR PREFIX "Create sysfs link\n");
+               goto err_thermal_unregister;
+       }
+       result = sysfs_create_link(&pr->cdev->device.kobj,
+                                  &device->dev.kobj,
+                                  "device");
+       if (result) {
+               printk(KERN_ERR PREFIX "Create sysfs link\n");
+               goto err_remove_sysfs;
+       }
+       if (pr->flags.throttling) {
+               printk(KERN_INFO PREFIX "%s [%s] (supports",
+                      acpi_device_name(device), acpi_device_bid(device));
+               printk(" %d throttling states", pr->throttling.state_count);
+               printk(")\n");
+       }
        return 0;
+ err_remove_sysfs:
+       sysfs_remove_link(&device->dev.kobj, "thermal_cooling");
+ err_thermal_unregister:
+       thermal_cooling_device_unregister(pr->cdev);
+ err_power_exit:
+       acpi_processor_power_exit(pr, device);
+ err_remove_fs:
+       acpi_processor_remove_fs(device);
+ err_free_cpumask:
+       free_cpumask_var(pr->throttling.shared_cpu_map);
+       return result;
  }
  
  static int acpi_processor_remove(struct acpi_device *device, int type)
@@@ -944,7 -945,6 +947,6 @@@ int acpi_processor_device_add(acpi_hand
  {
        acpi_handle phandle;
        struct acpi_device *pdev;
-       struct acpi_processor *pr;
  
  
        if (acpi_get_parent(handle, &phandle)) {
                return -ENODEV;
        }
  
-       acpi_bus_start(*device);
-       pr = acpi_driver_data(*device);
-       if (!pr)
-               return -ENODEV;
-       if ((pr->id >= 0) && (pr->id < nr_cpu_ids)) {
-               kobject_uevent(&(*device)->dev.kobj, KOBJ_ONLINE);
-       }
        return 0;
  }
  
@@@ -997,25 -988,6 +990,6 @@@ static void __ref acpi_processor_hotplu
                                            "Unable to add the device\n");
                        break;
                }
-               pr = acpi_driver_data(device);
-               if (!pr) {
-                       printk(KERN_ERR PREFIX "Driver data is NULL\n");
-                       break;
-               }
-               if (pr->id >= 0 && (pr->id < nr_cpu_ids)) {
-                       kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE);
-                       break;
-               }
-               result = acpi_processor_start(device);
-               if ((!result) && ((pr->id >= 0) && (pr->id < nr_cpu_ids))) {
-                       kobject_uevent(&device->dev.kobj, KOBJ_ONLINE);
-               } else {
-                       printk(KERN_ERR PREFIX "Device [%s] failed to start\n",
-                                   acpi_device_bid(device));
-               }
                break;
        case ACPI_NOTIFY_EJECT_REQUEST:
                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
                                    "Driver data is NULL, dropping EJECT\n");
                        return;
                }
-               if ((pr->id < nr_cpu_ids) && (cpu_present(pr->id)))
-                       kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE);
                break;
        default:
                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
@@@ -1153,9 -1122,6 +1124,9 @@@ static int __init acpi_processor_init(v
  {
        int result = 0;
  
 +      if (acpi_disabled)
 +              return 0;
 +
        memset(&errata, 0, sizeof(errata));
  
  #ifdef CONFIG_SMP
@@@ -1202,9 -1168,6 +1173,9 @@@ out_proc
  
  static void __exit acpi_processor_exit(void)
  {
 +      if (acpi_disabled)
 +              return;
 +
        acpi_processor_ppc_exit();
  
        acpi_thermal_cpufreq_exit();
diff --combined drivers/acpi/scan.c
index 297d8b94fbbc53c9fa75359eb4c934a08c92d68e,4a89f081160f255060298dbc1f6a865b2ca5f759..7b90900b2118ccb2f85387e3640d471f4feca7b7
@@@ -60,13 -60,13 +60,13 @@@ static int create_modalias(struct acpi_
        }
  
        if (acpi_dev->flags.compatible_ids) {
 -              struct acpi_compatible_id_list *cid_list;
 +              struct acpica_device_id_list *cid_list;
                int i;
  
                cid_list = acpi_dev->pnp.cid_list;
                for (i = 0; i < cid_list->count; i++) {
                        count = snprintf(&modalias[len], size, "%s:",
 -                                       cid_list->id[i].value);
 +                                       cid_list->ids[i].string);
                        if (count < 0 || count >= size) {
                                printk(KERN_ERR PREFIX "%s cid[%i] exceeds event buffer size",
                                       acpi_dev->pnp.device_name, i);
@@@ -287,14 -287,14 +287,14 @@@ int acpi_match_device_ids(struct acpi_d
        }
  
        if (device->flags.compatible_ids) {
 -              struct acpi_compatible_id_list *cid_list = device->pnp.cid_list;
 +              struct acpica_device_id_list *cid_list = device->pnp.cid_list;
                int i;
  
                for (id = ids; id->id[0]; id++) {
                        /* compare multiple _CID entries against driver ids */
                        for (i = 0; i < cid_list->count; i++) {
                                if (!strcmp((char*)id->id,
 -                                          cid_list->id[i].value))
 +                                          cid_list->ids[i].string))
                                        return 0;
                        }
                }
@@@ -309,10 -309,6 +309,10 @@@ static void acpi_device_release(struct 
        struct acpi_device *acpi_dev = to_acpi_device(dev);
  
        kfree(acpi_dev->pnp.cid_list);
 +      if (acpi_dev->flags.hardware_id)
 +              kfree(acpi_dev->pnp.hardware_id);
 +      if (acpi_dev->flags.unique_id)
 +              kfree(acpi_dev->pnp.unique_id);
        kfree(acpi_dev);
  }
  
@@@ -430,9 -426,6 +430,6 @@@ static int acpi_device_probe(struct dev
                if (acpi_drv->ops.notify) {
                        ret = acpi_device_install_notify_handler(acpi_dev);
                        if (ret) {
-                               if (acpi_drv->ops.stop)
-                                       acpi_drv->ops.stop(acpi_dev,
-                                                  acpi_dev->removal_type);
                                if (acpi_drv->ops.remove)
                                        acpi_drv->ops.remove(acpi_dev,
                                                     acpi_dev->removal_type);
@@@ -456,8 -449,6 +453,6 @@@ static int acpi_device_remove(struct de
        if (acpi_drv) {
                if (acpi_drv->ops.notify)
                        acpi_device_remove_notify_handler(acpi_dev);
-               if (acpi_drv->ops.stop)
-                       acpi_drv->ops.stop(acpi_dev, acpi_dev->removal_type);
                if (acpi_drv->ops.remove)
                        acpi_drv->ops.remove(acpi_dev, acpi_dev->removal_type);
        }
@@@ -691,7 -682,7 +686,7 @@@ acpi_bus_get_ejd(acpi_handle handle, ac
  }
  EXPORT_SYMBOL_GPL(acpi_bus_get_ejd);
  
 -void acpi_bus_data_handler(acpi_handle handle, u32 function, void *context)
 +void acpi_bus_data_handler(acpi_handle handle, void *context)
  {
  
        /* TBD */
@@@ -785,7 -776,6 +780,7 @@@ static int acpi_bus_get_wakeup_device_f
        kfree(buffer.pointer);
  
        device->wakeup.flags.valid = 1;
 +      device->wakeup.prepare_count = 0;
        /* Call _PSW/_DSW object to disable its ability to wake the sleeping
         * system for the ACPI device with the _PRW object.
         * The _PSW object is depreciated in ACPI 3.0 and is replaced by _DSW.
@@@ -1004,89 -994,33 +999,89 @@@ static int acpi_dock_match(struct acpi_
        return acpi_get_handle(device->handle, "_DCK", &tmp);
  }
  
 +static struct acpica_device_id_list*
 +acpi_add_cid(
 +      struct acpi_device_info         *info,
 +      struct acpica_device_id         *new_cid)
 +{
 +      struct acpica_device_id_list    *cid;
 +      char                            *next_id_string;
 +      acpi_size                       cid_length;
 +      acpi_size                       new_cid_length;
 +      u32                             i;
 +
 +
 +      /* Allocate new CID list with room for the new CID */
 +
 +      if (!new_cid)
 +              new_cid_length = info->compatible_id_list.list_size;
 +      else if (info->compatible_id_list.list_size)
 +              new_cid_length = info->compatible_id_list.list_size +
 +                      new_cid->length + sizeof(struct acpica_device_id);
 +      else
 +              new_cid_length = sizeof(struct acpica_device_id_list) + new_cid->length;
 +
 +      cid = ACPI_ALLOCATE_ZEROED(new_cid_length);
 +      if (!cid) {
 +              return NULL;
 +      }
 +
 +      cid->list_size = new_cid_length;
 +      cid->count = info->compatible_id_list.count;
 +      if (new_cid)
 +              cid->count++;
 +      next_id_string = (char *) cid->ids + (cid->count * sizeof(struct acpica_device_id));
 +
 +      /* Copy all existing CIDs */
 +
 +      for (i = 0; i < info->compatible_id_list.count; i++) {
 +              cid_length = info->compatible_id_list.ids[i].length;
 +              cid->ids[i].string = next_id_string;
 +              cid->ids[i].length = cid_length;
 +
 +              ACPI_MEMCPY(next_id_string, info->compatible_id_list.ids[i].string,
 +                      cid_length);
 +
 +              next_id_string += cid_length;
 +      }
 +
 +      /* Append the new CID */
 +
 +      if (new_cid) {
 +              cid->ids[i].string = next_id_string;
 +              cid->ids[i].length = new_cid->length;
 +
 +              ACPI_MEMCPY(next_id_string, new_cid->string, new_cid->length);
 +      }
 +
 +      return cid;
 +}
 +
  static void acpi_device_set_id(struct acpi_device *device,
                               struct acpi_device *parent, acpi_handle handle,
                               int type)
  {
 -      struct acpi_device_info *info;
 -      struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
 +      struct acpi_device_info *info = NULL;
        char *hid = NULL;
        char *uid = NULL;
 -      struct acpi_compatible_id_list *cid_list = NULL;
 -      const char *cid_add = NULL;
 +      struct acpica_device_id_list *cid_list = NULL;
 +      char *cid_add = NULL;
        acpi_status status;
  
        switch (type) {
        case ACPI_BUS_TYPE_DEVICE:
 -              status = acpi_get_object_info(handle, &buffer);
 +              status = acpi_get_object_info(handle, &info);
                if (ACPI_FAILURE(status)) {
                        printk(KERN_ERR PREFIX "%s: Error reading device info\n", __func__);
                        return;
                }
  
 -              info = buffer.pointer;
                if (info->valid & ACPI_VALID_HID)
 -                      hid = info->hardware_id.value;
 +                      hid = info->hardware_id.string;
                if (info->valid & ACPI_VALID_UID)
 -                      uid = info->unique_id.value;
 +                      uid = info->unique_id.string;
                if (info->valid & ACPI_VALID_CID)
 -                      cid_list = &info->compatibility_id;
 +                      cid_list = &info->compatible_id_list;
                if (info->valid & ACPI_VALID_ADR) {
                        device->pnp.bus_address = info->address;
                        device->flags.bus_address = 1;
        }
  
        if (hid) {
 -              strcpy(device->pnp.hardware_id, hid);
 -              device->flags.hardware_id = 1;
 +              device->pnp.hardware_id = ACPI_ALLOCATE_ZEROED(strlen (hid) + 1);
 +              if (device->pnp.hardware_id) {
 +                      strcpy(device->pnp.hardware_id, hid);
 +                      device->flags.hardware_id = 1;
 +              }
        }
 +      if (!device->flags.hardware_id)
 +              device->pnp.hardware_id = "";
 +
        if (uid) {
 -              strcpy(device->pnp.unique_id, uid);
 -              device->flags.unique_id = 1;
 +              device->pnp.unique_id = ACPI_ALLOCATE_ZEROED(strlen (uid) + 1);
 +              if (device->pnp.unique_id) {
 +                      strcpy(device->pnp.unique_id, uid);
 +                      device->flags.unique_id = 1;
 +              }
        }
 +      if (!device->flags.unique_id)
 +              device->pnp.unique_id = "";
 +
        if (cid_list || cid_add) {
 -              struct  acpi_compatible_id_list *list;
 -              int size = 0;
 -              int count = 0;
 -
 -              if (cid_list) {
 -                      size = cid_list->size;
 -              } else if (cid_add) {
 -                      size = sizeof(struct acpi_compatible_id_list);
 -                      cid_list = ACPI_ALLOCATE_ZEROED((acpi_size) size);
 -                      if (!cid_list) {
 -                              printk(KERN_ERR "Memory allocation error\n");
 -                              kfree(buffer.pointer);
 -                              return;
 -                      } else {
 -                              cid_list->count = 0;
 -                              cid_list->size = size;
 -                      }
 +              struct acpica_device_id_list *list;
 +
 +              if (cid_add) {
 +                      struct acpica_device_id cid;
 +                      cid.length = strlen (cid_add) + 1;
 +                      cid.string = cid_add;
 +
 +                      list = acpi_add_cid(info, &cid);
 +              } else {
 +                      list = acpi_add_cid(info, NULL);
                }
 -              if (cid_add)
 -                      size += sizeof(struct acpi_compatible_id);
 -              list = kmalloc(size, GFP_KERNEL);
  
                if (list) {
 -                      if (cid_list) {
 -                              memcpy(list, cid_list, cid_list->size);
 -                              count = cid_list->count;
 -                      }
 -                      if (cid_add) {
 -                              strncpy(list->id[count].value, cid_add,
 -                                      ACPI_MAX_CID_LENGTH);
 -                              count++;
 -                              device->flags.compatible_ids = 1;
 -                      }
 -                      list->size = size;
 -                      list->count = count;
                        device->pnp.cid_list = list;
 -              } else
 -                      printk(KERN_ERR PREFIX "Memory allocation error\n");
 +                      if (cid_add)
 +                              device->flags.compatible_ids = 1;
 +              }
        }
  
 -      kfree(buffer.pointer);
 +      kfree(info);
  }
  
  static int acpi_device_set_context(struct acpi_device *device, int type)
@@@ -1315,6 -1258,16 +1310,6 @@@ acpi_add_single_object(struct acpi_devi
         */
        acpi_device_set_id(device, parent, handle, type);
  
 -      /*
 -       * The ACPI device is attached to acpi handle before getting
 -       * the power/wakeup/peformance flags. Otherwise OS can't get
 -       * the corresponding ACPI device by the acpi handle in the course
 -       * of getting the power/wakeup/performance flags.
 -       */
 -      result = acpi_device_set_context(device, type);
 -      if (result)
 -              goto end;
 -
        /*
         * Power Management
         * ----------------
                        goto end;
        }
  
 +      if ((result = acpi_device_set_context(device, type)))
 +              goto end;
  
        result = acpi_device_register(device, parent);
  
  end:
        if (!result)
                *child = device;
 -      else {
 -              kfree(device->pnp.cid_list);
 -              kfree(device);
 -      }
 +      else
 +              acpi_device_release(&device->dev);
  
        return result;
  }
diff --combined include/acpi/acpi_bus.h
index af5905eca06f4cc70b7369f0afe1ecd1b6a94b30,79a6c5ebe9084bdf741169401246d042e59fe6c8..89bbb2aeabbd05cd337b6e57cfc5c44b7610be44
@@@ -30,6 -30,8 +30,6 @@@
  
  #include <acpi/acpi.h>
  
 -#define PREFIX                        "ACPI: "
 -
  /* TBD: Make dynamic */
  #define ACPI_MAX_HANDLES      10
  struct acpi_handle_list {
@@@ -87,7 -89,6 +87,6 @@@ struct acpi_device
  typedef int (*acpi_op_add) (struct acpi_device * device);
  typedef int (*acpi_op_remove) (struct acpi_device * device, int type);
  typedef int (*acpi_op_start) (struct acpi_device * device);
- typedef int (*acpi_op_stop) (struct acpi_device * device, int type);
  typedef int (*acpi_op_suspend) (struct acpi_device * device,
                                pm_message_t state);
  typedef int (*acpi_op_resume) (struct acpi_device * device);
@@@ -104,7 -105,6 +103,6 @@@ struct acpi_device_ops 
        acpi_op_add add;
        acpi_op_remove remove;
        acpi_op_start start;
-       acpi_op_stop stop;
        acpi_op_suspend suspend;
        acpi_op_resume resume;
        acpi_op_bind bind;
@@@ -171,15 -171,17 +169,15 @@@ struct acpi_device_dir 
  
  typedef char acpi_bus_id[8];
  typedef unsigned long acpi_bus_address;
 -typedef char acpi_hardware_id[15];
 -typedef char acpi_unique_id[9];
  typedef char acpi_device_name[40];
  typedef char acpi_device_class[20];
  
  struct acpi_device_pnp {
        acpi_bus_id bus_id;     /* Object name */
        acpi_bus_address bus_address;   /* _ADR */
 -      acpi_hardware_id hardware_id;   /* _HID */
 -      struct acpi_compatible_id_list *cid_list;       /* _CIDs */
 -      acpi_unique_id unique_id;       /* _UID */
 +      char *hardware_id;      /* _HID */
 +      struct acpica_device_id_list *cid_list; /* _CIDs */
 +      char *unique_id;        /* _UID */
        acpi_device_name device_name;   /* Driver-determined */
        acpi_device_class device_class; /*        "          */
  };
@@@ -244,6 -246,7 +242,6 @@@ struct acpi_device_perf 
  /* Wakeup Management */
  struct acpi_device_wakeup_flags {
        u8 valid:1;             /* Can successfully enable wakeup? */
 -      u8 prepared:1;          /* Has the wake-up capability been enabled? */
        u8 run_wake:1;          /* Run-Wake GPE devices */
  };
  
@@@ -258,7 -261,6 +256,7 @@@ struct acpi_device_wakeup 
        struct acpi_handle_list resources;
        struct acpi_device_wakeup_state state;
        struct acpi_device_wakeup_flags flags;
 +      int prepare_count;
  };
  
  /* Device */
@@@ -310,7 -312,7 +308,7 @@@ struct acpi_bus_event 
  
  extern struct kobject *acpi_kobj;
  extern int acpi_bus_generate_netlink_event(const char*, const char*, u8, int);
 -void acpi_bus_private_data_handler(acpi_handle, u32, void *);
 +void acpi_bus_private_data_handler(acpi_handle, void *);
  int acpi_bus_get_private_data(acpi_handle, void **);
  extern int acpi_notifier_call_chain(struct acpi_device *, u32, u32);
  extern int register_acpi_notifier(struct notifier_block *);
@@@ -323,7 -325,7 +321,7 @@@ extern void unregister_acpi_bus_notifie
   */
  
  int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device);
 -void acpi_bus_data_handler(acpi_handle handle, u32 function, void *context);
 +void acpi_bus_data_handler(acpi_handle handle, void *context);
  int acpi_bus_get_status(struct acpi_device *device);
  int acpi_bus_get_power(acpi_handle handle, int *state);
  int acpi_bus_set_power(acpi_handle handle, int state);
@@@ -365,26 -367,10 +363,26 @@@ int register_acpi_bus_type(struct acpi_
  int unregister_acpi_bus_type(struct acpi_bus_type *);
  struct device *acpi_get_physical_device(acpi_handle);
  
 +struct acpi_pci_root {
 +      struct list_head node;
 +      struct acpi_device * device;
 +      struct acpi_pci_id id;
 +      struct pci_bus *bus;
 +      u16 segment;
 +      u8 bus_nr;
 +
 +      u32 osc_support_set;    /* _OSC state of support bits */
 +      u32 osc_control_set;    /* _OSC state of control bits */
 +      u32 osc_control_qry;    /* the latest _OSC query result */
 +
 +      u32 osc_queried:1;      /* has _OSC control been queried? */
 +};
 +
  /* helper */
  acpi_handle acpi_get_child(acpi_handle, acpi_integer);
  int acpi_is_root_bridge(acpi_handle);
  acpi_handle acpi_get_pci_rootbridge_handle(unsigned int, unsigned int);
 +struct acpi_pci_root *acpi_pci_find_root(acpi_handle handle);
  #define DEVICE_ACPI_HANDLE(dev) ((acpi_handle)((dev)->archdata.acpi_handle))
  
  #ifdef CONFIG_PM_SLEEP
This page took 0.152205 seconds and 4 git commands to generate.