Patchwork [3.5.y.z,extended,stable] Patch "ALSA: pxa27x: fix ac97 cold reset" has been added to staging queue

mail settings
Submitter Herton Ronaldo Krzesinski
Date Jan. 23, 2013, 4:42 a.m.
Message ID <>
Download mbox | patch
Permalink /patch/214754/
State New
Headers show


Herton Ronaldo Krzesinski - Jan. 23, 2013, 4:42 a.m.
This is a note to let you know that I have just added a patch titled

    ALSA: pxa27x: fix ac97 cold reset

to the linux-3.5.y-queue branch of the 3.5.y.z extended stable tree 
which can be found at:;a=shortlog;h=refs/heads/linux-3.5.y-queue

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.5.y.z tree, see



From c984707f6799fad8e61d12970f18458a3af154b8 Mon Sep 17 00:00:00 2001
From: Mike Dunn <>
Date: Mon, 7 Jan 2013 13:55:12 -0800
Subject: [PATCH] ALSA: pxa27x: fix ac97 cold reset

commit 41b645c8624df6ace020a8863ad1449d69140f7d upstream.

Cold reset on the pxa27x currently fails and

     pxa2xx_ac97_try_cold_reset: cold reset timeout (GSR=0x44)

appears in the kernel log.  Through trial-and-error (the pxa270 developer's
manual is mostly incoherent on the topic of ac97 reset), I got cold reset to
complete by setting the WARM_RST bit in the GCR register (and later noticed that
pxa3xx does this for cold reset as well).  Also, a timeout loop is needed to
wait for the reset to complete.

Tested on a palm treo 680 machine.

Signed-off-by: Mike Dunn <>
Acked-by: Igor Grinberg <>
Signed-off-by: Mark Brown <>
Signed-off-by: Herton Ronaldo Krzesinski <>
 sound/arm/pxa2xx-ac97-lib.c |    8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)



diff --git a/sound/arm/pxa2xx-ac97-lib.c b/sound/arm/pxa2xx-ac97-lib.c
index 48d7c0a..8cfb2c0 100644
--- a/sound/arm/pxa2xx-ac97-lib.c
+++ b/sound/arm/pxa2xx-ac97-lib.c
@@ -148,6 +148,8 @@  static inline void pxa_ac97_warm_pxa27x(void)

 static inline void pxa_ac97_cold_pxa27x(void)
+	unsigned int timeout;
 	GCR &=  GCR_COLD_RST;  /* clear everything but nCRST */
 	GCR &= ~GCR_COLD_RST;  /* then assert nCRST */

@@ -157,8 +159,10 @@  static inline void pxa_ac97_cold_pxa27x(void)
-	udelay(50);
+	timeout = 100;     /* wait for the codec-ready bit to be set */
+	while (!((GSR | gsr_bits) & (GSR_PCR | GSR_SCR)) && timeout--)
+		mdelay(1);