Commit 87fee06c authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branch 'asoc/fix/pxa' into tmp

parents c31b71de 3b4bc7bc
...@@ -463,6 +463,9 @@ ...@@ -463,6 +463,9 @@
GPIO76_LCD_PCLK, \ GPIO76_LCD_PCLK, \
GPIO77_LCD_BIAS 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); extern int keypad_set_wake(unsigned int on);
#endif /* __ASM_ARCH_MFP_PXA27X_H */ #endif /* __ASM_ARCH_MFP_PXA27X_H */
...@@ -47,9 +47,9 @@ void pxa27x_clear_otgph(void) ...@@ -47,9 +47,9 @@ void pxa27x_clear_otgph(void)
EXPORT_SYMBOL(pxa27x_clear_otgph); EXPORT_SYMBOL(pxa27x_clear_otgph);
static unsigned long ac97_reset_config[] = { static unsigned long ac97_reset_config[] = {
GPIO113_GPIO, GPIO113_AC97_nRESET_GPIO_HIGH,
GPIO113_AC97_nRESET, GPIO113_AC97_nRESET,
GPIO95_GPIO, GPIO95_AC97_nRESET_GPIO_HIGH,
GPIO95_AC97_nRESET, GPIO95_AC97_nRESET,
}; };
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/gpio.h>
#include <sound/ac97_codec.h> #include <sound/ac97_codec.h>
#include <sound/pxa2xx-lib.h> #include <sound/pxa2xx-lib.h>
...@@ -148,6 +149,8 @@ static inline void pxa_ac97_warm_pxa27x(void) ...@@ -148,6 +149,8 @@ static inline void pxa_ac97_warm_pxa27x(void)
static inline void pxa_ac97_cold_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; /* clear everything but nCRST */
GCR &= ~GCR_COLD_RST; /* then assert nCRST */ GCR &= ~GCR_COLD_RST; /* then assert nCRST */
...@@ -157,8 +160,10 @@ static inline void pxa_ac97_cold_pxa27x(void) ...@@ -157,8 +160,10 @@ static inline void pxa_ac97_cold_pxa27x(void)
clk_enable(ac97conf_clk); clk_enable(ac97conf_clk);
udelay(5); udelay(5);
clk_disable(ac97conf_clk); clk_disable(ac97conf_clk);
GCR = GCR_COLD_RST; GCR = GCR_COLD_RST | GCR_WARM_RST;
udelay(50); timeout = 100; /* wait for the codec-ready bit to be set */
while (!((GSR | gsr_bits) & (GSR_PCR | GSR_SCR)) && timeout--)
mdelay(1);
} }
#endif #endif
...@@ -340,8 +345,21 @@ int pxa2xx_ac97_hw_probe(struct platform_device *dev) ...@@ -340,8 +345,21 @@ int pxa2xx_ac97_hw_probe(struct platform_device *dev)
} }
if (cpu_is_pxa27x()) { 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); pxa27x_assert_ac97reset(reset_gpio, 0);
ac97conf_clk = clk_get(&dev->dev, "AC97CONFCLK"); ac97conf_clk = clk_get(&dev->dev, "AC97CONFCLK");
if (IS_ERR(ac97conf_clk)) { if (IS_ERR(ac97conf_clk)) {
ret = PTR_ERR(ac97conf_clk); ret = PTR_ERR(ac97conf_clk);
...@@ -384,6 +402,8 @@ EXPORT_SYMBOL_GPL(pxa2xx_ac97_hw_probe); ...@@ -384,6 +402,8 @@ EXPORT_SYMBOL_GPL(pxa2xx_ac97_hw_probe);
void pxa2xx_ac97_hw_remove(struct platform_device *dev) void pxa2xx_ac97_hw_remove(struct platform_device *dev)
{ {
if (cpu_is_pxa27x())
gpio_free(reset_gpio);
GCR |= GCR_ACLINK_OFF; GCR |= GCR_ACLINK_OFF;
free_irq(IRQ_AC97, NULL); free_irq(IRQ_AC97, NULL);
if (ac97conf_clk) { if (ac97conf_clk) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment