diff options
-rw-r--r-- | drivers/acpi/device_pm.c | 56 | ||||
-rw-r--r-- | drivers/acpi/internal.h | 1 | ||||
-rw-r--r-- | drivers/acpi/power.c | 219 | ||||
-rw-r--r-- | drivers/acpi/scan.c | 8 | ||||
-rw-r--r-- | drivers/ata/libata-acpi.c | 18 | ||||
-rw-r--r-- | drivers/pci/pci-acpi.c | 2 | ||||
-rw-r--r-- | include/acpi/acpi_bus.h | 9 |
7 files changed, 158 insertions, 155 deletions
diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c index 995019063f64..8be4b29e38aa 100644 --- a/drivers/acpi/device_pm.c +++ b/drivers/acpi/device_pm.c | |||
@@ -665,3 +665,59 @@ void acpi_dev_pm_detach(struct device *dev, bool power_off) | |||
665 | } | 665 | } |
666 | } | 666 | } |
667 | EXPORT_SYMBOL_GPL(acpi_dev_pm_detach); | 667 | EXPORT_SYMBOL_GPL(acpi_dev_pm_detach); |
668 | |||
669 | /** | ||
670 | * acpi_dev_pm_add_dependent - Add physical device depending for PM. | ||
671 | * @handle: Handle of ACPI device node. | ||
672 | * @depdev: Device depending on that node for PM. | ||
673 | */ | ||
674 | void acpi_dev_pm_add_dependent(acpi_handle handle, struct device *depdev) | ||
675 | { | ||
676 | struct acpi_device_physical_node *dep; | ||
677 | struct acpi_device *adev; | ||
678 | |||
679 | if (!depdev || acpi_bus_get_device(handle, &adev)) | ||
680 | return; | ||
681 | |||
682 | mutex_lock(&adev->physical_node_lock); | ||
683 | |||
684 | list_for_each_entry(dep, &adev->power_dependent, node) | ||
685 | if (dep->dev == depdev) | ||
686 | goto out; | ||
687 | |||
688 | dep = kzalloc(sizeof(*dep), GFP_KERNEL); | ||
689 | if (dep) { | ||
690 | dep->dev = depdev; | ||
691 | list_add_tail(&dep->node, &adev->power_dependent); | ||
692 | } | ||
693 | |||
694 | out: | ||
695 | mutex_unlock(&adev->physical_node_lock); | ||
696 | } | ||
697 | EXPORT_SYMBOL_GPL(acpi_dev_pm_add_dependent); | ||
698 | |||
699 | /** | ||
700 | * acpi_dev_pm_remove_dependent - Remove physical device depending for PM. | ||
701 | * @handle: Handle of ACPI device node. | ||
702 | * @depdev: Device depending on that node for PM. | ||
703 | */ | ||
704 | void acpi_dev_pm_remove_dependent(acpi_handle handle, struct device *depdev) | ||
705 | { | ||
706 | struct acpi_device_physical_node *dep; | ||
707 | struct acpi_device *adev; | ||
708 | |||
709 | if (!depdev || acpi_bus_get_device(handle, &adev)) | ||
710 | return; | ||
711 | |||
712 | mutex_lock(&adev->physical_node_lock); | ||
713 | |||
714 | list_for_each_entry(dep, &adev->power_dependent, node) | ||
715 | if (dep->dev == depdev) { | ||
716 | list_del(&dep->node); | ||
717 | kfree(dep); | ||
718 | break; | ||
719 | } | ||
720 | |||
721 | mutex_unlock(&adev->physical_node_lock); | ||
722 | } | ||
723 | EXPORT_SYMBOL_GPL(acpi_dev_pm_remove_dependent); | ||
diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h index e050254ae143..b79b4258bd6b 100644 --- a/drivers/acpi/internal.h +++ b/drivers/acpi/internal.h | |||
@@ -38,6 +38,7 @@ static inline void acpi_debugfs_init(void) { return; } | |||
38 | Power Resource | 38 | Power Resource |
39 | -------------------------------------------------------------------------- */ | 39 | -------------------------------------------------------------------------- */ |
40 | int acpi_power_init(void); | 40 | int acpi_power_init(void); |
41 | void acpi_power_add_remove_device(struct acpi_device *adev, bool add); | ||
41 | int acpi_device_sleep_wake(struct acpi_device *dev, | 42 | int acpi_device_sleep_wake(struct acpi_device *dev, |
42 | int enable, int sleep_state, int dev_state); | 43 | int enable, int sleep_state, int dev_state); |
43 | int acpi_power_get_inferred_state(struct acpi_device *device, int *state); | 44 | int acpi_power_get_inferred_state(struct acpi_device *device, int *state); |
diff --git a/drivers/acpi/power.c b/drivers/acpi/power.c index 6e7b9d523812..659386c4f0cb 100644 --- a/drivers/acpi/power.c +++ b/drivers/acpi/power.c | |||
@@ -83,31 +83,20 @@ static struct acpi_driver acpi_power_driver = { | |||
83 | .drv.pm = &acpi_power_pm, | 83 | .drv.pm = &acpi_power_pm, |
84 | }; | 84 | }; |
85 | 85 | ||
86 | /* | 86 | struct acpi_power_dependent_device { |
87 | * A power managed device | 87 | struct list_head node; |
88 | * A device may rely on multiple power resources. | 88 | struct acpi_device *adev; |
89 | * */ | 89 | struct work_struct work; |
90 | struct acpi_power_managed_device { | ||
91 | struct device *dev; /* The physical device */ | ||
92 | acpi_handle *handle; | ||
93 | }; | ||
94 | |||
95 | struct acpi_power_resource_device { | ||
96 | struct acpi_power_managed_device *device; | ||
97 | struct acpi_power_resource_device *next; | ||
98 | }; | 90 | }; |
99 | 91 | ||
100 | struct acpi_power_resource { | 92 | struct acpi_power_resource { |
101 | struct acpi_device * device; | 93 | struct acpi_device *device; |
94 | struct list_head dependent; | ||
102 | acpi_bus_id name; | 95 | acpi_bus_id name; |
103 | u32 system_level; | 96 | u32 system_level; |
104 | u32 order; | 97 | u32 order; |
105 | unsigned int ref_count; | 98 | unsigned int ref_count; |
106 | struct mutex resource_lock; | 99 | struct mutex resource_lock; |
107 | |||
108 | /* List of devices relying on this power resource */ | ||
109 | struct acpi_power_resource_device *devices; | ||
110 | struct mutex devices_lock; | ||
111 | }; | 100 | }; |
112 | 101 | ||
113 | static struct list_head acpi_power_resource_list; | 102 | static struct list_head acpi_power_resource_list; |
@@ -207,21 +196,30 @@ static int acpi_power_get_list_state(struct acpi_handle_list *list, int *state) | |||
207 | return 0; | 196 | return 0; |
208 | } | 197 | } |
209 | 198 | ||
210 | /* Resume the device when all power resources in _PR0 are on */ | 199 | static void acpi_power_resume_dependent(struct work_struct *work) |
211 | static void acpi_power_on_device(struct acpi_power_managed_device *device) | ||
212 | { | 200 | { |
213 | struct acpi_device *acpi_dev; | 201 | struct acpi_power_dependent_device *dep; |
214 | acpi_handle handle = device->handle; | 202 | struct acpi_device_physical_node *pn; |
203 | struct acpi_device *adev; | ||
215 | int state; | 204 | int state; |
216 | 205 | ||
217 | if (acpi_bus_get_device(handle, &acpi_dev)) | 206 | dep = container_of(work, struct acpi_power_dependent_device, work); |
207 | adev = dep->adev; | ||
208 | if (acpi_power_get_inferred_state(adev, &state)) | ||
218 | return; | 209 | return; |
219 | 210 | ||
220 | if(acpi_power_get_inferred_state(acpi_dev, &state)) | 211 | if (state > ACPI_STATE_D0) |
221 | return; | 212 | return; |
222 | 213 | ||
223 | if (state == ACPI_STATE_D0 && pm_runtime_suspended(device->dev)) | 214 | mutex_lock(&adev->physical_node_lock); |
224 | pm_request_resume(device->dev); | 215 | |
216 | list_for_each_entry(pn, &adev->physical_node_list, node) | ||
217 | pm_request_resume(pn->dev); | ||
218 | |||
219 | list_for_each_entry(pn, &adev->power_dependent, node) | ||
220 | pm_request_resume(pn->dev); | ||
221 | |||
222 | mutex_unlock(&adev->physical_node_lock); | ||
225 | } | 223 | } |
226 | 224 | ||
227 | static int __acpi_power_on(struct acpi_power_resource *resource) | 225 | static int __acpi_power_on(struct acpi_power_resource *resource) |
@@ -244,9 +242,7 @@ static int __acpi_power_on(struct acpi_power_resource *resource) | |||
244 | static int acpi_power_on(acpi_handle handle) | 242 | static int acpi_power_on(acpi_handle handle) |
245 | { | 243 | { |
246 | int result = 0; | 244 | int result = 0; |
247 | bool resume_device = false; | ||
248 | struct acpi_power_resource *resource = NULL; | 245 | struct acpi_power_resource *resource = NULL; |
249 | struct acpi_power_resource_device *device_list; | ||
250 | 246 | ||
251 | result = acpi_power_get_context(handle, &resource); | 247 | result = acpi_power_get_context(handle, &resource); |
252 | if (result) | 248 | if (result) |
@@ -260,26 +256,17 @@ static int acpi_power_on(acpi_handle handle) | |||
260 | resource->name)); | 256 | resource->name)); |
261 | } else { | 257 | } else { |
262 | result = __acpi_power_on(resource); | 258 | result = __acpi_power_on(resource); |
263 | if (result) | 259 | if (result) { |
264 | resource->ref_count--; | 260 | resource->ref_count--; |
265 | else | 261 | } else { |
266 | resume_device = true; | 262 | struct acpi_power_dependent_device *dep; |
267 | } | ||
268 | 263 | ||
269 | mutex_unlock(&resource->resource_lock); | 264 | list_for_each_entry(dep, &resource->dependent, node) |
270 | 265 | schedule_work(&dep->work); | |
271 | if (!resume_device) | 266 | } |
272 | return result; | ||
273 | |||
274 | mutex_lock(&resource->devices_lock); | ||
275 | |||
276 | device_list = resource->devices; | ||
277 | while (device_list) { | ||
278 | acpi_power_on_device(device_list->device); | ||
279 | device_list = device_list->next; | ||
280 | } | 267 | } |
281 | 268 | ||
282 | mutex_unlock(&resource->devices_lock); | 269 | mutex_unlock(&resource->resource_lock); |
283 | 270 | ||
284 | return result; | 271 | return result; |
285 | } | 272 | } |
@@ -357,119 +344,81 @@ static int acpi_power_on_list(struct acpi_handle_list *list) | |||
357 | return result; | 344 | return result; |
358 | } | 345 | } |
359 | 346 | ||
360 | static void __acpi_power_resource_unregister_device(struct device *dev, | 347 | static void acpi_power_add_dependent(acpi_handle rhandle, |
361 | acpi_handle res_handle) | 348 | struct acpi_device *adev) |
362 | { | 349 | { |
363 | struct acpi_power_resource *resource = NULL; | 350 | struct acpi_power_dependent_device *dep; |
364 | struct acpi_power_resource_device *prev, *curr; | 351 | struct acpi_power_resource *resource; |
365 | 352 | ||
366 | if (acpi_power_get_context(res_handle, &resource)) | 353 | if (!rhandle || !adev || acpi_power_get_context(rhandle, &resource)) |
367 | return; | 354 | return; |
368 | 355 | ||
369 | mutex_lock(&resource->devices_lock); | 356 | mutex_lock(&resource->resource_lock); |
370 | prev = NULL; | ||
371 | curr = resource->devices; | ||
372 | while (curr) { | ||
373 | if (curr->device->dev == dev) { | ||
374 | if (!prev) | ||
375 | resource->devices = curr->next; | ||
376 | else | ||
377 | prev->next = curr->next; | ||
378 | |||
379 | kfree(curr); | ||
380 | break; | ||
381 | } | ||
382 | |||
383 | prev = curr; | ||
384 | curr = curr->next; | ||
385 | } | ||
386 | mutex_unlock(&resource->devices_lock); | ||
387 | } | ||
388 | |||
389 | /* Unlink dev from all power resources in _PR0 */ | ||
390 | void acpi_power_resource_unregister_device(struct device *dev, acpi_handle handle) | ||
391 | { | ||
392 | struct acpi_device *acpi_dev; | ||
393 | struct acpi_handle_list *list; | ||
394 | int i; | ||
395 | 357 | ||
396 | if (!dev || !handle) | 358 | list_for_each_entry(dep, &resource->dependent, node) |
397 | return; | 359 | if (dep->adev == adev) |
360 | goto out; | ||
398 | 361 | ||
399 | if (acpi_bus_get_device(handle, &acpi_dev)) | 362 | dep = kzalloc(sizeof(*dep), GFP_KERNEL); |
400 | return; | 363 | if (!dep) |
364 | goto out; | ||
401 | 365 | ||
402 | list = &acpi_dev->power.states[ACPI_STATE_D0].resources; | 366 | dep->adev = adev; |
367 | INIT_WORK(&dep->work, acpi_power_resume_dependent); | ||
368 | list_add_tail(&dep->node, &resource->dependent); | ||
403 | 369 | ||
404 | for (i = 0; i < list->count; i++) | 370 | out: |
405 | __acpi_power_resource_unregister_device(dev, | 371 | mutex_unlock(&resource->resource_lock); |
406 | list->handles[i]); | ||
407 | } | 372 | } |
408 | EXPORT_SYMBOL_GPL(acpi_power_resource_unregister_device); | ||
409 | 373 | ||
410 | static int __acpi_power_resource_register_device( | 374 | static void acpi_power_remove_dependent(acpi_handle rhandle, |
411 | struct acpi_power_managed_device *powered_device, acpi_handle handle) | 375 | struct acpi_device *adev) |
412 | { | 376 | { |
413 | struct acpi_power_resource *resource = NULL; | 377 | struct acpi_power_dependent_device *dep; |
414 | struct acpi_power_resource_device *power_resource_device; | 378 | struct acpi_power_resource *resource; |
415 | int result; | 379 | struct work_struct *work = NULL; |
416 | 380 | ||
417 | result = acpi_power_get_context(handle, &resource); | 381 | if (!rhandle || !adev || acpi_power_get_context(rhandle, &resource)) |
418 | if (result) | 382 | return; |
419 | return result; | ||
420 | 383 | ||
421 | power_resource_device = kzalloc( | 384 | mutex_lock(&resource->resource_lock); |
422 | sizeof(*power_resource_device), GFP_KERNEL); | ||
423 | if (!power_resource_device) | ||
424 | return -ENOMEM; | ||
425 | 385 | ||
426 | power_resource_device->device = powered_device; | 386 | list_for_each_entry(dep, &resource->dependent, node) |
387 | if (dep->adev == adev) { | ||
388 | list_del(&dep->node); | ||
389 | work = &dep->work; | ||
390 | break; | ||
391 | } | ||
427 | 392 | ||
428 | mutex_lock(&resource->devices_lock); | 393 | mutex_unlock(&resource->resource_lock); |
429 | power_resource_device->next = resource->devices; | ||
430 | resource->devices = power_resource_device; | ||
431 | mutex_unlock(&resource->devices_lock); | ||
432 | 394 | ||
433 | return 0; | 395 | if (work) { |
396 | cancel_work_sync(work); | ||
397 | kfree(dep); | ||
398 | } | ||
434 | } | 399 | } |
435 | 400 | ||
436 | /* Link dev to all power resources in _PR0 */ | 401 | void acpi_power_add_remove_device(struct acpi_device *adev, bool add) |
437 | int acpi_power_resource_register_device(struct device *dev, acpi_handle handle) | ||
438 | { | 402 | { |
439 | struct acpi_device *acpi_dev; | 403 | if (adev->power.flags.power_resources) { |
440 | struct acpi_handle_list *list; | 404 | struct acpi_device_power_state *ps; |
441 | struct acpi_power_managed_device *powered_device; | 405 | int j; |
442 | int i, ret; | ||
443 | 406 | ||
444 | if (!dev || !handle) | 407 | ps = &adev->power.states[ACPI_STATE_D0]; |
445 | return -ENODEV; | 408 | for (j = 0; j < ps->resources.count; j++) { |
446 | 409 | acpi_handle rhandle = ps->resources.handles[j]; | |
447 | ret = acpi_bus_get_device(handle, &acpi_dev); | ||
448 | if (ret || !acpi_dev->power.flags.power_resources) | ||
449 | return -ENODEV; | ||
450 | 410 | ||
451 | powered_device = kzalloc(sizeof(*powered_device), GFP_KERNEL); | 411 | if (add) |
452 | if (!powered_device) | 412 | acpi_power_add_dependent(rhandle, adev); |
453 | return -ENOMEM; | 413 | else |
454 | 414 | acpi_power_remove_dependent(rhandle, adev); | |
455 | powered_device->dev = dev; | ||
456 | powered_device->handle = handle; | ||
457 | |||
458 | list = &acpi_dev->power.states[ACPI_STATE_D0].resources; | ||
459 | |||
460 | for (i = 0; i < list->count; i++) { | ||
461 | ret = __acpi_power_resource_register_device(powered_device, | ||
462 | list->handles[i]); | ||
463 | |||
464 | if (ret) { | ||
465 | acpi_power_resource_unregister_device(dev, handle); | ||
466 | break; | ||
467 | } | 415 | } |
468 | } | 416 | } |
469 | |||
470 | return ret; | ||
471 | } | 417 | } |
472 | EXPORT_SYMBOL_GPL(acpi_power_resource_register_device); | 418 | |
419 | /* -------------------------------------------------------------------------- | ||
420 | Device Power Management | ||
421 | -------------------------------------------------------------------------- */ | ||
473 | 422 | ||
474 | /** | 423 | /** |
475 | * acpi_device_sleep_wake - execute _DSW (Device Sleep Wake) or (deprecated in | 424 | * acpi_device_sleep_wake - execute _DSW (Device Sleep Wake) or (deprecated in |
@@ -623,10 +572,6 @@ int acpi_disable_wakeup_device_power(struct acpi_device *dev) | |||
623 | return err; | 572 | return err; |
624 | } | 573 | } |
625 | 574 | ||
626 | /* -------------------------------------------------------------------------- | ||
627 | Device Power Management | ||
628 | -------------------------------------------------------------------------- */ | ||
629 | |||
630 | int acpi_power_get_inferred_state(struct acpi_device *device, int *state) | 575 | int acpi_power_get_inferred_state(struct acpi_device *device, int *state) |
631 | { | 576 | { |
632 | int result = 0; | 577 | int result = 0; |
@@ -725,7 +670,7 @@ static int acpi_power_add(struct acpi_device *device) | |||
725 | 670 | ||
726 | resource->device = device; | 671 | resource->device = device; |
727 | mutex_init(&resource->resource_lock); | 672 | mutex_init(&resource->resource_lock); |
728 | mutex_init(&resource->devices_lock); | 673 | INIT_LIST_HEAD(&resource->dependent); |
729 | strcpy(resource->name, device->pnp.bus_id); | 674 | strcpy(resource->name, device->pnp.bus_id); |
730 | strcpy(acpi_device_name(device), ACPI_POWER_DEVICE_NAME); | 675 | strcpy(acpi_device_name(device), ACPI_POWER_DEVICE_NAME); |
731 | strcpy(acpi_device_class(device), ACPI_POWER_CLASS); | 676 | strcpy(acpi_device_class(device), ACPI_POWER_CLASS); |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 7d164a966b0d..c6d60910e8a8 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
@@ -633,6 +633,7 @@ static int acpi_device_register(struct acpi_device *device) | |||
633 | INIT_LIST_HEAD(&device->wakeup_list); | 633 | INIT_LIST_HEAD(&device->wakeup_list); |
634 | INIT_LIST_HEAD(&device->physical_node_list); | 634 | INIT_LIST_HEAD(&device->physical_node_list); |
635 | mutex_init(&device->physical_node_lock); | 635 | mutex_init(&device->physical_node_lock); |
636 | INIT_LIST_HEAD(&device->power_dependent); | ||
636 | 637 | ||
637 | new_bus_id = kzalloc(sizeof(struct acpi_device_bus_id), GFP_KERNEL); | 638 | new_bus_id = kzalloc(sizeof(struct acpi_device_bus_id), GFP_KERNEL); |
638 | if (!new_bus_id) { | 639 | if (!new_bus_id) { |
@@ -706,8 +707,14 @@ static void acpi_device_unregister(struct acpi_device *device) | |||
706 | 707 | ||
707 | acpi_detach_data(device->handle, acpi_bus_data_handler); | 708 | acpi_detach_data(device->handle, acpi_bus_data_handler); |
708 | 709 | ||
710 | acpi_power_add_remove_device(device, false); | ||
709 | acpi_device_remove_files(device); | 711 | acpi_device_remove_files(device); |
710 | device_unregister(&device->dev); | 712 | device_unregister(&device->dev); |
713 | /* | ||
714 | * Drop the reference counts of all power resources the device depends | ||
715 | * on and turn off the ones that have no more references. | ||
716 | */ | ||
717 | acpi_power_transition(device, ACPI_STATE_D3_COLD); | ||
711 | } | 718 | } |
712 | 719 | ||
713 | /* -------------------------------------------------------------------------- | 720 | /* -------------------------------------------------------------------------- |
@@ -1441,6 +1448,7 @@ static int acpi_add_single_object(struct acpi_device **child, | |||
1441 | 1448 | ||
1442 | end: | 1449 | end: |
1443 | if (!result) { | 1450 | if (!result) { |
1451 | acpi_power_add_remove_device(device, true); | ||
1444 | acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer); | 1452 | acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer); |
1445 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 1453 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
1446 | "Adding %s [%s] parent %s\n", dev_name(&device->dev), | 1454 | "Adding %s [%s] parent %s\n", dev_name(&device->dev), |
diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c index ef01ac07502e..6fc67f7efb22 100644 --- a/drivers/ata/libata-acpi.c +++ b/drivers/ata/libata-acpi.c | |||
@@ -1029,30 +1029,20 @@ static void ata_acpi_register_power_resource(struct ata_device *dev) | |||
1029 | { | 1029 | { |
1030 | struct scsi_device *sdev = dev->sdev; | 1030 | struct scsi_device *sdev = dev->sdev; |
1031 | acpi_handle handle; | 1031 | acpi_handle handle; |
1032 | struct device *device; | ||
1033 | 1032 | ||
1034 | handle = ata_dev_acpi_handle(dev); | 1033 | handle = ata_dev_acpi_handle(dev); |
1035 | if (!handle) | 1034 | if (handle) |
1036 | return; | 1035 | acpi_dev_pm_remove_dependent(handle, &sdev->sdev_gendev); |
1037 | |||
1038 | device = &sdev->sdev_gendev; | ||
1039 | |||
1040 | acpi_power_resource_register_device(device, handle); | ||
1041 | } | 1036 | } |
1042 | 1037 | ||
1043 | static void ata_acpi_unregister_power_resource(struct ata_device *dev) | 1038 | static void ata_acpi_unregister_power_resource(struct ata_device *dev) |
1044 | { | 1039 | { |
1045 | struct scsi_device *sdev = dev->sdev; | 1040 | struct scsi_device *sdev = dev->sdev; |
1046 | acpi_handle handle; | 1041 | acpi_handle handle; |
1047 | struct device *device; | ||
1048 | 1042 | ||
1049 | handle = ata_dev_acpi_handle(dev); | 1043 | handle = ata_dev_acpi_handle(dev); |
1050 | if (!handle) | 1044 | if (handle) |
1051 | return; | 1045 | acpi_dev_pm_remove_dependent(handle, &sdev->sdev_gendev); |
1052 | |||
1053 | device = &sdev->sdev_gendev; | ||
1054 | |||
1055 | acpi_power_resource_unregister_device(device, handle); | ||
1056 | } | 1046 | } |
1057 | 1047 | ||
1058 | void ata_acpi_bind(struct ata_device *dev) | 1048 | void ata_acpi_bind(struct ata_device *dev) |
diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c index 42736e213f25..e407c61559ca 100644 --- a/drivers/pci/pci-acpi.c +++ b/drivers/pci/pci-acpi.c | |||
@@ -345,7 +345,6 @@ static void pci_acpi_setup(struct device *dev) | |||
345 | acpi_pci_irq_add_prt(handle, pci_domain_nr(pci_dev->bus), bus); | 345 | acpi_pci_irq_add_prt(handle, pci_domain_nr(pci_dev->bus), bus); |
346 | } | 346 | } |
347 | 347 | ||
348 | acpi_power_resource_register_device(dev, handle); | ||
349 | if (acpi_bus_get_device(handle, &adev) || !adev->wakeup.flags.valid) | 348 | if (acpi_bus_get_device(handle, &adev) || !adev->wakeup.flags.valid) |
350 | return; | 349 | return; |
351 | 350 | ||
@@ -368,7 +367,6 @@ static void pci_acpi_cleanup(struct device *dev) | |||
368 | device_set_run_wake(dev, false); | 367 | device_set_run_wake(dev, false); |
369 | pci_acpi_remove_pm_notifier(adev); | 368 | pci_acpi_remove_pm_notifier(adev); |
370 | } | 369 | } |
371 | acpi_power_resource_unregister_device(dev, handle); | ||
372 | 370 | ||
373 | if (pci_dev->subordinate) | 371 | if (pci_dev->subordinate) |
374 | acpi_pci_irq_del_prt(pci_domain_nr(pci_dev->bus), | 372 | acpi_pci_irq_del_prt(pci_domain_nr(pci_dev->bus), |
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h index 567851b4f043..29a1badfca55 100644 --- a/include/acpi/acpi_bus.h +++ b/include/acpi/acpi_bus.h | |||
@@ -279,6 +279,7 @@ struct acpi_device { | |||
279 | struct list_head physical_node_list; | 279 | struct list_head physical_node_list; |
280 | struct mutex physical_node_lock; | 280 | struct mutex physical_node_lock; |
281 | DECLARE_BITMAP(physical_node_id_bitmap, ACPI_MAX_PHYSICAL_NODE); | 281 | DECLARE_BITMAP(physical_node_id_bitmap, ACPI_MAX_PHYSICAL_NODE); |
282 | struct list_head power_dependent; | ||
282 | }; | 283 | }; |
283 | 284 | ||
284 | static inline void *acpi_driver_data(struct acpi_device *d) | 285 | static inline void *acpi_driver_data(struct acpi_device *d) |
@@ -334,8 +335,6 @@ int acpi_device_set_power(struct acpi_device *device, int state); | |||
334 | int acpi_bus_update_power(acpi_handle handle, int *state_p); | 335 | int acpi_bus_update_power(acpi_handle handle, int *state_p); |
335 | bool acpi_bus_power_manageable(acpi_handle handle); | 336 | bool acpi_bus_power_manageable(acpi_handle handle); |
336 | bool acpi_bus_can_wakeup(acpi_handle handle); | 337 | bool acpi_bus_can_wakeup(acpi_handle handle); |
337 | int acpi_power_resource_register_device(struct device *dev, acpi_handle handle); | ||
338 | void acpi_power_resource_unregister_device(struct device *dev, acpi_handle handle); | ||
339 | #ifdef CONFIG_ACPI_PROC_EVENT | 338 | #ifdef CONFIG_ACPI_PROC_EVENT |
340 | int acpi_bus_generate_proc_event(struct acpi_device *device, u8 type, int data); | 339 | int acpi_bus_generate_proc_event(struct acpi_device *device, u8 type, int data); |
341 | int acpi_bus_generate_proc_event4(const char *class, const char *bid, u8 type, int data); | 340 | int acpi_bus_generate_proc_event4(const char *class, const char *bid, u8 type, int data); |
@@ -414,6 +413,8 @@ acpi_status acpi_remove_pm_notifier(struct acpi_device *adev, | |||
414 | int acpi_device_power_state(struct device *dev, struct acpi_device *adev, | 413 | int acpi_device_power_state(struct device *dev, struct acpi_device *adev, |
415 | u32 target_state, int d_max_in, int *d_min_p); | 414 | u32 target_state, int d_max_in, int *d_min_p); |
416 | int acpi_pm_device_sleep_state(struct device *, int *, int); | 415 | int acpi_pm_device_sleep_state(struct device *, int *, int); |
416 | void acpi_dev_pm_add_dependent(acpi_handle handle, struct device *depdev); | ||
417 | void acpi_dev_pm_remove_dependent(acpi_handle handle, struct device *depdev); | ||
417 | #else | 418 | #else |
418 | static inline acpi_status acpi_add_pm_notifier(struct acpi_device *adev, | 419 | static inline acpi_status acpi_add_pm_notifier(struct acpi_device *adev, |
419 | acpi_notify_handler handler, | 420 | acpi_notify_handler handler, |
@@ -443,6 +444,10 @@ static inline int acpi_pm_device_sleep_state(struct device *d, int *p, int m) | |||
443 | { | 444 | { |
444 | return __acpi_device_power_state(m, p); | 445 | return __acpi_device_power_state(m, p); |
445 | } | 446 | } |
447 | static inline void acpi_dev_pm_add_dependent(acpi_handle handle, | ||
448 | struct device *depdev) {} | ||
449 | static inline void acpi_dev_pm_remove_dependent(acpi_handle handle, | ||
450 | struct device *depdev) {} | ||
446 | #endif | 451 | #endif |
447 | 452 | ||
448 | #ifdef CONFIG_PM_RUNTIME | 453 | #ifdef CONFIG_PM_RUNTIME |