Loading arch/arm/mach-pxa/include/mach/mfp-pxa27x.h +3 −0 Original line number Diff line number Diff line Loading @@ -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 */ arch/arm/mach-pxa/pxa27x.c +2 −2 Original line number Diff line number Diff line Loading @@ -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, }; Loading sound/arm/pxa2xx-ac97-lib.c +23 −3 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -148,6 +149,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 */ Loading @@ -157,8 +160,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 Loading Loading @@ -340,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); Loading Loading @@ -384,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) { Loading Loading
arch/arm/mach-pxa/include/mach/mfp-pxa27x.h +3 −0 Original line number Diff line number Diff line Loading @@ -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 */
arch/arm/mach-pxa/pxa27x.c +2 −2 Original line number Diff line number Diff line Loading @@ -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, }; Loading
sound/arm/pxa2xx-ac97-lib.c +23 −3 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -148,6 +149,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 */ Loading @@ -157,8 +160,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 Loading Loading @@ -340,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); Loading Loading @@ -384,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) { Loading