0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #define pr_fmt(fmt) "PM: " fmt
0014
0015 #include <linux/acpi.h>
0016 #include <linux/export.h>
0017 #include <linux/mutex.h>
0018 #include <linux/pm_qos.h>
0019 #include <linux/pm_domain.h>
0020 #include <linux/pm_runtime.h>
0021 #include <linux/suspend.h>
0022
0023 #include "fan.h"
0024 #include "internal.h"
0025
0026
0027
0028
0029
0030 const char *acpi_power_state_string(int state)
0031 {
0032 switch (state) {
0033 case ACPI_STATE_D0:
0034 return "D0";
0035 case ACPI_STATE_D1:
0036 return "D1";
0037 case ACPI_STATE_D2:
0038 return "D2";
0039 case ACPI_STATE_D3_HOT:
0040 return "D3hot";
0041 case ACPI_STATE_D3_COLD:
0042 return "D3cold";
0043 default:
0044 return "(unknown)";
0045 }
0046 }
0047
0048 static int acpi_dev_pm_explicit_get(struct acpi_device *device, int *state)
0049 {
0050 unsigned long long psc;
0051 acpi_status status;
0052
0053 status = acpi_evaluate_integer(device->handle, "_PSC", NULL, &psc);
0054 if (ACPI_FAILURE(status))
0055 return -ENODEV;
0056
0057 *state = psc;
0058 return 0;
0059 }
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075 int acpi_device_get_power(struct acpi_device *device, int *state)
0076 {
0077 int result = ACPI_STATE_UNKNOWN;
0078 int error;
0079
0080 if (!device || !state)
0081 return -EINVAL;
0082
0083 if (!device->flags.power_manageable) {
0084
0085 *state = device->parent ?
0086 device->parent->power.state : ACPI_STATE_D0;
0087 goto out;
0088 }
0089
0090
0091
0092
0093
0094 if (device->power.flags.power_resources) {
0095 error = acpi_power_get_inferred_state(device, &result);
0096 if (error)
0097 return error;
0098 }
0099 if (device->power.flags.explicit_get) {
0100 int psc;
0101
0102 error = acpi_dev_pm_explicit_get(device, &psc);
0103 if (error)
0104 return error;
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114 if (psc > result && psc < ACPI_STATE_D3_COLD)
0115 result = psc;
0116 else if (result == ACPI_STATE_UNKNOWN)
0117 result = psc > ACPI_STATE_D2 ? ACPI_STATE_D3_HOT : psc;
0118 }
0119
0120
0121
0122
0123
0124
0125 if (!device->power.flags.ignore_parent && device->parent
0126 && device->parent->power.state == ACPI_STATE_UNKNOWN
0127 && result == ACPI_STATE_D0)
0128 device->parent->power.state = ACPI_STATE_D0;
0129
0130 *state = result;
0131
0132 out:
0133 acpi_handle_debug(device->handle, "Power state: %s\n",
0134 acpi_power_state_string(*state));
0135
0136 return 0;
0137 }
0138
0139 static int acpi_dev_pm_explicit_set(struct acpi_device *adev, int state)
0140 {
0141 if (adev->power.states[state].flags.explicit_set) {
0142 char method[5] = { '_', 'P', 'S', '0' + state, '\0' };
0143 acpi_status status;
0144
0145 status = acpi_evaluate_object(adev->handle, method, NULL, NULL);
0146 if (ACPI_FAILURE(status))
0147 return -ENODEV;
0148 }
0149 return 0;
0150 }
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160 int acpi_device_set_power(struct acpi_device *device, int state)
0161 {
0162 int target_state = state;
0163 int result = 0;
0164
0165 if (!device || !device->flags.power_manageable
0166 || (state < ACPI_STATE_D0) || (state > ACPI_STATE_D3_COLD))
0167 return -EINVAL;
0168
0169 acpi_handle_debug(device->handle, "Power state change: %s -> %s\n",
0170 acpi_power_state_string(device->power.state),
0171 acpi_power_state_string(state));
0172
0173
0174
0175
0176 if (state > ACPI_STATE_D0 && state == device->power.state)
0177 goto no_change;
0178
0179 if (state == ACPI_STATE_D3_COLD) {
0180
0181
0182
0183
0184 state = ACPI_STATE_D3_HOT;
0185
0186 if (!device->power.states[ACPI_STATE_D3_COLD].flags.valid)
0187 target_state = state;
0188 } else if (!device->power.states[state].flags.valid) {
0189 acpi_handle_debug(device->handle, "Power state %s not supported\n",
0190 acpi_power_state_string(state));
0191 return -ENODEV;
0192 }
0193
0194 if (!device->power.flags.ignore_parent && device->parent &&
0195 state < device->parent->power.state) {
0196 acpi_handle_debug(device->handle,
0197 "Cannot transition to %s for parent in %s\n",
0198 acpi_power_state_string(state),
0199 acpi_power_state_string(device->parent->power.state));
0200 return -ENODEV;
0201 }
0202
0203
0204
0205
0206
0207
0208
0209
0210 if (state > ACPI_STATE_D0) {
0211
0212
0213
0214
0215 if (state < device->power.state) {
0216 acpi_handle_debug(device->handle,
0217 "Cannot transition from %s to %s\n",
0218 acpi_power_state_string(device->power.state),
0219 acpi_power_state_string(state));
0220 return -ENODEV;
0221 }
0222
0223
0224
0225
0226
0227 if (device->power.state < ACPI_STATE_D3_HOT) {
0228 result = acpi_dev_pm_explicit_set(device, state);
0229 if (result)
0230 goto end;
0231 }
0232
0233 if (device->power.flags.power_resources)
0234 result = acpi_power_transition(device, target_state);
0235 } else {
0236 int cur_state = device->power.state;
0237
0238 if (device->power.flags.power_resources) {
0239 result = acpi_power_transition(device, ACPI_STATE_D0);
0240 if (result)
0241 goto end;
0242 }
0243
0244 if (cur_state == ACPI_STATE_D0) {
0245 int psc;
0246
0247
0248 if (!device->power.flags.explicit_get)
0249 goto no_change;
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262 result = acpi_dev_pm_explicit_get(device, &psc);
0263 if (result || psc == ACPI_STATE_D0)
0264 goto no_change;
0265 }
0266
0267 result = acpi_dev_pm_explicit_set(device, ACPI_STATE_D0);
0268 }
0269
0270 end:
0271 if (result) {
0272 acpi_handle_debug(device->handle,
0273 "Failed to change power state to %s\n",
0274 acpi_power_state_string(target_state));
0275 } else {
0276 device->power.state = target_state;
0277 acpi_handle_debug(device->handle, "Power state changed to %s\n",
0278 acpi_power_state_string(target_state));
0279 }
0280
0281 return result;
0282
0283 no_change:
0284 acpi_handle_debug(device->handle, "Already in %s\n",
0285 acpi_power_state_string(state));
0286 return 0;
0287 }
0288 EXPORT_SYMBOL(acpi_device_set_power);
0289
0290 int acpi_bus_set_power(acpi_handle handle, int state)
0291 {
0292 struct acpi_device *device = acpi_fetch_acpi_dev(handle);
0293
0294 if (device)
0295 return acpi_device_set_power(device, state);
0296
0297 return -ENODEV;
0298 }
0299 EXPORT_SYMBOL(acpi_bus_set_power);
0300
0301 int acpi_bus_init_power(struct acpi_device *device)
0302 {
0303 int state;
0304 int result;
0305
0306 if (!device)
0307 return -EINVAL;
0308
0309 device->power.state = ACPI_STATE_UNKNOWN;
0310 if (!acpi_device_is_present(device)) {
0311 device->flags.initialized = false;
0312 return -ENXIO;
0313 }
0314
0315 result = acpi_device_get_power(device, &state);
0316 if (result)
0317 return result;
0318
0319 if (state < ACPI_STATE_D3_COLD && device->power.flags.power_resources) {
0320
0321 result = acpi_power_on_resources(device, state);
0322 if (result)
0323 return result;
0324
0325 if (state == ACPI_STATE_D0) {
0326
0327
0328
0329
0330
0331
0332
0333
0334 result = acpi_dev_pm_explicit_set(device, state);
0335 if (result)
0336 return result;
0337 }
0338 } else if (state == ACPI_STATE_UNKNOWN) {
0339
0340
0341
0342
0343
0344
0345 state = ACPI_STATE_D0;
0346 }
0347 device->power.state = state;
0348 return 0;
0349 }
0350
0351
0352
0353
0354
0355
0356
0357
0358
0359 int acpi_device_fix_up_power(struct acpi_device *device)
0360 {
0361 int ret = 0;
0362
0363 if (!device->power.flags.power_resources
0364 && !device->power.flags.explicit_get
0365 && device->power.state == ACPI_STATE_D0)
0366 ret = acpi_dev_pm_explicit_set(device, ACPI_STATE_D0);
0367
0368 return ret;
0369 }
0370 EXPORT_SYMBOL_GPL(acpi_device_fix_up_power);
0371
0372 static int fix_up_power_if_applicable(struct acpi_device *adev, void *not_used)
0373 {
0374 if (adev->status.present && adev->status.enabled)
0375 acpi_device_fix_up_power(adev);
0376
0377 return 0;
0378 }
0379
0380
0381
0382
0383
0384
0385
0386
0387 void acpi_device_fix_up_power_extended(struct acpi_device *adev)
0388 {
0389 acpi_device_fix_up_power(adev);
0390 acpi_dev_for_each_child(adev, fix_up_power_if_applicable, NULL);
0391 }
0392 EXPORT_SYMBOL_GPL(acpi_device_fix_up_power_extended);
0393
0394 int acpi_device_update_power(struct acpi_device *device, int *state_p)
0395 {
0396 int state;
0397 int result;
0398
0399 if (device->power.state == ACPI_STATE_UNKNOWN) {
0400 result = acpi_bus_init_power(device);
0401 if (!result && state_p)
0402 *state_p = device->power.state;
0403
0404 return result;
0405 }
0406
0407 result = acpi_device_get_power(device, &state);
0408 if (result)
0409 return result;
0410
0411 if (state == ACPI_STATE_UNKNOWN) {
0412 state = ACPI_STATE_D0;
0413 result = acpi_device_set_power(device, state);
0414 if (result)
0415 return result;
0416 } else {
0417 if (device->power.flags.power_resources) {
0418
0419
0420
0421
0422 result = acpi_power_transition(device, state);
0423 if (result)
0424 return result;
0425 }
0426 device->power.state = state;
0427 }
0428 if (state_p)
0429 *state_p = state;
0430
0431 return 0;
0432 }
0433 EXPORT_SYMBOL_GPL(acpi_device_update_power);
0434
0435 int acpi_bus_update_power(acpi_handle handle, int *state_p)
0436 {
0437 struct acpi_device *device = acpi_fetch_acpi_dev(handle);
0438
0439 if (device)
0440 return acpi_device_update_power(device, state_p);
0441
0442 return -ENODEV;
0443 }
0444 EXPORT_SYMBOL_GPL(acpi_bus_update_power);
0445
0446 bool acpi_bus_power_manageable(acpi_handle handle)
0447 {
0448 struct acpi_device *device = acpi_fetch_acpi_dev(handle);
0449
0450 return device && device->flags.power_manageable;
0451 }
0452 EXPORT_SYMBOL(acpi_bus_power_manageable);
0453
0454 static int acpi_power_up_if_adr_present(struct acpi_device *adev, void *not_used)
0455 {
0456 if (!(adev->flags.power_manageable && adev->pnp.type.bus_address))
0457 return 0;
0458
0459 acpi_handle_debug(adev->handle, "Power state: %s\n",
0460 acpi_power_state_string(adev->power.state));
0461
0462 if (adev->power.state == ACPI_STATE_D3_COLD)
0463 return acpi_device_set_power(adev, ACPI_STATE_D0);
0464
0465 return 0;
0466 }
0467
0468
0469
0470
0471
0472
0473
0474
0475
0476 void acpi_dev_power_up_children_with_adr(struct acpi_device *adev)
0477 {
0478 acpi_dev_for_each_child(adev, acpi_power_up_if_adr_present, NULL);
0479 }
0480
0481 #ifdef CONFIG_PM
0482 static DEFINE_MUTEX(acpi_pm_notifier_lock);
0483 static DEFINE_MUTEX(acpi_pm_notifier_install_lock);
0484
0485 void acpi_pm_wakeup_event(struct device *dev)
0486 {
0487 pm_wakeup_dev_event(dev, 0, acpi_s2idle_wakeup());
0488 }
0489 EXPORT_SYMBOL_GPL(acpi_pm_wakeup_event);
0490
0491 static void acpi_pm_notify_handler(acpi_handle handle, u32 val, void *not_used)
0492 {
0493 struct acpi_device *adev;
0494
0495 if (val != ACPI_NOTIFY_DEVICE_WAKE)
0496 return;
0497
0498 acpi_handle_debug(handle, "Wake notify\n");
0499
0500 adev = acpi_bus_get_acpi_device(handle);
0501 if (!adev)
0502 return;
0503
0504 mutex_lock(&acpi_pm_notifier_lock);
0505
0506 if (adev->wakeup.flags.notifier_present) {
0507 pm_wakeup_ws_event(adev->wakeup.ws, 0, acpi_s2idle_wakeup());
0508 if (adev->wakeup.context.func) {
0509 acpi_handle_debug(handle, "Running %pS for %s\n",
0510 adev->wakeup.context.func,
0511 dev_name(adev->wakeup.context.dev));
0512 adev->wakeup.context.func(&adev->wakeup.context);
0513 }
0514 }
0515
0516 mutex_unlock(&acpi_pm_notifier_lock);
0517
0518 acpi_bus_put_acpi_device(adev);
0519 }
0520
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530
0531
0532 acpi_status acpi_add_pm_notifier(struct acpi_device *adev, struct device *dev,
0533 void (*func)(struct acpi_device_wakeup_context *context))
0534 {
0535 acpi_status status = AE_ALREADY_EXISTS;
0536
0537 if (!dev && !func)
0538 return AE_BAD_PARAMETER;
0539
0540 mutex_lock(&acpi_pm_notifier_install_lock);
0541
0542 if (adev->wakeup.flags.notifier_present)
0543 goto out;
0544
0545 status = acpi_install_notify_handler(adev->handle, ACPI_SYSTEM_NOTIFY,
0546 acpi_pm_notify_handler, NULL);
0547 if (ACPI_FAILURE(status))
0548 goto out;
0549
0550 mutex_lock(&acpi_pm_notifier_lock);
0551 adev->wakeup.ws = wakeup_source_register(&adev->dev,
0552 dev_name(&adev->dev));
0553 adev->wakeup.context.dev = dev;
0554 adev->wakeup.context.func = func;
0555 adev->wakeup.flags.notifier_present = true;
0556 mutex_unlock(&acpi_pm_notifier_lock);
0557
0558 out:
0559 mutex_unlock(&acpi_pm_notifier_install_lock);
0560 return status;
0561 }
0562
0563
0564
0565
0566
0567 acpi_status acpi_remove_pm_notifier(struct acpi_device *adev)
0568 {
0569 acpi_status status = AE_BAD_PARAMETER;
0570
0571 mutex_lock(&acpi_pm_notifier_install_lock);
0572
0573 if (!adev->wakeup.flags.notifier_present)
0574 goto out;
0575
0576 status = acpi_remove_notify_handler(adev->handle,
0577 ACPI_SYSTEM_NOTIFY,
0578 acpi_pm_notify_handler);
0579 if (ACPI_FAILURE(status))
0580 goto out;
0581
0582 mutex_lock(&acpi_pm_notifier_lock);
0583 adev->wakeup.context.func = NULL;
0584 adev->wakeup.context.dev = NULL;
0585 wakeup_source_unregister(adev->wakeup.ws);
0586 adev->wakeup.flags.notifier_present = false;
0587 mutex_unlock(&acpi_pm_notifier_lock);
0588
0589 out:
0590 mutex_unlock(&acpi_pm_notifier_install_lock);
0591 return status;
0592 }
0593
0594 bool acpi_bus_can_wakeup(acpi_handle handle)
0595 {
0596 struct acpi_device *device = acpi_fetch_acpi_dev(handle);
0597
0598 return device && device->wakeup.flags.valid;
0599 }
0600 EXPORT_SYMBOL(acpi_bus_can_wakeup);
0601
0602 bool acpi_pm_device_can_wakeup(struct device *dev)
0603 {
0604 struct acpi_device *adev = ACPI_COMPANION(dev);
0605
0606 return adev ? acpi_device_can_wakeup(adev) : false;
0607 }
0608
0609
0610
0611
0612
0613
0614
0615
0616
0617
0618
0619
0620
0621
0622
0623
0624
0625
0626
0627
0628
0629
0630 static int acpi_dev_pm_get_state(struct device *dev, struct acpi_device *adev,
0631 u32 target_state, int *d_min_p, int *d_max_p)
0632 {
0633 char method[] = { '_', 'S', '0' + target_state, 'D', '\0' };
0634 acpi_handle handle = adev->handle;
0635 unsigned long long ret;
0636 int d_min, d_max;
0637 bool wakeup = false;
0638 bool has_sxd = false;
0639 acpi_status status;
0640
0641
0642
0643
0644
0645
0646
0647 d_min = ACPI_STATE_D0;
0648 d_max = ACPI_STATE_D3_COLD;
0649
0650
0651
0652
0653
0654
0655 if (target_state > ACPI_STATE_S0) {
0656
0657
0658
0659
0660 ret = d_min;
0661 status = acpi_evaluate_integer(handle, method, NULL, &ret);
0662 if ((ACPI_FAILURE(status) && status != AE_NOT_FOUND)
0663 || ret > ACPI_STATE_D3_COLD)
0664 return -ENODATA;
0665
0666
0667
0668
0669
0670
0671 if (!adev->power.states[ret].flags.valid) {
0672 if (ret == ACPI_STATE_D3_HOT)
0673 ret = ACPI_STATE_D3_COLD;
0674 else
0675 return -ENODATA;
0676 }
0677
0678 if (status == AE_OK)
0679 has_sxd = true;
0680
0681 d_min = ret;
0682 wakeup = device_may_wakeup(dev) && adev->wakeup.flags.valid
0683 && adev->wakeup.sleep_state >= target_state;
0684 } else {
0685 wakeup = adev->wakeup.flags.valid;
0686 }
0687
0688
0689
0690
0691
0692
0693
0694
0695 if (wakeup) {
0696 method[3] = 'W';
0697 status = acpi_evaluate_integer(handle, method, NULL, &ret);
0698 if (status == AE_NOT_FOUND) {
0699
0700
0701
0702
0703 if (has_sxd && target_state > ACPI_STATE_S0)
0704 d_max = d_min;
0705 } else if (ACPI_SUCCESS(status) && ret <= ACPI_STATE_D3_COLD) {
0706
0707 if (!adev->power.states[ret].flags.valid)
0708 ret = ACPI_STATE_D3_COLD;
0709
0710 d_max = ret > d_min ? ret : d_min;
0711 } else {
0712 return -ENODATA;
0713 }
0714 }
0715
0716 if (d_min_p)
0717 *d_min_p = d_min;
0718
0719 if (d_max_p)
0720 *d_max_p = d_max;
0721
0722 return 0;
0723 }
0724
0725
0726
0727
0728
0729
0730
0731
0732
0733
0734
0735
0736 int acpi_pm_device_sleep_state(struct device *dev, int *d_min_p, int d_max_in)
0737 {
0738 struct acpi_device *adev;
0739 int ret, d_min, d_max;
0740
0741 if (d_max_in < ACPI_STATE_D0 || d_max_in > ACPI_STATE_D3_COLD)
0742 return -EINVAL;
0743
0744 if (d_max_in > ACPI_STATE_D2) {
0745 enum pm_qos_flags_status stat;
0746
0747 stat = dev_pm_qos_flags(dev, PM_QOS_FLAG_NO_POWER_OFF);
0748 if (stat == PM_QOS_FLAGS_ALL)
0749 d_max_in = ACPI_STATE_D2;
0750 }
0751
0752 adev = ACPI_COMPANION(dev);
0753 if (!adev) {
0754 dev_dbg(dev, "ACPI companion missing in %s!\n", __func__);
0755 return -ENODEV;
0756 }
0757
0758 ret = acpi_dev_pm_get_state(dev, adev, acpi_target_system_state(),
0759 &d_min, &d_max);
0760 if (ret)
0761 return ret;
0762
0763 if (d_max_in < d_min)
0764 return -EINVAL;
0765
0766 if (d_max > d_max_in) {
0767 for (d_max = d_max_in; d_max > d_min; d_max--) {
0768 if (adev->power.states[d_max].flags.valid)
0769 break;
0770 }
0771 }
0772
0773 if (d_min_p)
0774 *d_min_p = d_min;
0775
0776 return d_max;
0777 }
0778 EXPORT_SYMBOL(acpi_pm_device_sleep_state);
0779
0780
0781
0782
0783
0784 static void acpi_pm_notify_work_func(struct acpi_device_wakeup_context *context)
0785 {
0786 struct device *dev = context->dev;
0787
0788 if (dev) {
0789 pm_wakeup_event(dev, 0);
0790 pm_request_resume(dev);
0791 }
0792 }
0793
0794 static DEFINE_MUTEX(acpi_wakeup_lock);
0795
0796 static int __acpi_device_wakeup_enable(struct acpi_device *adev,
0797 u32 target_state)
0798 {
0799 struct acpi_device_wakeup *wakeup = &adev->wakeup;
0800 acpi_status status;
0801 int error = 0;
0802
0803 mutex_lock(&acpi_wakeup_lock);
0804
0805
0806
0807
0808
0809
0810
0811 if (wakeup->enable_count > 0)
0812 acpi_disable_wakeup_device_power(adev);
0813
0814 error = acpi_enable_wakeup_device_power(adev, target_state);
0815 if (error) {
0816 if (wakeup->enable_count > 0) {
0817 acpi_disable_gpe(wakeup->gpe_device, wakeup->gpe_number);
0818 wakeup->enable_count = 0;
0819 }
0820 goto out;
0821 }
0822
0823 if (wakeup->enable_count > 0)
0824 goto inc;
0825
0826 status = acpi_enable_gpe(wakeup->gpe_device, wakeup->gpe_number);
0827 if (ACPI_FAILURE(status)) {
0828 acpi_disable_wakeup_device_power(adev);
0829 error = -EIO;
0830 goto out;
0831 }
0832
0833 acpi_handle_debug(adev->handle, "GPE%2X enabled for wakeup\n",
0834 (unsigned int)wakeup->gpe_number);
0835
0836 inc:
0837 if (wakeup->enable_count < INT_MAX)
0838 wakeup->enable_count++;
0839 else
0840 acpi_handle_info(adev->handle, "Wakeup enable count out of bounds!\n");
0841
0842 out:
0843 mutex_unlock(&acpi_wakeup_lock);
0844 return error;
0845 }
0846
0847
0848
0849
0850
0851
0852
0853
0854
0855
0856
0857
0858
0859 static int acpi_device_wakeup_enable(struct acpi_device *adev, u32 target_state)
0860 {
0861 return __acpi_device_wakeup_enable(adev, target_state);
0862 }
0863
0864
0865
0866
0867
0868
0869
0870
0871
0872
0873 static void acpi_device_wakeup_disable(struct acpi_device *adev)
0874 {
0875 struct acpi_device_wakeup *wakeup = &adev->wakeup;
0876
0877 mutex_lock(&acpi_wakeup_lock);
0878
0879 if (!wakeup->enable_count)
0880 goto out;
0881
0882 acpi_disable_gpe(wakeup->gpe_device, wakeup->gpe_number);
0883 acpi_disable_wakeup_device_power(adev);
0884
0885 wakeup->enable_count--;
0886
0887 out:
0888 mutex_unlock(&acpi_wakeup_lock);
0889 }
0890
0891
0892
0893
0894
0895
0896 int acpi_pm_set_device_wakeup(struct device *dev, bool enable)
0897 {
0898 struct acpi_device *adev;
0899 int error;
0900
0901 adev = ACPI_COMPANION(dev);
0902 if (!adev) {
0903 dev_dbg(dev, "ACPI companion missing in %s!\n", __func__);
0904 return -ENODEV;
0905 }
0906
0907 if (!acpi_device_can_wakeup(adev))
0908 return -EINVAL;
0909
0910 if (!enable) {
0911 acpi_device_wakeup_disable(adev);
0912 dev_dbg(dev, "Wakeup disabled by ACPI\n");
0913 return 0;
0914 }
0915
0916 error = __acpi_device_wakeup_enable(adev, acpi_target_system_state());
0917 if (!error)
0918 dev_dbg(dev, "Wakeup enabled by ACPI\n");
0919
0920 return error;
0921 }
0922 EXPORT_SYMBOL_GPL(acpi_pm_set_device_wakeup);
0923
0924
0925
0926
0927
0928
0929
0930 static int acpi_dev_pm_low_power(struct device *dev, struct acpi_device *adev,
0931 u32 system_state)
0932 {
0933 int ret, state;
0934
0935 if (!acpi_device_power_manageable(adev))
0936 return 0;
0937
0938 ret = acpi_dev_pm_get_state(dev, adev, system_state, NULL, &state);
0939 return ret ? ret : acpi_device_set_power(adev, state);
0940 }
0941
0942
0943
0944
0945
0946 static int acpi_dev_pm_full_power(struct acpi_device *adev)
0947 {
0948 return acpi_device_power_manageable(adev) ?
0949 acpi_device_set_power(adev, ACPI_STATE_D0) : 0;
0950 }
0951
0952
0953
0954
0955
0956
0957
0958
0959
0960
0961
0962 int acpi_dev_suspend(struct device *dev, bool wakeup)
0963 {
0964 struct acpi_device *adev = ACPI_COMPANION(dev);
0965 u32 target_state = acpi_target_system_state();
0966 int error;
0967
0968 if (!adev)
0969 return 0;
0970
0971 if (wakeup && acpi_device_can_wakeup(adev)) {
0972 error = acpi_device_wakeup_enable(adev, target_state);
0973 if (error)
0974 return -EAGAIN;
0975 } else {
0976 wakeup = false;
0977 }
0978
0979 error = acpi_dev_pm_low_power(dev, adev, target_state);
0980 if (error && wakeup)
0981 acpi_device_wakeup_disable(adev);
0982
0983 return error;
0984 }
0985 EXPORT_SYMBOL_GPL(acpi_dev_suspend);
0986
0987
0988
0989
0990
0991
0992
0993
0994 int acpi_dev_resume(struct device *dev)
0995 {
0996 struct acpi_device *adev = ACPI_COMPANION(dev);
0997 int error;
0998
0999 if (!adev)
1000 return 0;
1001
1002 error = acpi_dev_pm_full_power(adev);
1003 acpi_device_wakeup_disable(adev);
1004 return error;
1005 }
1006 EXPORT_SYMBOL_GPL(acpi_dev_resume);
1007
1008
1009
1010
1011
1012
1013
1014
1015 int acpi_subsys_runtime_suspend(struct device *dev)
1016 {
1017 int ret = pm_generic_runtime_suspend(dev);
1018
1019 return ret ? ret : acpi_dev_suspend(dev, true);
1020 }
1021 EXPORT_SYMBOL_GPL(acpi_subsys_runtime_suspend);
1022
1023
1024
1025
1026
1027
1028
1029
1030 int acpi_subsys_runtime_resume(struct device *dev)
1031 {
1032 int ret = acpi_dev_resume(dev);
1033
1034 return ret ? ret : pm_generic_runtime_resume(dev);
1035 }
1036 EXPORT_SYMBOL_GPL(acpi_subsys_runtime_resume);
1037
1038 #ifdef CONFIG_PM_SLEEP
1039 static bool acpi_dev_needs_resume(struct device *dev, struct acpi_device *adev)
1040 {
1041 u32 sys_target = acpi_target_system_state();
1042 int ret, state;
1043
1044 if (!pm_runtime_suspended(dev) || !adev || (adev->wakeup.flags.valid &&
1045 device_may_wakeup(dev) != !!adev->wakeup.prepare_count))
1046 return true;
1047
1048 if (sys_target == ACPI_STATE_S0)
1049 return false;
1050
1051 if (adev->power.flags.dsw_present)
1052 return true;
1053
1054 ret = acpi_dev_pm_get_state(dev, adev, sys_target, NULL, &state);
1055 if (ret)
1056 return true;
1057
1058 return state != adev->power.state;
1059 }
1060
1061
1062
1063
1064
1065 int acpi_subsys_prepare(struct device *dev)
1066 {
1067 struct acpi_device *adev = ACPI_COMPANION(dev);
1068
1069 if (dev->driver && dev->driver->pm && dev->driver->pm->prepare) {
1070 int ret = dev->driver->pm->prepare(dev);
1071
1072 if (ret < 0)
1073 return ret;
1074
1075 if (!ret && dev_pm_test_driver_flags(dev, DPM_FLAG_SMART_PREPARE))
1076 return 0;
1077 }
1078
1079 return !acpi_dev_needs_resume(dev, adev);
1080 }
1081 EXPORT_SYMBOL_GPL(acpi_subsys_prepare);
1082
1083
1084
1085
1086
1087 void acpi_subsys_complete(struct device *dev)
1088 {
1089 pm_generic_complete(dev);
1090
1091
1092
1093
1094
1095 if (pm_runtime_suspended(dev) && pm_resume_via_firmware())
1096 pm_request_resume(dev);
1097 }
1098 EXPORT_SYMBOL_GPL(acpi_subsys_complete);
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109 int acpi_subsys_suspend(struct device *dev)
1110 {
1111 if (!dev_pm_test_driver_flags(dev, DPM_FLAG_SMART_SUSPEND) ||
1112 acpi_dev_needs_resume(dev, ACPI_COMPANION(dev)))
1113 pm_runtime_resume(dev);
1114
1115 return pm_generic_suspend(dev);
1116 }
1117 EXPORT_SYMBOL_GPL(acpi_subsys_suspend);
1118
1119
1120
1121
1122
1123
1124
1125
1126 int acpi_subsys_suspend_late(struct device *dev)
1127 {
1128 int ret;
1129
1130 if (dev_pm_skip_suspend(dev))
1131 return 0;
1132
1133 ret = pm_generic_suspend_late(dev);
1134 return ret ? ret : acpi_dev_suspend(dev, device_may_wakeup(dev));
1135 }
1136 EXPORT_SYMBOL_GPL(acpi_subsys_suspend_late);
1137
1138
1139
1140
1141
1142 int acpi_subsys_suspend_noirq(struct device *dev)
1143 {
1144 int ret;
1145
1146 if (dev_pm_skip_suspend(dev))
1147 return 0;
1148
1149 ret = pm_generic_suspend_noirq(dev);
1150 if (ret)
1151 return ret;
1152
1153
1154
1155
1156
1157
1158
1159
1160 if (device_can_wakeup(dev) && !device_may_wakeup(dev))
1161 dev->power.may_skip_resume = false;
1162
1163 return 0;
1164 }
1165 EXPORT_SYMBOL_GPL(acpi_subsys_suspend_noirq);
1166
1167
1168
1169
1170
1171 static int acpi_subsys_resume_noirq(struct device *dev)
1172 {
1173 if (dev_pm_skip_resume(dev))
1174 return 0;
1175
1176 return pm_generic_resume_noirq(dev);
1177 }
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189 static int acpi_subsys_resume_early(struct device *dev)
1190 {
1191 const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
1192 int ret;
1193
1194 if (dev_pm_skip_resume(dev))
1195 return 0;
1196
1197 if (pm && !pm->resume_early) {
1198 dev_dbg(dev, "postponing D0 transition to normal resume stage\n");
1199 return 0;
1200 }
1201
1202 ret = acpi_dev_resume(dev);
1203 return ret ? ret : pm_generic_resume_early(dev);
1204 }
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214 static int acpi_subsys_resume(struct device *dev)
1215 {
1216 const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
1217 int ret = 0;
1218
1219 if (!dev_pm_skip_resume(dev) && pm && !pm->resume_early) {
1220 dev_dbg(dev, "executing postponed D0 transition\n");
1221 ret = acpi_dev_resume(dev);
1222 }
1223
1224 return ret ? ret : pm_generic_resume(dev);
1225 }
1226
1227
1228
1229
1230
1231 int acpi_subsys_freeze(struct device *dev)
1232 {
1233
1234
1235
1236
1237
1238
1239
1240
1241 pm_runtime_resume(dev);
1242
1243 return pm_generic_freeze(dev);
1244 }
1245 EXPORT_SYMBOL_GPL(acpi_subsys_freeze);
1246
1247
1248
1249
1250
1251 int acpi_subsys_restore_early(struct device *dev)
1252 {
1253 int ret = acpi_dev_resume(dev);
1254
1255 return ret ? ret : pm_generic_restore_early(dev);
1256 }
1257 EXPORT_SYMBOL_GPL(acpi_subsys_restore_early);
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268 int acpi_subsys_poweroff(struct device *dev)
1269 {
1270 if (!dev_pm_test_driver_flags(dev, DPM_FLAG_SMART_SUSPEND) ||
1271 acpi_dev_needs_resume(dev, ACPI_COMPANION(dev)))
1272 pm_runtime_resume(dev);
1273
1274 return pm_generic_poweroff(dev);
1275 }
1276 EXPORT_SYMBOL_GPL(acpi_subsys_poweroff);
1277
1278
1279
1280
1281
1282
1283
1284
1285 static int acpi_subsys_poweroff_late(struct device *dev)
1286 {
1287 int ret;
1288
1289 if (dev_pm_skip_suspend(dev))
1290 return 0;
1291
1292 ret = pm_generic_poweroff_late(dev);
1293 if (ret)
1294 return ret;
1295
1296 return acpi_dev_suspend(dev, device_may_wakeup(dev));
1297 }
1298
1299
1300
1301
1302
1303 static int acpi_subsys_poweroff_noirq(struct device *dev)
1304 {
1305 if (dev_pm_skip_suspend(dev))
1306 return 0;
1307
1308 return pm_generic_poweroff_noirq(dev);
1309 }
1310 #endif
1311
1312 static struct dev_pm_domain acpi_general_pm_domain = {
1313 .ops = {
1314 .runtime_suspend = acpi_subsys_runtime_suspend,
1315 .runtime_resume = acpi_subsys_runtime_resume,
1316 #ifdef CONFIG_PM_SLEEP
1317 .prepare = acpi_subsys_prepare,
1318 .complete = acpi_subsys_complete,
1319 .suspend = acpi_subsys_suspend,
1320 .resume = acpi_subsys_resume,
1321 .suspend_late = acpi_subsys_suspend_late,
1322 .suspend_noirq = acpi_subsys_suspend_noirq,
1323 .resume_noirq = acpi_subsys_resume_noirq,
1324 .resume_early = acpi_subsys_resume_early,
1325 .freeze = acpi_subsys_freeze,
1326 .poweroff = acpi_subsys_poweroff,
1327 .poweroff_late = acpi_subsys_poweroff_late,
1328 .poweroff_noirq = acpi_subsys_poweroff_noirq,
1329 .restore_early = acpi_subsys_restore_early,
1330 #endif
1331 },
1332 };
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346 static void acpi_dev_pm_detach(struct device *dev, bool power_off)
1347 {
1348 struct acpi_device *adev = ACPI_COMPANION(dev);
1349
1350 if (adev && dev->pm_domain == &acpi_general_pm_domain) {
1351 dev_pm_domain_set(dev, NULL);
1352 acpi_remove_pm_notifier(adev);
1353 if (power_off) {
1354
1355
1356
1357
1358
1359
1360 dev_pm_qos_hide_latency_limit(dev);
1361 dev_pm_qos_hide_flags(dev);
1362 acpi_device_wakeup_disable(adev);
1363 acpi_dev_pm_low_power(dev, adev, ACPI_STATE_S0);
1364 }
1365 }
1366 }
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384 int acpi_dev_pm_attach(struct device *dev, bool power_on)
1385 {
1386
1387
1388
1389
1390
1391 static const struct acpi_device_id special_pm_ids[] = {
1392 ACPI_FAN_DEVICE_IDS,
1393 {}
1394 };
1395 struct acpi_device *adev = ACPI_COMPANION(dev);
1396
1397 if (!adev || !acpi_match_device_ids(adev, special_pm_ids))
1398 return 0;
1399
1400
1401
1402
1403
1404
1405 if (!acpi_device_is_first_physical_node(adev, dev))
1406 return 0;
1407
1408 acpi_add_pm_notifier(adev, dev, acpi_pm_notify_work_func);
1409 dev_pm_domain_set(dev, &acpi_general_pm_domain);
1410 if (power_on) {
1411 acpi_dev_pm_full_power(adev);
1412 acpi_device_wakeup_disable(adev);
1413 }
1414
1415 dev->pm_domain->detach = acpi_dev_pm_detach;
1416 return 1;
1417 }
1418 EXPORT_SYMBOL_GPL(acpi_dev_pm_attach);
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434 bool acpi_storage_d3(struct device *dev)
1435 {
1436 struct acpi_device *adev = ACPI_COMPANION(dev);
1437 u8 val;
1438
1439 if (force_storage_d3())
1440 return true;
1441
1442 if (!adev)
1443 return false;
1444 if (fwnode_property_read_u8(acpi_fwnode_handle(adev), "StorageD3Enable",
1445 &val))
1446 return false;
1447 return val == 1;
1448 }
1449 EXPORT_SYMBOL_GPL(acpi_storage_d3);
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466 bool acpi_dev_state_d0(struct device *dev)
1467 {
1468 struct acpi_device *adev = ACPI_COMPANION(dev);
1469
1470 if (!adev)
1471 return true;
1472
1473 return adev->power.state == ACPI_STATE_D0;
1474 }
1475 EXPORT_SYMBOL_GPL(acpi_dev_state_d0);
1476
1477 #endif