Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * DB1200/DB1300/DB1550 ASoC audio fabric support code.
0004  *
0005  * (c) 2008-2011 Manuel Lauss <manuel.lauss@googlemail.com>
0006  *
0007  */
0008 
0009 #include <linux/module.h>
0010 #include <linux/moduleparam.h>
0011 #include <linux/timer.h>
0012 #include <linux/interrupt.h>
0013 #include <linux/platform_device.h>
0014 #include <sound/core.h>
0015 #include <sound/pcm.h>
0016 #include <sound/soc.h>
0017 #include <asm/mach-au1x00/au1000.h>
0018 #include <asm/mach-au1x00/au1xxx_psc.h>
0019 #include <asm/mach-au1x00/au1xxx_dbdma.h>
0020 #include <asm/mach-db1x00/bcsr.h>
0021 
0022 #include "../codecs/wm8731.h"
0023 #include "psc.h"
0024 
0025 static const struct platform_device_id db1200_pids[] = {
0026     {
0027         .name       = "db1200-ac97",
0028         .driver_data    = 0,
0029     }, {
0030         .name       = "db1200-i2s",
0031         .driver_data    = 1,
0032     }, {
0033         .name       = "db1300-ac97",
0034         .driver_data    = 2,
0035     }, {
0036         .name       = "db1300-i2s",
0037         .driver_data    = 3,
0038     }, {
0039         .name       = "db1550-ac97",
0040         .driver_data    = 4,
0041     }, {
0042         .name       = "db1550-i2s",
0043         .driver_data    = 5,
0044     },
0045     {},
0046 };
0047 
0048 /*-------------------------  AC97 PART  ---------------------------*/
0049 
0050 SND_SOC_DAILINK_DEFS(db1200_ac97,
0051     DAILINK_COMP_ARRAY(COMP_CPU("au1xpsc_ac97.1")),
0052     DAILINK_COMP_ARRAY(COMP_CODEC("ac97-codec.1", "ac97-hifi")),
0053     DAILINK_COMP_ARRAY(COMP_PLATFORM("au1xpsc-pcm.1")));
0054 
0055 static struct snd_soc_dai_link db1200_ac97_dai = {
0056     .name       = "AC97",
0057     .stream_name    = "AC97 HiFi",
0058     SND_SOC_DAILINK_REG(db1200_ac97),
0059 };
0060 
0061 static struct snd_soc_card db1200_ac97_machine = {
0062     .name       = "DB1200_AC97",
0063     .owner      = THIS_MODULE,
0064     .dai_link   = &db1200_ac97_dai,
0065     .num_links  = 1,
0066 };
0067 
0068 SND_SOC_DAILINK_DEFS(db1300_ac97,
0069     DAILINK_COMP_ARRAY(COMP_CPU("au1xpsc_ac97.1")),
0070     DAILINK_COMP_ARRAY(COMP_CODEC("wm9712-codec.1", "wm9712-hifi")),
0071     DAILINK_COMP_ARRAY(COMP_PLATFORM("au1xpsc-pcm.1")));
0072 
0073 static struct snd_soc_dai_link db1300_ac97_dai = {
0074     .name       = "AC97",
0075     .stream_name    = "AC97 HiFi",
0076     SND_SOC_DAILINK_REG(db1300_ac97),
0077 };
0078 
0079 static struct snd_soc_card db1300_ac97_machine = {
0080     .name       = "DB1300_AC97",
0081     .owner      = THIS_MODULE,
0082     .dai_link   = &db1300_ac97_dai,
0083     .num_links  = 1,
0084 };
0085 
0086 static struct snd_soc_card db1550_ac97_machine = {
0087     .name       = "DB1550_AC97",
0088     .owner      = THIS_MODULE,
0089     .dai_link   = &db1200_ac97_dai,
0090     .num_links  = 1,
0091 };
0092 
0093 /*-------------------------  I2S PART  ---------------------------*/
0094 
0095 static int db1200_i2s_startup(struct snd_pcm_substream *substream)
0096 {
0097     struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
0098     struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
0099 
0100     /* WM8731 has its own 12MHz crystal */
0101     snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK_XTAL,
0102                 12000000, SND_SOC_CLOCK_IN);
0103 
0104     return 0;
0105 }
0106 
0107 static const struct snd_soc_ops db1200_i2s_wm8731_ops = {
0108     .startup    = db1200_i2s_startup,
0109 };
0110 
0111 SND_SOC_DAILINK_DEFS(db1200_i2s,
0112     DAILINK_COMP_ARRAY(COMP_CPU("au1xpsc_i2s.1")),
0113     DAILINK_COMP_ARRAY(COMP_CODEC("wm8731.0-001b", "wm8731-hifi")),
0114     DAILINK_COMP_ARRAY(COMP_PLATFORM("au1xpsc-pcm.1")));
0115 
0116 static struct snd_soc_dai_link db1200_i2s_dai = {
0117     .name       = "WM8731",
0118     .stream_name    = "WM8731 PCM",
0119     .dai_fmt    = SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF |
0120               SND_SOC_DAIFMT_CBP_CFP,
0121     .ops        = &db1200_i2s_wm8731_ops,
0122     SND_SOC_DAILINK_REG(db1200_i2s),
0123 };
0124 
0125 static struct snd_soc_card db1200_i2s_machine = {
0126     .name       = "DB1200_I2S",
0127     .owner      = THIS_MODULE,
0128     .dai_link   = &db1200_i2s_dai,
0129     .num_links  = 1,
0130 };
0131 
0132 SND_SOC_DAILINK_DEFS(db1300_i2s,
0133     DAILINK_COMP_ARRAY(COMP_CPU("au1xpsc_i2s.2")),
0134     DAILINK_COMP_ARRAY(COMP_CODEC("wm8731.0-001b", "wm8731-hifi")),
0135     DAILINK_COMP_ARRAY(COMP_PLATFORM("au1xpsc-pcm.2")));
0136 
0137 static struct snd_soc_dai_link db1300_i2s_dai = {
0138     .name       = "WM8731",
0139     .stream_name    = "WM8731 PCM",
0140     .dai_fmt    = SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF |
0141               SND_SOC_DAIFMT_CBP_CFP,
0142     .ops        = &db1200_i2s_wm8731_ops,
0143     SND_SOC_DAILINK_REG(db1300_i2s),
0144 };
0145 
0146 static struct snd_soc_card db1300_i2s_machine = {
0147     .name       = "DB1300_I2S",
0148     .owner      = THIS_MODULE,
0149     .dai_link   = &db1300_i2s_dai,
0150     .num_links  = 1,
0151 };
0152 
0153 SND_SOC_DAILINK_DEFS(db1550_i2s,
0154     DAILINK_COMP_ARRAY(COMP_CPU("au1xpsc_i2s.3")),
0155     DAILINK_COMP_ARRAY(COMP_CODEC("wm8731.0-001b", "wm8731-hifi")),
0156     DAILINK_COMP_ARRAY(COMP_PLATFORM("au1xpsc-pcm.3")));
0157 
0158 static struct snd_soc_dai_link db1550_i2s_dai = {
0159     .name       = "WM8731",
0160     .stream_name    = "WM8731 PCM",
0161     .dai_fmt    = SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF |
0162               SND_SOC_DAIFMT_CBP_CFP,
0163     .ops        = &db1200_i2s_wm8731_ops,
0164     SND_SOC_DAILINK_REG(db1550_i2s),
0165 };
0166 
0167 static struct snd_soc_card db1550_i2s_machine = {
0168     .name       = "DB1550_I2S",
0169     .owner      = THIS_MODULE,
0170     .dai_link   = &db1550_i2s_dai,
0171     .num_links  = 1,
0172 };
0173 
0174 /*-------------------------  COMMON PART  ---------------------------*/
0175 
0176 static struct snd_soc_card *db1200_cards[] = {
0177     &db1200_ac97_machine,
0178     &db1200_i2s_machine,
0179     &db1300_ac97_machine,
0180     &db1300_i2s_machine,
0181     &db1550_ac97_machine,
0182     &db1550_i2s_machine,
0183 };
0184 
0185 static int db1200_audio_probe(struct platform_device *pdev)
0186 {
0187     const struct platform_device_id *pid = platform_get_device_id(pdev);
0188     struct snd_soc_card *card;
0189 
0190     card = db1200_cards[pid->driver_data];
0191     card->dev = &pdev->dev;
0192     return devm_snd_soc_register_card(&pdev->dev, card);
0193 }
0194 
0195 static struct platform_driver db1200_audio_driver = {
0196     .driver = {
0197         .name   = "db1200-ac97",
0198         .pm = &snd_soc_pm_ops,
0199     },
0200     .id_table   = db1200_pids,
0201     .probe      = db1200_audio_probe,
0202 };
0203 
0204 module_platform_driver(db1200_audio_driver);
0205 
0206 MODULE_LICENSE("GPL");
0207 MODULE_DESCRIPTION("DB1200/DB1300/DB1550 ASoC audio support");
0208 MODULE_AUTHOR("Manuel Lauss");