linux/sound/soc/blackfin/bf5xx-ad1836.c
<<
>>
Prefs
   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                .owner = THIS_MODULE,
 108                .pm = &snd_soc_pm_ops,
 109        },
 110        .probe = bf5xx_ad1836_driver_probe,
 111        .remove = bf5xx_ad1836_driver_remove,
 112};
 113module_platform_driver(bf5xx_ad1836_driver);
 114
 115/* Module information */
 116MODULE_AUTHOR("Barry Song");
 117MODULE_DESCRIPTION("ALSA SoC AD1836 board driver");
 118MODULE_LICENSE("GPL");
 119
 120