diff options
-rw-r--r-- | arch/arm/mach-shmobile/pm_runtime.c | 25 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/shmobile/pm_runtime.c | 33 |
2 files changed, 40 insertions, 18 deletions
diff --git a/arch/arm/mach-shmobile/pm_runtime.c b/arch/arm/mach-shmobile/pm_runtime.c index 94912d3944d3..12bb504c7f49 100644 --- a/arch/arm/mach-shmobile/pm_runtime.c +++ b/arch/arm/mach-shmobile/pm_runtime.c | |||
@@ -66,11 +66,11 @@ static void platform_pm_runtime_bug(struct device *dev, | |||
66 | dev_err(dev, "runtime pm suspend before resume\n"); | 66 | dev_err(dev, "runtime pm suspend before resume\n"); |
67 | } | 67 | } |
68 | 68 | ||
69 | int platform_pm_runtime_suspend(struct device *dev) | 69 | static int default_platform_runtime_suspend(struct device *dev) |
70 | { | 70 | { |
71 | struct pm_runtime_data *prd = __to_prd(dev); | 71 | struct pm_runtime_data *prd = __to_prd(dev); |
72 | 72 | ||
73 | dev_dbg(dev, "platform_pm_runtime_suspend()\n"); | 73 | dev_dbg(dev, "%s()\n", __func__); |
74 | 74 | ||
75 | platform_pm_runtime_bug(dev, prd); | 75 | platform_pm_runtime_bug(dev, prd); |
76 | 76 | ||
@@ -82,11 +82,11 @@ int platform_pm_runtime_suspend(struct device *dev) | |||
82 | return 0; | 82 | return 0; |
83 | } | 83 | } |
84 | 84 | ||
85 | int platform_pm_runtime_resume(struct device *dev) | 85 | static int default_platform_runtime_resume(struct device *dev) |
86 | { | 86 | { |
87 | struct pm_runtime_data *prd = __to_prd(dev); | 87 | struct pm_runtime_data *prd = __to_prd(dev); |
88 | 88 | ||
89 | dev_dbg(dev, "platform_pm_runtime_resume()\n"); | 89 | dev_dbg(dev, "%s()\n", __func__); |
90 | 90 | ||
91 | platform_pm_runtime_init(dev, prd); | 91 | platform_pm_runtime_init(dev, prd); |
92 | 92 | ||
@@ -98,12 +98,21 @@ int platform_pm_runtime_resume(struct device *dev) | |||
98 | return 0; | 98 | return 0; |
99 | } | 99 | } |
100 | 100 | ||
101 | int platform_pm_runtime_idle(struct device *dev) | 101 | static int default_platform_runtime_idle(struct device *dev) |
102 | { | 102 | { |
103 | /* suspend synchronously to disable clocks immediately */ | 103 | /* suspend synchronously to disable clocks immediately */ |
104 | return pm_runtime_suspend(dev); | 104 | return pm_runtime_suspend(dev); |
105 | } | 105 | } |
106 | 106 | ||
107 | static struct dev_power_domain default_power_domain = { | ||
108 | .ops = { | ||
109 | .runtime_suspend = default_platform_runtime_suspend, | ||
110 | .runtime_resume = default_platform_runtime_resume, | ||
111 | .runtime_idle = default_platform_runtime_idle, | ||
112 | USE_PLATFORM_PM_SLEEP_OPS | ||
113 | }, | ||
114 | }; | ||
115 | |||
107 | static int platform_bus_notify(struct notifier_block *nb, | 116 | static int platform_bus_notify(struct notifier_block *nb, |
108 | unsigned long action, void *data) | 117 | unsigned long action, void *data) |
109 | { | 118 | { |
@@ -114,10 +123,12 @@ static int platform_bus_notify(struct notifier_block *nb, | |||
114 | 123 | ||
115 | if (action == BUS_NOTIFY_BIND_DRIVER) { | 124 | if (action == BUS_NOTIFY_BIND_DRIVER) { |
116 | prd = devres_alloc(__devres_release, sizeof(*prd), GFP_KERNEL); | 125 | prd = devres_alloc(__devres_release, sizeof(*prd), GFP_KERNEL); |
117 | if (prd) | 126 | if (prd) { |
118 | devres_add(dev, prd); | 127 | devres_add(dev, prd); |
119 | else | 128 | dev->pwr_domain = &default_power_domain; |
129 | } else { | ||
120 | dev_err(dev, "unable to alloc memory for runtime pm\n"); | 130 | dev_err(dev, "unable to alloc memory for runtime pm\n"); |
131 | } | ||
121 | } | 132 | } |
122 | 133 | ||
123 | return 0; | 134 | return 0; |
diff --git a/arch/sh/kernel/cpu/shmobile/pm_runtime.c b/arch/sh/kernel/cpu/shmobile/pm_runtime.c index 6dcb8166a64d..22db127afa7b 100644 --- a/arch/sh/kernel/cpu/shmobile/pm_runtime.c +++ b/arch/sh/kernel/cpu/shmobile/pm_runtime.c | |||
@@ -139,7 +139,7 @@ void platform_pm_runtime_suspend_idle(void) | |||
139 | queue_work(pm_wq, &hwblk_work); | 139 | queue_work(pm_wq, &hwblk_work); |
140 | } | 140 | } |
141 | 141 | ||
142 | int platform_pm_runtime_suspend(struct device *dev) | 142 | static int default_platform_runtime_suspend(struct device *dev) |
143 | { | 143 | { |
144 | struct platform_device *pdev = to_platform_device(dev); | 144 | struct platform_device *pdev = to_platform_device(dev); |
145 | struct pdev_archdata *ad = &pdev->archdata; | 145 | struct pdev_archdata *ad = &pdev->archdata; |
@@ -147,7 +147,7 @@ int platform_pm_runtime_suspend(struct device *dev) | |||
147 | int hwblk = ad->hwblk_id; | 147 | int hwblk = ad->hwblk_id; |
148 | int ret = 0; | 148 | int ret = 0; |
149 | 149 | ||
150 | dev_dbg(dev, "platform_pm_runtime_suspend() [%d]\n", hwblk); | 150 | dev_dbg(dev, "%s() [%d]\n", __func__, hwblk); |
151 | 151 | ||
152 | /* ignore off-chip platform devices */ | 152 | /* ignore off-chip platform devices */ |
153 | if (!hwblk) | 153 | if (!hwblk) |
@@ -183,20 +183,20 @@ int platform_pm_runtime_suspend(struct device *dev) | |||
183 | mutex_unlock(&ad->mutex); | 183 | mutex_unlock(&ad->mutex); |
184 | 184 | ||
185 | out: | 185 | out: |
186 | dev_dbg(dev, "platform_pm_runtime_suspend() [%d] returns %d\n", | 186 | dev_dbg(dev, "%s() [%d] returns %d\n", |
187 | hwblk, ret); | 187 | __func__, hwblk, ret); |
188 | 188 | ||
189 | return ret; | 189 | return ret; |
190 | } | 190 | } |
191 | 191 | ||
192 | int platform_pm_runtime_resume(struct device *dev) | 192 | static int default_platform_runtime_resume(struct device *dev) |
193 | { | 193 | { |
194 | struct platform_device *pdev = to_platform_device(dev); | 194 | struct platform_device *pdev = to_platform_device(dev); |
195 | struct pdev_archdata *ad = &pdev->archdata; | 195 | struct pdev_archdata *ad = &pdev->archdata; |
196 | int hwblk = ad->hwblk_id; | 196 | int hwblk = ad->hwblk_id; |
197 | int ret = 0; | 197 | int ret = 0; |
198 | 198 | ||
199 | dev_dbg(dev, "platform_pm_runtime_resume() [%d]\n", hwblk); | 199 | dev_dbg(dev, "%s() [%d]\n", __func__, hwblk); |
200 | 200 | ||
201 | /* ignore off-chip platform devices */ | 201 | /* ignore off-chip platform devices */ |
202 | if (!hwblk) | 202 | if (!hwblk) |
@@ -228,19 +228,19 @@ int platform_pm_runtime_resume(struct device *dev) | |||
228 | */ | 228 | */ |
229 | mutex_unlock(&ad->mutex); | 229 | mutex_unlock(&ad->mutex); |
230 | out: | 230 | out: |
231 | dev_dbg(dev, "platform_pm_runtime_resume() [%d] returns %d\n", | 231 | dev_dbg(dev, "%s() [%d] returns %d\n", |
232 | hwblk, ret); | 232 | __func__, hwblk, ret); |
233 | 233 | ||
234 | return ret; | 234 | return ret; |
235 | } | 235 | } |
236 | 236 | ||
237 | int platform_pm_runtime_idle(struct device *dev) | 237 | static int default_platform_runtime_idle(struct device *dev) |
238 | { | 238 | { |
239 | struct platform_device *pdev = to_platform_device(dev); | 239 | struct platform_device *pdev = to_platform_device(dev); |
240 | int hwblk = pdev->archdata.hwblk_id; | 240 | int hwblk = pdev->archdata.hwblk_id; |
241 | int ret = 0; | 241 | int ret = 0; |
242 | 242 | ||
243 | dev_dbg(dev, "platform_pm_runtime_idle() [%d]\n", hwblk); | 243 | dev_dbg(dev, "%s() [%d]\n", __func__, hwblk); |
244 | 244 | ||
245 | /* ignore off-chip platform devices */ | 245 | /* ignore off-chip platform devices */ |
246 | if (!hwblk) | 246 | if (!hwblk) |
@@ -252,10 +252,19 @@ int platform_pm_runtime_idle(struct device *dev) | |||
252 | /* suspend synchronously to disable clocks immediately */ | 252 | /* suspend synchronously to disable clocks immediately */ |
253 | ret = pm_runtime_suspend(dev); | 253 | ret = pm_runtime_suspend(dev); |
254 | out: | 254 | out: |
255 | dev_dbg(dev, "platform_pm_runtime_idle() [%d] done!\n", hwblk); | 255 | dev_dbg(dev, "%s() [%d] done!\n", __func__, hwblk); |
256 | return ret; | 256 | return ret; |
257 | } | 257 | } |
258 | 258 | ||
259 | static struct dev_power_domain default_power_domain = { | ||
260 | .ops = { | ||
261 | .runtime_suspend = default_platform_runtime_suspend, | ||
262 | .runtime_resume = default_platform_runtime_resume, | ||
263 | .runtime_idle = default_platform_runtime_idle, | ||
264 | USE_PLATFORM_PM_SLEEP_OPS | ||
265 | }, | ||
266 | }; | ||
267 | |||
259 | static int platform_bus_notify(struct notifier_block *nb, | 268 | static int platform_bus_notify(struct notifier_block *nb, |
260 | unsigned long action, void *data) | 269 | unsigned long action, void *data) |
261 | { | 270 | { |
@@ -276,6 +285,7 @@ static int platform_bus_notify(struct notifier_block *nb, | |||
276 | hwblk_disable(hwblk_info, hwblk); | 285 | hwblk_disable(hwblk_info, hwblk); |
277 | /* make sure driver re-inits itself once */ | 286 | /* make sure driver re-inits itself once */ |
278 | __set_bit(PDEV_ARCHDATA_FLAG_INIT, &pdev->archdata.flags); | 287 | __set_bit(PDEV_ARCHDATA_FLAG_INIT, &pdev->archdata.flags); |
288 | dev->pwr_domain = &default_power_domain; | ||
279 | break; | 289 | break; |
280 | /* TODO: add BUS_NOTIFY_BIND_DRIVER and increase idle count */ | 290 | /* TODO: add BUS_NOTIFY_BIND_DRIVER and increase idle count */ |
281 | case BUS_NOTIFY_BOUND_DRIVER: | 291 | case BUS_NOTIFY_BOUND_DRIVER: |
@@ -289,6 +299,7 @@ static int platform_bus_notify(struct notifier_block *nb, | |||
289 | __set_bit(PDEV_ARCHDATA_FLAG_INIT, &pdev->archdata.flags); | 299 | __set_bit(PDEV_ARCHDATA_FLAG_INIT, &pdev->archdata.flags); |
290 | break; | 300 | break; |
291 | case BUS_NOTIFY_DEL_DEVICE: | 301 | case BUS_NOTIFY_DEL_DEVICE: |
302 | dev->pwr_domain = NULL; | ||
292 | break; | 303 | break; |
293 | } | 304 | } |
294 | return 0; | 305 | return 0; |