diff options
author | Paul Walmsley <paul@pwsan.com> | 2011-10-06 19:18:45 -0400 |
---|---|---|
committer | Kevin Hilman <khilman@ti.com> | 2011-10-07 16:41:49 -0400 |
commit | b02b917211d50ad5dc13e49c933ef916b10e0d00 (patch) | |
tree | 138707c1aab31b0263cb1bd02ba4678c6a7d80f5 /arch/arm/plat-omap/include/plat/cpu.h | |
parent | ff2f8e5ffb23de6e2284f31651447cb80a4c9d1b (diff) |
ARM: OMAP3: PM: fix I/O wakeup and I/O chain clock control detection
The way that we detect which OMAP3 chips support I/O wakeup and
software I/O chain clock control is broken.
Currently, I/O wakeup is marked as present for all OMAP3 SoCs other
than the AM3505/3517. The TI81xx family of SoCs are at present
considered to be OMAP3 SoCs, but don't support I/O wakeup. To resolve
this, convert the existing blacklist approach to an explicit,
whitelist support, in which only SoCs which are known to support I/O
wakeup are listed. (At present, this only includes OMAP34xx,
OMAP3503, OMAP3515, OMAP3525, OMAP3530, and OMAP36xx.)
Also, the current code incorrectly detects the presence of a
software-controllable I/O chain clock on several chips that don't
support it. This results in writes to reserved bitfields, unnecessary
delays, and console messages on kernels running on those chips:
http://www.spinics.net/lists/linux-omap/msg58735.html
Convert this test to a feature test with a chip-by-chip whitelist.
Thanks to Dave Hylands <dhylands@gmail.com> for reporting this problem
and doing some testing to help isolate the cause. Thanks to Steve
Sakoman <sakoman@gmail.com> for catching a bug in the first version of
this patch. Thanks to Russell King <linux@arm.linux.org.uk> for
comments.
Signed-off-by: Paul Walmsley <paul@pwsan.com>
Cc: Dave Hylands <dhylands@gmail.com>
Cc: Steve Sakoman <sakoman@gmail.com>
Tested-by: Steve Sakoman <sakoman@gmail.com>
Cc: Russell King - ARM Linux <linux@arm.linux.org.uk>
Signed-off-by: Kevin Hilman <khilman@ti.com>
Diffstat (limited to 'arch/arm/plat-omap/include/plat/cpu.h')
-rw-r--r-- | arch/arm/plat-omap/include/plat/cpu.h | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/arch/arm/plat-omap/include/plat/cpu.h b/arch/arm/plat-omap/include/plat/cpu.h index 67b3d75884cd..3a280aaf9675 100644 --- a/arch/arm/plat-omap/include/plat/cpu.h +++ b/arch/arm/plat-omap/include/plat/cpu.h | |||
@@ -477,6 +477,13 @@ void omap2_check_revision(void); | |||
477 | 477 | ||
478 | /* | 478 | /* |
479 | * Runtime detection of OMAP3 features | 479 | * Runtime detection of OMAP3 features |
480 | * | ||
481 | * OMAP3_HAS_IO_CHAIN_CTRL: Some later members of the OMAP3 chip | ||
482 | * family have OS-level control over the I/O chain clock. This is | ||
483 | * to avoid a window during which wakeups could potentially be lost | ||
484 | * during powerdomain transitions. If this bit is set, it | ||
485 | * indicates that the chip does support OS-level control of this | ||
486 | * feature. | ||
480 | */ | 487 | */ |
481 | extern u32 omap_features; | 488 | extern u32 omap_features; |
482 | 489 | ||
@@ -488,9 +495,10 @@ extern u32 omap_features; | |||
488 | #define OMAP3_HAS_192MHZ_CLK BIT(5) | 495 | #define OMAP3_HAS_192MHZ_CLK BIT(5) |
489 | #define OMAP3_HAS_IO_WAKEUP BIT(6) | 496 | #define OMAP3_HAS_IO_WAKEUP BIT(6) |
490 | #define OMAP3_HAS_SDRC BIT(7) | 497 | #define OMAP3_HAS_SDRC BIT(7) |
491 | #define OMAP4_HAS_MPU_1GHZ BIT(8) | 498 | #define OMAP3_HAS_IO_CHAIN_CTRL BIT(8) |
492 | #define OMAP4_HAS_MPU_1_2GHZ BIT(9) | 499 | #define OMAP4_HAS_MPU_1GHZ BIT(9) |
493 | #define OMAP4_HAS_MPU_1_5GHZ BIT(10) | 500 | #define OMAP4_HAS_MPU_1_2GHZ BIT(10) |
501 | #define OMAP4_HAS_MPU_1_5GHZ BIT(11) | ||
494 | 502 | ||
495 | 503 | ||
496 | #define OMAP3_HAS_FEATURE(feat,flag) \ | 504 | #define OMAP3_HAS_FEATURE(feat,flag) \ |
@@ -507,12 +515,11 @@ OMAP3_HAS_FEATURE(isp, ISP) | |||
507 | OMAP3_HAS_FEATURE(192mhz_clk, 192MHZ_CLK) | 515 | OMAP3_HAS_FEATURE(192mhz_clk, 192MHZ_CLK) |
508 | OMAP3_HAS_FEATURE(io_wakeup, IO_WAKEUP) | 516 | OMAP3_HAS_FEATURE(io_wakeup, IO_WAKEUP) |
509 | OMAP3_HAS_FEATURE(sdrc, SDRC) | 517 | OMAP3_HAS_FEATURE(sdrc, SDRC) |
518 | OMAP3_HAS_FEATURE(io_chain_ctrl, IO_CHAIN_CTRL) | ||
510 | 519 | ||
511 | /* | 520 | /* |
512 | * Runtime detection of OMAP4 features | 521 | * Runtime detection of OMAP4 features |
513 | */ | 522 | */ |
514 | extern u32 omap_features; | ||
515 | |||
516 | #define OMAP4_HAS_FEATURE(feat, flag) \ | 523 | #define OMAP4_HAS_FEATURE(feat, flag) \ |
517 | static inline unsigned int omap4_has_ ##feat(void) \ | 524 | static inline unsigned int omap4_has_ ##feat(void) \ |
518 | { \ | 525 | { \ |