1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#include <linux/acpi.h>
22#include <linux/export.h>
23#include <linux/mutex.h>
24#include <linux/pm_qos.h>
25#include <linux/pm_domain.h>
26#include <linux/pm_runtime.h>
27
28#include "internal.h"
29
30#define _COMPONENT ACPI_POWER_COMPONENT
31ACPI_MODULE_NAME("device_pm");
32
33
34
35
36
37const char *acpi_power_state_string(int state)
38{
39 switch (state) {
40 case ACPI_STATE_D0:
41 return "D0";
42 case ACPI_STATE_D1:
43 return "D1";
44 case ACPI_STATE_D2:
45 return "D2";
46 case ACPI_STATE_D3_HOT:
47 return "D3hot";
48 case ACPI_STATE_D3_COLD:
49 return "D3cold";
50 default:
51 return "(unknown)";
52 }
53}
54
55
56
57
58
59
60
61
62
63
64int acpi_device_get_power(struct acpi_device *device, int *state)
65{
66 int result = ACPI_STATE_UNKNOWN;
67
68 if (!device || !state)
69 return -EINVAL;
70
71 if (!device->flags.power_manageable) {
72
73 *state = device->parent ?
74 device->parent->power.state : ACPI_STATE_D0;
75 goto out;
76 }
77
78
79
80
81
82 if (device->power.flags.power_resources) {
83 int error = acpi_power_get_inferred_state(device, &result);
84 if (error)
85 return error;
86 }
87 if (device->power.flags.explicit_get) {
88 acpi_handle handle = device->handle;
89 unsigned long long psc;
90 acpi_status status;
91
92 status = acpi_evaluate_integer(handle, "_PSC", NULL, &psc);
93 if (ACPI_FAILURE(status))
94 return -ENODEV;
95
96
97
98
99
100
101
102
103
104 if (psc > result && psc < ACPI_STATE_D3_COLD)
105 result = psc;
106 else if (result == ACPI_STATE_UNKNOWN)
107 result = psc > ACPI_STATE_D2 ? ACPI_STATE_D3_HOT : psc;
108 }
109
110
111
112
113
114
115 if (!device->power.flags.ignore_parent && device->parent
116 && device->parent->power.state == ACPI_STATE_UNKNOWN
117 && result == ACPI_STATE_D0)
118 device->parent->power.state = ACPI_STATE_D0;
119
120 *state = result;
121
122 out:
123 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] power state is %s\n",
124 device->pnp.bus_id, acpi_power_state_string(*state)));
125
126 return 0;
127}
128
129static int acpi_dev_pm_explicit_set(struct acpi_device *adev, int state)
130{
131 if (adev->power.states[state].flags.explicit_set) {
132 char method[5] = { '_', 'P', 'S', '0' + state, '\0' };
133 acpi_status status;
134
135 status = acpi_evaluate_object(adev->handle, method, NULL, NULL);
136 if (ACPI_FAILURE(status))
137 return -ENODEV;
138 }
139 return 0;
140}
141
142
143
144
145
146
147
148
149
150int acpi_device_set_power(struct acpi_device *device, int state)
151{
152 int target_state = state;
153 int result = 0;
154
155 if (!device || !device->flags.power_manageable
156 || (state < ACPI_STATE_D0) || (state > ACPI_STATE_D3_COLD))
157 return -EINVAL;
158
159
160
161 if (state == device->power.state) {
162 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] already in %s\n",
163 device->pnp.bus_id,
164 acpi_power_state_string(state)));
165 return 0;
166 }
167
168 if (state == ACPI_STATE_D3_COLD) {
169
170
171
172
173 state = ACPI_STATE_D3_HOT;
174
175 if (!device->power.states[ACPI_STATE_D3_COLD].flags.valid)
176 target_state = state;
177 } else if (!device->power.states[state].flags.valid) {
178 dev_warn(&device->dev, "Power state %s not supported\n",
179 acpi_power_state_string(state));
180 return -ENODEV;
181 }
182
183 if (!device->power.flags.ignore_parent &&
184 device->parent && (state < device->parent->power.state)) {
185 dev_warn(&device->dev,
186 "Cannot transition to power state %s for parent in %s\n",
187 acpi_power_state_string(state),
188 acpi_power_state_string(device->parent->power.state));
189 return -ENODEV;
190 }
191
192
193
194
195
196
197
198
199 if (state > ACPI_STATE_D0) {
200
201
202
203
204 if (state < device->power.state) {
205 dev_warn(&device->dev, "Cannot transition from %s to %s\n",
206 acpi_power_state_string(device->power.state),
207 acpi_power_state_string(state));
208 return -ENODEV;
209 }
210
211 result = acpi_dev_pm_explicit_set(device, state);
212 if (result)
213 goto end;
214
215 if (device->power.flags.power_resources)
216 result = acpi_power_transition(device, target_state);
217 } else {
218 if (device->power.flags.power_resources) {
219 result = acpi_power_transition(device, ACPI_STATE_D0);
220 if (result)
221 goto end;
222 }
223 result = acpi_dev_pm_explicit_set(device, ACPI_STATE_D0);
224 }
225
226 end:
227 if (result) {
228 dev_warn(&device->dev, "Failed to change power state to %s\n",
229 acpi_power_state_string(state));
230 } else {
231 device->power.state = target_state;
232 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
233 "Device [%s] transitioned to %s\n",
234 device->pnp.bus_id,
235 acpi_power_state_string(state)));
236 }
237
238 return result;
239}
240EXPORT_SYMBOL(acpi_device_set_power);
241
242int acpi_bus_set_power(acpi_handle handle, int state)
243{
244 struct acpi_device *device;
245 int result;
246
247 result = acpi_bus_get_device(handle, &device);
248 if (result)
249 return result;
250
251 return acpi_device_set_power(device, state);
252}
253EXPORT_SYMBOL(acpi_bus_set_power);
254
255int acpi_bus_init_power(struct acpi_device *device)
256{
257 int state;
258 int result;
259
260 if (!device)
261 return -EINVAL;
262
263 device->power.state = ACPI_STATE_UNKNOWN;
264 if (!acpi_device_is_present(device))
265 return -ENXIO;
266
267 result = acpi_device_get_power(device, &state);
268 if (result)
269 return result;
270
271 if (state < ACPI_STATE_D3_COLD && device->power.flags.power_resources) {
272
273 result = acpi_power_on_resources(device, state);
274 if (result)
275 return result;
276
277 if (state == ACPI_STATE_D0) {
278
279
280
281
282
283
284
285
286 result = acpi_dev_pm_explicit_set(device, state);
287 if (result)
288 return result;
289 }
290 } else if (state == ACPI_STATE_UNKNOWN) {
291
292
293
294
295
296
297 state = ACPI_STATE_D0;
298 }
299 device->power.state = state;
300 return 0;
301}
302
303
304
305
306
307
308
309
310
311int acpi_device_fix_up_power(struct acpi_device *device)
312{
313 int ret = 0;
314
315 if (!device->power.flags.power_resources
316 && !device->power.flags.explicit_get
317 && device->power.state == ACPI_STATE_D0)
318 ret = acpi_dev_pm_explicit_set(device, ACPI_STATE_D0);
319
320 return ret;
321}
322EXPORT_SYMBOL_GPL(acpi_device_fix_up_power);
323
324int acpi_device_update_power(struct acpi_device *device, int *state_p)
325{
326 int state;
327 int result;
328
329 if (device->power.state == ACPI_STATE_UNKNOWN) {
330 result = acpi_bus_init_power(device);
331 if (!result && state_p)
332 *state_p = device->power.state;
333
334 return result;
335 }
336
337 result = acpi_device_get_power(device, &state);
338 if (result)
339 return result;
340
341 if (state == ACPI_STATE_UNKNOWN) {
342 state = ACPI_STATE_D0;
343 result = acpi_device_set_power(device, state);
344 if (result)
345 return result;
346 } else {
347 if (device->power.flags.power_resources) {
348
349
350
351
352 result = acpi_power_transition(device, state);
353 if (result)
354 return result;
355 }
356 device->power.state = state;
357 }
358 if (state_p)
359 *state_p = state;
360
361 return 0;
362}
363EXPORT_SYMBOL_GPL(acpi_device_update_power);
364
365int acpi_bus_update_power(acpi_handle handle, int *state_p)
366{
367 struct acpi_device *device;
368 int result;
369
370 result = acpi_bus_get_device(handle, &device);
371 return result ? result : acpi_device_update_power(device, state_p);
372}
373EXPORT_SYMBOL_GPL(acpi_bus_update_power);
374
375bool acpi_bus_power_manageable(acpi_handle handle)
376{
377 struct acpi_device *device;
378 int result;
379
380 result = acpi_bus_get_device(handle, &device);
381 return result ? false : device->flags.power_manageable;
382}
383EXPORT_SYMBOL(acpi_bus_power_manageable);
384
385#ifdef CONFIG_PM
386static DEFINE_MUTEX(acpi_pm_notifier_lock);
387
388static void acpi_pm_notify_handler(acpi_handle handle, u32 val, void *not_used)
389{
390 struct acpi_device *adev;
391
392 if (val != ACPI_NOTIFY_DEVICE_WAKE)
393 return;
394
395 adev = acpi_bus_get_acpi_device(handle);
396 if (!adev)
397 return;
398
399 mutex_lock(&acpi_pm_notifier_lock);
400
401 if (adev->wakeup.flags.notifier_present) {
402 __pm_wakeup_event(adev->wakeup.ws, 0);
403 if (adev->wakeup.context.work.func)
404 queue_pm_work(&adev->wakeup.context.work);
405 }
406
407 mutex_unlock(&acpi_pm_notifier_lock);
408
409 acpi_bus_put_acpi_device(adev);
410}
411
412
413
414
415
416
417
418
419
420
421
422
423acpi_status acpi_add_pm_notifier(struct acpi_device *adev, struct device *dev,
424 void (*work_func)(struct work_struct *work))
425{
426 acpi_status status = AE_ALREADY_EXISTS;
427
428 if (!dev && !work_func)
429 return AE_BAD_PARAMETER;
430
431 mutex_lock(&acpi_pm_notifier_lock);
432
433 if (adev->wakeup.flags.notifier_present)
434 goto out;
435
436 adev->wakeup.ws = wakeup_source_register(dev_name(&adev->dev));
437 adev->wakeup.context.dev = dev;
438 if (work_func)
439 INIT_WORK(&adev->wakeup.context.work, work_func);
440
441 status = acpi_install_notify_handler(adev->handle, ACPI_SYSTEM_NOTIFY,
442 acpi_pm_notify_handler, NULL);
443 if (ACPI_FAILURE(status))
444 goto out;
445
446 adev->wakeup.flags.notifier_present = true;
447
448 out:
449 mutex_unlock(&acpi_pm_notifier_lock);
450 return status;
451}
452
453
454
455
456
457acpi_status acpi_remove_pm_notifier(struct acpi_device *adev)
458{
459 acpi_status status = AE_BAD_PARAMETER;
460
461 mutex_lock(&acpi_pm_notifier_lock);
462
463 if (!adev->wakeup.flags.notifier_present)
464 goto out;
465
466 status = acpi_remove_notify_handler(adev->handle,
467 ACPI_SYSTEM_NOTIFY,
468 acpi_pm_notify_handler);
469 if (ACPI_FAILURE(status))
470 goto out;
471
472 if (adev->wakeup.context.work.func) {
473 cancel_work_sync(&adev->wakeup.context.work);
474 adev->wakeup.context.work.func = NULL;
475 }
476 adev->wakeup.context.dev = NULL;
477 wakeup_source_unregister(adev->wakeup.ws);
478
479 adev->wakeup.flags.notifier_present = false;
480
481 out:
482 mutex_unlock(&acpi_pm_notifier_lock);
483 return status;
484}
485
486bool acpi_bus_can_wakeup(acpi_handle handle)
487{
488 struct acpi_device *device;
489 int result;
490
491 result = acpi_bus_get_device(handle, &device);
492 return result ? false : device->wakeup.flags.valid;
493}
494EXPORT_SYMBOL(acpi_bus_can_wakeup);
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517static int acpi_dev_pm_get_state(struct device *dev, struct acpi_device *adev,
518 u32 target_state, int *d_min_p, int *d_max_p)
519{
520 char method[] = { '_', 'S', '0' + target_state, 'D', '\0' };
521 acpi_handle handle = adev->handle;
522 unsigned long long ret;
523 int d_min, d_max;
524 bool wakeup = false;
525 acpi_status status;
526
527
528
529
530
531
532
533 d_min = ACPI_STATE_D0;
534 d_max = ACPI_STATE_D3_COLD;
535
536
537
538
539
540
541 if (target_state > ACPI_STATE_S0) {
542
543
544
545
546 ret = d_min;
547 status = acpi_evaluate_integer(handle, method, NULL, &ret);
548 if ((ACPI_FAILURE(status) && status != AE_NOT_FOUND)
549 || ret > ACPI_STATE_D3_COLD)
550 return -ENODATA;
551
552
553
554
555
556
557 if (!adev->power.states[ret].flags.valid) {
558 if (ret == ACPI_STATE_D3_HOT)
559 ret = ACPI_STATE_D3_COLD;
560 else
561 return -ENODATA;
562 }
563 d_min = ret;
564 wakeup = device_may_wakeup(dev) && adev->wakeup.flags.valid
565 && adev->wakeup.sleep_state >= target_state;
566 } else if (dev_pm_qos_flags(dev, PM_QOS_FLAG_REMOTE_WAKEUP) !=
567 PM_QOS_FLAGS_NONE) {
568 wakeup = adev->wakeup.flags.valid;
569 }
570
571
572
573
574
575
576
577
578 if (wakeup) {
579 method[3] = 'W';
580 status = acpi_evaluate_integer(handle, method, NULL, &ret);
581 if (status == AE_NOT_FOUND) {
582 if (target_state > ACPI_STATE_S0)
583 d_max = d_min;
584 } else if (ACPI_SUCCESS(status) && ret <= ACPI_STATE_D3_COLD) {
585
586 if (!adev->power.states[ret].flags.valid)
587 ret = ACPI_STATE_D3_COLD;
588
589 d_max = ret > d_min ? ret : d_min;
590 } else {
591 return -ENODATA;
592 }
593 }
594
595 if (d_min_p)
596 *d_min_p = d_min;
597
598 if (d_max_p)
599 *d_max_p = d_max;
600
601 return 0;
602}
603
604
605
606
607
608
609
610
611
612
613
614
615int acpi_pm_device_sleep_state(struct device *dev, int *d_min_p, int d_max_in)
616{
617 struct acpi_device *adev;
618 int ret, d_min, d_max;
619
620 if (d_max_in < ACPI_STATE_D0 || d_max_in > ACPI_STATE_D3_COLD)
621 return -EINVAL;
622
623 if (d_max_in > ACPI_STATE_D2) {
624 enum pm_qos_flags_status stat;
625
626 stat = dev_pm_qos_flags(dev, PM_QOS_FLAG_NO_POWER_OFF);
627 if (stat == PM_QOS_FLAGS_ALL)
628 d_max_in = ACPI_STATE_D2;
629 }
630
631 adev = ACPI_COMPANION(dev);
632 if (!adev) {
633 dev_dbg(dev, "ACPI companion missing in %s!\n", __func__);
634 return -ENODEV;
635 }
636
637 ret = acpi_dev_pm_get_state(dev, adev, acpi_target_system_state(),
638 &d_min, &d_max);
639 if (ret)
640 return ret;
641
642 if (d_max_in < d_min)
643 return -EINVAL;
644
645 if (d_max > d_max_in) {
646 for (d_max = d_max_in; d_max > d_min; d_max--) {
647 if (adev->power.states[d_max].flags.valid)
648 break;
649 }
650 }
651
652 if (d_min_p)
653 *d_min_p = d_min;
654
655 return d_max;
656}
657EXPORT_SYMBOL(acpi_pm_device_sleep_state);
658
659
660
661
662
663static void acpi_pm_notify_work_func(struct work_struct *work)
664{
665 struct device *dev;
666
667 dev = container_of(work, struct acpi_device_wakeup_context, work)->dev;
668 if (dev) {
669 pm_wakeup_event(dev, 0);
670 pm_runtime_resume(dev);
671 }
672}
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687static int acpi_device_wakeup(struct acpi_device *adev, u32 target_state,
688 bool enable)
689{
690 struct acpi_device_wakeup *wakeup = &adev->wakeup;
691
692 if (enable) {
693 acpi_status res;
694 int error;
695
696 error = acpi_enable_wakeup_device_power(adev, target_state);
697 if (error)
698 return error;
699
700 if (adev->wakeup.flags.enabled)
701 return 0;
702
703 res = acpi_enable_gpe(wakeup->gpe_device, wakeup->gpe_number);
704 if (ACPI_SUCCESS(res)) {
705 adev->wakeup.flags.enabled = 1;
706 } else {
707 acpi_disable_wakeup_device_power(adev);
708 return -EIO;
709 }
710 } else {
711 if (adev->wakeup.flags.enabled) {
712 acpi_disable_gpe(wakeup->gpe_device, wakeup->gpe_number);
713 adev->wakeup.flags.enabled = 0;
714 }
715 acpi_disable_wakeup_device_power(adev);
716 }
717 return 0;
718}
719
720
721
722
723
724
725int acpi_pm_device_run_wake(struct device *phys_dev, bool enable)
726{
727 struct acpi_device *adev;
728
729 if (!device_run_wake(phys_dev))
730 return -EINVAL;
731
732 adev = ACPI_COMPANION(phys_dev);
733 if (!adev) {
734 dev_dbg(phys_dev, "ACPI companion missing in %s!\n", __func__);
735 return -ENODEV;
736 }
737
738 return acpi_device_wakeup(adev, ACPI_STATE_S0, enable);
739}
740EXPORT_SYMBOL(acpi_pm_device_run_wake);
741
742#ifdef CONFIG_PM_SLEEP
743
744
745
746
747
748int acpi_pm_device_sleep_wake(struct device *dev, bool enable)
749{
750 struct acpi_device *adev;
751 int error;
752
753 if (!device_can_wakeup(dev))
754 return -EINVAL;
755
756 adev = ACPI_COMPANION(dev);
757 if (!adev) {
758 dev_dbg(dev, "ACPI companion missing in %s!\n", __func__);
759 return -ENODEV;
760 }
761
762 error = acpi_device_wakeup(adev, acpi_target_system_state(), enable);
763 if (!error)
764 dev_info(dev, "System wakeup %s by ACPI\n",
765 enable ? "enabled" : "disabled");
766
767 return error;
768}
769#endif
770
771
772
773
774
775
776
777static int acpi_dev_pm_low_power(struct device *dev, struct acpi_device *adev,
778 u32 system_state)
779{
780 int ret, state;
781
782 if (!acpi_device_power_manageable(adev))
783 return 0;
784
785 ret = acpi_dev_pm_get_state(dev, adev, system_state, NULL, &state);
786 return ret ? ret : acpi_device_set_power(adev, state);
787}
788
789
790
791
792
793static int acpi_dev_pm_full_power(struct acpi_device *adev)
794{
795 return acpi_device_power_manageable(adev) ?
796 acpi_device_set_power(adev, ACPI_STATE_D0) : 0;
797}
798
799
800
801
802
803
804
805
806
807
808int acpi_dev_runtime_suspend(struct device *dev)
809{
810 struct acpi_device *adev = ACPI_COMPANION(dev);
811 bool remote_wakeup;
812 int error;
813
814 if (!adev)
815 return 0;
816
817 remote_wakeup = dev_pm_qos_flags(dev, PM_QOS_FLAG_REMOTE_WAKEUP) >
818 PM_QOS_FLAGS_NONE;
819 error = acpi_device_wakeup(adev, ACPI_STATE_S0, remote_wakeup);
820 if (remote_wakeup && error)
821 return -EAGAIN;
822
823 error = acpi_dev_pm_low_power(dev, adev, ACPI_STATE_S0);
824 if (error)
825 acpi_device_wakeup(adev, ACPI_STATE_S0, false);
826
827 return error;
828}
829EXPORT_SYMBOL_GPL(acpi_dev_runtime_suspend);
830
831
832
833
834
835
836
837
838
839int acpi_dev_runtime_resume(struct device *dev)
840{
841 struct acpi_device *adev = ACPI_COMPANION(dev);
842 int error;
843
844 if (!adev)
845 return 0;
846
847 error = acpi_dev_pm_full_power(adev);
848 acpi_device_wakeup(adev, ACPI_STATE_S0, false);
849 return error;
850}
851EXPORT_SYMBOL_GPL(acpi_dev_runtime_resume);
852
853
854
855
856
857
858
859
860int acpi_subsys_runtime_suspend(struct device *dev)
861{
862 int ret = pm_generic_runtime_suspend(dev);
863 return ret ? ret : acpi_dev_runtime_suspend(dev);
864}
865EXPORT_SYMBOL_GPL(acpi_subsys_runtime_suspend);
866
867
868
869
870
871
872
873
874int acpi_subsys_runtime_resume(struct device *dev)
875{
876 int ret = acpi_dev_runtime_resume(dev);
877 return ret ? ret : pm_generic_runtime_resume(dev);
878}
879EXPORT_SYMBOL_GPL(acpi_subsys_runtime_resume);
880
881#ifdef CONFIG_PM_SLEEP
882
883
884
885
886
887
888
889
890
891int acpi_dev_suspend_late(struct device *dev)
892{
893 struct acpi_device *adev = ACPI_COMPANION(dev);
894 u32 target_state;
895 bool wakeup;
896 int error;
897
898 if (!adev)
899 return 0;
900
901 target_state = acpi_target_system_state();
902 wakeup = device_may_wakeup(dev) && acpi_device_can_wakeup(adev);
903 error = acpi_device_wakeup(adev, target_state, wakeup);
904 if (wakeup && error)
905 return error;
906
907 error = acpi_dev_pm_low_power(dev, adev, target_state);
908 if (error)
909 acpi_device_wakeup(adev, ACPI_STATE_UNKNOWN, false);
910
911 return error;
912}
913EXPORT_SYMBOL_GPL(acpi_dev_suspend_late);
914
915
916
917
918
919
920
921
922
923int acpi_dev_resume_early(struct device *dev)
924{
925 struct acpi_device *adev = ACPI_COMPANION(dev);
926 int error;
927
928 if (!adev)
929 return 0;
930
931 error = acpi_dev_pm_full_power(adev);
932 acpi_device_wakeup(adev, ACPI_STATE_UNKNOWN, false);
933 return error;
934}
935EXPORT_SYMBOL_GPL(acpi_dev_resume_early);
936
937
938
939
940
941int acpi_subsys_prepare(struct device *dev)
942{
943 struct acpi_device *adev = ACPI_COMPANION(dev);
944 u32 sys_target;
945 int ret, state;
946
947 ret = pm_generic_prepare(dev);
948 if (ret < 0)
949 return ret;
950
951 if (!adev || !pm_runtime_suspended(dev)
952 || device_may_wakeup(dev) != !!adev->wakeup.prepare_count)
953 return 0;
954
955 sys_target = acpi_target_system_state();
956 if (sys_target == ACPI_STATE_S0)
957 return 1;
958
959 if (adev->power.flags.dsw_present)
960 return 0;
961
962 ret = acpi_dev_pm_get_state(dev, adev, sys_target, NULL, &state);
963 return !ret && state == adev->power.state;
964}
965EXPORT_SYMBOL_GPL(acpi_subsys_prepare);
966
967
968
969
970
971
972
973
974int acpi_subsys_suspend(struct device *dev)
975{
976 pm_runtime_resume(dev);
977 return pm_generic_suspend(dev);
978}
979EXPORT_SYMBOL_GPL(acpi_subsys_suspend);
980
981
982
983
984
985
986
987
988int acpi_subsys_suspend_late(struct device *dev)
989{
990 int ret = pm_generic_suspend_late(dev);
991 return ret ? ret : acpi_dev_suspend_late(dev);
992}
993EXPORT_SYMBOL_GPL(acpi_subsys_suspend_late);
994
995
996
997
998
999
1000
1001
1002
1003int acpi_subsys_resume_early(struct device *dev)
1004{
1005 int ret = acpi_dev_resume_early(dev);
1006 return ret ? ret : pm_generic_resume_early(dev);
1007}
1008EXPORT_SYMBOL_GPL(acpi_subsys_resume_early);
1009
1010
1011
1012
1013
1014int acpi_subsys_freeze(struct device *dev)
1015{
1016
1017
1018
1019
1020
1021
1022 pm_runtime_resume(dev);
1023 return pm_generic_freeze(dev);
1024}
1025EXPORT_SYMBOL_GPL(acpi_subsys_freeze);
1026
1027#endif
1028
1029static struct dev_pm_domain acpi_general_pm_domain = {
1030 .ops = {
1031 .runtime_suspend = acpi_subsys_runtime_suspend,
1032 .runtime_resume = acpi_subsys_runtime_resume,
1033#ifdef CONFIG_PM_SLEEP
1034 .prepare = acpi_subsys_prepare,
1035 .complete = pm_complete_with_resume_check,
1036 .suspend = acpi_subsys_suspend,
1037 .suspend_late = acpi_subsys_suspend_late,
1038 .resume_early = acpi_subsys_resume_early,
1039 .freeze = acpi_subsys_freeze,
1040 .poweroff = acpi_subsys_suspend,
1041 .poweroff_late = acpi_subsys_suspend_late,
1042 .restore_early = acpi_subsys_resume_early,
1043#endif
1044 },
1045};
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059static void acpi_dev_pm_detach(struct device *dev, bool power_off)
1060{
1061 struct acpi_device *adev = ACPI_COMPANION(dev);
1062
1063 if (adev && dev->pm_domain == &acpi_general_pm_domain) {
1064 dev_pm_domain_set(dev, NULL);
1065 acpi_remove_pm_notifier(adev);
1066 if (power_off) {
1067
1068
1069
1070
1071
1072
1073 dev_pm_qos_hide_latency_limit(dev);
1074 dev_pm_qos_hide_flags(dev);
1075 acpi_device_wakeup(adev, ACPI_STATE_S0, false);
1076 acpi_dev_pm_low_power(dev, adev, ACPI_STATE_S0);
1077 }
1078 }
1079}
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097int acpi_dev_pm_attach(struct device *dev, bool power_on)
1098{
1099 struct acpi_device *adev = ACPI_COMPANION(dev);
1100
1101 if (!adev)
1102 return -ENODEV;
1103
1104 if (dev->pm_domain)
1105 return -EEXIST;
1106
1107
1108
1109
1110
1111
1112 if (!acpi_device_is_first_physical_node(adev, dev))
1113 return -EBUSY;
1114
1115 acpi_add_pm_notifier(adev, dev, acpi_pm_notify_work_func);
1116 dev_pm_domain_set(dev, &acpi_general_pm_domain);
1117 if (power_on) {
1118 acpi_dev_pm_full_power(adev);
1119 acpi_device_wakeup(adev, ACPI_STATE_S0, false);
1120 }
1121
1122 dev->pm_domain->detach = acpi_dev_pm_detach;
1123 return 0;
1124}
1125EXPORT_SYMBOL_GPL(acpi_dev_pm_attach);
1126#endif
1127