diff options
author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2017-10-15 21:29:55 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2017-10-24 07:27:45 -0400 |
commit | a192aa923b66a435aae56983c4912ee150bc9b32 (patch) | |
tree | 3e09eab844a4524ad233470090b8b50bec024f61 | |
parent | cbe25ce37d6c2623b5ac09128987e98848a54c6c (diff) |
ACPI / LPSS: Consolidate runtime PM and system sleep handling
Move the LPSS-specific code from acpi_lpss_runtime_suspend()
and acpi_lpss_runtime_resume() into separate functions,
acpi_lpss_suspend() and acpi_lpss_resume(), respectively, and
make acpi_lpss_suspend_late() and acpi_lpss_resume_early() use
them too in order to unify the runtime PM and system sleep
handling in the LPSS driver.
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
-rw-r--r-- | drivers/acpi/acpi_lpss.c | 76 |
1 files changed, 34 insertions, 42 deletions
diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c index 8ec19e7c7b61..04d32bdb5a95 100644 --- a/drivers/acpi/acpi_lpss.c +++ b/drivers/acpi/acpi_lpss.c | |||
@@ -716,40 +716,6 @@ static void acpi_lpss_dismiss(struct device *dev) | |||
716 | acpi_dev_suspend(dev, false); | 716 | acpi_dev_suspend(dev, false); |
717 | } | 717 | } |
718 | 718 | ||
719 | #ifdef CONFIG_PM_SLEEP | ||
720 | static int acpi_lpss_suspend_late(struct device *dev) | ||
721 | { | ||
722 | struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev)); | ||
723 | int ret; | ||
724 | |||
725 | ret = pm_generic_suspend_late(dev); | ||
726 | if (ret) | ||
727 | return ret; | ||
728 | |||
729 | if (pdata->dev_desc->flags & LPSS_SAVE_CTX) | ||
730 | acpi_lpss_save_ctx(dev, pdata); | ||
731 | |||
732 | return acpi_dev_suspend(dev, device_may_wakeup(dev)); | ||
733 | } | ||
734 | |||
735 | static int acpi_lpss_resume_early(struct device *dev) | ||
736 | { | ||
737 | struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev)); | ||
738 | int ret; | ||
739 | |||
740 | ret = acpi_dev_resume(dev); | ||
741 | if (ret) | ||
742 | return ret; | ||
743 | |||
744 | acpi_lpss_d3_to_d0_delay(pdata); | ||
745 | |||
746 | if (pdata->dev_desc->flags & LPSS_SAVE_CTX) | ||
747 | acpi_lpss_restore_ctx(dev, pdata); | ||
748 | |||
749 | return pm_generic_resume_early(dev); | ||
750 | } | ||
751 | #endif /* CONFIG_PM_SLEEP */ | ||
752 | |||
753 | /* IOSF SB for LPSS island */ | 719 | /* IOSF SB for LPSS island */ |
754 | #define LPSS_IOSF_UNIT_LPIOEP 0xA0 | 720 | #define LPSS_IOSF_UNIT_LPIOEP 0xA0 |
755 | #define LPSS_IOSF_UNIT_LPIO1 0xAB | 721 | #define LPSS_IOSF_UNIT_LPIO1 0xAB |
@@ -835,19 +801,15 @@ static void lpss_iosf_exit_d3_state(void) | |||
835 | mutex_unlock(&lpss_iosf_mutex); | 801 | mutex_unlock(&lpss_iosf_mutex); |
836 | } | 802 | } |
837 | 803 | ||
838 | static int acpi_lpss_runtime_suspend(struct device *dev) | 804 | static int acpi_lpss_suspend(struct device *dev, bool wakeup) |
839 | { | 805 | { |
840 | struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev)); | 806 | struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev)); |
841 | int ret; | 807 | int ret; |
842 | 808 | ||
843 | ret = pm_generic_runtime_suspend(dev); | ||
844 | if (ret) | ||
845 | return ret; | ||
846 | |||
847 | if (pdata->dev_desc->flags & LPSS_SAVE_CTX) | 809 | if (pdata->dev_desc->flags & LPSS_SAVE_CTX) |
848 | acpi_lpss_save_ctx(dev, pdata); | 810 | acpi_lpss_save_ctx(dev, pdata); |
849 | 811 | ||
850 | ret = acpi_dev_suspend(dev, true); | 812 | ret = acpi_dev_suspend(dev, wakeup); |
851 | 813 | ||
852 | /* | 814 | /* |
853 | * This call must be last in the sequence, otherwise PMC will return | 815 | * This call must be last in the sequence, otherwise PMC will return |
@@ -860,7 +822,7 @@ static int acpi_lpss_runtime_suspend(struct device *dev) | |||
860 | return ret; | 822 | return ret; |
861 | } | 823 | } |
862 | 824 | ||
863 | static int acpi_lpss_runtime_resume(struct device *dev) | 825 | static int acpi_lpss_resume(struct device *dev) |
864 | { | 826 | { |
865 | struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev)); | 827 | struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev)); |
866 | int ret; | 828 | int ret; |
@@ -881,7 +843,37 @@ static int acpi_lpss_runtime_resume(struct device *dev) | |||
881 | if (pdata->dev_desc->flags & LPSS_SAVE_CTX) | 843 | if (pdata->dev_desc->flags & LPSS_SAVE_CTX) |
882 | acpi_lpss_restore_ctx(dev, pdata); | 844 | acpi_lpss_restore_ctx(dev, pdata); |
883 | 845 | ||
884 | return pm_generic_runtime_resume(dev); | 846 | return 0; |
847 | } | ||
848 | |||
849 | #ifdef CONFIG_PM_SLEEP | ||
850 | static int acpi_lpss_suspend_late(struct device *dev) | ||
851 | { | ||
852 | int ret = pm_generic_suspend_late(dev); | ||
853 | |||
854 | return ret ? ret : acpi_lpss_suspend(dev, device_may_wakeup(dev)); | ||
855 | } | ||
856 | |||
857 | static int acpi_lpss_resume_early(struct device *dev) | ||
858 | { | ||
859 | int ret = acpi_lpss_resume(dev); | ||
860 | |||
861 | return ret ? ret : pm_generic_resume_early(dev); | ||
862 | } | ||
863 | #endif /* CONFIG_PM_SLEEP */ | ||
864 | |||
865 | static int acpi_lpss_runtime_suspend(struct device *dev) | ||
866 | { | ||
867 | int ret = pm_generic_runtime_suspend(dev); | ||
868 | |||
869 | return ret ? ret : acpi_lpss_suspend(dev, true); | ||
870 | } | ||
871 | |||
872 | static int acpi_lpss_runtime_resume(struct device *dev) | ||
873 | { | ||
874 | int ret = acpi_lpss_resume(dev); | ||
875 | |||
876 | return ret ? ret : pm_generic_runtime_resume(dev); | ||
885 | } | 877 | } |
886 | #endif /* CONFIG_PM */ | 878 | #endif /* CONFIG_PM */ |
887 | 879 | ||