diff options
-rw-r--r-- | arch/arm/mach-shmobile/pm-sh7372.c | 45 |
1 files changed, 42 insertions, 3 deletions
diff --git a/arch/arm/mach-shmobile/pm-sh7372.c b/arch/arm/mach-shmobile/pm-sh7372.c index 9ad3b610f0fe..71400eae2b68 100644 --- a/arch/arm/mach-shmobile/pm-sh7372.c +++ b/arch/arm/mach-shmobile/pm-sh7372.c | |||
@@ -91,6 +91,36 @@ static int pd_power_up(struct generic_pm_domain *genpd) | |||
91 | return ret; | 91 | return ret; |
92 | } | 92 | } |
93 | 93 | ||
94 | static int pd_power_up_a3rv(struct generic_pm_domain *genpd) | ||
95 | { | ||
96 | int ret = pd_power_up(genpd); | ||
97 | |||
98 | /* force A4LC on after A3RV has been requested on */ | ||
99 | pm_genpd_poweron(&sh7372_a4lc.genpd); | ||
100 | |||
101 | return ret; | ||
102 | } | ||
103 | |||
104 | static int pd_power_down_a3rv(struct generic_pm_domain *genpd) | ||
105 | { | ||
106 | int ret = pd_power_down(genpd); | ||
107 | |||
108 | /* try to power down A4LC after A3RV is requested off */ | ||
109 | pm_genpd_poweron(&sh7372_a4lc.genpd); | ||
110 | queue_work(pm_wq, &sh7372_a4lc.genpd.power_off_work); | ||
111 | |||
112 | return ret; | ||
113 | } | ||
114 | |||
115 | static int pd_power_down_a4lc(struct generic_pm_domain *genpd) | ||
116 | { | ||
117 | /* only power down A4LC if A3RV is off */ | ||
118 | if (!(__raw_readl(PSTR) & (1 << sh7372_a3rv.bit_shift))) | ||
119 | return pd_power_down(genpd); | ||
120 | |||
121 | return 0; | ||
122 | } | ||
123 | |||
94 | static bool pd_active_wakeup(struct device *dev) | 124 | static bool pd_active_wakeup(struct device *dev) |
95 | { | 125 | { |
96 | return true; | 126 | return true; |
@@ -115,9 +145,18 @@ void sh7372_init_pm_domain(struct sh7372_pm_domain *sh7372_pd) | |||
115 | genpd->stop_device = pm_clk_suspend; | 145 | genpd->stop_device = pm_clk_suspend; |
116 | genpd->start_device = pm_clk_resume; | 146 | genpd->start_device = pm_clk_resume; |
117 | genpd->active_wakeup = pd_active_wakeup; | 147 | genpd->active_wakeup = pd_active_wakeup; |
118 | genpd->power_off = pd_power_down; | 148 | |
119 | genpd->power_on = pd_power_up; | 149 | if (sh7372_pd == &sh7372_a4lc) { |
120 | pd_power_up(&sh7372_pd->genpd); | 150 | genpd->power_off = pd_power_down_a4lc; |
151 | genpd->power_on = pd_power_up; | ||
152 | } else if (sh7372_pd == &sh7372_a3rv) { | ||
153 | genpd->power_off = pd_power_down_a3rv; | ||
154 | genpd->power_on = pd_power_up_a3rv; | ||
155 | } else { | ||
156 | genpd->power_off = pd_power_down; | ||
157 | genpd->power_on = pd_power_up; | ||
158 | } | ||
159 | genpd->power_on(&sh7372_pd->genpd); | ||
121 | 160 | ||
122 | shmobile_runtime_pm_late_init = sh7372_late_pm_domain_off; | 161 | shmobile_runtime_pm_late_init = sh7372_late_pm_domain_off; |
123 | } | 162 | } |