diff options
| -rw-r--r-- | drivers/base/power/main.c | 14 | ||||
| -rw-r--r-- | drivers/usb/core/driver.c | 6 | ||||
| -rw-r--r-- | include/linux/device.h | 4 | ||||
| -rw-r--r-- | include/linux/pm.h | 2 |
4 files changed, 15 insertions, 11 deletions
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index aa6320207745..bf5a59ac1957 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c | |||
| @@ -57,7 +57,7 @@ static int async_error; | |||
| 57 | */ | 57 | */ |
| 58 | void device_pm_init(struct device *dev) | 58 | void device_pm_init(struct device *dev) |
| 59 | { | 59 | { |
| 60 | dev->power.in_suspend = false; | 60 | dev->power.is_prepared = false; |
| 61 | init_completion(&dev->power.completion); | 61 | init_completion(&dev->power.completion); |
| 62 | complete_all(&dev->power.completion); | 62 | complete_all(&dev->power.completion); |
| 63 | dev->power.wakeup = NULL; | 63 | dev->power.wakeup = NULL; |
| @@ -91,7 +91,7 @@ void device_pm_add(struct device *dev) | |||
| 91 | pr_debug("PM: Adding info for %s:%s\n", | 91 | pr_debug("PM: Adding info for %s:%s\n", |
| 92 | dev->bus ? dev->bus->name : "No Bus", dev_name(dev)); | 92 | dev->bus ? dev->bus->name : "No Bus", dev_name(dev)); |
| 93 | mutex_lock(&dpm_list_mtx); | 93 | mutex_lock(&dpm_list_mtx); |
| 94 | if (dev->parent && dev->parent->power.in_suspend) | 94 | if (dev->parent && dev->parent->power.is_prepared) |
| 95 | dev_warn(dev, "parent %s should not be sleeping\n", | 95 | dev_warn(dev, "parent %s should not be sleeping\n", |
| 96 | dev_name(dev->parent)); | 96 | dev_name(dev->parent)); |
| 97 | list_add_tail(&dev->power.entry, &dpm_list); | 97 | list_add_tail(&dev->power.entry, &dpm_list); |
| @@ -511,7 +511,11 @@ static int device_resume(struct device *dev, pm_message_t state, bool async) | |||
| 511 | dpm_wait(dev->parent, async); | 511 | dpm_wait(dev->parent, async); |
| 512 | device_lock(dev); | 512 | device_lock(dev); |
| 513 | 513 | ||
| 514 | dev->power.in_suspend = false; | 514 | /* |
| 515 | * This is a fib. But we'll allow new children to be added below | ||
| 516 | * a resumed device, even if the device hasn't been completed yet. | ||
| 517 | */ | ||
| 518 | dev->power.is_prepared = false; | ||
| 515 | 519 | ||
| 516 | if (dev->pwr_domain) { | 520 | if (dev->pwr_domain) { |
| 517 | pm_dev_dbg(dev, state, "power domain "); | 521 | pm_dev_dbg(dev, state, "power domain "); |
| @@ -670,7 +674,7 @@ void dpm_complete(pm_message_t state) | |||
| 670 | struct device *dev = to_device(dpm_prepared_list.prev); | 674 | struct device *dev = to_device(dpm_prepared_list.prev); |
| 671 | 675 | ||
| 672 | get_device(dev); | 676 | get_device(dev); |
| 673 | dev->power.in_suspend = false; | 677 | dev->power.is_prepared = false; |
| 674 | list_move(&dev->power.entry, &list); | 678 | list_move(&dev->power.entry, &list); |
| 675 | mutex_unlock(&dpm_list_mtx); | 679 | mutex_unlock(&dpm_list_mtx); |
| 676 | 680 | ||
| @@ -1042,7 +1046,7 @@ int dpm_prepare(pm_message_t state) | |||
| 1042 | put_device(dev); | 1046 | put_device(dev); |
| 1043 | break; | 1047 | break; |
| 1044 | } | 1048 | } |
| 1045 | dev->power.in_suspend = true; | 1049 | dev->power.is_prepared = true; |
| 1046 | if (!list_empty(&dev->power.entry)) | 1050 | if (!list_empty(&dev->power.entry)) |
| 1047 | list_move_tail(&dev->power.entry, &dpm_prepared_list); | 1051 | list_move_tail(&dev->power.entry, &dpm_prepared_list); |
| 1048 | put_device(dev); | 1052 | put_device(dev); |
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index e35a17687c05..aa3cc465a601 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c | |||
| @@ -375,7 +375,7 @@ static int usb_unbind_interface(struct device *dev) | |||
| 375 | * Just re-enable it without affecting the endpoint toggles. | 375 | * Just re-enable it without affecting the endpoint toggles. |
| 376 | */ | 376 | */ |
| 377 | usb_enable_interface(udev, intf, false); | 377 | usb_enable_interface(udev, intf, false); |
| 378 | } else if (!error && !intf->dev.power.in_suspend) { | 378 | } else if (!error && !intf->dev.power.is_prepared) { |
| 379 | r = usb_set_interface(udev, intf->altsetting[0]. | 379 | r = usb_set_interface(udev, intf->altsetting[0]. |
| 380 | desc.bInterfaceNumber, 0); | 380 | desc.bInterfaceNumber, 0); |
| 381 | if (r < 0) | 381 | if (r < 0) |
| @@ -960,7 +960,7 @@ void usb_rebind_intf(struct usb_interface *intf) | |||
| 960 | } | 960 | } |
| 961 | 961 | ||
| 962 | /* Try to rebind the interface */ | 962 | /* Try to rebind the interface */ |
| 963 | if (!intf->dev.power.in_suspend) { | 963 | if (!intf->dev.power.is_prepared) { |
| 964 | intf->needs_binding = 0; | 964 | intf->needs_binding = 0; |
| 965 | rc = device_attach(&intf->dev); | 965 | rc = device_attach(&intf->dev); |
| 966 | if (rc < 0) | 966 | if (rc < 0) |
| @@ -1107,7 +1107,7 @@ static int usb_resume_interface(struct usb_device *udev, | |||
| 1107 | if (intf->condition == USB_INTERFACE_UNBOUND) { | 1107 | if (intf->condition == USB_INTERFACE_UNBOUND) { |
| 1108 | 1108 | ||
| 1109 | /* Carry out a deferred switch to altsetting 0 */ | 1109 | /* Carry out a deferred switch to altsetting 0 */ |
| 1110 | if (intf->needs_altsetting0 && !intf->dev.power.in_suspend) { | 1110 | if (intf->needs_altsetting0 && !intf->dev.power.is_prepared) { |
| 1111 | usb_set_interface(udev, intf->altsetting[0]. | 1111 | usb_set_interface(udev, intf->altsetting[0]. |
| 1112 | desc.bInterfaceNumber, 0); | 1112 | desc.bInterfaceNumber, 0); |
| 1113 | intf->needs_altsetting0 = 0; | 1113 | intf->needs_altsetting0 = 0; |
diff --git a/include/linux/device.h b/include/linux/device.h index c66111affca9..553fd37b173b 100644 --- a/include/linux/device.h +++ b/include/linux/device.h | |||
| @@ -654,13 +654,13 @@ static inline int device_is_registered(struct device *dev) | |||
| 654 | 654 | ||
| 655 | static inline void device_enable_async_suspend(struct device *dev) | 655 | static inline void device_enable_async_suspend(struct device *dev) |
| 656 | { | 656 | { |
| 657 | if (!dev->power.in_suspend) | 657 | if (!dev->power.is_prepared) |
| 658 | dev->power.async_suspend = true; | 658 | dev->power.async_suspend = true; |
| 659 | } | 659 | } |
| 660 | 660 | ||
| 661 | static inline void device_disable_async_suspend(struct device *dev) | 661 | static inline void device_disable_async_suspend(struct device *dev) |
| 662 | { | 662 | { |
| 663 | if (!dev->power.in_suspend) | 663 | if (!dev->power.is_prepared) |
| 664 | dev->power.async_suspend = false; | 664 | dev->power.async_suspend = false; |
| 665 | } | 665 | } |
| 666 | 666 | ||
diff --git a/include/linux/pm.h b/include/linux/pm.h index 3160648ccdda..cc536bd80984 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h | |||
| @@ -425,7 +425,7 @@ struct dev_pm_info { | |||
| 425 | pm_message_t power_state; | 425 | pm_message_t power_state; |
| 426 | unsigned int can_wakeup:1; | 426 | unsigned int can_wakeup:1; |
| 427 | unsigned int async_suspend:1; | 427 | unsigned int async_suspend:1; |
| 428 | unsigned int in_suspend:1; /* Owned by the PM core */ | 428 | bool is_prepared:1; /* Owned by the PM core */ |
| 429 | spinlock_t lock; | 429 | spinlock_t lock; |
| 430 | #ifdef CONFIG_PM_SLEEP | 430 | #ifdef CONFIG_PM_SLEEP |
| 431 | struct list_head entry; | 431 | struct list_head entry; |
