diff options
-rw-r--r-- | arch/arm/mach-omap2/omap_hwmod.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-omap2/powerdomain.c | 14 | ||||
-rw-r--r-- | arch/arm/mach-omap2/powerdomain.h | 2 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/plat/dmtimer.h | 4 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/plat/omap-pm.h | 4 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/plat/omap_device.h | 2 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/plat/omap_hwmod.h | 2 | ||||
-rw-r--r-- | arch/arm/plat-omap/omap-pm-noop.c | 24 | ||||
-rw-r--r-- | arch/arm/plat-omap/omap_device.c | 2 |
9 files changed, 36 insertions, 20 deletions
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index d7138070508..6b3088db83b 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
@@ -2625,7 +2625,7 @@ ohsps_unlock: | |||
2625 | * Returns the context loss count of the powerdomain assocated with @oh | 2625 | * Returns the context loss count of the powerdomain assocated with @oh |
2626 | * upon success, or zero if no powerdomain exists for @oh. | 2626 | * upon success, or zero if no powerdomain exists for @oh. |
2627 | */ | 2627 | */ |
2628 | u32 omap_hwmod_get_context_loss_count(struct omap_hwmod *oh) | 2628 | int omap_hwmod_get_context_loss_count(struct omap_hwmod *oh) |
2629 | { | 2629 | { |
2630 | struct powerdomain *pwrdm; | 2630 | struct powerdomain *pwrdm; |
2631 | int ret = 0; | 2631 | int ret = 0; |
diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c index 5164d587ef5..8a18d1bd61c 100644 --- a/arch/arm/mach-omap2/powerdomain.c +++ b/arch/arm/mach-omap2/powerdomain.c | |||
@@ -1002,16 +1002,16 @@ int pwrdm_post_transition(void) | |||
1002 | * @pwrdm: struct powerdomain * to wait for | 1002 | * @pwrdm: struct powerdomain * to wait for |
1003 | * | 1003 | * |
1004 | * Context loss count is the sum of powerdomain off-mode counter, the | 1004 | * Context loss count is the sum of powerdomain off-mode counter, the |
1005 | * logic off counter and the per-bank memory off counter. Returns 0 | 1005 | * logic off counter and the per-bank memory off counter. Returns negative |
1006 | * (and WARNs) upon error, otherwise, returns the context loss count. | 1006 | * (and WARNs) upon error, otherwise, returns the context loss count. |
1007 | */ | 1007 | */ |
1008 | u32 pwrdm_get_context_loss_count(struct powerdomain *pwrdm) | 1008 | int pwrdm_get_context_loss_count(struct powerdomain *pwrdm) |
1009 | { | 1009 | { |
1010 | int i, count; | 1010 | int i, count; |
1011 | 1011 | ||
1012 | if (!pwrdm) { | 1012 | if (!pwrdm) { |
1013 | WARN(1, "powerdomain: %s: pwrdm is null\n", __func__); | 1013 | WARN(1, "powerdomain: %s: pwrdm is null\n", __func__); |
1014 | return 0; | 1014 | return -ENODEV; |
1015 | } | 1015 | } |
1016 | 1016 | ||
1017 | count = pwrdm->state_counter[PWRDM_POWER_OFF]; | 1017 | count = pwrdm->state_counter[PWRDM_POWER_OFF]; |
@@ -1020,7 +1020,13 @@ u32 pwrdm_get_context_loss_count(struct powerdomain *pwrdm) | |||
1020 | for (i = 0; i < pwrdm->banks; i++) | 1020 | for (i = 0; i < pwrdm->banks; i++) |
1021 | count += pwrdm->ret_mem_off_counter[i]; | 1021 | count += pwrdm->ret_mem_off_counter[i]; |
1022 | 1022 | ||
1023 | pr_debug("powerdomain: %s: context loss count = %u\n", | 1023 | /* |
1024 | * Context loss count has to be a non-negative value. Clear the sign | ||
1025 | * bit to get a value range from 0 to INT_MAX. | ||
1026 | */ | ||
1027 | count &= INT_MAX; | ||
1028 | |||
1029 | pr_debug("powerdomain: %s: context loss count = %d\n", | ||
1024 | pwrdm->name, count); | 1030 | pwrdm->name, count); |
1025 | 1031 | ||
1026 | return count; | 1032 | return count; |
diff --git a/arch/arm/mach-omap2/powerdomain.h b/arch/arm/mach-omap2/powerdomain.h index 42e6dd8f2a7..0d72a8a8ce4 100644 --- a/arch/arm/mach-omap2/powerdomain.h +++ b/arch/arm/mach-omap2/powerdomain.h | |||
@@ -217,7 +217,7 @@ int pwrdm_clkdm_state_switch(struct clockdomain *clkdm); | |||
217 | int pwrdm_pre_transition(void); | 217 | int pwrdm_pre_transition(void); |
218 | int pwrdm_post_transition(void); | 218 | int pwrdm_post_transition(void); |
219 | int pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm); | 219 | int pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm); |
220 | u32 pwrdm_get_context_loss_count(struct powerdomain *pwrdm); | 220 | int pwrdm_get_context_loss_count(struct powerdomain *pwrdm); |
221 | bool pwrdm_can_ever_lose_context(struct powerdomain *pwrdm); | 221 | bool pwrdm_can_ever_lose_context(struct powerdomain *pwrdm); |
222 | 222 | ||
223 | extern void omap242x_powerdomains_init(void); | 223 | extern void omap242x_powerdomains_init(void); |
diff --git a/arch/arm/plat-omap/include/plat/dmtimer.h b/arch/arm/plat-omap/include/plat/dmtimer.h index d11025e6e7a..9418f00b6c3 100644 --- a/arch/arm/plat-omap/include/plat/dmtimer.h +++ b/arch/arm/plat-omap/include/plat/dmtimer.h | |||
@@ -104,7 +104,7 @@ struct dmtimer_platform_data { | |||
104 | 104 | ||
105 | bool loses_context; | 105 | bool loses_context; |
106 | 106 | ||
107 | u32 (*get_context_loss_count)(struct device *dev); | 107 | int (*get_context_loss_count)(struct device *dev); |
108 | }; | 108 | }; |
109 | 109 | ||
110 | struct omap_dm_timer *omap_dm_timer_request(void); | 110 | struct omap_dm_timer *omap_dm_timer_request(void); |
@@ -279,7 +279,7 @@ struct omap_dm_timer { | |||
279 | struct platform_device *pdev; | 279 | struct platform_device *pdev; |
280 | struct list_head node; | 280 | struct list_head node; |
281 | 281 | ||
282 | u32 (*get_context_loss_count)(struct device *dev); | 282 | int (*get_context_loss_count)(struct device *dev); |
283 | }; | 283 | }; |
284 | 284 | ||
285 | int omap_dm_timer_prepare(struct omap_dm_timer *timer); | 285 | int omap_dm_timer_prepare(struct omap_dm_timer *timer); |
diff --git a/arch/arm/plat-omap/include/plat/omap-pm.h b/arch/arm/plat-omap/include/plat/omap-pm.h index 0840df813f4..67faa7b8fe9 100644 --- a/arch/arm/plat-omap/include/plat/omap-pm.h +++ b/arch/arm/plat-omap/include/plat/omap-pm.h | |||
@@ -342,9 +342,9 @@ unsigned long omap_pm_cpu_get_freq(void); | |||
342 | * driver must restore device context. If the number of context losses | 342 | * driver must restore device context. If the number of context losses |
343 | * exceeds the maximum positive integer, the function will wrap to 0 and | 343 | * exceeds the maximum positive integer, the function will wrap to 0 and |
344 | * continue counting. Returns the number of context losses for this device, | 344 | * continue counting. Returns the number of context losses for this device, |
345 | * or zero upon error. | 345 | * or negative value upon error. |
346 | */ | 346 | */ |
347 | u32 omap_pm_get_dev_context_loss_count(struct device *dev); | 347 | int omap_pm_get_dev_context_loss_count(struct device *dev); |
348 | 348 | ||
349 | void omap_pm_enable_off_mode(void); | 349 | void omap_pm_enable_off_mode(void); |
350 | void omap_pm_disable_off_mode(void); | 350 | void omap_pm_disable_off_mode(void); |
diff --git a/arch/arm/plat-omap/include/plat/omap_device.h b/arch/arm/plat-omap/include/plat/omap_device.h index 12c5b0c345b..51423d2727a 100644 --- a/arch/arm/plat-omap/include/plat/omap_device.h +++ b/arch/arm/plat-omap/include/plat/omap_device.h | |||
@@ -107,7 +107,7 @@ struct device *omap_device_get_by_hwmod_name(const char *oh_name); | |||
107 | int omap_device_align_pm_lat(struct platform_device *pdev, | 107 | int omap_device_align_pm_lat(struct platform_device *pdev, |
108 | u32 new_wakeup_lat_limit); | 108 | u32 new_wakeup_lat_limit); |
109 | struct powerdomain *omap_device_get_pwrdm(struct omap_device *od); | 109 | struct powerdomain *omap_device_get_pwrdm(struct omap_device *od); |
110 | u32 omap_device_get_context_loss_count(struct platform_device *pdev); | 110 | int omap_device_get_context_loss_count(struct platform_device *pdev); |
111 | 111 | ||
112 | /* Other */ | 112 | /* Other */ |
113 | 113 | ||
diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h index 5419f1a2aaa..8b372ede17c 100644 --- a/arch/arm/plat-omap/include/plat/omap_hwmod.h +++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h | |||
@@ -600,7 +600,7 @@ int omap_hwmod_for_each_by_class(const char *classname, | |||
600 | void *user); | 600 | void *user); |
601 | 601 | ||
602 | int omap_hwmod_set_postsetup_state(struct omap_hwmod *oh, u8 state); | 602 | int omap_hwmod_set_postsetup_state(struct omap_hwmod *oh, u8 state); |
603 | u32 omap_hwmod_get_context_loss_count(struct omap_hwmod *oh); | 603 | int omap_hwmod_get_context_loss_count(struct omap_hwmod *oh); |
604 | 604 | ||
605 | int omap_hwmod_no_setup_reset(struct omap_hwmod *oh); | 605 | int omap_hwmod_no_setup_reset(struct omap_hwmod *oh); |
606 | 606 | ||
diff --git a/arch/arm/plat-omap/omap-pm-noop.c b/arch/arm/plat-omap/omap-pm-noop.c index b0471bb2d47..3dc3801aace 100644 --- a/arch/arm/plat-omap/omap-pm-noop.c +++ b/arch/arm/plat-omap/omap-pm-noop.c | |||
@@ -27,7 +27,7 @@ | |||
27 | #include <plat/omap_device.h> | 27 | #include <plat/omap_device.h> |
28 | 28 | ||
29 | static bool off_mode_enabled; | 29 | static bool off_mode_enabled; |
30 | static u32 dummy_context_loss_counter; | 30 | static int dummy_context_loss_counter; |
31 | 31 | ||
32 | /* | 32 | /* |
33 | * Device-driver-originated constraints (via board-*.c files) | 33 | * Device-driver-originated constraints (via board-*.c files) |
@@ -311,22 +311,32 @@ void omap_pm_disable_off_mode(void) | |||
311 | 311 | ||
312 | #ifdef CONFIG_ARCH_OMAP2PLUS | 312 | #ifdef CONFIG_ARCH_OMAP2PLUS |
313 | 313 | ||
314 | u32 omap_pm_get_dev_context_loss_count(struct device *dev) | 314 | int omap_pm_get_dev_context_loss_count(struct device *dev) |
315 | { | 315 | { |
316 | struct platform_device *pdev = to_platform_device(dev); | 316 | struct platform_device *pdev = to_platform_device(dev); |
317 | u32 count; | 317 | int count; |
318 | 318 | ||
319 | if (WARN_ON(!dev)) | 319 | if (WARN_ON(!dev)) |
320 | return 0; | 320 | return -ENODEV; |
321 | 321 | ||
322 | if (dev->parent == &omap_device_parent) { | 322 | if (dev->parent == &omap_device_parent) { |
323 | count = omap_device_get_context_loss_count(pdev); | 323 | count = omap_device_get_context_loss_count(pdev); |
324 | } else { | 324 | } else { |
325 | WARN_ONCE(off_mode_enabled, "omap_pm: using dummy context loss counter; device %s should be converted to omap_device", | 325 | WARN_ONCE(off_mode_enabled, "omap_pm: using dummy context loss counter; device %s should be converted to omap_device", |
326 | dev_name(dev)); | 326 | dev_name(dev)); |
327 | if (off_mode_enabled) | 327 | |
328 | dummy_context_loss_counter++; | ||
329 | count = dummy_context_loss_counter; | 328 | count = dummy_context_loss_counter; |
329 | |||
330 | if (off_mode_enabled) { | ||
331 | count++; | ||
332 | /* | ||
333 | * Context loss count has to be a non-negative value. | ||
334 | * Clear the sign bit to get a value range from 0 to | ||
335 | * INT_MAX. | ||
336 | */ | ||
337 | count &= INT_MAX; | ||
338 | dummy_context_loss_counter = count; | ||
339 | } | ||
330 | } | 340 | } |
331 | 341 | ||
332 | pr_debug("OMAP PM: context loss count for dev %s = %d\n", | 342 | pr_debug("OMAP PM: context loss count for dev %s = %d\n", |
@@ -337,7 +347,7 @@ u32 omap_pm_get_dev_context_loss_count(struct device *dev) | |||
337 | 347 | ||
338 | #else | 348 | #else |
339 | 349 | ||
340 | u32 omap_pm_get_dev_context_loss_count(struct device *dev) | 350 | int omap_pm_get_dev_context_loss_count(struct device *dev) |
341 | { | 351 | { |
342 | return dummy_context_loss_counter; | 352 | return dummy_context_loss_counter; |
343 | } | 353 | } |
diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c index cd90bedd930..ef4ffc21bba 100644 --- a/arch/arm/plat-omap/omap_device.c +++ b/arch/arm/plat-omap/omap_device.c | |||
@@ -426,7 +426,7 @@ static int _omap_device_notifier_call(struct notifier_block *nb, | |||
426 | * return the context loss counter for that hwmod, otherwise return | 426 | * return the context loss counter for that hwmod, otherwise return |
427 | * zero. | 427 | * zero. |
428 | */ | 428 | */ |
429 | u32 omap_device_get_context_loss_count(struct platform_device *pdev) | 429 | int omap_device_get_context_loss_count(struct platform_device *pdev) |
430 | { | 430 | { |
431 | struct omap_device *od; | 431 | struct omap_device *od; |
432 | u32 ret = 0; | 432 | u32 ret = 0; |