aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/mach-pxa/pxa27x.c20
-rw-r--r--sound/arm/pxa2xx-ac97-lib.c8
2 files changed, 18 insertions, 10 deletions
diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c
index 616cb87b6179..69985b06c0da 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[] = {
53 GPIO95_AC97_nRESET, 53 GPIO95_AC97_nRESET,
54}; 54};
55 55
56void pxa27x_assert_ac97reset(int reset_gpio, int on) 56void pxa27x_configure_ac97reset(int reset_gpio, bool to_gpio)
57{ 57{
58 /*
59 * This helper function is used to work around a bug in the pxa27x's
60 * ac97 controller during a warm reset. The configuration of the
61 * reset_gpio is changed as follows:
62 * to_gpio == true: configured to generic output gpio and driven high
63 * to_gpio == false: configured to ac97 controller alt fn AC97_nRESET
64 */
65
58 if (reset_gpio == 113) 66 if (reset_gpio == 113)
59 pxa2xx_mfp_config(on ? &ac97_reset_config[0] : 67 pxa2xx_mfp_config(to_gpio ? &ac97_reset_config[0] :
60 &ac97_reset_config[1], 1); 68 &ac97_reset_config[1], 1);
61 69
62 if (reset_gpio == 95) 70 if (reset_gpio == 95)
63 pxa2xx_mfp_config(on ? &ac97_reset_config[2] : 71 pxa2xx_mfp_config(to_gpio ? &ac97_reset_config[2] :
64 &ac97_reset_config[3], 1); 72 &ac97_reset_config[3], 1);
65} 73}
66EXPORT_SYMBOL_GPL(pxa27x_assert_ac97reset); 74EXPORT_SYMBOL_GPL(pxa27x_configure_ac97reset);
67 75
68/* Crystal clock: 13MHz */ 76/* Crystal clock: 13MHz */
69#define BASE_CLK 13000000 77#define BASE_CLK 13000000
diff --git a/sound/arm/pxa2xx-ac97-lib.c b/sound/arm/pxa2xx-ac97-lib.c
index fff7753e35c1..e6f4633b8dd5 100644
--- a/sound/arm/pxa2xx-ac97-lib.c
+++ b/sound/arm/pxa2xx-ac97-lib.c
@@ -34,7 +34,7 @@ static struct clk *ac97_clk;
34static struct clk *ac97conf_clk; 34static struct clk *ac97conf_clk;
35static int reset_gpio; 35static int reset_gpio;
36 36
37extern void pxa27x_assert_ac97reset(int reset_gpio, int on); 37extern void pxa27x_configure_ac97reset(int reset_gpio, bool to_gpio);
38 38
39/* 39/*
40 * Beware PXA27x bugs: 40 * Beware PXA27x bugs:
@@ -140,10 +140,10 @@ static inline void pxa_ac97_warm_pxa27x(void)
140 gsr_bits = 0; 140 gsr_bits = 0;
141 141
142 /* warm reset broken on Bulverde, so manually keep AC97 reset high */ 142 /* warm reset broken on Bulverde, so manually keep AC97 reset high */
143 pxa27x_assert_ac97reset(reset_gpio, 1); 143 pxa27x_configure_ac97reset(reset_gpio, true);
144 udelay(10); 144 udelay(10);
145 GCR |= GCR_WARM_RST; 145 GCR |= GCR_WARM_RST;
146 pxa27x_assert_ac97reset(reset_gpio, 0); 146 pxa27x_configure_ac97reset(reset_gpio, false);
147 udelay(500); 147 udelay(500);
148} 148}
149 149
@@ -358,7 +358,7 @@ int pxa2xx_ac97_hw_probe(struct platform_device *dev)
358 __func__, ret); 358 __func__, ret);
359 goto err_conf; 359 goto err_conf;
360 } 360 }
361 pxa27x_assert_ac97reset(reset_gpio, 0); 361 pxa27x_configure_ac97reset(reset_gpio, false);
362 362
363 ac97conf_clk = clk_get(&dev->dev, "AC97CONFCLK"); 363 ac97conf_clk = clk_get(&dev->dev, "AC97CONFCLK");
364 if (IS_ERR(ac97conf_clk)) { 364 if (IS_ERR(ac97conf_clk)) {