2 * Copyright (C) 2014 Marvell
4 * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of the
9 * License, or (at your option) any later version.
12 #include <linux/module.h>
13 #include <linux/moduleparam.h>
14 #include <linux/interrupt.h>
15 #include <linux/platform_device.h>
16 #include <linux/slab.h>
17 #include <sound/soc.h>
19 #include <linux/platform_data/asoc-kirkwood.h>
20 #include "../codecs/cs42l51.h"
22 static int a370db_hw_params(struct snd_pcm_substream
*substream
,
23 struct snd_pcm_hw_params
*params
)
25 struct snd_soc_pcm_runtime
*rtd
= substream
->private_data
;
26 struct snd_soc_dai
*codec_dai
= rtd
->codec_dai
;
29 switch (params_rate(params
)) {
42 return snd_soc_dai_set_sysclk(codec_dai
, 0, freq
, SND_SOC_CLOCK_IN
);
45 static struct snd_soc_ops a370db_ops
= {
46 .hw_params
= a370db_hw_params
,
49 static const struct snd_soc_dapm_widget a370db_dapm_widgets
[] = {
50 SND_SOC_DAPM_HP("Out Jack", NULL
),
51 SND_SOC_DAPM_LINE("In Jack", NULL
),
54 static const struct snd_soc_dapm_route a370db_route
[] = {
55 { "Out Jack", NULL
, "HPL" },
56 { "Out Jack", NULL
, "HPR" },
57 { "AIN1L", NULL
, "In Jack" },
58 { "AIN1L", NULL
, "In Jack" },
61 static struct snd_soc_dai_link a370db_dai
[] = {
64 .stream_name
= "analog",
65 .cpu_dai_name
= "i2s",
66 .codec_dai_name
= "cs42l51-hifi",
67 .dai_fmt
= SND_SOC_DAIFMT_I2S
| SND_SOC_DAIFMT_CBS_CFS
,
72 .stream_name
= "spdif-out",
73 .cpu_dai_name
= "spdif",
74 .codec_dai_name
= "dit-hifi",
75 .dai_fmt
= SND_SOC_DAIFMT_I2S
| SND_SOC_DAIFMT_CBS_CFS
,
79 .stream_name
= "spdif-in",
80 .cpu_dai_name
= "spdif",
81 .codec_dai_name
= "dir-hifi",
82 .dai_fmt
= SND_SOC_DAIFMT_I2S
| SND_SOC_DAIFMT_CBS_CFS
,
86 static struct snd_soc_card a370db
= {
89 .dai_link
= a370db_dai
,
90 .num_links
= ARRAY_SIZE(a370db_dai
),
91 .dapm_widgets
= a370db_dapm_widgets
,
92 .num_dapm_widgets
= ARRAY_SIZE(a370db_dapm_widgets
),
93 .dapm_routes
= a370db_route
,
94 .num_dapm_routes
= ARRAY_SIZE(a370db_route
),
97 static int a370db_probe(struct platform_device
*pdev
)
99 struct snd_soc_card
*card
= &a370db
;
101 card
->dev
= &pdev
->dev
;
103 a370db_dai
[0].cpu_of_node
=
104 of_parse_phandle(pdev
->dev
.of_node
,
105 "marvell,audio-controller", 0);
106 a370db_dai
[0].platform_of_node
= a370db_dai
[0].cpu_of_node
;
108 a370db_dai
[0].codec_of_node
=
109 of_parse_phandle(pdev
->dev
.of_node
,
110 "marvell,audio-codec", 0);
112 a370db_dai
[1].cpu_of_node
= a370db_dai
[0].cpu_of_node
;
113 a370db_dai
[1].platform_of_node
= a370db_dai
[0].cpu_of_node
;
115 a370db_dai
[1].codec_of_node
=
116 of_parse_phandle(pdev
->dev
.of_node
,
117 "marvell,audio-codec", 1);
119 a370db_dai
[2].cpu_of_node
= a370db_dai
[0].cpu_of_node
;
120 a370db_dai
[2].platform_of_node
= a370db_dai
[0].cpu_of_node
;
122 a370db_dai
[2].codec_of_node
=
123 of_parse_phandle(pdev
->dev
.of_node
,
124 "marvell,audio-codec", 2);
126 return devm_snd_soc_register_card(card
->dev
, card
);
129 static const struct of_device_id a370db_dt_ids
[] = {
130 { .compatible
= "marvell,a370db-audio" },
133 MODULE_DEVICE_TABLE(of
, a370db_dt_ids
);
135 static struct platform_driver a370db_driver
= {
137 .name
= "a370db-audio",
138 .of_match_table
= of_match_ptr(a370db_dt_ids
),
140 .probe
= a370db_probe
,
143 module_platform_driver(a370db_driver
);
145 MODULE_AUTHOR("Thomas Petazzoni <thomas.petazzoni@free-electrons.com>");
146 MODULE_DESCRIPTION("ALSA SoC a370db audio client");
147 MODULE_LICENSE("GPL");
148 MODULE_ALIAS("platform:a370db-audio");