pca100: add sound support
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
parent
d9e557e5cb
commit
c8a6885f21
1 changed files with 48 additions and 0 deletions
|
@ -25,6 +25,7 @@
|
||||||
#include <linux/spi/spi.h>
|
#include <linux/spi/spi.h>
|
||||||
#include <linux/spi/eeprom.h>
|
#include <linux/spi/eeprom.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
#include <linux/delay.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <linux/usb/otg.h>
|
#include <linux/usb/otg.h>
|
||||||
#include <linux/usb/ulpi.h>
|
#include <linux/usb/ulpi.h>
|
||||||
|
@ -41,6 +42,8 @@
|
||||||
#include <mach/spi.h>
|
#include <mach/spi.h>
|
||||||
#endif
|
#endif
|
||||||
#include <mach/imx-uart.h>
|
#include <mach/imx-uart.h>
|
||||||
|
#include <mach/audmux.h>
|
||||||
|
#include <mach/ssi.h>
|
||||||
#include <mach/mxc_nand.h>
|
#include <mach/mxc_nand.h>
|
||||||
#include <mach/irqs.h>
|
#include <mach/irqs.h>
|
||||||
#include <mach/mmc.h>
|
#include <mach/mmc.h>
|
||||||
|
@ -193,6 +196,37 @@ static struct spi_imx_master pca100_spi_0_data = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void pca100_ac97_warm_reset(struct snd_ac97 *ac97)
|
||||||
|
{
|
||||||
|
mxc_gpio_mode(GPIO_PORTC | 20 | GPIO_GPIO | GPIO_OUT);
|
||||||
|
gpio_set_value(GPIO_PORTC + 20, 1);
|
||||||
|
udelay(2);
|
||||||
|
gpio_set_value(GPIO_PORTC + 20, 0);
|
||||||
|
mxc_gpio_mode(PC20_PF_SSI1_FS);
|
||||||
|
msleep(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pca100_ac97_cold_reset(struct snd_ac97 *ac97)
|
||||||
|
{
|
||||||
|
mxc_gpio_mode(GPIO_PORTC | 20 | GPIO_GPIO | GPIO_OUT); /* FS */
|
||||||
|
gpio_set_value(GPIO_PORTC + 20, 0);
|
||||||
|
mxc_gpio_mode(GPIO_PORTC | 22 | GPIO_GPIO | GPIO_OUT); /* TX */
|
||||||
|
gpio_set_value(GPIO_PORTC + 22, 0);
|
||||||
|
mxc_gpio_mode(GPIO_PORTC | 28 | GPIO_GPIO | GPIO_OUT); /* reset */
|
||||||
|
gpio_set_value(GPIO_PORTC + 28, 0);
|
||||||
|
udelay(10);
|
||||||
|
gpio_set_value(GPIO_PORTC + 28, 1);
|
||||||
|
mxc_gpio_mode(PC20_PF_SSI1_FS);
|
||||||
|
mxc_gpio_mode(PC22_PF_SSI1_TXD);
|
||||||
|
msleep(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct imx_ssi_platform_data pca100_ssi_pdata = {
|
||||||
|
.ac97_reset = pca100_ac97_cold_reset,
|
||||||
|
.ac97_warm_reset = pca100_ac97_warm_reset,
|
||||||
|
.flags = IMX_SSI_USE_AC97,
|
||||||
|
};
|
||||||
|
|
||||||
static int pca100_sdhc2_init(struct device *dev, irq_handler_t detect_irq,
|
static int pca100_sdhc2_init(struct device *dev, irq_handler_t detect_irq,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
|
@ -266,11 +300,25 @@ static void __init pca100_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
/* SSI unit */
|
||||||
|
mxc_audmux_v1_configure_port(MX27_AUDMUX_HPCR1_SSI0,
|
||||||
|
MXC_AUDMUX_V1_PCR_SYN | /* 4wire mode */
|
||||||
|
MXC_AUDMUX_V1_PCR_TFCSEL(3) |
|
||||||
|
MXC_AUDMUX_V1_PCR_TCLKDIR | /* clock is output */
|
||||||
|
MXC_AUDMUX_V1_PCR_RXDSEL(3));
|
||||||
|
mxc_audmux_v1_configure_port(3,
|
||||||
|
MXC_AUDMUX_V1_PCR_SYN | /* 4wire mode */
|
||||||
|
MXC_AUDMUX_V1_PCR_TFCSEL(0) |
|
||||||
|
MXC_AUDMUX_V1_PCR_TFSDIR |
|
||||||
|
MXC_AUDMUX_V1_PCR_RXDSEL(0));
|
||||||
|
|
||||||
ret = mxc_gpio_setup_multiple_pins(pca100_pins,
|
ret = mxc_gpio_setup_multiple_pins(pca100_pins,
|
||||||
ARRAY_SIZE(pca100_pins), "PCA100");
|
ARRAY_SIZE(pca100_pins), "PCA100");
|
||||||
if (ret)
|
if (ret)
|
||||||
printk(KERN_ERR "pca100: Failed to setup pins (%d)\n", ret);
|
printk(KERN_ERR "pca100: Failed to setup pins (%d)\n", ret);
|
||||||
|
|
||||||
|
mxc_register_device(&imx_ssi_device0, &pca100_ssi_pdata);
|
||||||
|
|
||||||
mxc_register_device(&mxc_uart_device0, &uart_pdata);
|
mxc_register_device(&mxc_uart_device0, &uart_pdata);
|
||||||
|
|
||||||
mxc_gpio_mode(GPIO_PORTC | 29 | GPIO_GPIO | GPIO_IN);
|
mxc_gpio_mode(GPIO_PORTC | 29 | GPIO_GPIO | GPIO_IN);
|
||||||
|
|
Loading…
Reference in a new issue