diff options
author | Kevin Hilman <khilman@deeprootsystems.com> | 2010-12-21 23:31:55 -0500 |
---|---|---|
committer | Paul Walmsley <paul@pwsan.com> | 2010-12-21 23:31:55 -0500 |
commit | 6081dc348f122cdb76093b2fc6cf5742c968cb69 (patch) | |
tree | 8036b8bbc876515462cee608d400293bc490a6ec /arch/arm/plat-omap/omap-pm-noop.c | |
parent | c80705aa7074045e7431ed2ebeb0f7d5773615ab (diff) |
OMAP: PM noop: implement context loss count for non-omap_devices
For devices which have not (yet) been converted to use omap_device,
implement the context loss counter using the "brutal method" as
originally proposed by Paul Walmsley[1].
The dummy context loss counter is incremented every time it is
checked, but only when off-mode is enabled. When off-mode is
disabled, the dummy counter stops incrementing.
Tested on 36xx/Zoom3 using MMC driver, which is currently the
only in-tree user of this API.
This patch should be reverted after all devices are converted to using
omap_device.
[1] http://marc.info/?l=linux-omap&m=129176260000626&w=2
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
[paul@pwsan.com: fixed compile warning; fixed to compile on OMAP1]
Signed-off-by: Paul Walmsley <paul@pwsan.com>
Diffstat (limited to 'arch/arm/plat-omap/omap-pm-noop.c')
-rw-r--r-- | arch/arm/plat-omap/omap-pm-noop.c | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/arch/arm/plat-omap/omap-pm-noop.c b/arch/arm/plat-omap/omap-pm-noop.c index af58daddcf50..b0471bb2d47d 100644 --- a/arch/arm/plat-omap/omap-pm-noop.c +++ b/arch/arm/plat-omap/omap-pm-noop.c | |||
@@ -26,6 +26,9 @@ | |||
26 | #include <plat/omap-pm.h> | 26 | #include <plat/omap-pm.h> |
27 | #include <plat/omap_device.h> | 27 | #include <plat/omap_device.h> |
28 | 28 | ||
29 | static bool off_mode_enabled; | ||
30 | static u32 dummy_context_loss_counter; | ||
31 | |||
29 | /* | 32 | /* |
30 | * Device-driver-originated constraints (via board-*.c files) | 33 | * Device-driver-originated constraints (via board-*.c files) |
31 | */ | 34 | */ |
@@ -280,10 +283,34 @@ unsigned long omap_pm_cpu_get_freq(void) | |||
280 | return 0; | 283 | return 0; |
281 | } | 284 | } |
282 | 285 | ||
286 | /** | ||
287 | * omap_pm_enable_off_mode - notify OMAP PM that off-mode is enabled | ||
288 | * | ||
289 | * Intended for use only by OMAP PM core code to notify this layer | ||
290 | * that off mode has been enabled. | ||
291 | */ | ||
292 | void omap_pm_enable_off_mode(void) | ||
293 | { | ||
294 | off_mode_enabled = true; | ||
295 | } | ||
296 | |||
297 | /** | ||
298 | * omap_pm_disable_off_mode - notify OMAP PM that off-mode is disabled | ||
299 | * | ||
300 | * Intended for use only by OMAP PM core code to notify this layer | ||
301 | * that off mode has been disabled. | ||
302 | */ | ||
303 | void omap_pm_disable_off_mode(void) | ||
304 | { | ||
305 | off_mode_enabled = false; | ||
306 | } | ||
307 | |||
283 | /* | 308 | /* |
284 | * Device context loss tracking | 309 | * Device context loss tracking |
285 | */ | 310 | */ |
286 | 311 | ||
312 | #ifdef CONFIG_ARCH_OMAP2PLUS | ||
313 | |||
287 | u32 omap_pm_get_dev_context_loss_count(struct device *dev) | 314 | u32 omap_pm_get_dev_context_loss_count(struct device *dev) |
288 | { | 315 | { |
289 | struct platform_device *pdev = to_platform_device(dev); | 316 | struct platform_device *pdev = to_platform_device(dev); |
@@ -292,13 +319,30 @@ u32 omap_pm_get_dev_context_loss_count(struct device *dev) | |||
292 | if (WARN_ON(!dev)) | 319 | if (WARN_ON(!dev)) |
293 | return 0; | 320 | return 0; |
294 | 321 | ||
295 | count = omap_device_get_context_loss_count(pdev); | 322 | if (dev->parent == &omap_device_parent) { |
323 | count = omap_device_get_context_loss_count(pdev); | ||
324 | } else { | ||
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)); | ||
327 | if (off_mode_enabled) | ||
328 | dummy_context_loss_counter++; | ||
329 | count = dummy_context_loss_counter; | ||
330 | } | ||
331 | |||
296 | pr_debug("OMAP PM: context loss count for dev %s = %d\n", | 332 | pr_debug("OMAP PM: context loss count for dev %s = %d\n", |
297 | dev_name(dev), count); | 333 | dev_name(dev), count); |
298 | 334 | ||
299 | return count; | 335 | return count; |
300 | } | 336 | } |
301 | 337 | ||
338 | #else | ||
339 | |||
340 | u32 omap_pm_get_dev_context_loss_count(struct device *dev) | ||
341 | { | ||
342 | return dummy_context_loss_counter; | ||
343 | } | ||
344 | |||
345 | #endif | ||
302 | 346 | ||
303 | /* Should be called before clk framework init */ | 347 | /* Should be called before clk framework init */ |
304 | int __init omap_pm_if_early_init(void) | 348 | int __init omap_pm_if_early_init(void) |