1/* 2 * File: sound/soc/blackfin/bf5xx-ad193x.c 3 * Author: Barry Song <Barry.Song@analog.com> 4 * 5 * Created: Thur June 4 2009 6 * Description: Board driver for ad193x sound chip 7 * 8 * Bugs: Enter bugs at http://blackfin.uclinux.org/ 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License as published by 12 * the Free Software Foundation; either version 2 of the License, or 13 * (at your option) any later version. 14 * 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, see the file COPYING, or write 22 * to the Free Software Foundation, Inc., 23 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 24 */ 25 26#include <linux/module.h> 27#include <linux/moduleparam.h> 28#include <linux/device.h> 29#include <sound/core.h> 30#include <sound/pcm.h> 31#include <sound/soc.h> 32#include <sound/pcm_params.h> 33 34#include <asm/blackfin.h> 35#include <asm/cacheflush.h> 36#include <asm/irq.h> 37#include <asm/dma.h> 38#include <asm/portmux.h> 39 40#include "../codecs/ad193x.h" 41 42static struct snd_soc_card bf5xx_ad193x; 43 44static int bf5xx_ad193x_link_init(struct snd_soc_pcm_runtime *rtd) 45{ 46 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 47 struct snd_soc_dai *codec_dai = rtd->codec_dai; 48 int ret; 49 50 /* set the codec system clock for DAC and ADC */ 51 ret = snd_soc_dai_set_sysclk(codec_dai, 0, 24576000, SND_SOC_CLOCK_IN); 52 if (ret < 0) 53 return ret; 54 55 /* set codec DAI slots, 8 channels, all channels are enabled */ 56 ret = snd_soc_dai_set_tdm_slot(codec_dai, 0xFF, 0xFF, 8, 32); 57 if (ret < 0) 58 return ret; 59 60 ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0xFF, 0xFF, 8, 32); 61 if (ret < 0) 62 return ret; 63 64 return 0; 65} 66 67#define BF5XX_AD193X_DAIFMT (SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_IB_IF | \ 68 SND_SOC_DAIFMT_CBM_CFM) 69 70static struct snd_soc_dai_link bf5xx_ad193x_dai[] = { 71 { 72 .name = "ad193x", 73 .stream_name = "AD193X", 74 .cpu_dai_name = "bfin-i2s.0", 75 .codec_dai_name ="ad193x-hifi", 76 .platform_name = "bfin-i2s-pcm-audio", 77 .codec_name = "spi0.5", 78 .dai_fmt = BF5XX_AD193X_DAIFMT, 79 .init = bf5xx_ad193x_link_init, 80 }, 81 { 82 .name = "ad193x", 83 .stream_name = "AD193X", 84 .cpu_dai_name = "bfin-i2s.1", 85 .codec_dai_name ="ad193x-hifi", 86 .platform_name = "bfin-i2s-pcm-audio", 87 .codec_name = "spi0.5", 88 .dai_fmt = BF5XX_AD193X_DAIFMT, 89 .init = bf5xx_ad193x_link_init, 90 }, 91}; 92 93static struct snd_soc_card bf5xx_ad193x = { 94 .name = "bfin-ad193x", 95 .owner = THIS_MODULE, 96 .dai_link = &bf5xx_ad193x_dai[CONFIG_SND_BF5XX_SPORT_NUM], 97 .num_links = 1, 98}; 99 100static struct platform_device *bfxx_ad193x_snd_device; 101 102static int __init bf5xx_ad193x_init(void) 103{ 104 int ret; 105 106 bfxx_ad193x_snd_device = platform_device_alloc("soc-audio", -1); 107 if (!bfxx_ad193x_snd_device) 108 return -ENOMEM; 109 110 platform_set_drvdata(bfxx_ad193x_snd_device, &bf5xx_ad193x); 111 ret = platform_device_add(bfxx_ad193x_snd_device); 112 113 if (ret) 114 platform_device_put(bfxx_ad193x_snd_device); 115 116 return ret; 117} 118 119static void __exit bf5xx_ad193x_exit(void) 120{ 121 platform_device_unregister(bfxx_ad193x_snd_device); 122} 123 124module_init(bf5xx_ad193x_init); 125module_exit(bf5xx_ad193x_exit); 126 127/* Module information */ 128MODULE_AUTHOR("Barry Song"); 129MODULE_DESCRIPTION("ALSA SoC AD193X board driver"); 130MODULE_LICENSE("GPL"); 131 132