* [PATCH 0/3] ALSA: pxa27x: ac97 reset fixes
@ 2013-01-07 21:55 Mike Dunn
2013-01-07 21:55 ` [PATCH 1/3] ALSA: pxa27x: fix ac97 cold reset Mike Dunn
` (5 more replies)
0 siblings, 6 replies; 10+ messages in thread
From: Mike Dunn @ 2013-01-07 21:55 UTC (permalink / raw)
To: linux-arm-kernel
AC97 reset is broken on the pxa27x. These patches fix it by addressing multiple
problems:
- cold reset fails because the GCR register is not set correctly
- warm reset fails because some code used to work around a hardware bug is
broken
- the intent of the work-around code is obfuscated by unfortunate function
naming
This patch set replaces some earlier individual patches that had some problems.
Thanks Robert and Igor.
Changelog:
v2:
- don't specify the LPM flag DRIVE_HIGH in #define for the mfp config
- patches 2 and 3 are combined into one patch
- mfp level and direction are set only once, during driver initialization
Mike Dunn (3):
ALSA: pxa2xx: fix ac97 cold reset
ALSA: pxa27x: fix ac97 warm reset
ALSA: pxa27x: rename pxa27x_assert_ac97reset()
arch/arm/mach-pxa/include/mach/mfp-pxa27x.h | 3 ++
arch/arm/mach-pxa/pxa27x.c | 24 ++++++++++++------
sound/arm/pxa2xx-ac97-lib.c | 34 +++++++++++++++++++++-----
3 files changed, 46 insertions(+), 15 deletions(-)
--
1.7.8.6
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/3] ALSA: pxa27x: fix ac97 cold reset
2013-01-07 21:55 [PATCH 0/3] ALSA: pxa27x: ac97 reset fixes Mike Dunn
@ 2013-01-07 21:55 ` Mike Dunn
2013-01-08 8:17 ` Igor Grinberg
2013-01-07 21:55 ` [PATCH 2/3] ALSA: pxa27x: fix ac97 warm reset Mike Dunn
` (4 subsequent siblings)
5 siblings, 1 reply; 10+ messages in thread
From: Mike Dunn @ 2013-01-07 21:55 UTC (permalink / raw)
To: linux-arm-kernel
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 <mikedunn@newsguy.com>
---
sound/arm/pxa2xx-ac97-lib.c | 8 ++++++--
1 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/sound/arm/pxa2xx-ac97-lib.c b/sound/arm/pxa2xx-ac97-lib.c
index 6fc0ae9..1ecd0a66 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)
clk_enable(ac97conf_clk);
udelay(5);
clk_disable(ac97conf_clk);
- GCR = GCR_COLD_RST;
- udelay(50);
+ GCR = GCR_COLD_RST | GCR_WARM_RST;
+ timeout = 100; /* wait for the codec-ready bit to be set */
+ while (!((GSR | gsr_bits) & (GSR_PCR | GSR_SCR)) && timeout--)
+ mdelay(1);
}
#endif
--
1.7.8.6
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 2/3] ALSA: pxa27x: fix ac97 warm reset
2013-01-07 21:55 [PATCH 0/3] ALSA: pxa27x: ac97 reset fixes Mike Dunn
2013-01-07 21:55 ` [PATCH 1/3] ALSA: pxa27x: fix ac97 cold reset Mike Dunn
@ 2013-01-07 21:55 ` Mike Dunn
2013-01-08 8:36 ` Igor Grinberg
2013-01-07 21:55 ` [PATCH 3/3] ALSA: pxa27x: rename pxa27x_assert_ac97reset() Mike Dunn
` (3 subsequent siblings)
5 siblings, 1 reply; 10+ messages in thread
From: Mike Dunn @ 2013-01-07 21:55 UTC (permalink / raw)
To: linux-arm-kernel
This patch fixes some code that implements a work-around to a hardware bug in
the ac97 controller on the pxa27x. A bug in the controller's warm reset
functionality requires that the mfp used by the controller as the AC97_nRESET
line be temporarily reconfigured as a generic output gpio (AF0) and manually
held high for the duration of the warm reset cycle. This is what was done in
the original code, but it was broken long ago by commit fb1bf8cd
([ARM] pxa: introduce processor specific pxa27x_assert_ac97reset())
which changed the mfp to a GPIO input instead of a high output.
The fix requires the ac97 controller to obtain the gpio via gpio_request_one(),
with arguments that configure the gpio as an output initially driven high.
Tested on a palm treo 680 machine. Reportedly, this broken code only prevents a
warm reset on hardware that lacks a pull-up on the line, which appears to be the
case for me.
Signed-off-by: Mike Dunn <mikedunn@newsguy.com>
---
arch/arm/mach-pxa/include/mach/mfp-pxa27x.h | 3 +++
arch/arm/mach-pxa/pxa27x.c | 4 ++--
sound/arm/pxa2xx-ac97-lib.c | 18 +++++++++++++++++-
3 files changed, 22 insertions(+), 3 deletions(-)
diff --git a/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h b/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h
index a611ad3..b6132aa 100644
--- a/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h
+++ b/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h
@@ -463,6 +463,9 @@
GPIO76_LCD_PCLK, \
GPIO77_LCD_BIAS
+/* these enable a work-around for a hw bug in pxa27x during ac97 warm reset */
+#define GPIO113_AC97_nRESET_GPIO_HIGH MFP_CFG_OUT(GPIO113, AF0, DEFAULT)
+#define GPIO95_AC97_nRESET_GPIO_HIGH MFP_CFG_OUT(GPIO95, AF0, DEFAULT)
extern int keypad_set_wake(unsigned int on);
#endif /* __ASM_ARCH_MFP_PXA27X_H */
diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c
index 8047ee0..616cb87 100644
--- a/arch/arm/mach-pxa/pxa27x.c
+++ b/arch/arm/mach-pxa/pxa27x.c
@@ -47,9 +47,9 @@ void pxa27x_clear_otgph(void)
EXPORT_SYMBOL(pxa27x_clear_otgph);
static unsigned long ac97_reset_config[] = {
- GPIO113_GPIO,
+ GPIO113_AC97_nRESET_GPIO_HIGH,
GPIO113_AC97_nRESET,
- GPIO95_GPIO,
+ GPIO95_AC97_nRESET_GPIO_HIGH,
GPIO95_AC97_nRESET,
};
diff --git a/sound/arm/pxa2xx-ac97-lib.c b/sound/arm/pxa2xx-ac97-lib.c
index 1ecd0a66..fff7753 100644
--- a/sound/arm/pxa2xx-ac97-lib.c
+++ b/sound/arm/pxa2xx-ac97-lib.c
@@ -18,6 +18,7 @@
#include <linux/delay.h>
#include <linux/module.h>
#include <linux/io.h>
+#include <linux/gpio.h>
#include <sound/ac97_codec.h>
#include <sound/pxa2xx-lib.h>
@@ -344,8 +345,21 @@ int pxa2xx_ac97_hw_probe(struct platform_device *dev)
}
if (cpu_is_pxa27x()) {
- /* Use GPIO 113 as AC97 Reset on Bulverde */
+ /*
+ * This gpio is needed for a work-around to a bug in the ac97
+ * controller during warm reset. The direction and level is set
+ * here so that it is an output driven high when switching from
+ * AC97_nRESET alt function to generic gpio.
+ */
+ ret = gpio_request_one(reset_gpio, GPIOF_OUT_INIT_HIGH,
+ "pxa27x ac97 reset");
+ if (ret < 0) {
+ pr_err("%s: gpio_request_one() failed: %d\n",
+ __func__, ret);
+ goto err_conf;
+ }
pxa27x_assert_ac97reset(reset_gpio, 0);
+
ac97conf_clk = clk_get(&dev->dev, "AC97CONFCLK");
if (IS_ERR(ac97conf_clk)) {
ret = PTR_ERR(ac97conf_clk);
@@ -388,6 +402,8 @@ EXPORT_SYMBOL_GPL(pxa2xx_ac97_hw_probe);
void pxa2xx_ac97_hw_remove(struct platform_device *dev)
{
+ if (cpu_is_pxa27x())
+ gpio_free(reset_gpio);
GCR |= GCR_ACLINK_OFF;
free_irq(IRQ_AC97, NULL);
if (ac97conf_clk) {
--
1.7.8.6
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 3/3] ALSA: pxa27x: rename pxa27x_assert_ac97reset()
2013-01-07 21:55 [PATCH 0/3] ALSA: pxa27x: ac97 reset fixes Mike Dunn
2013-01-07 21:55 ` [PATCH 1/3] ALSA: pxa27x: fix ac97 cold reset Mike Dunn
2013-01-07 21:55 ` [PATCH 2/3] ALSA: pxa27x: fix ac97 warm reset Mike Dunn
@ 2013-01-07 21:55 ` Mike Dunn
2013-01-08 8:36 ` Igor Grinberg
2013-01-08 8:44 ` [PATCH 0/3] ALSA: pxa27x: ac97 reset fixes Igor Grinberg
` (2 subsequent siblings)
5 siblings, 1 reply; 10+ messages in thread
From: Mike Dunn @ 2013-01-07 21:55 UTC (permalink / raw)
To: linux-arm-kernel
This patch does nothing functionally, it just gives the function a new name and
modifies the prototype slightly in order to clarify what the function is doing
(which is not necessarily asserting the reset).
Some commentary also added.
Tested on a palm treo 680 machine.
Signed-off-by: Mike Dunn <mikedunn@newsguy.com>
---
arch/arm/mach-pxa/pxa27x.c | 20 ++++++++++++++------
sound/arm/pxa2xx-ac97-lib.c | 8 ++++----
2 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c
index 616cb87..69985b06 100644
--- a/arch/arm/mach-pxa/pxa27x.c
+++ b/arch/arm/mach-pxa/pxa27x.c
@@ -53,17 +53,25 @@ static unsigned long ac97_reset_config[] = {
GPIO95_AC97_nRESET,
};
-void pxa27x_assert_ac97reset(int reset_gpio, int on)
+void pxa27x_configure_ac97reset(int reset_gpio, bool to_gpio)
{
+ /*
+ * This helper function is used to work around a bug in the pxa27x's
+ * ac97 controller during a warm reset. The configuration of the
+ * reset_gpio is changed as follows:
+ * to_gpio == true: configured to generic output gpio and driven high
+ * to_gpio == false: configured to ac97 controller alt fn AC97_nRESET
+ */
+
if (reset_gpio == 113)
- pxa2xx_mfp_config(on ? &ac97_reset_config[0] :
- &ac97_reset_config[1], 1);
+ pxa2xx_mfp_config(to_gpio ? &ac97_reset_config[0] :
+ &ac97_reset_config[1], 1);
if (reset_gpio == 95)
- pxa2xx_mfp_config(on ? &ac97_reset_config[2] :
- &ac97_reset_config[3], 1);
+ pxa2xx_mfp_config(to_gpio ? &ac97_reset_config[2] :
+ &ac97_reset_config[3], 1);
}
-EXPORT_SYMBOL_GPL(pxa27x_assert_ac97reset);
+EXPORT_SYMBOL_GPL(pxa27x_configure_ac97reset);
/* Crystal clock: 13MHz */
#define BASE_CLK 13000000
diff --git a/sound/arm/pxa2xx-ac97-lib.c b/sound/arm/pxa2xx-ac97-lib.c
index fff7753..e6f4633 100644
--- a/sound/arm/pxa2xx-ac97-lib.c
+++ b/sound/arm/pxa2xx-ac97-lib.c
@@ -34,7 +34,7 @@ static struct clk *ac97_clk;
static struct clk *ac97conf_clk;
static int reset_gpio;
-extern void pxa27x_assert_ac97reset(int reset_gpio, int on);
+extern void pxa27x_configure_ac97reset(int reset_gpio, bool to_gpio);
/*
* Beware PXA27x bugs:
@@ -140,10 +140,10 @@ static inline void pxa_ac97_warm_pxa27x(void)
gsr_bits = 0;
/* warm reset broken on Bulverde, so manually keep AC97 reset high */
- pxa27x_assert_ac97reset(reset_gpio, 1);
+ pxa27x_configure_ac97reset(reset_gpio, true);
udelay(10);
GCR |= GCR_WARM_RST;
- pxa27x_assert_ac97reset(reset_gpio, 0);
+ pxa27x_configure_ac97reset(reset_gpio, false);
udelay(500);
}
@@ -358,7 +358,7 @@ int pxa2xx_ac97_hw_probe(struct platform_device *dev)
__func__, ret);
goto err_conf;
}
- pxa27x_assert_ac97reset(reset_gpio, 0);
+ pxa27x_configure_ac97reset(reset_gpio, false);
ac97conf_clk = clk_get(&dev->dev, "AC97CONFCLK");
if (IS_ERR(ac97conf_clk)) {
--
1.7.8.6
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 1/3] ALSA: pxa27x: fix ac97 cold reset
2013-01-07 21:55 ` [PATCH 1/3] ALSA: pxa27x: fix ac97 cold reset Mike Dunn
@ 2013-01-08 8:17 ` Igor Grinberg
0 siblings, 0 replies; 10+ messages in thread
From: Igor Grinberg @ 2013-01-08 8:17 UTC (permalink / raw)
To: linux-arm-kernel
On 01/07/13 23:55, Mike Dunn wrote:
> 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 <mikedunn@newsguy.com>
Acked-by: Igor Grinberg <grinberg@compulab.co.il>
> ---
> sound/arm/pxa2xx-ac97-lib.c | 8 ++++++--
> 1 files changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/sound/arm/pxa2xx-ac97-lib.c b/sound/arm/pxa2xx-ac97-lib.c
> index 6fc0ae9..1ecd0a66 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)
> clk_enable(ac97conf_clk);
> udelay(5);
> clk_disable(ac97conf_clk);
> - GCR = GCR_COLD_RST;
> - udelay(50);
> + GCR = GCR_COLD_RST | GCR_WARM_RST;
> + timeout = 100; /* wait for the codec-ready bit to be set */
> + while (!((GSR | gsr_bits) & (GSR_PCR | GSR_SCR)) && timeout--)
> + mdelay(1);
> }
> #endif
>
--
Regards,
Igor.
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 2/3] ALSA: pxa27x: fix ac97 warm reset
2013-01-07 21:55 ` [PATCH 2/3] ALSA: pxa27x: fix ac97 warm reset Mike Dunn
@ 2013-01-08 8:36 ` Igor Grinberg
0 siblings, 0 replies; 10+ messages in thread
From: Igor Grinberg @ 2013-01-08 8:36 UTC (permalink / raw)
To: linux-arm-kernel
On 01/07/13 23:55, Mike Dunn wrote:
> This patch fixes some code that implements a work-around to a hardware bug in
> the ac97 controller on the pxa27x. A bug in the controller's warm reset
> functionality requires that the mfp used by the controller as the AC97_nRESET
> line be temporarily reconfigured as a generic output gpio (AF0) and manually
> held high for the duration of the warm reset cycle. This is what was done in
> the original code, but it was broken long ago by commit fb1bf8cd
> ([ARM] pxa: introduce processor specific pxa27x_assert_ac97reset())
> which changed the mfp to a GPIO input instead of a high output.
>
> The fix requires the ac97 controller to obtain the gpio via gpio_request_one(),
> with arguments that configure the gpio as an output initially driven high.
>
> Tested on a palm treo 680 machine. Reportedly, this broken code only prevents a
> warm reset on hardware that lacks a pull-up on the line, which appears to be the
> case for me.
>
> Signed-off-by: Mike Dunn <mikedunn@newsguy.com>
Since I've participated in the patch development, please, add:
Signed-off-by: Igor Grinberg <grinberg@compulab.co.il>
Thanks!
> ---
> arch/arm/mach-pxa/include/mach/mfp-pxa27x.h | 3 +++
> arch/arm/mach-pxa/pxa27x.c | 4 ++--
> sound/arm/pxa2xx-ac97-lib.c | 18 +++++++++++++++++-
> 3 files changed, 22 insertions(+), 3 deletions(-)
>
> diff --git a/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h b/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h
> index a611ad3..b6132aa 100644
> --- a/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h
> +++ b/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h
> @@ -463,6 +463,9 @@
> GPIO76_LCD_PCLK, \
> GPIO77_LCD_BIAS
>
> +/* these enable a work-around for a hw bug in pxa27x during ac97 warm reset */
> +#define GPIO113_AC97_nRESET_GPIO_HIGH MFP_CFG_OUT(GPIO113, AF0, DEFAULT)
> +#define GPIO95_AC97_nRESET_GPIO_HIGH MFP_CFG_OUT(GPIO95, AF0, DEFAULT)
>
> extern int keypad_set_wake(unsigned int on);
> #endif /* __ASM_ARCH_MFP_PXA27X_H */
> diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c
> index 8047ee0..616cb87 100644
> --- a/arch/arm/mach-pxa/pxa27x.c
> +++ b/arch/arm/mach-pxa/pxa27x.c
> @@ -47,9 +47,9 @@ void pxa27x_clear_otgph(void)
> EXPORT_SYMBOL(pxa27x_clear_otgph);
>
> static unsigned long ac97_reset_config[] = {
> - GPIO113_GPIO,
> + GPIO113_AC97_nRESET_GPIO_HIGH,
> GPIO113_AC97_nRESET,
> - GPIO95_GPIO,
> + GPIO95_AC97_nRESET_GPIO_HIGH,
> GPIO95_AC97_nRESET,
> };
>
> diff --git a/sound/arm/pxa2xx-ac97-lib.c b/sound/arm/pxa2xx-ac97-lib.c
> index 1ecd0a66..fff7753 100644
> --- a/sound/arm/pxa2xx-ac97-lib.c
> +++ b/sound/arm/pxa2xx-ac97-lib.c
> @@ -18,6 +18,7 @@
> #include <linux/delay.h>
> #include <linux/module.h>
> #include <linux/io.h>
> +#include <linux/gpio.h>
>
> #include <sound/ac97_codec.h>
> #include <sound/pxa2xx-lib.h>
> @@ -344,8 +345,21 @@ int pxa2xx_ac97_hw_probe(struct platform_device *dev)
> }
>
> if (cpu_is_pxa27x()) {
> - /* Use GPIO 113 as AC97 Reset on Bulverde */
> + /*
> + * This gpio is needed for a work-around to a bug in the ac97
> + * controller during warm reset. The direction and level is set
> + * here so that it is an output driven high when switching from
> + * AC97_nRESET alt function to generic gpio.
> + */
> + ret = gpio_request_one(reset_gpio, GPIOF_OUT_INIT_HIGH,
> + "pxa27x ac97 reset");
> + if (ret < 0) {
> + pr_err("%s: gpio_request_one() failed: %d\n",
> + __func__, ret);
> + goto err_conf;
> + }
> pxa27x_assert_ac97reset(reset_gpio, 0);
> +
> ac97conf_clk = clk_get(&dev->dev, "AC97CONFCLK");
> if (IS_ERR(ac97conf_clk)) {
> ret = PTR_ERR(ac97conf_clk);
> @@ -388,6 +402,8 @@ EXPORT_SYMBOL_GPL(pxa2xx_ac97_hw_probe);
>
> void pxa2xx_ac97_hw_remove(struct platform_device *dev)
> {
> + if (cpu_is_pxa27x())
> + gpio_free(reset_gpio);
> GCR |= GCR_ACLINK_OFF;
> free_irq(IRQ_AC97, NULL);
> if (ac97conf_clk) {
--
Regards,
Igor.
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 3/3] ALSA: pxa27x: rename pxa27x_assert_ac97reset()
2013-01-07 21:55 ` [PATCH 3/3] ALSA: pxa27x: rename pxa27x_assert_ac97reset() Mike Dunn
@ 2013-01-08 8:36 ` Igor Grinberg
0 siblings, 0 replies; 10+ messages in thread
From: Igor Grinberg @ 2013-01-08 8:36 UTC (permalink / raw)
To: linux-arm-kernel
On 01/07/13 23:55, Mike Dunn wrote:
> This patch does nothing functionally, it just gives the function a new name and
> modifies the prototype slightly in order to clarify what the function is doing
> (which is not necessarily asserting the reset).
> Some commentary also added.
>
> Tested on a palm treo 680 machine.
>
> Signed-off-by: Mike Dunn <mikedunn@newsguy.com>
Acked-by: Igor Grinberg <grinberg@compulab.co.il>
> ---
> arch/arm/mach-pxa/pxa27x.c | 20 ++++++++++++++------
> sound/arm/pxa2xx-ac97-lib.c | 8 ++++----
> 2 files changed, 18 insertions(+), 10 deletions(-)
>
> diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c
> index 616cb87..69985b06 100644
> --- a/arch/arm/mach-pxa/pxa27x.c
> +++ b/arch/arm/mach-pxa/pxa27x.c
> @@ -53,17 +53,25 @@ static unsigned long ac97_reset_config[] = {
> GPIO95_AC97_nRESET,
> };
>
> -void pxa27x_assert_ac97reset(int reset_gpio, int on)
> +void pxa27x_configure_ac97reset(int reset_gpio, bool to_gpio)
> {
> + /*
> + * This helper function is used to work around a bug in the pxa27x's
> + * ac97 controller during a warm reset. The configuration of the
> + * reset_gpio is changed as follows:
> + * to_gpio == true: configured to generic output gpio and driven high
> + * to_gpio == false: configured to ac97 controller alt fn AC97_nRESET
> + */
> +
> if (reset_gpio == 113)
> - pxa2xx_mfp_config(on ? &ac97_reset_config[0] :
> - &ac97_reset_config[1], 1);
> + pxa2xx_mfp_config(to_gpio ? &ac97_reset_config[0] :
> + &ac97_reset_config[1], 1);
>
> if (reset_gpio == 95)
> - pxa2xx_mfp_config(on ? &ac97_reset_config[2] :
> - &ac97_reset_config[3], 1);
> + pxa2xx_mfp_config(to_gpio ? &ac97_reset_config[2] :
> + &ac97_reset_config[3], 1);
> }
> -EXPORT_SYMBOL_GPL(pxa27x_assert_ac97reset);
> +EXPORT_SYMBOL_GPL(pxa27x_configure_ac97reset);
>
> /* Crystal clock: 13MHz */
> #define BASE_CLK 13000000
> diff --git a/sound/arm/pxa2xx-ac97-lib.c b/sound/arm/pxa2xx-ac97-lib.c
> index fff7753..e6f4633 100644
> --- a/sound/arm/pxa2xx-ac97-lib.c
> +++ b/sound/arm/pxa2xx-ac97-lib.c
> @@ -34,7 +34,7 @@ static struct clk *ac97_clk;
> static struct clk *ac97conf_clk;
> static int reset_gpio;
>
> -extern void pxa27x_assert_ac97reset(int reset_gpio, int on);
> +extern void pxa27x_configure_ac97reset(int reset_gpio, bool to_gpio);
>
> /*
> * Beware PXA27x bugs:
> @@ -140,10 +140,10 @@ static inline void pxa_ac97_warm_pxa27x(void)
> gsr_bits = 0;
>
> /* warm reset broken on Bulverde, so manually keep AC97 reset high */
> - pxa27x_assert_ac97reset(reset_gpio, 1);
> + pxa27x_configure_ac97reset(reset_gpio, true);
> udelay(10);
> GCR |= GCR_WARM_RST;
> - pxa27x_assert_ac97reset(reset_gpio, 0);
> + pxa27x_configure_ac97reset(reset_gpio, false);
> udelay(500);
> }
>
> @@ -358,7 +358,7 @@ int pxa2xx_ac97_hw_probe(struct platform_device *dev)
> __func__, ret);
> goto err_conf;
> }
> - pxa27x_assert_ac97reset(reset_gpio, 0);
> + pxa27x_configure_ac97reset(reset_gpio, false);
>
> ac97conf_clk = clk_get(&dev->dev, "AC97CONFCLK");
> if (IS_ERR(ac97conf_clk)) {
--
Regards,
Igor.
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 0/3] ALSA: pxa27x: ac97 reset fixes
2013-01-07 21:55 [PATCH 0/3] ALSA: pxa27x: ac97 reset fixes Mike Dunn
` (2 preceding siblings ...)
2013-01-07 21:55 ` [PATCH 3/3] ALSA: pxa27x: rename pxa27x_assert_ac97reset() Mike Dunn
@ 2013-01-08 8:44 ` Igor Grinberg
2013-01-08 11:30 ` Mark Brown
2013-01-08 19:16 ` Robert Jarzmik
5 siblings, 0 replies; 10+ messages in thread
From: Igor Grinberg @ 2013-01-08 8:44 UTC (permalink / raw)
To: linux-arm-kernel
On 01/07/13 23:55, Mike Dunn wrote:
> AC97 reset is broken on the pxa27x. These patches fix it by addressing multiple
> problems:
> - cold reset fails because the GCR register is not set correctly
> - warm reset fails because some code used to work around a hardware bug is
> broken
> - the intent of the work-around code is obfuscated by unfortunate function
> naming
>
> This patch set replaces some earlier individual patches that had some problems.
> Thanks Robert and Igor.
>
> Changelog:
> v2:
> - don't specify the LPM flag DRIVE_HIGH in #define for the mfp config
> - patches 2 and 3 are combined into one patch
> - mfp level and direction are set only once, during driver initialization
>
> Mike Dunn (3):
> ALSA: pxa2xx: fix ac97 cold reset
> ALSA: pxa27x: fix ac97 warm reset
> ALSA: pxa27x: rename pxa27x_assert_ac97reset()
I believe all three patches should go through Mark's tree.
Mark, at least patches 1 and 2 are also stable material,
can you please, add stable tags?
Thanks.
>
> arch/arm/mach-pxa/include/mach/mfp-pxa27x.h | 3 ++
> arch/arm/mach-pxa/pxa27x.c | 24 ++++++++++++------
> sound/arm/pxa2xx-ac97-lib.c | 34 +++++++++++++++++++++-----
> 3 files changed, 46 insertions(+), 15 deletions(-)
>
--
Regards,
Igor.
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 0/3] ALSA: pxa27x: ac97 reset fixes
2013-01-07 21:55 [PATCH 0/3] ALSA: pxa27x: ac97 reset fixes Mike Dunn
` (3 preceding siblings ...)
2013-01-08 8:44 ` [PATCH 0/3] ALSA: pxa27x: ac97 reset fixes Igor Grinberg
@ 2013-01-08 11:30 ` Mark Brown
2013-01-08 19:16 ` Robert Jarzmik
5 siblings, 0 replies; 10+ messages in thread
From: Mark Brown @ 2013-01-08 11:30 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, Jan 07, 2013 at 01:55:11PM -0800, Mike Dunn wrote:
> AC97 reset is broken on the pxa27x. These patches fix it by addressing multiple
> problems:
Applied all, thanks.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20130108/6a709bc7/attachment.sig>
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 0/3] ALSA: pxa27x: ac97 reset fixes
2013-01-07 21:55 [PATCH 0/3] ALSA: pxa27x: ac97 reset fixes Mike Dunn
` (4 preceding siblings ...)
2013-01-08 11:30 ` Mark Brown
@ 2013-01-08 19:16 ` Robert Jarzmik
5 siblings, 0 replies; 10+ messages in thread
From: Robert Jarzmik @ 2013-01-08 19:16 UTC (permalink / raw)
To: linux-arm-kernel
Mike Dunn <mikedunn@newsguy.com> writes:
Ack for the whole serie.
--
Robert
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2013-01-08 19:16 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-01-07 21:55 [PATCH 0/3] ALSA: pxa27x: ac97 reset fixes Mike Dunn
2013-01-07 21:55 ` [PATCH 1/3] ALSA: pxa27x: fix ac97 cold reset Mike Dunn
2013-01-08 8:17 ` Igor Grinberg
2013-01-07 21:55 ` [PATCH 2/3] ALSA: pxa27x: fix ac97 warm reset Mike Dunn
2013-01-08 8:36 ` Igor Grinberg
2013-01-07 21:55 ` [PATCH 3/3] ALSA: pxa27x: rename pxa27x_assert_ac97reset() Mike Dunn
2013-01-08 8:36 ` Igor Grinberg
2013-01-08 8:44 ` [PATCH 0/3] ALSA: pxa27x: ac97 reset fixes Igor Grinberg
2013-01-08 11:30 ` Mark Brown
2013-01-08 19:16 ` Robert Jarzmik
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).