static int __init eukrea_tlv320_init(void) { int ret; int int_port = 0, ext_port; if (machine_is_eukrea_cpuimx27()) { imx_audmux_v1_configure_port(MX27_AUDMUX_HPCR1_SSI0, IMX_AUDMUX_V1_PCR_SYN | IMX_AUDMUX_V1_PCR_TFSDIR | IMX_AUDMUX_V1_PCR_TCLKDIR | IMX_AUDMUX_V1_PCR_RFSDIR | IMX_AUDMUX_V1_PCR_RCLKDIR | IMX_AUDMUX_V1_PCR_TFCSEL(MX27_AUDMUX_HPCR3_SSI_PINS_4) | IMX_AUDMUX_V1_PCR_RFCSEL(MX27_AUDMUX_HPCR3_SSI_PINS_4) | IMX_AUDMUX_V1_PCR_RXDSEL(MX27_AUDMUX_HPCR3_SSI_PINS_4) ); imx_audmux_v1_configure_port(MX27_AUDMUX_HPCR3_SSI_PINS_4, IMX_AUDMUX_V1_PCR_SYN | IMX_AUDMUX_V1_PCR_RXDSEL(MX27_AUDMUX_HPCR1_SSI0) ); } else if (machine_is_eukrea_cpuimx25sd() || machine_is_eukrea_cpuimx35sd() || machine_is_eukrea_cpuimx51sd()) { ext_port = machine_is_eukrea_cpuimx25sd() ? 4 : 3; imx_audmux_v2_configure_port(int_port, IMX_AUDMUX_V2_PTCR_SYN | IMX_AUDMUX_V2_PTCR_TFSDIR | IMX_AUDMUX_V2_PTCR_TFSEL(ext_port) | IMX_AUDMUX_V2_PTCR_TCLKDIR | IMX_AUDMUX_V2_PTCR_TCSEL(ext_port), IMX_AUDMUX_V2_PDCR_RXDSEL(ext_port) ); imx_audmux_v2_configure_port(ext_port, IMX_AUDMUX_V2_PTCR_SYN, IMX_AUDMUX_V2_PDCR_RXDSEL(int_port) ); } else { /* return happy. We might run on a totally different machine */ return 0; } eukrea_tlv320_snd_device = platform_device_alloc("soc-audio", -1); if (!eukrea_tlv320_snd_device) return -ENOMEM; platform_set_drvdata(eukrea_tlv320_snd_device, &eukrea_tlv320); ret = platform_device_add(eukrea_tlv320_snd_device); if (ret) { printk(KERN_ERR "ASoC: Platform device allocation failed\n"); platform_device_put(eukrea_tlv320_snd_device); } return ret; }
static int __devinit imx_mc13783_probe(struct platform_device *pdev) { int ret; imx_mc13783.dev = &pdev->dev; ret = snd_soc_register_card(&imx_mc13783); if (ret) { dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", ret); return ret; } if (machine_is_mx31_3ds()) { imx_audmux_v2_configure_port(MX31_AUDMUX_PORT4_SSI_PINS_4, IMX_AUDMUX_V2_PTCR_SYN, IMX_AUDMUX_V2_PDCR_RXDSEL(MX31_AUDMUX_PORT1_SSI0) | IMX_AUDMUX_V2_PDCR_MODE(1) | IMX_AUDMUX_V2_PDCR_INMMASK(0xfc)); imx_audmux_v2_configure_port(MX31_AUDMUX_PORT1_SSI0, IMX_AUDMUX_V2_PTCR_SYN | IMX_AUDMUX_V2_PTCR_TFSDIR | IMX_AUDMUX_V2_PTCR_TFSEL(MX31_AUDMUX_PORT4_SSI_PINS_4) | IMX_AUDMUX_V2_PTCR_TCLKDIR | IMX_AUDMUX_V2_PTCR_TCSEL(MX31_AUDMUX_PORT4_SSI_PINS_4) | IMX_AUDMUX_V2_PTCR_RFSDIR | IMX_AUDMUX_V2_PTCR_RFSEL(MX31_AUDMUX_PORT4_SSI_PINS_4) | IMX_AUDMUX_V2_PTCR_RCLKDIR | IMX_AUDMUX_V2_PTCR_RCSEL(MX31_AUDMUX_PORT4_SSI_PINS_4), IMX_AUDMUX_V2_PDCR_RXDSEL(MX31_AUDMUX_PORT4_SSI_PINS_4)); } else if (machine_is_mx27_3ds()) { imx_audmux_v1_configure_port(MX27_AUDMUX_HPCR1_SSI0, IMX_AUDMUX_V1_PCR_SYN | IMX_AUDMUX_V1_PCR_TFSDIR | IMX_AUDMUX_V1_PCR_TCLKDIR | IMX_AUDMUX_V1_PCR_RFSDIR | IMX_AUDMUX_V1_PCR_RCLKDIR | IMX_AUDMUX_V1_PCR_TFCSEL(MX27_AUDMUX_HPCR3_SSI_PINS_4) | IMX_AUDMUX_V1_PCR_RFCSEL(MX27_AUDMUX_HPCR3_SSI_PINS_4) | IMX_AUDMUX_V1_PCR_RXDSEL(MX27_AUDMUX_HPCR3_SSI_PINS_4) ); imx_audmux_v1_configure_port(MX27_AUDMUX_HPCR3_SSI_PINS_4, IMX_AUDMUX_V1_PCR_SYN | IMX_AUDMUX_V1_PCR_RXDSEL(MX27_AUDMUX_HPCR1_SSI0) ); } return ret; }
static int __devinit mx27vis_aic32x4_probe(struct platform_device *pdev) { struct snd_mx27vis_platform_data *pdata = pdev->dev.platform_data; int ret; if (!pdata) { dev_err(&pdev->dev, "No platform data supplied\n"); return -EINVAL; } mx27vis_amp_gain0_gpio = pdata->amp_gain0_gpio; mx27vis_amp_gain1_gpio = pdata->amp_gain1_gpio; mx27vis_amp_mutel_gpio = pdata->amp_mutel_gpio; mx27vis_amp_muter_gpio = pdata->amp_muter_gpio; mx27vis_aic32x4.dev = &pdev->dev; ret = snd_soc_register_card(&mx27vis_aic32x4); if (ret) { dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", ret); return ret; } /* Connect SSI0 as clock slave to SSI1 external pins */ imx_audmux_v1_configure_port(MX27_AUDMUX_HPCR1_SSI0, IMX_AUDMUX_V1_PCR_SYN | IMX_AUDMUX_V1_PCR_TFSDIR | IMX_AUDMUX_V1_PCR_TCLKDIR | IMX_AUDMUX_V1_PCR_TFCSEL(MX27_AUDMUX_PPCR1_SSI_PINS_1) | IMX_AUDMUX_V1_PCR_RXDSEL(MX27_AUDMUX_PPCR1_SSI_PINS_1) ); imx_audmux_v1_configure_port(MX27_AUDMUX_PPCR1_SSI_PINS_1, IMX_AUDMUX_V1_PCR_SYN | IMX_AUDMUX_V1_PCR_RXDSEL(MX27_AUDMUX_HPCR1_SSI0) ); return ret; }
static int __init imx_phycore_init(void) { int ret; if (machine_is_pca100()) { imx_audmux_v1_configure_port(MX27_AUDMUX_HPCR1_SSI0, IMX_AUDMUX_V1_PCR_SYN | /* 4wire mode */ IMX_AUDMUX_V1_PCR_TFCSEL(3) | IMX_AUDMUX_V1_PCR_TCLKDIR | /* clock is output */ IMX_AUDMUX_V1_PCR_RXDSEL(3)); imx_audmux_v1_configure_port(3, IMX_AUDMUX_V1_PCR_SYN | /* 4wire mode */ IMX_AUDMUX_V1_PCR_TFCSEL(0) | IMX_AUDMUX_V1_PCR_TFSDIR | IMX_AUDMUX_V1_PCR_RXDSEL(0)); } else if (machine_is_pcm043()) { imx_audmux_v2_configure_port(3, IMX_AUDMUX_V2_PTCR_SYN | /* 4wire mode */ IMX_AUDMUX_V2_PTCR_TFSEL(0) | IMX_AUDMUX_V2_PTCR_TFSDIR, IMX_AUDMUX_V2_PDCR_RXDSEL(0)); imx_audmux_v2_configure_port(0, IMX_AUDMUX_V2_PTCR_SYN | /* 4wire mode */ IMX_AUDMUX_V2_PTCR_TCSEL(3) | IMX_AUDMUX_V2_PTCR_TCLKDIR, /* clock is output */ IMX_AUDMUX_V2_PDCR_RXDSEL(3)); } else { /* return happy. We might run on a totally different machine */ return 0; } imx_phycore_snd_ac97_device = platform_device_alloc("soc-audio", -1); if (!imx_phycore_snd_ac97_device) return -ENOMEM; platform_set_drvdata(imx_phycore_snd_ac97_device, &imx_phycore); ret = platform_device_add(imx_phycore_snd_ac97_device); if (ret) goto fail1; imx_phycore_snd_device = platform_device_alloc("wm9712-codec", -1); if (!imx_phycore_snd_device) { ret = -ENOMEM; goto fail2; } ret = platform_device_add(imx_phycore_snd_device); if (ret) { printk(KERN_ERR "ASoC: Platform device allocation failed\n"); goto fail3; } return 0; fail3: platform_device_put(imx_phycore_snd_device); fail2: platform_device_del(imx_phycore_snd_ac97_device); fail1: platform_device_put(imx_phycore_snd_ac97_device); return ret; }
static int eukrea_tlv320_probe(struct platform_device *pdev) { int ret; int int_port = 0, ext_port; struct device_node *np = pdev->dev.of_node; struct device_node *ssi_np = NULL, *codec_np = NULL; eukrea_tlv320.dev = &pdev->dev; if (np) { ret = snd_soc_of_parse_card_name(&eukrea_tlv320, "eukrea,model"); if (ret) { dev_err(&pdev->dev, "eukrea,model node missing or invalid.\n"); goto err; } ssi_np = of_parse_phandle(pdev->dev.of_node, "ssi-controller", 0); if (!ssi_np) { dev_err(&pdev->dev, "ssi-controller missing or invalid.\n"); ret = -ENODEV; goto err; } codec_np = of_parse_phandle(ssi_np, "codec-handle", 0); if (codec_np) eukrea_tlv320_dai.codec_of_node = codec_np; else dev_err(&pdev->dev, "codec-handle node missing or invalid.\n"); ret = of_property_read_u32(np, "fsl,mux-int-port", &int_port); if (ret) { dev_err(&pdev->dev, "fsl,mux-int-port node missing or invalid.\n"); return ret; } ret = of_property_read_u32(np, "fsl,mux-ext-port", &ext_port); if (ret) { dev_err(&pdev->dev, "fsl,mux-ext-port node missing or invalid.\n"); return ret; } /* * The port numbering in the hardware manual starts at 1, while * the audmux API expects it starts at 0. */ int_port--; ext_port--; eukrea_tlv320_dai.cpu_of_node = ssi_np; eukrea_tlv320_dai.platform_of_node = ssi_np; } else { eukrea_tlv320_dai.cpu_dai_name = "imx-ssi.0"; eukrea_tlv320_dai.platform_name = "imx-ssi.0"; eukrea_tlv320_dai.codec_name = "tlv320aic23-codec.0-001a"; eukrea_tlv320.name = "cpuimx-audio"; } if (machine_is_eukrea_cpuimx27() || of_find_compatible_node(NULL, NULL, "fsl,imx21-audmux")) { imx_audmux_v1_configure_port(MX27_AUDMUX_HPCR1_SSI0, IMX_AUDMUX_V1_PCR_SYN | IMX_AUDMUX_V1_PCR_TFSDIR | IMX_AUDMUX_V1_PCR_TCLKDIR | IMX_AUDMUX_V1_PCR_RFSDIR | IMX_AUDMUX_V1_PCR_RCLKDIR | IMX_AUDMUX_V1_PCR_TFCSEL(MX27_AUDMUX_HPCR3_SSI_PINS_4) | IMX_AUDMUX_V1_PCR_RFCSEL(MX27_AUDMUX_HPCR3_SSI_PINS_4) | IMX_AUDMUX_V1_PCR_RXDSEL(MX27_AUDMUX_HPCR3_SSI_PINS_4) ); imx_audmux_v1_configure_port(MX27_AUDMUX_HPCR3_SSI_PINS_4, IMX_AUDMUX_V1_PCR_SYN | IMX_AUDMUX_V1_PCR_RXDSEL(MX27_AUDMUX_HPCR1_SSI0) ); } else if (machine_is_eukrea_cpuimx25sd() || machine_is_eukrea_cpuimx35sd() || machine_is_eukrea_cpuimx51sd() || of_find_compatible_node(NULL, NULL, "fsl,imx31-audmux")) { if (!np) ext_port = machine_is_eukrea_cpuimx25sd() ? 4 : 3; imx_audmux_v2_configure_port(int_port, IMX_AUDMUX_V2_PTCR_SYN | IMX_AUDMUX_V2_PTCR_TFSDIR | IMX_AUDMUX_V2_PTCR_TFSEL(ext_port) | IMX_AUDMUX_V2_PTCR_TCLKDIR | IMX_AUDMUX_V2_PTCR_TCSEL(ext_port), IMX_AUDMUX_V2_PDCR_RXDSEL(ext_port) ); imx_audmux_v2_configure_port(ext_port, IMX_AUDMUX_V2_PTCR_SYN, IMX_AUDMUX_V2_PDCR_RXDSEL(int_port) ); } else { if (np) { /* The eukrea,asoc-tlv320 driver was explicitely * requested (through the device tree). */ dev_err(&pdev->dev, "Missing or invalid audmux DT node.\n"); return -ENODEV; } else { /* Return happy. * We might run on a totally different machine. */ return 0; } } ret = snd_soc_register_card(&eukrea_tlv320); err: if (ret) dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", ret); of_node_put(ssi_np); return ret; }