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