linux/sound/soc/au1x/db1200.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * DB1200/DB1300/DB1550 ASoC audio fabric support code.
   4 *
   5 * (c) 2008-2011 Manuel Lauss <manuel.lauss@googlemail.com>
   6 *
   7 */
   8
   9#include <linux/module.h>
  10#include <linux/moduleparam.h>
  11#include <linux/timer.h>
  12#include <linux/interrupt.h>
  13#include <linux/platform_device.h>
  14#include <sound/core.h>
  15#include <sound/pcm.h>
  16#include <sound/soc.h>
  17#include <asm/mach-au1x00/au1000.h>
  18#include <asm/mach-au1x00/au1xxx_psc.h>
  19#include <asm/mach-au1x00/au1xxx_dbdma.h>
  20#include <asm/mach-db1x00/bcsr.h>
  21
  22#include "../codecs/wm8731.h"
  23#include "psc.h"
  24
  25static const struct platform_device_id db1200_pids[] = {
  26        {
  27                .name           = "db1200-ac97",
  28                .driver_data    = 0,
  29        }, {
  30                .name           = "db1200-i2s",
  31                .driver_data    = 1,
  32        }, {
  33                .name           = "db1300-ac97",
  34                .driver_data    = 2,
  35        }, {
  36                .name           = "db1300-i2s",
  37                .driver_data    = 3,
  38        }, {
  39                .name           = "db1550-ac97",
  40                .driver_data    = 4,
  41        }, {
  42                .name           = "db1550-i2s",
  43                .driver_data    = 5,
  44        },
  45        {},
  46};
  47MODULE_DEVICE_TABLE(platform, db1200_pids);
  48
  49/*-------------------------  AC97 PART  ---------------------------*/
  50
  51SND_SOC_DAILINK_DEFS(db1200_ac97,
  52        DAILINK_COMP_ARRAY(COMP_CPU("au1xpsc_ac97.1")),
  53        DAILINK_COMP_ARRAY(COMP_CODEC("ac97-codec.1", "ac97-hifi")),
  54        DAILINK_COMP_ARRAY(COMP_PLATFORM("au1xpsc-pcm.1")));
  55
  56static struct snd_soc_dai_link db1200_ac97_dai = {
  57        .name           = "AC97",
  58        .stream_name    = "AC97 HiFi",
  59        SND_SOC_DAILINK_REG(db1200_ac97),
  60};
  61
  62static struct snd_soc_card db1200_ac97_machine = {
  63        .name           = "DB1200_AC97",
  64        .owner          = THIS_MODULE,
  65        .dai_link       = &db1200_ac97_dai,
  66        .num_links      = 1,
  67};
  68
  69SND_SOC_DAILINK_DEFS(db1300_ac97,
  70        DAILINK_COMP_ARRAY(COMP_CPU("au1xpsc_ac97.1")),
  71        DAILINK_COMP_ARRAY(COMP_CODEC("wm9712-codec.1", "wm9712-hifi")),
  72        DAILINK_COMP_ARRAY(COMP_PLATFORM("au1xpsc-pcm.1")));
  73
  74static struct snd_soc_dai_link db1300_ac97_dai = {
  75        .name           = "AC97",
  76        .stream_name    = "AC97 HiFi",
  77        SND_SOC_DAILINK_REG(db1300_ac97),
  78};
  79
  80static struct snd_soc_card db1300_ac97_machine = {
  81        .name           = "DB1300_AC97",
  82        .owner          = THIS_MODULE,
  83        .dai_link       = &db1300_ac97_dai,
  84        .num_links      = 1,
  85};
  86
  87static struct snd_soc_card db1550_ac97_machine = {
  88        .name           = "DB1550_AC97",
  89        .owner          = THIS_MODULE,
  90        .dai_link       = &db1200_ac97_dai,
  91        .num_links      = 1,
  92};
  93
  94/*-------------------------  I2S PART  ---------------------------*/
  95
  96static int db1200_i2s_startup(struct snd_pcm_substream *substream)
  97{
  98        struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
  99        struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
 100
 101        /* WM8731 has its own 12MHz crystal */
 102        snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK_XTAL,
 103                                12000000, SND_SOC_CLOCK_IN);
 104
 105        return 0;
 106}
 107
 108static const struct snd_soc_ops db1200_i2s_wm8731_ops = {
 109        .startup        = db1200_i2s_startup,
 110};
 111
 112SND_SOC_DAILINK_DEFS(db1200_i2s,
 113        DAILINK_COMP_ARRAY(COMP_CPU("au1xpsc_i2s.1")),
 114        DAILINK_COMP_ARRAY(COMP_CODEC("wm8731.0-001b", "wm8731-hifi")),
 115        DAILINK_COMP_ARRAY(COMP_PLATFORM("au1xpsc-pcm.1")));
 116
 117static struct snd_soc_dai_link db1200_i2s_dai = {
 118        .name           = "WM8731",
 119        .stream_name    = "WM8731 PCM",
 120        .dai_fmt        = SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF |
 121                          SND_SOC_DAIFMT_CBP_CFP,
 122        .ops            = &db1200_i2s_wm8731_ops,
 123        SND_SOC_DAILINK_REG(db1200_i2s),
 124};
 125
 126static struct snd_soc_card db1200_i2s_machine = {
 127        .name           = "DB1200_I2S",
 128        .owner          = THIS_MODULE,
 129        .dai_link       = &db1200_i2s_dai,
 130        .num_links      = 1,
 131};
 132
 133SND_SOC_DAILINK_DEFS(db1300_i2s,
 134        DAILINK_COMP_ARRAY(COMP_CPU("au1xpsc_i2s.2")),
 135        DAILINK_COMP_ARRAY(COMP_CODEC("wm8731.0-001b", "wm8731-hifi")),
 136        DAILINK_COMP_ARRAY(COMP_PLATFORM("au1xpsc-pcm.2")));
 137
 138static struct snd_soc_dai_link db1300_i2s_dai = {
 139        .name           = "WM8731",
 140        .stream_name    = "WM8731 PCM",
 141        .dai_fmt        = SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF |
 142                          SND_SOC_DAIFMT_CBP_CFP,
 143        .ops            = &db1200_i2s_wm8731_ops,
 144        SND_SOC_DAILINK_REG(db1300_i2s),
 145};
 146
 147static struct snd_soc_card db1300_i2s_machine = {
 148        .name           = "DB1300_I2S",
 149        .owner          = THIS_MODULE,
 150        .dai_link       = &db1300_i2s_dai,
 151        .num_links      = 1,
 152};
 153
 154SND_SOC_DAILINK_DEFS(db1550_i2s,
 155        DAILINK_COMP_ARRAY(COMP_CPU("au1xpsc_i2s.3")),
 156        DAILINK_COMP_ARRAY(COMP_CODEC("wm8731.0-001b", "wm8731-hifi")),
 157        DAILINK_COMP_ARRAY(COMP_PLATFORM("au1xpsc-pcm.3")));
 158
 159static struct snd_soc_dai_link db1550_i2s_dai = {
 160        .name           = "WM8731",
 161        .stream_name    = "WM8731 PCM",
 162        .dai_fmt        = SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF |
 163                          SND_SOC_DAIFMT_CBP_CFP,
 164        .ops            = &db1200_i2s_wm8731_ops,
 165        SND_SOC_DAILINK_REG(db1550_i2s),
 166};
 167
 168static struct snd_soc_card db1550_i2s_machine = {
 169        .name           = "DB1550_I2S",
 170        .owner          = THIS_MODULE,
 171        .dai_link       = &db1550_i2s_dai,
 172        .num_links      = 1,
 173};
 174
 175/*-------------------------  COMMON PART  ---------------------------*/
 176
 177static struct snd_soc_card *db1200_cards[] = {
 178        &db1200_ac97_machine,
 179        &db1200_i2s_machine,
 180        &db1300_ac97_machine,
 181        &db1300_i2s_machine,
 182        &db1550_ac97_machine,
 183        &db1550_i2s_machine,
 184};
 185
 186static int db1200_audio_probe(struct platform_device *pdev)
 187{
 188        const struct platform_device_id *pid = platform_get_device_id(pdev);
 189        struct snd_soc_card *card;
 190
 191        card = db1200_cards[pid->driver_data];
 192        card->dev = &pdev->dev;
 193        return devm_snd_soc_register_card(&pdev->dev, card);
 194}
 195
 196static struct platform_driver db1200_audio_driver = {
 197        .driver = {
 198                .name   = "db1200-ac97",
 199                .pm     = &snd_soc_pm_ops,
 200        },
 201        .id_table       = db1200_pids,
 202        .probe          = db1200_audio_probe,
 203};
 204
 205module_platform_driver(db1200_audio_driver);
 206
 207MODULE_LICENSE("GPL");
 208MODULE_DESCRIPTION("DB1200/DB1300/DB1550 ASoC audio support");
 209MODULE_AUTHOR("Manuel Lauss");
 210