diff options
-rw-r--r-- | arch/arm/mach-pxa/pxa27x.c | 20 | ||||
-rw-r--r-- | 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 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 | ||
56 | void pxa27x_assert_ac97reset(int reset_gpio, int on) | 56 | void 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 | } |
66 | EXPORT_SYMBOL_GPL(pxa27x_assert_ac97reset); | 74 | EXPORT_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; | |||
34 | static struct clk *ac97conf_clk; | 34 | static struct clk *ac97conf_clk; |
35 | static int reset_gpio; | 35 | static int reset_gpio; |
36 | 36 | ||
37 | extern void pxa27x_assert_ac97reset(int reset_gpio, int on); | 37 | extern 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)) { |