diff mbox

[PATCHv2] OMAP: McBSP: Always maintain McBSP fclk while active

Message ID 12373758621770-git-send-email-ext-eero.nurkkala@nokia.com (mailing list archive)
State Accepted, archived
Commit bd0d1794e9897e65d9443b8b7ba897d93f3deab8
Delegated to: Tony Lindgren
Headers show

Commit Message

ext-eero.nurkkala@nokia.com March 18, 2009, 11:31 a.m. UTC
From: Eero Nurkkala <ext-eero.nurkkala@nokia.com>

McBSP fclk must be maintained for the duration of
audio playback or recording. Otherwise the fclk
may get autogated when the PER96M clk is no longer
required by other modules. This results in audio
activity being hang. Also, if the McBSP is run
as a slave, it is possible that words are
randomly missed from the playback. Fix all this
phenomenom by enabling the McBSP fclk
clockactivity bit for the entire active duration
of the McBSP usage.

Signed-off-by: Eero Nurkkala <ext-eero.nurkkala@nokia.com>
---
 arch/arm/plat-omap/include/mach/mcbsp.h |    1 +
 arch/arm/plat-omap/mcbsp.c              |    6 +++---
 2 files changed, 4 insertions(+), 3 deletions(-)

Comments

Jarkko Nikula March 19, 2009, 12:29 p.m. UTC | #1
On Wed, 18 Mar 2009 12:31:02 +0100
"Nurkkala Eero.An (EXT-Offcode/Oulu)" <ext-Eero.Nurkkala@nokia.com>
wrote:

> From: Eero Nurkkala <ext-eero.nurkkala@nokia.com>
> 
> McBSP fclk must be maintained for the duration of
> audio playback or recording. Otherwise the fclk
> may get autogated when the PER96M clk is no longer
> required by other modules. This results in audio
> activity being hang. Also, if the McBSP is run
> as a slave, it is possible that words are
> randomly missed from the playback. Fix all this
> phenomenom by enabling the McBSP fclk
> clockactivity bit for the entire active duration
> of the McBSP usage.
> 
> Signed-off-by: Eero Nurkkala <ext-eero.nurkkala@nokia.com>
> ---
...
>  		w = OMAP_MCBSP_READ(mcbsp->io_base, SYSCON);
> -		w &= ~(ENAWAKEUP | SIDLEMODE(0x03));
> -		w |= (ENAWAKEUP | SIDLEMODE(0x02));
> +		w &= ~(ENAWAKEUP | SIDLEMODE(0x03) | CLOCKACTIVITY
> (0x03));
> +		w |= (ENAWAKEUP | SIDLEMODE(0x02) | CLOCKACTIVITY
> (0x02));

Based on updated TRM info:
http://marc.info/?l=linux-omap&m=123674373120880&w=2

Acked-by: Jarkko Nikula <jarkko.nikula@nokia.com>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Tony Lindgren March 26, 2009, 10:47 p.m. UTC | #2
This patch has been applied to the linux-omap
by youw fwiendly patch wobot.

Commit: bd0d1794e9897e65d9443b8b7ba897d93f3deab8

PatchWorks
http://patchwork.kernel.org/patch/12818/

Git
http://git.kernel.org/?p=linux/kernel/git/tmlind/linux-omap-2.6.git;a=commit;h=bd0d1794e9897e65d9443b8b7ba897d93f3deab8


--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/arch/arm/plat-omap/include/mach/mcbsp.h b/arch/arm/plat-omap/include/mach/mcbsp.h
index 26bde05..ec61b89 100644
--- a/arch/arm/plat-omap/include/mach/mcbsp.h
+++ b/arch/arm/plat-omap/include/mach/mcbsp.h
@@ -252,6 +252,7 @@ 
 #define RDISABLE		0x0001
 
 /********************** McBSP SYSCONFIG bit definitions ********************/
+#define CLOCKACTIVITY(value)	((value)<<8)
 #define SIDLEMODE(value)	((value)<<3)
 #define ENAWAKEUP		0x0004
 #define SOFTRST			0x0002
diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c
index a94d03e..02b3f2d 100644
--- a/arch/arm/plat-omap/mcbsp.c
+++ b/arch/arm/plat-omap/mcbsp.c
@@ -248,8 +248,8 @@  int omap_mcbsp_request(unsigned int id)
 		u16 w;
 
 		w = OMAP_MCBSP_READ(mcbsp->io_base, SYSCON);
-		w &= ~(ENAWAKEUP | SIDLEMODE(0x03));
-		w |= (ENAWAKEUP | SIDLEMODE(0x02));
+		w &= ~(ENAWAKEUP | SIDLEMODE(0x03) | CLOCKACTIVITY(0x03));
+		w |= (ENAWAKEUP | SIDLEMODE(0x02) | CLOCKACTIVITY(0x02));
 		OMAP_MCBSP_WRITE(mcbsp->io_base, SYSCON, w);
 
 		OMAP_MCBSP_WRITE(mcbsp->io_base, WAKEUPEN, WAKEUPEN_ALL);
@@ -308,7 +308,7 @@  void omap_mcbsp_free(unsigned int id)
 		u16 w;
 
 		w = OMAP_MCBSP_READ(mcbsp->io_base, SYSCON);
-		w &= ~(ENAWAKEUP | SIDLEMODE(0x03));
+		w &= ~(ENAWAKEUP | SIDLEMODE(0x03) | CLOCKACTIVITY(0x03));
 		OMAP_MCBSP_WRITE(mcbsp->io_base, SYSCON, w);
 
 		w = OMAP_MCBSP_READ(mcbsp->io_base, WAKEUPEN);