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/soc-dapm.h> 33#include <sound/pcm_params.h> 34 35#include <asm/blackfin.h> 36#include <asm/cacheflush.h> 37#include <asm/irq.h> 38#include <asm/dma.h> 39#include <asm/portmux.h> 40 41#include "../codecs/ad193x.h" 42#include "bf5xx-sport.h" 43 44#include "bf5xx-tdm-pcm.h" 45#include "bf5xx-tdm.h" 46 47static struct snd_soc_card bf5xx_ad193x; 48 49static int bf5xx_ad193x_startup(struct snd_pcm_substream *substream) 50{ 51 struct snd_soc_pcm_runtime *rtd = substream->private_data; 52 struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; 53 54 cpu_dai->private_data = sport_handle; 55 return 0; 56} 57 58static int bf5xx_ad193x_hw_params(struct snd_pcm_substream *substream, 59 struct snd_pcm_hw_params *params) 60{ 61 struct snd_soc_pcm_runtime *rtd = substream->private_data; 62 struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; 63 struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; 64 unsigned int channel_map[] = {0, 1, 2, 3, 4, 5, 6, 7}; 65 int ret = 0; 66 /* set cpu DAI configuration */ 67 ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_DSP_A | 68 SND_SOC_DAIFMT_IB_IF | SND_SOC_DAIFMT_CBM_CFM); 69 if (ret < 0) 70 return ret; 71 72 /* set codec DAI configuration */ 73 ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_DSP_A | 74 SND_SOC_DAIFMT_IB_IF | SND_SOC_DAIFMT_CBM_CFM); 75 if (ret < 0) 76 return ret; 77 78 /* set codec DAI slots, 8 channels, all channels are enabled */ 79 ret = snd_soc_dai_set_tdm_slot(codec_dai, 0xFF, 0xFF, 8, 32); 80 if (ret < 0) 81 return ret; 82 83 /* set cpu DAI channel mapping */ 84 ret = snd_soc_dai_set_channel_map(cpu_dai, ARRAY_SIZE(channel_map), 85 channel_map, ARRAY_SIZE(channel_map), channel_map); 86 if (ret < 0) 87 return ret; 88 89 return 0; 90} 91 92static struct snd_soc_ops bf5xx_ad193x_ops = { 93 .startup = bf5xx_ad193x_startup, 94 .hw_params = bf5xx_ad193x_hw_params, 95}; 96 97static struct snd_soc_dai_link bf5xx_ad193x_dai = { 98 .name = "ad193x", 99 .stream_name = "AD193X", 100 .cpu_dai = &bf5xx_tdm_dai, 101 .codec_dai = &ad193x_dai, 102 .ops = &bf5xx_ad193x_ops, 103}; 104 105static struct snd_soc_card bf5xx_ad193x = { 106 .name = "bf5xx_ad193x", 107 .platform = &bf5xx_tdm_soc_platform, 108 .dai_link = &bf5xx_ad193x_dai, 109 .num_links = 1, 110}; 111 112static struct snd_soc_device bf5xx_ad193x_snd_devdata = { 113 .card = &bf5xx_ad193x, 114 .codec_dev = &soc_codec_dev_ad193x, 115}; 116 117static struct platform_device *bfxx_ad193x_snd_device; 118 119static int __init bf5xx_ad193x_init(void) 120{ 121 int ret; 122 123 bfxx_ad193x_snd_device = platform_device_alloc("soc-audio", -1); 124 if (!bfxx_ad193x_snd_device) 125 return -ENOMEM; 126 127 platform_set_drvdata(bfxx_ad193x_snd_device, &bf5xx_ad193x_snd_devdata); 128 bf5xx_ad193x_snd_devdata.dev = &bfxx_ad193x_snd_device->dev; 129 ret = platform_device_add(bfxx_ad193x_snd_device); 130 131 if (ret) 132 platform_device_put(bfxx_ad193x_snd_device); 133 134 return ret; 135} 136 137static void __exit bf5xx_ad193x_exit(void) 138{ 139 platform_device_unregister(bfxx_ad193x_snd_device); 140} 141 142module_init(bf5xx_ad193x_init); 143module_exit(bf5xx_ad193x_exit); 144 145/* Module information */ 146MODULE_AUTHOR("Barry Song"); 147MODULE_DESCRIPTION("ALSA SoC AD193X board driver"); 148MODULE_LICENSE("GPL"); 149