xref: /openbmc/linux/sound/soc/uniphier/aio-ld11.c (revision db4cb3d04eba91db48da0032c44b83ed7185973c)
1*db4cb3d0SKatsuhiro Suzuki // SPDX-License-Identifier: GPL-2.0
2*db4cb3d0SKatsuhiro Suzuki //
3*db4cb3d0SKatsuhiro Suzuki // Socionext UniPhier AIO ALSA driver for LD11/LD20.
4*db4cb3d0SKatsuhiro Suzuki //
5*db4cb3d0SKatsuhiro Suzuki // Copyright (c) 2016-2018 Socionext Inc.
6*db4cb3d0SKatsuhiro Suzuki //
7*db4cb3d0SKatsuhiro Suzuki // This program is free software; you can redistribute it and/or
8*db4cb3d0SKatsuhiro Suzuki // modify it under the terms of the GNU General Public License
9*db4cb3d0SKatsuhiro Suzuki // as published by the Free Software Foundation; version 2
10*db4cb3d0SKatsuhiro Suzuki // of the License.
11*db4cb3d0SKatsuhiro Suzuki //
12*db4cb3d0SKatsuhiro Suzuki // This program is distributed in the hope that it will be useful,
13*db4cb3d0SKatsuhiro Suzuki // but WITHOUT ANY WARRANTY; without even the implied warranty of
14*db4cb3d0SKatsuhiro Suzuki // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*db4cb3d0SKatsuhiro Suzuki // GNU General Public License for more details.
16*db4cb3d0SKatsuhiro Suzuki //
17*db4cb3d0SKatsuhiro Suzuki // You should have received a copy of the GNU General Public License
18*db4cb3d0SKatsuhiro Suzuki // along with this program; if not, see <http://www.gnu.org/licenses/>.
19*db4cb3d0SKatsuhiro Suzuki 
20*db4cb3d0SKatsuhiro Suzuki #include <linux/module.h>
21*db4cb3d0SKatsuhiro Suzuki 
22*db4cb3d0SKatsuhiro Suzuki #include "aio.h"
23*db4cb3d0SKatsuhiro Suzuki 
24*db4cb3d0SKatsuhiro Suzuki static const struct uniphier_aio_spec uniphier_aio_ld11[] = {
25*db4cb3d0SKatsuhiro Suzuki 	/* for HDMI PCM In, Pin:AI1Dx */
26*db4cb3d0SKatsuhiro Suzuki 	{
27*db4cb3d0SKatsuhiro Suzuki 		.name = AUD_NAME_PCMIN1,
28*db4cb3d0SKatsuhiro Suzuki 		.gname = AUD_GNAME_HDMI,
29*db4cb3d0SKatsuhiro Suzuki 		.swm = {
30*db4cb3d0SKatsuhiro Suzuki 			.type  = PORT_TYPE_I2S,
31*db4cb3d0SKatsuhiro Suzuki 			.dir   = PORT_DIR_INPUT,
32*db4cb3d0SKatsuhiro Suzuki 			.rb    = { 21, 14, },
33*db4cb3d0SKatsuhiro Suzuki 			.ch    = { 21, 14, },
34*db4cb3d0SKatsuhiro Suzuki 			.iif   = { 5, 3, },
35*db4cb3d0SKatsuhiro Suzuki 			.iport = { 0, AUD_HW_PCMIN1, },
36*db4cb3d0SKatsuhiro Suzuki 		},
37*db4cb3d0SKatsuhiro Suzuki 	},
38*db4cb3d0SKatsuhiro Suzuki 
39*db4cb3d0SKatsuhiro Suzuki 	/* for SIF In, Pin:AI2Dx */
40*db4cb3d0SKatsuhiro Suzuki 	{
41*db4cb3d0SKatsuhiro Suzuki 		.name = AUD_NAME_PCMIN2,
42*db4cb3d0SKatsuhiro Suzuki 		.swm = {
43*db4cb3d0SKatsuhiro Suzuki 			.type  = PORT_TYPE_I2S,
44*db4cb3d0SKatsuhiro Suzuki 			.dir   = PORT_DIR_INPUT,
45*db4cb3d0SKatsuhiro Suzuki 			.rb    = { 22, 15, },
46*db4cb3d0SKatsuhiro Suzuki 			.ch    = { 22, 15, },
47*db4cb3d0SKatsuhiro Suzuki 			.iif   = { 6, 4, },
48*db4cb3d0SKatsuhiro Suzuki 			.iport = { 1, AUD_HW_PCMIN2, },
49*db4cb3d0SKatsuhiro Suzuki 		},
50*db4cb3d0SKatsuhiro Suzuki 	},
51*db4cb3d0SKatsuhiro Suzuki 
52*db4cb3d0SKatsuhiro Suzuki 	/* for Line In, Pin:AI3Dx */
53*db4cb3d0SKatsuhiro Suzuki 	{
54*db4cb3d0SKatsuhiro Suzuki 		.name = AUD_NAME_PCMIN3,
55*db4cb3d0SKatsuhiro Suzuki 		.gname = AUD_GNAME_LINE,
56*db4cb3d0SKatsuhiro Suzuki 		.swm = {
57*db4cb3d0SKatsuhiro Suzuki 			.type  = PORT_TYPE_EVE,
58*db4cb3d0SKatsuhiro Suzuki 			.dir   = PORT_DIR_INPUT,
59*db4cb3d0SKatsuhiro Suzuki 			.rb    = { 23, 16, },
60*db4cb3d0SKatsuhiro Suzuki 			.ch    = { 23, 16, },
61*db4cb3d0SKatsuhiro Suzuki 			.iif   = { 7, 5, },
62*db4cb3d0SKatsuhiro Suzuki 			.iport = { 2, AUD_HW_PCMIN3, },
63*db4cb3d0SKatsuhiro Suzuki 		},
64*db4cb3d0SKatsuhiro Suzuki 	},
65*db4cb3d0SKatsuhiro Suzuki 
66*db4cb3d0SKatsuhiro Suzuki 	/* for S/PDIF In, Pin:AI1IEC */
67*db4cb3d0SKatsuhiro Suzuki 	{
68*db4cb3d0SKatsuhiro Suzuki 		.name = AUD_NAME_IECIN1,
69*db4cb3d0SKatsuhiro Suzuki 		.gname = AUD_GNAME_IEC,
70*db4cb3d0SKatsuhiro Suzuki 		.swm = {
71*db4cb3d0SKatsuhiro Suzuki 			.type  = PORT_TYPE_SPDIF,
72*db4cb3d0SKatsuhiro Suzuki 			.dir   = PORT_DIR_INPUT,
73*db4cb3d0SKatsuhiro Suzuki 			.rb    = { 26, 17, },
74*db4cb3d0SKatsuhiro Suzuki 			.ch    = { 26, 17, },
75*db4cb3d0SKatsuhiro Suzuki 			.iif   = { 10, 6, },
76*db4cb3d0SKatsuhiro Suzuki 			.iport = { 3, AUD_HW_IECIN1, },
77*db4cb3d0SKatsuhiro Suzuki 		},
78*db4cb3d0SKatsuhiro Suzuki 	},
79*db4cb3d0SKatsuhiro Suzuki 
80*db4cb3d0SKatsuhiro Suzuki 	/* for Speaker, Pin:AO1Dx */
81*db4cb3d0SKatsuhiro Suzuki 	{
82*db4cb3d0SKatsuhiro Suzuki 		.name = AUD_NAME_HPCMOUT1,
83*db4cb3d0SKatsuhiro Suzuki 		.swm = {
84*db4cb3d0SKatsuhiro Suzuki 			.type  = PORT_TYPE_I2S,
85*db4cb3d0SKatsuhiro Suzuki 			.dir   = PORT_DIR_OUTPUT,
86*db4cb3d0SKatsuhiro Suzuki 			.rb    = { 0, 0, },
87*db4cb3d0SKatsuhiro Suzuki 			.ch    = { 0, 0, },
88*db4cb3d0SKatsuhiro Suzuki 			.oif   = { 0, 0, },
89*db4cb3d0SKatsuhiro Suzuki 			.oport = { 0, AUD_HW_HPCMOUT1, },
90*db4cb3d0SKatsuhiro Suzuki 		},
91*db4cb3d0SKatsuhiro Suzuki 	},
92*db4cb3d0SKatsuhiro Suzuki 
93*db4cb3d0SKatsuhiro Suzuki 	/* for HDMI PCM, Pin:AO2Dx */
94*db4cb3d0SKatsuhiro Suzuki 	{
95*db4cb3d0SKatsuhiro Suzuki 		.name = AUD_NAME_PCMOUT1,
96*db4cb3d0SKatsuhiro Suzuki 		.gname = AUD_GNAME_HDMI,
97*db4cb3d0SKatsuhiro Suzuki 		.swm = {
98*db4cb3d0SKatsuhiro Suzuki 			.type  = PORT_TYPE_I2S,
99*db4cb3d0SKatsuhiro Suzuki 			.dir   = PORT_DIR_OUTPUT,
100*db4cb3d0SKatsuhiro Suzuki 			.rb    = { 0, 0, },
101*db4cb3d0SKatsuhiro Suzuki 			.ch    = { 0, 0, },
102*db4cb3d0SKatsuhiro Suzuki 			.oif   = { 0, 0, },
103*db4cb3d0SKatsuhiro Suzuki 			.oport = { 3, AUD_HW_PCMOUT1, },
104*db4cb3d0SKatsuhiro Suzuki 		},
105*db4cb3d0SKatsuhiro Suzuki 	},
106*db4cb3d0SKatsuhiro Suzuki 
107*db4cb3d0SKatsuhiro Suzuki 	/* for Line Out, Pin:LO2_x */
108*db4cb3d0SKatsuhiro Suzuki 	{
109*db4cb3d0SKatsuhiro Suzuki 		.name = AUD_NAME_PCMOUT2,
110*db4cb3d0SKatsuhiro Suzuki 		.gname = AUD_GNAME_LINE,
111*db4cb3d0SKatsuhiro Suzuki 		.swm = {
112*db4cb3d0SKatsuhiro Suzuki 			.type  = PORT_TYPE_EVE,
113*db4cb3d0SKatsuhiro Suzuki 			.dir   = PORT_DIR_OUTPUT,
114*db4cb3d0SKatsuhiro Suzuki 			.rb    = { 2, 2, },
115*db4cb3d0SKatsuhiro Suzuki 			.ch    = { 2, 2, },
116*db4cb3d0SKatsuhiro Suzuki 			.oif   = { 2, 2, },
117*db4cb3d0SKatsuhiro Suzuki 			.oport = { 1, AUD_HW_PCMOUT2, },
118*db4cb3d0SKatsuhiro Suzuki 		},
119*db4cb3d0SKatsuhiro Suzuki 	},
120*db4cb3d0SKatsuhiro Suzuki 
121*db4cb3d0SKatsuhiro Suzuki 	/* for Headphone, Pin:HP1_x */
122*db4cb3d0SKatsuhiro Suzuki 	{
123*db4cb3d0SKatsuhiro Suzuki 		.name = AUD_NAME_PCMOUT3,
124*db4cb3d0SKatsuhiro Suzuki 		.swm = {
125*db4cb3d0SKatsuhiro Suzuki 			.type  = PORT_TYPE_EVE,
126*db4cb3d0SKatsuhiro Suzuki 			.dir   = PORT_DIR_OUTPUT,
127*db4cb3d0SKatsuhiro Suzuki 			.rb    = { 3, 3, },
128*db4cb3d0SKatsuhiro Suzuki 			.ch    = { 3, 3, },
129*db4cb3d0SKatsuhiro Suzuki 			.oif   = { 3, 3, },
130*db4cb3d0SKatsuhiro Suzuki 			.oport = { 2, AUD_HW_PCMOUT3, },
131*db4cb3d0SKatsuhiro Suzuki 		},
132*db4cb3d0SKatsuhiro Suzuki 	},
133*db4cb3d0SKatsuhiro Suzuki 
134*db4cb3d0SKatsuhiro Suzuki 	/* for HW Sampling Rate Converter */
135*db4cb3d0SKatsuhiro Suzuki 	{
136*db4cb3d0SKatsuhiro Suzuki 		.name = AUD_NAME_EPCMOUT2,
137*db4cb3d0SKatsuhiro Suzuki 		.swm = {
138*db4cb3d0SKatsuhiro Suzuki 			.type  = PORT_TYPE_CONV,
139*db4cb3d0SKatsuhiro Suzuki 			.dir   = PORT_DIR_OUTPUT,
140*db4cb3d0SKatsuhiro Suzuki 			.rb    = { 7, 5, },
141*db4cb3d0SKatsuhiro Suzuki 			.ch    = { 7, 5, },
142*db4cb3d0SKatsuhiro Suzuki 			.oif   = { 7, 5, },
143*db4cb3d0SKatsuhiro Suzuki 			.oport = { 6, AUD_HW_EPCMOUT2, },
144*db4cb3d0SKatsuhiro Suzuki 			.och   = { 17, 12, },
145*db4cb3d0SKatsuhiro Suzuki 			.iif   = { 1, 1, },
146*db4cb3d0SKatsuhiro Suzuki 		},
147*db4cb3d0SKatsuhiro Suzuki 	},
148*db4cb3d0SKatsuhiro Suzuki 
149*db4cb3d0SKatsuhiro Suzuki 	/* for HW Sampling Rate Converter 2 */
150*db4cb3d0SKatsuhiro Suzuki 	{
151*db4cb3d0SKatsuhiro Suzuki 		.name = AUD_NAME_EPCMOUT3,
152*db4cb3d0SKatsuhiro Suzuki 		.swm = {
153*db4cb3d0SKatsuhiro Suzuki 			.type  = PORT_TYPE_CONV,
154*db4cb3d0SKatsuhiro Suzuki 			.dir   = PORT_DIR_OUTPUT,
155*db4cb3d0SKatsuhiro Suzuki 			.rb    = { 8, 6, },
156*db4cb3d0SKatsuhiro Suzuki 			.ch    = { 8, 6, },
157*db4cb3d0SKatsuhiro Suzuki 			.oif   = { 8, 6, },
158*db4cb3d0SKatsuhiro Suzuki 			.oport = { 7, AUD_HW_EPCMOUT3, },
159*db4cb3d0SKatsuhiro Suzuki 			.och   = { 18, 13, },
160*db4cb3d0SKatsuhiro Suzuki 			.iif   = { 2, 2, },
161*db4cb3d0SKatsuhiro Suzuki 		},
162*db4cb3d0SKatsuhiro Suzuki 	},
163*db4cb3d0SKatsuhiro Suzuki 
164*db4cb3d0SKatsuhiro Suzuki 	/* for S/PDIF Out, Pin:AO1IEC */
165*db4cb3d0SKatsuhiro Suzuki 	{
166*db4cb3d0SKatsuhiro Suzuki 		.name = AUD_NAME_HIECOUT1,
167*db4cb3d0SKatsuhiro Suzuki 		.gname = AUD_GNAME_IEC,
168*db4cb3d0SKatsuhiro Suzuki 		.swm = {
169*db4cb3d0SKatsuhiro Suzuki 			.type  = PORT_TYPE_SPDIF,
170*db4cb3d0SKatsuhiro Suzuki 			.dir   = PORT_DIR_OUTPUT,
171*db4cb3d0SKatsuhiro Suzuki 			.rb    = { 1, 1, },
172*db4cb3d0SKatsuhiro Suzuki 			.ch    = { 1, 1, },
173*db4cb3d0SKatsuhiro Suzuki 			.oif   = { 1, 1, },
174*db4cb3d0SKatsuhiro Suzuki 			.oport = { 12, AUD_HW_HIECOUT1, },
175*db4cb3d0SKatsuhiro Suzuki 		},
176*db4cb3d0SKatsuhiro Suzuki 	},
177*db4cb3d0SKatsuhiro Suzuki 
178*db4cb3d0SKatsuhiro Suzuki 	/* for S/PDIF Out, Pin:AO1IEC, Compress */
179*db4cb3d0SKatsuhiro Suzuki 	{
180*db4cb3d0SKatsuhiro Suzuki 		.name = AUD_NAME_HIECCOMPOUT1,
181*db4cb3d0SKatsuhiro Suzuki 		.gname = AUD_GNAME_IEC,
182*db4cb3d0SKatsuhiro Suzuki 		.swm = {
183*db4cb3d0SKatsuhiro Suzuki 			.type  = PORT_TYPE_SPDIF,
184*db4cb3d0SKatsuhiro Suzuki 			.dir   = PORT_DIR_OUTPUT,
185*db4cb3d0SKatsuhiro Suzuki 			.rb    = { 1, 1, },
186*db4cb3d0SKatsuhiro Suzuki 			.ch    = { 1, 1, },
187*db4cb3d0SKatsuhiro Suzuki 			.oif   = { 1, 1, },
188*db4cb3d0SKatsuhiro Suzuki 			.oport = { 12, AUD_HW_HIECOUT1, },
189*db4cb3d0SKatsuhiro Suzuki 		},
190*db4cb3d0SKatsuhiro Suzuki 	},
191*db4cb3d0SKatsuhiro Suzuki };
192*db4cb3d0SKatsuhiro Suzuki 
193*db4cb3d0SKatsuhiro Suzuki static const struct uniphier_aio_pll uniphier_aio_pll_ld11[] = {
194*db4cb3d0SKatsuhiro Suzuki 	[AUD_PLL_A1]   = { .enable = true, },
195*db4cb3d0SKatsuhiro Suzuki 	[AUD_PLL_F1]   = { .enable = true, },
196*db4cb3d0SKatsuhiro Suzuki 	[AUD_PLL_A2]   = { .enable = true, },
197*db4cb3d0SKatsuhiro Suzuki 	[AUD_PLL_F2]   = { .enable = true, },
198*db4cb3d0SKatsuhiro Suzuki 	[AUD_PLL_APLL] = { .enable = true, },
199*db4cb3d0SKatsuhiro Suzuki 	[AUD_PLL_RX0]  = { .enable = true, },
200*db4cb3d0SKatsuhiro Suzuki 	[AUD_PLL_USB0] = { .enable = true, },
201*db4cb3d0SKatsuhiro Suzuki 	[AUD_PLL_HSC0] = { .enable = true, },
202*db4cb3d0SKatsuhiro Suzuki };
203*db4cb3d0SKatsuhiro Suzuki 
204*db4cb3d0SKatsuhiro Suzuki static int uniphier_aio_ld11_probe(struct snd_soc_dai *dai)
205*db4cb3d0SKatsuhiro Suzuki {
206*db4cb3d0SKatsuhiro Suzuki 	int ret;
207*db4cb3d0SKatsuhiro Suzuki 
208*db4cb3d0SKatsuhiro Suzuki 	ret = uniphier_aio_dai_probe(dai);
209*db4cb3d0SKatsuhiro Suzuki 	if (ret < 0)
210*db4cb3d0SKatsuhiro Suzuki 		return ret;
211*db4cb3d0SKatsuhiro Suzuki 
212*db4cb3d0SKatsuhiro Suzuki 	ret = snd_soc_dai_set_pll(dai, AUD_PLL_A1, 0, 0, 36864000);
213*db4cb3d0SKatsuhiro Suzuki 	if (ret < 0)
214*db4cb3d0SKatsuhiro Suzuki 		return ret;
215*db4cb3d0SKatsuhiro Suzuki 	ret = snd_soc_dai_set_pll(dai, AUD_PLL_F1, 0, 0, 36864000);
216*db4cb3d0SKatsuhiro Suzuki 	if (ret < 0)
217*db4cb3d0SKatsuhiro Suzuki 		return ret;
218*db4cb3d0SKatsuhiro Suzuki 
219*db4cb3d0SKatsuhiro Suzuki 	ret = snd_soc_dai_set_pll(dai, AUD_PLL_A2, 0, 0, 33868800);
220*db4cb3d0SKatsuhiro Suzuki 	if (ret < 0)
221*db4cb3d0SKatsuhiro Suzuki 		return ret;
222*db4cb3d0SKatsuhiro Suzuki 	ret = snd_soc_dai_set_pll(dai, AUD_PLL_F2, 0, 0, 33868800);
223*db4cb3d0SKatsuhiro Suzuki 	if (ret < 0)
224*db4cb3d0SKatsuhiro Suzuki 		return ret;
225*db4cb3d0SKatsuhiro Suzuki 
226*db4cb3d0SKatsuhiro Suzuki 	return 0;
227*db4cb3d0SKatsuhiro Suzuki }
228*db4cb3d0SKatsuhiro Suzuki 
229*db4cb3d0SKatsuhiro Suzuki static struct snd_soc_dai_driver uniphier_aio_dai_ld11[] = {
230*db4cb3d0SKatsuhiro Suzuki 	{
231*db4cb3d0SKatsuhiro Suzuki 		.name    = AUD_GNAME_HDMI,
232*db4cb3d0SKatsuhiro Suzuki 		.probe   = uniphier_aio_ld11_probe,
233*db4cb3d0SKatsuhiro Suzuki 		.remove  = uniphier_aio_dai_remove,
234*db4cb3d0SKatsuhiro Suzuki 		.suspend = uniphier_aio_dai_suspend,
235*db4cb3d0SKatsuhiro Suzuki 		.resume  = uniphier_aio_dai_resume,
236*db4cb3d0SKatsuhiro Suzuki 		.playback = {
237*db4cb3d0SKatsuhiro Suzuki 			.stream_name = AUD_NAME_PCMOUT1,
238*db4cb3d0SKatsuhiro Suzuki 			.formats     = SNDRV_PCM_FMTBIT_S32_LE,
239*db4cb3d0SKatsuhiro Suzuki 			.rates       = SNDRV_PCM_RATE_48000,
240*db4cb3d0SKatsuhiro Suzuki 			.channels_min = 2,
241*db4cb3d0SKatsuhiro Suzuki 			.channels_max = 2,
242*db4cb3d0SKatsuhiro Suzuki 		},
243*db4cb3d0SKatsuhiro Suzuki 		.capture = {
244*db4cb3d0SKatsuhiro Suzuki 			.stream_name = AUD_NAME_PCMIN1,
245*db4cb3d0SKatsuhiro Suzuki 			.formats     = SNDRV_PCM_FMTBIT_S32_LE,
246*db4cb3d0SKatsuhiro Suzuki 			.rates       = SNDRV_PCM_RATE_48000 |
247*db4cb3d0SKatsuhiro Suzuki 				SNDRV_PCM_RATE_44100 |
248*db4cb3d0SKatsuhiro Suzuki 				SNDRV_PCM_RATE_32000,
249*db4cb3d0SKatsuhiro Suzuki 			.channels_min = 2,
250*db4cb3d0SKatsuhiro Suzuki 			.channels_max = 2,
251*db4cb3d0SKatsuhiro Suzuki 		},
252*db4cb3d0SKatsuhiro Suzuki 		.ops = &uniphier_aio_i2s_ops,
253*db4cb3d0SKatsuhiro Suzuki 	},
254*db4cb3d0SKatsuhiro Suzuki 	{
255*db4cb3d0SKatsuhiro Suzuki 		.name    = AUD_NAME_PCMIN2,
256*db4cb3d0SKatsuhiro Suzuki 		.probe   = uniphier_aio_ld11_probe,
257*db4cb3d0SKatsuhiro Suzuki 		.remove  = uniphier_aio_dai_remove,
258*db4cb3d0SKatsuhiro Suzuki 		.suspend = uniphier_aio_dai_suspend,
259*db4cb3d0SKatsuhiro Suzuki 		.resume  = uniphier_aio_dai_resume,
260*db4cb3d0SKatsuhiro Suzuki 		.capture = {
261*db4cb3d0SKatsuhiro Suzuki 			.stream_name = AUD_NAME_PCMIN2,
262*db4cb3d0SKatsuhiro Suzuki 			.formats     = SNDRV_PCM_FMTBIT_S32_LE,
263*db4cb3d0SKatsuhiro Suzuki 			.rates       = SNDRV_PCM_RATE_48000,
264*db4cb3d0SKatsuhiro Suzuki 			.channels_min = 2,
265*db4cb3d0SKatsuhiro Suzuki 			.channels_max = 2,
266*db4cb3d0SKatsuhiro Suzuki 		},
267*db4cb3d0SKatsuhiro Suzuki 		.ops = &uniphier_aio_i2s_ops,
268*db4cb3d0SKatsuhiro Suzuki 	},
269*db4cb3d0SKatsuhiro Suzuki 	{
270*db4cb3d0SKatsuhiro Suzuki 		.name    = AUD_GNAME_LINE,
271*db4cb3d0SKatsuhiro Suzuki 		.probe   = uniphier_aio_ld11_probe,
272*db4cb3d0SKatsuhiro Suzuki 		.remove  = uniphier_aio_dai_remove,
273*db4cb3d0SKatsuhiro Suzuki 		.suspend = uniphier_aio_dai_suspend,
274*db4cb3d0SKatsuhiro Suzuki 		.resume  = uniphier_aio_dai_resume,
275*db4cb3d0SKatsuhiro Suzuki 		.playback = {
276*db4cb3d0SKatsuhiro Suzuki 			.stream_name = AUD_NAME_PCMOUT2,
277*db4cb3d0SKatsuhiro Suzuki 			.formats     = SNDRV_PCM_FMTBIT_S32_LE,
278*db4cb3d0SKatsuhiro Suzuki 			.rates       = SNDRV_PCM_RATE_48000,
279*db4cb3d0SKatsuhiro Suzuki 			.channels_min = 2,
280*db4cb3d0SKatsuhiro Suzuki 			.channels_max = 2,
281*db4cb3d0SKatsuhiro Suzuki 		},
282*db4cb3d0SKatsuhiro Suzuki 		.capture = {
283*db4cb3d0SKatsuhiro Suzuki 			.stream_name = AUD_NAME_PCMIN3,
284*db4cb3d0SKatsuhiro Suzuki 			.formats     = SNDRV_PCM_FMTBIT_S32_LE,
285*db4cb3d0SKatsuhiro Suzuki 			.rates       = SNDRV_PCM_RATE_48000,
286*db4cb3d0SKatsuhiro Suzuki 			.channels_min = 2,
287*db4cb3d0SKatsuhiro Suzuki 			.channels_max = 2,
288*db4cb3d0SKatsuhiro Suzuki 		},
289*db4cb3d0SKatsuhiro Suzuki 		.ops = &uniphier_aio_i2s_ops,
290*db4cb3d0SKatsuhiro Suzuki 	},
291*db4cb3d0SKatsuhiro Suzuki 	{
292*db4cb3d0SKatsuhiro Suzuki 		.name    = AUD_NAME_HPCMOUT1,
293*db4cb3d0SKatsuhiro Suzuki 		.probe   = uniphier_aio_ld11_probe,
294*db4cb3d0SKatsuhiro Suzuki 		.remove  = uniphier_aio_dai_remove,
295*db4cb3d0SKatsuhiro Suzuki 		.suspend = uniphier_aio_dai_suspend,
296*db4cb3d0SKatsuhiro Suzuki 		.resume  = uniphier_aio_dai_resume,
297*db4cb3d0SKatsuhiro Suzuki 		.playback = {
298*db4cb3d0SKatsuhiro Suzuki 			.stream_name = AUD_NAME_HPCMOUT1,
299*db4cb3d0SKatsuhiro Suzuki 			.formats     = SNDRV_PCM_FMTBIT_S32_LE,
300*db4cb3d0SKatsuhiro Suzuki 			.rates       = SNDRV_PCM_RATE_48000,
301*db4cb3d0SKatsuhiro Suzuki 			.channels_min = 2,
302*db4cb3d0SKatsuhiro Suzuki 			.channels_max = 2,
303*db4cb3d0SKatsuhiro Suzuki 		},
304*db4cb3d0SKatsuhiro Suzuki 		.ops = &uniphier_aio_i2s_ops,
305*db4cb3d0SKatsuhiro Suzuki 	},
306*db4cb3d0SKatsuhiro Suzuki 	{
307*db4cb3d0SKatsuhiro Suzuki 		.name    = AUD_NAME_PCMOUT3,
308*db4cb3d0SKatsuhiro Suzuki 		.probe   = uniphier_aio_ld11_probe,
309*db4cb3d0SKatsuhiro Suzuki 		.remove  = uniphier_aio_dai_remove,
310*db4cb3d0SKatsuhiro Suzuki 		.suspend = uniphier_aio_dai_suspend,
311*db4cb3d0SKatsuhiro Suzuki 		.resume  = uniphier_aio_dai_resume,
312*db4cb3d0SKatsuhiro Suzuki 		.playback = {
313*db4cb3d0SKatsuhiro Suzuki 			.stream_name = AUD_NAME_PCMOUT3,
314*db4cb3d0SKatsuhiro Suzuki 			.formats     = SNDRV_PCM_FMTBIT_S32_LE,
315*db4cb3d0SKatsuhiro Suzuki 			.rates       = SNDRV_PCM_RATE_48000,
316*db4cb3d0SKatsuhiro Suzuki 			.channels_min = 2,
317*db4cb3d0SKatsuhiro Suzuki 			.channels_max = 2,
318*db4cb3d0SKatsuhiro Suzuki 		},
319*db4cb3d0SKatsuhiro Suzuki 		.ops = &uniphier_aio_i2s_ops,
320*db4cb3d0SKatsuhiro Suzuki 	},
321*db4cb3d0SKatsuhiro Suzuki 	{
322*db4cb3d0SKatsuhiro Suzuki 		.name    = AUD_NAME_HIECOUT1,
323*db4cb3d0SKatsuhiro Suzuki 		.probe   = uniphier_aio_ld11_probe,
324*db4cb3d0SKatsuhiro Suzuki 		.remove  = uniphier_aio_dai_remove,
325*db4cb3d0SKatsuhiro Suzuki 		.suspend = uniphier_aio_dai_suspend,
326*db4cb3d0SKatsuhiro Suzuki 		.resume  = uniphier_aio_dai_resume,
327*db4cb3d0SKatsuhiro Suzuki 		.playback = {
328*db4cb3d0SKatsuhiro Suzuki 			.stream_name = AUD_NAME_HIECOUT1,
329*db4cb3d0SKatsuhiro Suzuki 			.formats     = SNDRV_PCM_FMTBIT_S32_LE,
330*db4cb3d0SKatsuhiro Suzuki 			.rates       = SNDRV_PCM_RATE_48000,
331*db4cb3d0SKatsuhiro Suzuki 			.channels_min = 2,
332*db4cb3d0SKatsuhiro Suzuki 			.channels_max = 2,
333*db4cb3d0SKatsuhiro Suzuki 		},
334*db4cb3d0SKatsuhiro Suzuki 		.ops = &uniphier_aio_spdif_ops,
335*db4cb3d0SKatsuhiro Suzuki 	},
336*db4cb3d0SKatsuhiro Suzuki 	{
337*db4cb3d0SKatsuhiro Suzuki 		.name    = AUD_NAME_EPCMOUT2,
338*db4cb3d0SKatsuhiro Suzuki 		.probe   = uniphier_aio_ld11_probe,
339*db4cb3d0SKatsuhiro Suzuki 		.remove  = uniphier_aio_dai_remove,
340*db4cb3d0SKatsuhiro Suzuki 		.suspend = uniphier_aio_dai_suspend,
341*db4cb3d0SKatsuhiro Suzuki 		.resume  = uniphier_aio_dai_resume,
342*db4cb3d0SKatsuhiro Suzuki 		.playback = {
343*db4cb3d0SKatsuhiro Suzuki 			.stream_name = AUD_NAME_EPCMOUT2,
344*db4cb3d0SKatsuhiro Suzuki 			.formats     = SNDRV_PCM_FMTBIT_S32_LE,
345*db4cb3d0SKatsuhiro Suzuki 			.rates       = SNDRV_PCM_RATE_48000 |
346*db4cb3d0SKatsuhiro Suzuki 				SNDRV_PCM_RATE_44100 |
347*db4cb3d0SKatsuhiro Suzuki 				SNDRV_PCM_RATE_32000,
348*db4cb3d0SKatsuhiro Suzuki 			.channels_min = 2,
349*db4cb3d0SKatsuhiro Suzuki 			.channels_max = 2,
350*db4cb3d0SKatsuhiro Suzuki 		},
351*db4cb3d0SKatsuhiro Suzuki 		.ops = &uniphier_aio_i2s_ops,
352*db4cb3d0SKatsuhiro Suzuki 	},
353*db4cb3d0SKatsuhiro Suzuki 	{
354*db4cb3d0SKatsuhiro Suzuki 		.name    = AUD_NAME_EPCMOUT3,
355*db4cb3d0SKatsuhiro Suzuki 		.probe   = uniphier_aio_ld11_probe,
356*db4cb3d0SKatsuhiro Suzuki 		.remove  = uniphier_aio_dai_remove,
357*db4cb3d0SKatsuhiro Suzuki 		.suspend = uniphier_aio_dai_suspend,
358*db4cb3d0SKatsuhiro Suzuki 		.resume  = uniphier_aio_dai_resume,
359*db4cb3d0SKatsuhiro Suzuki 		.playback = {
360*db4cb3d0SKatsuhiro Suzuki 			.stream_name = AUD_NAME_EPCMOUT3,
361*db4cb3d0SKatsuhiro Suzuki 			.formats     = SNDRV_PCM_FMTBIT_S32_LE,
362*db4cb3d0SKatsuhiro Suzuki 			.rates       = SNDRV_PCM_RATE_48000 |
363*db4cb3d0SKatsuhiro Suzuki 				SNDRV_PCM_RATE_44100 |
364*db4cb3d0SKatsuhiro Suzuki 				SNDRV_PCM_RATE_32000,
365*db4cb3d0SKatsuhiro Suzuki 			.channels_min = 2,
366*db4cb3d0SKatsuhiro Suzuki 			.channels_max = 2,
367*db4cb3d0SKatsuhiro Suzuki 		},
368*db4cb3d0SKatsuhiro Suzuki 		.ops = &uniphier_aio_i2s_ops,
369*db4cb3d0SKatsuhiro Suzuki 	},
370*db4cb3d0SKatsuhiro Suzuki 	{
371*db4cb3d0SKatsuhiro Suzuki 		.name    = AUD_NAME_HIECCOMPOUT1,
372*db4cb3d0SKatsuhiro Suzuki 		.probe   = uniphier_aio_ld11_probe,
373*db4cb3d0SKatsuhiro Suzuki 		.remove  = uniphier_aio_dai_remove,
374*db4cb3d0SKatsuhiro Suzuki 		.suspend = uniphier_aio_dai_suspend,
375*db4cb3d0SKatsuhiro Suzuki 		.resume  = uniphier_aio_dai_resume,
376*db4cb3d0SKatsuhiro Suzuki 		.compress_new = snd_soc_new_compress,
377*db4cb3d0SKatsuhiro Suzuki 		.playback = {
378*db4cb3d0SKatsuhiro Suzuki 			.stream_name = AUD_NAME_HIECCOMPOUT1,
379*db4cb3d0SKatsuhiro Suzuki 			.channels_min = 1,
380*db4cb3d0SKatsuhiro Suzuki 			.channels_max = 1,
381*db4cb3d0SKatsuhiro Suzuki 		},
382*db4cb3d0SKatsuhiro Suzuki 		.ops = &uniphier_aio_spdif_ops,
383*db4cb3d0SKatsuhiro Suzuki 	},
384*db4cb3d0SKatsuhiro Suzuki };
385*db4cb3d0SKatsuhiro Suzuki 
386*db4cb3d0SKatsuhiro Suzuki static const struct uniphier_aio_chip_spec uniphier_aio_ld11_spec = {
387*db4cb3d0SKatsuhiro Suzuki 	.specs     = uniphier_aio_ld11,
388*db4cb3d0SKatsuhiro Suzuki 	.num_specs = ARRAY_SIZE(uniphier_aio_ld11),
389*db4cb3d0SKatsuhiro Suzuki 	.dais      = uniphier_aio_dai_ld11,
390*db4cb3d0SKatsuhiro Suzuki 	.num_dais  = ARRAY_SIZE(uniphier_aio_dai_ld11),
391*db4cb3d0SKatsuhiro Suzuki 	.plls      = uniphier_aio_pll_ld11,
392*db4cb3d0SKatsuhiro Suzuki 	.num_plls  = ARRAY_SIZE(uniphier_aio_pll_ld11),
393*db4cb3d0SKatsuhiro Suzuki 	.addr_ext  = 0,
394*db4cb3d0SKatsuhiro Suzuki };
395*db4cb3d0SKatsuhiro Suzuki 
396*db4cb3d0SKatsuhiro Suzuki static const struct uniphier_aio_chip_spec uniphier_aio_ld20_spec = {
397*db4cb3d0SKatsuhiro Suzuki 	.specs     = uniphier_aio_ld11,
398*db4cb3d0SKatsuhiro Suzuki 	.num_specs = ARRAY_SIZE(uniphier_aio_ld11),
399*db4cb3d0SKatsuhiro Suzuki 	.dais      = uniphier_aio_dai_ld11,
400*db4cb3d0SKatsuhiro Suzuki 	.num_dais  = ARRAY_SIZE(uniphier_aio_dai_ld11),
401*db4cb3d0SKatsuhiro Suzuki 	.plls      = uniphier_aio_pll_ld11,
402*db4cb3d0SKatsuhiro Suzuki 	.num_plls  = ARRAY_SIZE(uniphier_aio_pll_ld11),
403*db4cb3d0SKatsuhiro Suzuki 	.addr_ext  = 1,
404*db4cb3d0SKatsuhiro Suzuki };
405*db4cb3d0SKatsuhiro Suzuki 
406*db4cb3d0SKatsuhiro Suzuki static const struct of_device_id uniphier_aio_of_match[] = {
407*db4cb3d0SKatsuhiro Suzuki 	{
408*db4cb3d0SKatsuhiro Suzuki 		.compatible = "socionext,uniphier-ld11-aio",
409*db4cb3d0SKatsuhiro Suzuki 		.data = &uniphier_aio_ld11_spec,
410*db4cb3d0SKatsuhiro Suzuki 	},
411*db4cb3d0SKatsuhiro Suzuki 	{
412*db4cb3d0SKatsuhiro Suzuki 		.compatible = "socionext,uniphier-ld20-aio",
413*db4cb3d0SKatsuhiro Suzuki 		.data = &uniphier_aio_ld20_spec,
414*db4cb3d0SKatsuhiro Suzuki 	},
415*db4cb3d0SKatsuhiro Suzuki 	{},
416*db4cb3d0SKatsuhiro Suzuki };
417*db4cb3d0SKatsuhiro Suzuki MODULE_DEVICE_TABLE(of, uniphier_aio_of_match);
418*db4cb3d0SKatsuhiro Suzuki 
419*db4cb3d0SKatsuhiro Suzuki static struct platform_driver uniphier_aio_driver = {
420*db4cb3d0SKatsuhiro Suzuki 	.driver = {
421*db4cb3d0SKatsuhiro Suzuki 		.name = "snd-uniphier-aio",
422*db4cb3d0SKatsuhiro Suzuki 		.of_match_table = of_match_ptr(uniphier_aio_of_match),
423*db4cb3d0SKatsuhiro Suzuki 	},
424*db4cb3d0SKatsuhiro Suzuki 	.probe    = uniphier_aio_probe,
425*db4cb3d0SKatsuhiro Suzuki 	.remove   = uniphier_aio_remove,
426*db4cb3d0SKatsuhiro Suzuki };
427*db4cb3d0SKatsuhiro Suzuki module_platform_driver(uniphier_aio_driver);
428*db4cb3d0SKatsuhiro Suzuki 
429*db4cb3d0SKatsuhiro Suzuki MODULE_AUTHOR("Katsuhiro Suzuki <suzuki.katsuhiro@socionext.com>");
430*db4cb3d0SKatsuhiro Suzuki MODULE_DESCRIPTION("UniPhier LD11/LD20 AIO driver.");
431*db4cb3d0SKatsuhiro Suzuki MODULE_LICENSE("GPL v2");
432