brintos

brintos / linux-shallow public Read only

0
0
Text · 5.3 KiB · 81abe2e Raw
210 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*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