File Index
Files and directories
Sign in
FILE

db1200.c

File preview with syntax highlighting.

linux-6.19.14/sound/soc/au1x/db1200.c C
  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");
~/ Read-only file preview.