1/* 2 * File: sound/soc/blackfin/bf5xx-ad1836.c 3 * Author: Barry Song <Barry.Song@analog.com> 4 * 5 * Created: Aug 4 2009 6 * Description: Board driver for ad1836 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 */ 16 17#include <linux/module.h> 18#include <linux/moduleparam.h> 19#include <linux/device.h> 20#include <sound/core.h> 21#include <sound/pcm.h> 22#include <sound/soc.h> 23#include <sound/pcm_params.h> 24 25#include <asm/blackfin.h> 26#include <asm/cacheflush.h> 27#include <asm/irq.h> 28#include <asm/dma.h> 29#include <asm/portmux.h> 30 31#include "../codecs/ad1836.h" 32 33static struct snd_soc_card bf5xx_ad1836; 34 35static int bf5xx_ad1836_init(struct snd_soc_pcm_runtime *rtd) 36{ 37 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 38 unsigned int channel_map[] = {0, 4, 1, 5, 2, 6, 3, 7}; 39 int ret = 0; 40 41 /* set cpu DAI channel mapping */ 42 ret = snd_soc_dai_set_channel_map(cpu_dai, ARRAY_SIZE(channel_map), 43 channel_map, ARRAY_SIZE(channel_map), channel_map); 44 if (ret < 0) 45 return ret; 46 47 ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0xFF, 0xFF, 8, 32); 48 if (ret < 0) 49 return ret; 50 51 return 0; 52} 53 54#define BF5XX_AD1836_DAIFMT (SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_IB_IF | \ 55 SND_SOC_DAIFMT_CBM_CFM) 56 57static struct snd_soc_dai_link bf5xx_ad1836_dai = { 58 .name = "ad1836", 59 .stream_name = "AD1836", 60 .codec_dai_name = "ad1836-hifi", 61 .platform_name = "bfin-i2s-pcm-audio", 62 .dai_fmt = BF5XX_AD1836_DAIFMT, 63 .init = bf5xx_ad1836_init, 64}; 65 66static struct snd_soc_card bf5xx_ad1836 = { 67 .name = "bfin-ad1836", 68 .owner = THIS_MODULE, 69 .dai_link = &bf5xx_ad1836_dai, 70 .num_links = 1, 71}; 72 73static int bf5xx_ad1836_driver_probe(struct platform_device *pdev) 74{ 75 struct snd_soc_card *card = &bf5xx_ad1836; 76 const char **link_name; 77 int ret; 78 79 link_name = pdev->dev.platform_data; 80 if (!link_name) { 81 dev_err(&pdev->dev, "No platform data supplied\n"); 82 return -EINVAL; 83 } 84 bf5xx_ad1836_dai.cpu_dai_name = link_name[0]; 85 bf5xx_ad1836_dai.codec_name = link_name[1]; 86 87 card->dev = &pdev->dev; 88 platform_set_drvdata(pdev, card); 89 90 ret = snd_soc_register_card(card); 91 if (ret) 92 dev_err(&pdev->dev, "Failed to register card\n"); 93 return ret; 94} 95 96static int bf5xx_ad1836_driver_remove(struct platform_device *pdev) 97{ 98 struct snd_soc_card *card = platform_get_drvdata(pdev); 99 100 snd_soc_unregister_card(card); 101 return 0; 102} 103 104static struct platform_driver bf5xx_ad1836_driver = { 105 .driver = { 106 .name = "bfin-snd-ad1836", 107 .pm = &snd_soc_pm_ops, 108 }, 109 .probe = bf5xx_ad1836_driver_probe, 110 .remove = bf5xx_ad1836_driver_remove, 111}; 112module_platform_driver(bf5xx_ad1836_driver); 113 114/* Module information */ 115MODULE_AUTHOR("Barry Song"); 116MODULE_DESCRIPTION("ALSA SoC AD1836 board driver"); 117MODULE_LICENSE("GPL"); 118 119