1/* 2 * phycore-ac97.c -- SoC audio for imx_phycore in AC97 mode 3 * 4 * Copyright 2009 Sascha Hauer, Pengutronix <s.hauer@pengutronix.de> 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License as published by the 8 * Free Software Foundation; either version 2 of the License, or (at your 9 * option) any later version. 10 * 11 */ 12 13#include <linux/module.h> 14#include <linux/moduleparam.h> 15#include <linux/device.h> 16#include <linux/i2c.h> 17#include <sound/core.h> 18#include <sound/pcm.h> 19#include <sound/soc.h> 20#include <asm/mach-types.h> 21 22#include "imx-audmux.h" 23 24static struct snd_soc_card imx_phycore; 25 26static struct snd_soc_ops imx_phycore_hifi_ops = { 27}; 28 29static struct snd_soc_dai_link imx_phycore_dai_ac97[] = { 30 { 31 .name = "HiFi", 32 .stream_name = "HiFi", 33 .codec_dai_name = "wm9712-hifi", 34 .codec_name = "wm9712-codec", 35 .cpu_dai_name = "imx-ssi.0", 36 .platform_name = "imx-ssi.0", 37 .ops = &imx_phycore_hifi_ops, 38 }, 39}; 40 41static struct snd_soc_card imx_phycore = { 42 .name = "PhyCORE-ac97-audio", 43 .owner = THIS_MODULE, 44 .dai_link = imx_phycore_dai_ac97, 45 .num_links = ARRAY_SIZE(imx_phycore_dai_ac97), 46}; 47 48static struct platform_device *imx_phycore_snd_ac97_device; 49static struct platform_device *imx_phycore_snd_device; 50 51static int __init imx_phycore_init(void) 52{ 53 int ret; 54 55 if (machine_is_pca100()) { 56 imx_audmux_v1_configure_port(MX27_AUDMUX_HPCR1_SSI0, 57 IMX_AUDMUX_V1_PCR_SYN | /* 4wire mode */ 58 IMX_AUDMUX_V1_PCR_TFCSEL(3) | 59 IMX_AUDMUX_V1_PCR_TCLKDIR | /* clock is output */ 60 IMX_AUDMUX_V1_PCR_RXDSEL(3)); 61 imx_audmux_v1_configure_port(3, 62 IMX_AUDMUX_V1_PCR_SYN | /* 4wire mode */ 63 IMX_AUDMUX_V1_PCR_TFCSEL(0) | 64 IMX_AUDMUX_V1_PCR_TFSDIR | 65 IMX_AUDMUX_V1_PCR_RXDSEL(0)); 66 } else if (machine_is_pcm043()) { 67 imx_audmux_v2_configure_port(3, 68 IMX_AUDMUX_V2_PTCR_SYN | /* 4wire mode */ 69 IMX_AUDMUX_V2_PTCR_TFSEL(0) | 70 IMX_AUDMUX_V2_PTCR_TFSDIR, 71 IMX_AUDMUX_V2_PDCR_RXDSEL(0)); 72 imx_audmux_v2_configure_port(0, 73 IMX_AUDMUX_V2_PTCR_SYN | /* 4wire mode */ 74 IMX_AUDMUX_V2_PTCR_TCSEL(3) | 75 IMX_AUDMUX_V2_PTCR_TCLKDIR, /* clock is output */ 76 IMX_AUDMUX_V2_PDCR_RXDSEL(3)); 77 } else { 78 /* return happy. We might run on a totally different machine */ 79 return 0; 80 } 81 82 imx_phycore_snd_ac97_device = platform_device_alloc("soc-audio", -1); 83 if (!imx_phycore_snd_ac97_device) 84 return -ENOMEM; 85 86 platform_set_drvdata(imx_phycore_snd_ac97_device, &imx_phycore); 87 ret = platform_device_add(imx_phycore_snd_ac97_device); 88 if (ret) 89 goto fail1; 90 91 imx_phycore_snd_device = platform_device_alloc("wm9712-codec", -1); 92 if (!imx_phycore_snd_device) { 93 ret = -ENOMEM; 94 goto fail2; 95 } 96 ret = platform_device_add(imx_phycore_snd_device); 97 98 if (ret) { 99 printk(KERN_ERR "ASoC: Platform device allocation failed\n"); 100 goto fail3; 101 } 102 103 return 0; 104 105fail3: 106 platform_device_put(imx_phycore_snd_device); 107fail2: 108 platform_device_del(imx_phycore_snd_ac97_device); 109fail1: 110 platform_device_put(imx_phycore_snd_ac97_device); 111 return ret; 112} 113 114static void __exit imx_phycore_exit(void) 115{ 116 platform_device_unregister(imx_phycore_snd_device); 117 platform_device_unregister(imx_phycore_snd_ac97_device); 118} 119 120late_initcall(imx_phycore_init); 121module_exit(imx_phycore_exit); 122 123MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>"); 124MODULE_DESCRIPTION("PhyCORE ALSA SoC driver"); 125MODULE_LICENSE("GPL"); 126