1 | // SPDX-License-Identifier: GPL-2.0 |
2 | // |
3 | // ak4613.c -- Asahi Kasei ALSA Soc Audio driver |
4 | // |
5 | // Copyright (C) 2015 Renesas Electronics Corporation |
6 | // Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
7 | // |
8 | // Based on ak4642.c by Kuninori Morimoto |
9 | // Based on wm8731.c by Richard Purdie |
10 | // Based on ak4535.c by Richard Purdie |
11 | // Based on wm8753.c by Liam Girdwood |
12 | |
13 | /* |
14 | * +-------+ |
15 | * |AK4613 | |
16 | * SDTO1 <-| | |
17 | * | | |
18 | * SDTI1 ->| | |
19 | * SDTI2 ->| | |
20 | * SDTI3 ->| | |
21 | * +-------+ |
22 | * |
23 | * +---+ |
24 | * clk | |___________________________________________... |
25 | * |
26 | * [TDM512] |
27 | * SDTO1 [L1][R1][L2][R2] |
28 | * SDTI1 [L1][R1][L2][R2][L3][R3][L4][R4][L5][R5][L6][R6] |
29 | * |
30 | * [TDM256] |
31 | * SDTO1 [L1][R1][L2][R2] |
32 | * SDTI1 [L1][R1][L2][R2][L3][R3][L4][R4] |
33 | * SDTI2 [L5][R5][L6][R6] |
34 | * |
35 | * [TDM128] |
36 | * SDTO1 [L1][R1][L2][R2] |
37 | * SDTI1 [L1][R1][L2][R2] |
38 | * SDTI2 [L3][R3][L4][R4] |
39 | * SDTI3 [L5][R5][L6][R6] |
40 | * |
41 | * [STEREO] |
42 | * Playback 2ch : SDTI1 |
43 | * Capture 2ch : SDTO1 |
44 | * |
45 | * [TDM512] |
46 | * Playback 12ch : SDTI1 |
47 | * Capture 4ch : SDTO1 |
48 | * |
49 | * [TDM256] |
50 | * Playback 12ch : SDTI1 + SDTI2 |
51 | * Playback 8ch : SDTI1 |
52 | * Capture 4ch : SDTO1 |
53 | * |
54 | * [TDM128] |
55 | * Playback 12ch : SDTI1 + SDTI2 + SDTI3 |
56 | * Playback 8ch : SDTI1 + SDTI2 |
57 | * Playback 4ch : SDTI1 |
58 | * Capture 4ch : SDTO1 |
59 | * |
60 | * |
61 | * !!! NOTE !!! |
62 | * |
63 | * Renesas is the only user of ak4613 on upstream so far, |
64 | * but the chip connection is like below. |
65 | * Thus, Renesas can't test all connection case. |
66 | * Tested TDM is very limited. |
67 | * |
68 | * +-----+ +-----------+ |
69 | * | SoC | | AK4613 | |
70 | * | |<-----|SDTO1 IN1|<-- Mic |
71 | * | | | IN2| |
72 | * | | | | |
73 | * | |----->|SDTI1 OUT1|--> Headphone |
74 | * +-----+ |SDTI2 OUT2| |
75 | * |SDTI3 OUT3| |
76 | * | OUT4| |
77 | * | OUT5| |
78 | * | OUT6| |
79 | * +-----------+ |
80 | * |
81 | * Renesas SoC can handle [2, 6,8] channels. |
82 | * Ak4613 can handle [2,4, 8,12] channels. |
83 | * |
84 | * Because of above HW connection and available channels number, |
85 | * Renesas could test are ... |
86 | * |
87 | * [STEREO] Playback 2ch : SDTI1 |
88 | * Capture 2ch : SDTO1 |
89 | * [TDM256] Playback 8ch : SDTI1 (*) |
90 | * |
91 | * (*) it used 8ch data between SoC <-> AK4613 on TDM256 mode, |
92 | * but could confirm is only first 2ch because only 1 |
93 | * Headphone is connected. |
94 | * |
95 | * see |
96 | * AK4613_ENABLE_TDM_TEST |
97 | */ |
98 | #include <linux/clk.h> |
99 | #include <linux/delay.h> |
100 | #include <linux/i2c.h> |
101 | #include <linux/slab.h> |
102 | #include <linux/of.h> |
103 | #include <linux/of_graph.h> |
104 | #include <linux/module.h> |
105 | #include <linux/regmap.h> |
106 | #include <sound/soc.h> |
107 | #include <sound/pcm_params.h> |
108 | #include <sound/tlv.h> |
109 | |
110 | #define PW_MGMT1 0x00 /* Power Management 1 */ |
111 | #define PW_MGMT2 0x01 /* Power Management 2 */ |
112 | #define PW_MGMT3 0x02 /* Power Management 3 */ |
113 | #define CTRL1 0x03 /* Control 1 */ |
114 | #define CTRL2 0x04 /* Control 2 */ |
115 | #define DEMP1 0x05 /* De-emphasis1 */ |
116 | #define DEMP2 0x06 /* De-emphasis2 */ |
117 | #define OFD 0x07 /* Overflow Detect */ |
118 | #define ZRD 0x08 /* Zero Detect */ |
119 | #define ICTRL 0x09 /* Input Control */ |
120 | #define OCTRL 0x0a /* Output Control */ |
121 | #define LOUT1 0x0b /* LOUT1 Volume Control */ |
122 | #define ROUT1 0x0c /* ROUT1 Volume Control */ |
123 | #define LOUT2 0x0d /* LOUT2 Volume Control */ |
124 | #define ROUT2 0x0e /* ROUT2 Volume Control */ |
125 | #define LOUT3 0x0f /* LOUT3 Volume Control */ |
126 | #define ROUT3 0x10 /* ROUT3 Volume Control */ |
127 | #define LOUT4 0x11 /* LOUT4 Volume Control */ |
128 | #define ROUT4 0x12 /* ROUT4 Volume Control */ |
129 | #define LOUT5 0x13 /* LOUT5 Volume Control */ |
130 | #define ROUT5 0x14 /* ROUT5 Volume Control */ |
131 | #define LOUT6 0x15 /* LOUT6 Volume Control */ |
132 | #define ROUT6 0x16 /* ROUT6 Volume Control */ |
133 | |
134 | /* PW_MGMT1 */ |
135 | #define RSTN BIT(0) |
136 | #define PMDAC BIT(1) |
137 | #define PMADC BIT(2) |
138 | #define PMVR BIT(3) |
139 | |
140 | /* PW_MGMT2 */ |
141 | #define PMAD_ALL 0x7 |
142 | |
143 | /* PW_MGMT3 */ |
144 | #define PMDA_ALL 0x3f |
145 | |
146 | /* CTRL1 */ |
147 | #define DIF0 BIT(3) |
148 | #define DIF1 BIT(4) |
149 | #define DIF2 BIT(5) |
150 | #define TDM0 BIT(6) |
151 | #define TDM1 BIT(7) |
152 | #define NO_FMT (0xff) |
153 | #define FMT_MASK (0xf8) |
154 | |
155 | /* CTRL2 */ |
156 | #define DFS_MASK (3 << 2) |
157 | #define DFS_NORMAL_SPEED (0 << 2) |
158 | #define DFS_DOUBLE_SPEED (1 << 2) |
159 | #define DFS_QUAD_SPEED (2 << 2) |
160 | |
161 | /* ICTRL */ |
162 | #define ICTRL_MASK (0x3) |
163 | |
164 | /* OCTRL */ |
165 | #define OCTRL_MASK (0x3F) |
166 | |
167 | /* |
168 | * configs |
169 | * |
170 | * 0x000000BA |
171 | * |
172 | * B : AK4613_CONFIG_SDTI_x |
173 | * A : AK4613_CONFIG_MODE_x |
174 | */ |
175 | #define AK4613_CONFIG_SET(priv, x) priv->configs |= AK4613_CONFIG_##x |
176 | #define AK4613_CONFIG_GET(priv, x) (priv->configs & AK4613_CONFIG_##x##_MASK) |
177 | |
178 | /* |
179 | * AK4613_CONFIG_SDTI_x |
180 | * |
181 | * It indicates how many SDTIx is connected. |
182 | */ |
183 | #define AK4613_CONFIG_SDTI_MASK (0xF << 4) |
184 | #define AK4613_CONFIG_SDTI(x) (((x) & 0xF) << 4) |
185 | #define AK4613_CONFIG_SDTI_set(priv, x) AK4613_CONFIG_SET(priv, SDTI(x)) |
186 | #define AK4613_CONFIG_SDTI_get(priv) ((AK4613_CONFIG_GET(priv, SDTI) >> 4) & 0xF) |
187 | |
188 | /* |
189 | * AK4613_CONFIG_MODE_x |
190 | * |
191 | * Same as Ctrl1 :: TDM1/TDM0 |
192 | * No shift is requested |
193 | * see |
194 | * AK4613_CTRL1_TO_MODE() |
195 | * Table 11/12/13/14 |
196 | */ |
197 | #define AK4613_CONFIG_MODE_MASK (0xF) |
198 | #define AK4613_CONFIG_MODE_STEREO (0x0) |
199 | #define AK4613_CONFIG_MODE_TDM512 (0x1) |
200 | #define AK4613_CONFIG_MODE_TDM256 (0x2) |
201 | #define AK4613_CONFIG_MODE_TDM128 (0x3) |
202 | |
203 | /* |
204 | * !!!! FIXME !!!! |
205 | * |
206 | * Because of testable HW limitation, TDM256 8ch TDM was only tested. |
207 | * This driver uses AK4613_ENABLE_TDM_TEST instead of new DT property so far. |
208 | * Don't hesitate to update driver, you don't need to care compatible |
209 | * with Renesas. |
210 | * |
211 | * #define AK4613_ENABLE_TDM_TEST |
212 | */ |
213 | |
214 | struct ak4613_interface { |
215 | unsigned int width; |
216 | unsigned int fmt; |
217 | u8 dif; |
218 | }; |
219 | |
220 | struct ak4613_priv { |
221 | struct mutex lock; |
222 | struct snd_pcm_hw_constraint_list constraint_rates; |
223 | struct snd_pcm_hw_constraint_list constraint_channels; |
224 | struct work_struct dummy_write_work; |
225 | struct snd_soc_component *component; |
226 | unsigned int rate; |
227 | unsigned int sysclk; |
228 | |
229 | unsigned int fmt; |
230 | unsigned int configs; |
231 | int cnt; |
232 | u8 ctrl1; |
233 | u8 oc; |
234 | u8 ic; |
235 | }; |
236 | |
237 | /* |
238 | * Playback Volume |
239 | * |
240 | * max : 0x00 : 0 dB |
241 | * ( 0.5 dB step ) |
242 | * min : 0xFE : -127.0 dB |
243 | * mute: 0xFF |
244 | */ |
245 | static const DECLARE_TLV_DB_SCALE(out_tlv, -12750, 50, 1); |
246 | |
247 | static const struct snd_kcontrol_new ak4613_snd_controls[] = { |
248 | SOC_DOUBLE_R_TLV("Digital Playback Volume1" , LOUT1, ROUT1, |
249 | 0, 0xFF, 1, out_tlv), |
250 | SOC_DOUBLE_R_TLV("Digital Playback Volume2" , LOUT2, ROUT2, |
251 | 0, 0xFF, 1, out_tlv), |
252 | SOC_DOUBLE_R_TLV("Digital Playback Volume3" , LOUT3, ROUT3, |
253 | 0, 0xFF, 1, out_tlv), |
254 | SOC_DOUBLE_R_TLV("Digital Playback Volume4" , LOUT4, ROUT4, |
255 | 0, 0xFF, 1, out_tlv), |
256 | SOC_DOUBLE_R_TLV("Digital Playback Volume5" , LOUT5, ROUT5, |
257 | 0, 0xFF, 1, out_tlv), |
258 | SOC_DOUBLE_R_TLV("Digital Playback Volume6" , LOUT6, ROUT6, |
259 | 0, 0xFF, 1, out_tlv), |
260 | }; |
261 | |
262 | static const struct reg_default ak4613_reg[] = { |
263 | { 0x0, 0x0f }, { 0x1, 0x07 }, { 0x2, 0x3f }, { 0x3, 0x20 }, |
264 | { 0x4, 0x20 }, { 0x5, 0x55 }, { 0x6, 0x05 }, { 0x7, 0x07 }, |
265 | { 0x8, 0x0f }, { 0x9, 0x07 }, { 0xa, 0x3f }, { 0xb, 0x00 }, |
266 | { 0xc, 0x00 }, { 0xd, 0x00 }, { 0xe, 0x00 }, { 0xf, 0x00 }, |
267 | { 0x10, 0x00 }, { 0x11, 0x00 }, { 0x12, 0x00 }, { 0x13, 0x00 }, |
268 | { 0x14, 0x00 }, { 0x15, 0x00 }, { 0x16, 0x00 }, |
269 | }; |
270 | |
271 | /* |
272 | * CTRL1 register |
273 | * see |
274 | * Table 11/12/13/14 |
275 | */ |
276 | #define AUDIO_IFACE(_dif, _width, _fmt) \ |
277 | { \ |
278 | .dif = _dif, \ |
279 | .width = _width, \ |
280 | .fmt = SND_SOC_DAIFMT_##_fmt,\ |
281 | } |
282 | static const struct ak4613_interface ak4613_iface[] = { |
283 | /* It doesn't support asymmetric format */ |
284 | |
285 | AUDIO_IFACE(0x03, 24, LEFT_J), |
286 | AUDIO_IFACE(0x04, 24, I2S), |
287 | }; |
288 | #define AK4613_CTRL1_TO_MODE(priv) ((priv)->ctrl1 >> 6) /* AK4613_CONFIG_MODE_x */ |
289 | |
290 | static const struct regmap_config ak4613_regmap_cfg = { |
291 | .reg_bits = 8, |
292 | .val_bits = 8, |
293 | .max_register = 0x16, |
294 | .reg_defaults = ak4613_reg, |
295 | .num_reg_defaults = ARRAY_SIZE(ak4613_reg), |
296 | .cache_type = REGCACHE_RBTREE, |
297 | }; |
298 | |
299 | static const struct of_device_id ak4613_of_match[] = { |
300 | { .compatible = "asahi-kasei,ak4613" , .data = &ak4613_regmap_cfg }, |
301 | {}, |
302 | }; |
303 | MODULE_DEVICE_TABLE(of, ak4613_of_match); |
304 | |
305 | static const struct i2c_device_id ak4613_i2c_id[] = { |
306 | { "ak4613" , (kernel_ulong_t)&ak4613_regmap_cfg }, |
307 | { } |
308 | }; |
309 | MODULE_DEVICE_TABLE(i2c, ak4613_i2c_id); |
310 | |
311 | static const struct snd_soc_dapm_widget ak4613_dapm_widgets[] = { |
312 | |
313 | /* Outputs */ |
314 | SND_SOC_DAPM_OUTPUT("LOUT1" ), |
315 | SND_SOC_DAPM_OUTPUT("LOUT2" ), |
316 | SND_SOC_DAPM_OUTPUT("LOUT3" ), |
317 | SND_SOC_DAPM_OUTPUT("LOUT4" ), |
318 | SND_SOC_DAPM_OUTPUT("LOUT5" ), |
319 | SND_SOC_DAPM_OUTPUT("LOUT6" ), |
320 | |
321 | SND_SOC_DAPM_OUTPUT("ROUT1" ), |
322 | SND_SOC_DAPM_OUTPUT("ROUT2" ), |
323 | SND_SOC_DAPM_OUTPUT("ROUT3" ), |
324 | SND_SOC_DAPM_OUTPUT("ROUT4" ), |
325 | SND_SOC_DAPM_OUTPUT("ROUT5" ), |
326 | SND_SOC_DAPM_OUTPUT("ROUT6" ), |
327 | |
328 | /* Inputs */ |
329 | SND_SOC_DAPM_INPUT("LIN1" ), |
330 | SND_SOC_DAPM_INPUT("LIN2" ), |
331 | |
332 | SND_SOC_DAPM_INPUT("RIN1" ), |
333 | SND_SOC_DAPM_INPUT("RIN2" ), |
334 | |
335 | /* DAC */ |
336 | SND_SOC_DAPM_DAC("DAC1" , NULL, PW_MGMT3, 0, 0), |
337 | SND_SOC_DAPM_DAC("DAC2" , NULL, PW_MGMT3, 1, 0), |
338 | SND_SOC_DAPM_DAC("DAC3" , NULL, PW_MGMT3, 2, 0), |
339 | SND_SOC_DAPM_DAC("DAC4" , NULL, PW_MGMT3, 3, 0), |
340 | SND_SOC_DAPM_DAC("DAC5" , NULL, PW_MGMT3, 4, 0), |
341 | SND_SOC_DAPM_DAC("DAC6" , NULL, PW_MGMT3, 5, 0), |
342 | |
343 | /* ADC */ |
344 | SND_SOC_DAPM_ADC("ADC1" , NULL, PW_MGMT2, 0, 0), |
345 | SND_SOC_DAPM_ADC("ADC2" , NULL, PW_MGMT2, 1, 0), |
346 | }; |
347 | |
348 | static const struct snd_soc_dapm_route ak4613_intercon[] = { |
349 | {"LOUT1" , NULL, "DAC1" }, |
350 | {"LOUT2" , NULL, "DAC2" }, |
351 | {"LOUT3" , NULL, "DAC3" }, |
352 | {"LOUT4" , NULL, "DAC4" }, |
353 | {"LOUT5" , NULL, "DAC5" }, |
354 | {"LOUT6" , NULL, "DAC6" }, |
355 | |
356 | {"ROUT1" , NULL, "DAC1" }, |
357 | {"ROUT2" , NULL, "DAC2" }, |
358 | {"ROUT3" , NULL, "DAC3" }, |
359 | {"ROUT4" , NULL, "DAC4" }, |
360 | {"ROUT5" , NULL, "DAC5" }, |
361 | {"ROUT6" , NULL, "DAC6" }, |
362 | |
363 | {"DAC1" , NULL, "Playback" }, |
364 | {"DAC2" , NULL, "Playback" }, |
365 | {"DAC3" , NULL, "Playback" }, |
366 | {"DAC4" , NULL, "Playback" }, |
367 | {"DAC5" , NULL, "Playback" }, |
368 | {"DAC6" , NULL, "Playback" }, |
369 | |
370 | {"Capture" , NULL, "ADC1" }, |
371 | {"Capture" , NULL, "ADC2" }, |
372 | |
373 | {"ADC1" , NULL, "LIN1" }, |
374 | {"ADC2" , NULL, "LIN2" }, |
375 | |
376 | {"ADC1" , NULL, "RIN1" }, |
377 | {"ADC2" , NULL, "RIN2" }, |
378 | }; |
379 | |
380 | static void ak4613_dai_shutdown(struct snd_pcm_substream *substream, |
381 | struct snd_soc_dai *dai) |
382 | { |
383 | struct snd_soc_component *component = dai->component; |
384 | struct ak4613_priv *priv = snd_soc_component_get_drvdata(c: component); |
385 | struct device *dev = component->dev; |
386 | |
387 | mutex_lock(&priv->lock); |
388 | priv->cnt--; |
389 | if (priv->cnt < 0) { |
390 | dev_err(dev, "unexpected counter error\n" ); |
391 | priv->cnt = 0; |
392 | } |
393 | if (!priv->cnt) |
394 | priv->ctrl1 = 0; |
395 | mutex_unlock(lock: &priv->lock); |
396 | } |
397 | |
398 | static void ak4613_hw_constraints(struct ak4613_priv *priv, |
399 | struct snd_pcm_substream *substream) |
400 | { |
401 | struct snd_pcm_runtime *runtime = substream->runtime; |
402 | static const unsigned int ak4613_rates[] = { |
403 | 32000, |
404 | 44100, |
405 | 48000, |
406 | 64000, |
407 | 88200, |
408 | 96000, |
409 | 176400, |
410 | 192000, |
411 | }; |
412 | #define AK4613_CHANNEL_2 0 |
413 | #define AK4613_CHANNEL_4 1 |
414 | #define AK4613_CHANNEL_8 2 |
415 | #define AK4613_CHANNEL_12 3 |
416 | #define AK4613_CHANNEL_NONE -1 |
417 | static const unsigned int ak4613_channels[] = { |
418 | [AK4613_CHANNEL_2] = 2, |
419 | [AK4613_CHANNEL_4] = 4, |
420 | [AK4613_CHANNEL_8] = 8, |
421 | [AK4613_CHANNEL_12] = 12, |
422 | }; |
423 | #define MODE_MAX 4 |
424 | #define SDTx_MAX 4 |
425 | #define MASK(x) (1 << AK4613_CHANNEL_##x) |
426 | static const int mask_list[MODE_MAX][SDTx_MAX] = { |
427 | /* SDTO SDTIx1 SDTIx2 SDTIx3 */ |
428 | [AK4613_CONFIG_MODE_STEREO] = { MASK(2), MASK(2), MASK(2), MASK(2)}, |
429 | [AK4613_CONFIG_MODE_TDM512] = { MASK(4), MASK(12), MASK(12), MASK(12)}, |
430 | [AK4613_CONFIG_MODE_TDM256] = { MASK(4), MASK(8), MASK(8)|MASK(12), MASK(8)|MASK(12)}, |
431 | [AK4613_CONFIG_MODE_TDM128] = { MASK(4), MASK(4), MASK(4)|MASK(8), MASK(4)|MASK(8)|MASK(12)}, |
432 | }; |
433 | struct snd_pcm_hw_constraint_list *constraint; |
434 | unsigned int mask; |
435 | unsigned int mode; |
436 | unsigned int fs; |
437 | int is_play = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; |
438 | int sdti_num; |
439 | int i; |
440 | |
441 | constraint = &priv->constraint_rates; |
442 | constraint->list = ak4613_rates; |
443 | constraint->mask = 0; |
444 | constraint->count = 0; |
445 | |
446 | /* |
447 | * Slave Mode |
448 | * Normal: [32kHz, 48kHz] : 256fs,384fs or 512fs |
449 | * Double: [64kHz, 96kHz] : 256fs |
450 | * Quad : [128kHz,192kHz]: 128fs |
451 | * |
452 | * Master mode |
453 | * Normal: [32kHz, 48kHz] : 256fs or 512fs |
454 | * Double: [64kHz, 96kHz] : 256fs |
455 | * Quad : [128kHz,192kHz]: 128fs |
456 | */ |
457 | for (i = 0; i < ARRAY_SIZE(ak4613_rates); i++) { |
458 | /* minimum fs on each range */ |
459 | fs = (ak4613_rates[i] <= 96000) ? 256 : 128; |
460 | |
461 | if (priv->sysclk >= ak4613_rates[i] * fs) |
462 | constraint->count = i + 1; |
463 | } |
464 | |
465 | snd_pcm_hw_constraint_list(runtime, cond: 0, |
466 | SNDRV_PCM_HW_PARAM_RATE, l: constraint); |
467 | |
468 | |
469 | sdti_num = AK4613_CONFIG_SDTI_get(priv); |
470 | if (WARN_ON(sdti_num >= SDTx_MAX)) |
471 | return; |
472 | |
473 | if (priv->cnt) { |
474 | /* |
475 | * If it was already working, |
476 | * the constraint is same as working mode. |
477 | */ |
478 | mode = AK4613_CTRL1_TO_MODE(priv); |
479 | mask = 0; /* no default */ |
480 | } else { |
481 | /* |
482 | * It is not yet working, |
483 | * the constraint is based on board configs. |
484 | * STEREO mask is default |
485 | */ |
486 | mode = AK4613_CONFIG_GET(priv, MODE); |
487 | mask = mask_list[AK4613_CONFIG_MODE_STEREO][is_play * sdti_num]; |
488 | } |
489 | |
490 | if (WARN_ON(mode >= MODE_MAX)) |
491 | return; |
492 | |
493 | /* add each mode mask */ |
494 | mask |= mask_list[mode][is_play * sdti_num]; |
495 | |
496 | constraint = &priv->constraint_channels; |
497 | constraint->list = ak4613_channels; |
498 | constraint->mask = mask; |
499 | constraint->count = sizeof(ak4613_channels); |
500 | snd_pcm_hw_constraint_list(runtime, cond: 0, |
501 | SNDRV_PCM_HW_PARAM_CHANNELS, l: constraint); |
502 | } |
503 | |
504 | static int ak4613_dai_startup(struct snd_pcm_substream *substream, |
505 | struct snd_soc_dai *dai) |
506 | { |
507 | struct snd_soc_component *component = dai->component; |
508 | struct ak4613_priv *priv = snd_soc_component_get_drvdata(c: component); |
509 | |
510 | mutex_lock(&priv->lock); |
511 | ak4613_hw_constraints(priv, substream); |
512 | priv->cnt++; |
513 | mutex_unlock(lock: &priv->lock); |
514 | |
515 | return 0; |
516 | } |
517 | |
518 | static int ak4613_dai_set_sysclk(struct snd_soc_dai *codec_dai, |
519 | int clk_id, unsigned int freq, int dir) |
520 | { |
521 | struct snd_soc_component *component = codec_dai->component; |
522 | struct ak4613_priv *priv = snd_soc_component_get_drvdata(c: component); |
523 | |
524 | priv->sysclk = freq; |
525 | |
526 | return 0; |
527 | } |
528 | |
529 | static int ak4613_dai_set_fmt(struct snd_soc_dai *dai, unsigned int format) |
530 | { |
531 | struct snd_soc_component *component = dai->component; |
532 | struct ak4613_priv *priv = snd_soc_component_get_drvdata(c: component); |
533 | unsigned int fmt; |
534 | |
535 | fmt = format & SND_SOC_DAIFMT_FORMAT_MASK; |
536 | switch (fmt) { |
537 | case SND_SOC_DAIFMT_LEFT_J: |
538 | case SND_SOC_DAIFMT_I2S: |
539 | priv->fmt = fmt; |
540 | break; |
541 | default: |
542 | return -EINVAL; |
543 | } |
544 | |
545 | fmt = format & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK; |
546 | switch (fmt) { |
547 | case SND_SOC_DAIFMT_CBC_CFC: |
548 | break; |
549 | default: |
550 | /* |
551 | * SUPPORTME |
552 | * |
553 | * "clock provider" is not yet supperted |
554 | */ |
555 | return -EINVAL; |
556 | } |
557 | |
558 | return 0; |
559 | } |
560 | |
561 | static int ak4613_dai_hw_params(struct snd_pcm_substream *substream, |
562 | struct snd_pcm_hw_params *params, |
563 | struct snd_soc_dai *dai) |
564 | { |
565 | struct snd_soc_component *component = dai->component; |
566 | struct ak4613_priv *priv = snd_soc_component_get_drvdata(c: component); |
567 | struct device *dev = component->dev; |
568 | unsigned int width = params_width(p: params); |
569 | unsigned int fmt = priv->fmt; |
570 | unsigned int rate; |
571 | int i, ret; |
572 | u8 ctrl2; |
573 | |
574 | rate = params_rate(p: params); |
575 | switch (rate) { |
576 | case 32000: |
577 | case 44100: |
578 | case 48000: |
579 | ctrl2 = DFS_NORMAL_SPEED; |
580 | break; |
581 | case 64000: |
582 | case 88200: |
583 | case 96000: |
584 | ctrl2 = DFS_DOUBLE_SPEED; |
585 | break; |
586 | case 176400: |
587 | case 192000: |
588 | ctrl2 = DFS_QUAD_SPEED; |
589 | break; |
590 | default: |
591 | return -EINVAL; |
592 | } |
593 | priv->rate = rate; |
594 | |
595 | /* |
596 | * FIXME |
597 | * |
598 | * It doesn't have full TDM suppert yet |
599 | */ |
600 | ret = -EINVAL; |
601 | |
602 | mutex_lock(&priv->lock); |
603 | if (priv->cnt > 1) { |
604 | /* |
605 | * If it was already working, use current priv->ctrl1 |
606 | */ |
607 | ret = 0; |
608 | } else { |
609 | /* |
610 | * It is not yet working, |
611 | */ |
612 | unsigned int channel = params_channels(p: params); |
613 | u8 tdm; |
614 | |
615 | /* STEREO or TDM */ |
616 | if (channel == 2) |
617 | tdm = AK4613_CONFIG_MODE_STEREO; |
618 | else |
619 | tdm = AK4613_CONFIG_GET(priv, MODE); |
620 | |
621 | for (i = ARRAY_SIZE(ak4613_iface) - 1; i >= 0; i--) { |
622 | const struct ak4613_interface *iface = ak4613_iface + i; |
623 | |
624 | if ((iface->fmt == fmt) && (iface->width == width)) { |
625 | /* |
626 | * Ctrl1 |
627 | * | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |
628 | * |TDM1|TDM0|DIF2|DIF1|DIF0|ATS1|ATS0|SMUTE| |
629 | * < tdm > < iface->dif > |
630 | */ |
631 | priv->ctrl1 = (tdm << 6) | (iface->dif << 3); |
632 | ret = 0; |
633 | break; |
634 | } |
635 | } |
636 | } |
637 | mutex_unlock(lock: &priv->lock); |
638 | |
639 | if (ret < 0) |
640 | goto hw_params_end; |
641 | |
642 | snd_soc_component_update_bits(component, CTRL1, FMT_MASK, val: priv->ctrl1); |
643 | snd_soc_component_update_bits(component, CTRL2, DFS_MASK, val: ctrl2); |
644 | |
645 | snd_soc_component_update_bits(component, ICTRL, ICTRL_MASK, val: priv->ic); |
646 | snd_soc_component_update_bits(component, OCTRL, OCTRL_MASK, val: priv->oc); |
647 | |
648 | hw_params_end: |
649 | if (ret < 0) |
650 | dev_warn(dev, "unsupported data width/format combination\n" ); |
651 | |
652 | return ret; |
653 | } |
654 | |
655 | static int ak4613_set_bias_level(struct snd_soc_component *component, |
656 | enum snd_soc_bias_level level) |
657 | { |
658 | u8 mgmt1 = 0; |
659 | |
660 | switch (level) { |
661 | case SND_SOC_BIAS_ON: |
662 | mgmt1 |= RSTN; |
663 | fallthrough; |
664 | case SND_SOC_BIAS_PREPARE: |
665 | mgmt1 |= PMADC | PMDAC; |
666 | fallthrough; |
667 | case SND_SOC_BIAS_STANDBY: |
668 | mgmt1 |= PMVR; |
669 | fallthrough; |
670 | case SND_SOC_BIAS_OFF: |
671 | default: |
672 | break; |
673 | } |
674 | |
675 | snd_soc_component_write(component, PW_MGMT1, val: mgmt1); |
676 | |
677 | return 0; |
678 | } |
679 | |
680 | static void ak4613_dummy_write(struct work_struct *work) |
681 | { |
682 | struct ak4613_priv *priv = container_of(work, |
683 | struct ak4613_priv, |
684 | dummy_write_work); |
685 | struct snd_soc_component *component = priv->component; |
686 | unsigned int mgmt1; |
687 | unsigned int mgmt3; |
688 | |
689 | /* |
690 | * PW_MGMT1 / PW_MGMT3 needs dummy write at least after 5 LR clocks |
691 | * |
692 | * Note |
693 | * |
694 | * To avoid extra delay, we want to avoid preemption here, |
695 | * but we can't. Because it uses I2C access which is using IRQ |
696 | * and sleep. Thus, delay might be more than 5 LR clocks |
697 | * see also |
698 | * ak4613_dai_trigger() |
699 | */ |
700 | udelay(5000000 / priv->rate); |
701 | |
702 | mgmt1 = snd_soc_component_read(component, PW_MGMT1); |
703 | mgmt3 = snd_soc_component_read(component, PW_MGMT3); |
704 | |
705 | snd_soc_component_write(component, PW_MGMT1, val: mgmt1); |
706 | snd_soc_component_write(component, PW_MGMT3, val: mgmt3); |
707 | } |
708 | |
709 | static int ak4613_dai_trigger(struct snd_pcm_substream *substream, int cmd, |
710 | struct snd_soc_dai *dai) |
711 | { |
712 | struct snd_soc_component *component = dai->component; |
713 | struct ak4613_priv *priv = snd_soc_component_get_drvdata(c: component); |
714 | |
715 | /* |
716 | * FIXME |
717 | * |
718 | * PW_MGMT1 / PW_MGMT3 needs dummy write at least after 5 LR clocks |
719 | * from Power Down Release. Otherwise, Playback volume will be 0dB. |
720 | * To avoid complex multiple delay/dummy_write method from |
721 | * ak4613_set_bias_level() / SND_SOC_DAPM_DAC_E("DACx", ...), |
722 | * call it once here. |
723 | * |
724 | * But, unfortunately, we can't "write" here because here is atomic |
725 | * context (It uses I2C access for writing). |
726 | * Thus, use schedule_work() to switching to normal context |
727 | * immediately. |
728 | * |
729 | * Note |
730 | * |
731 | * Calling ak4613_dummy_write() function might be delayed. |
732 | * In such case, ak4613 volume might be temporarily 0dB when |
733 | * beggining of playback. |
734 | * see also |
735 | * ak4613_dummy_write() |
736 | */ |
737 | |
738 | if ((cmd != SNDRV_PCM_TRIGGER_START) && |
739 | (cmd != SNDRV_PCM_TRIGGER_RESUME)) |
740 | return 0; |
741 | |
742 | if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK) |
743 | return 0; |
744 | |
745 | priv->component = component; |
746 | schedule_work(work: &priv->dummy_write_work); |
747 | |
748 | return 0; |
749 | } |
750 | |
751 | /* |
752 | * Select below from Sound Card, not Auto |
753 | * SND_SOC_DAIFMT_CBC_CFC |
754 | * SND_SOC_DAIFMT_CBP_CFP |
755 | */ |
756 | static u64 ak4613_dai_formats = |
757 | SND_SOC_POSSIBLE_DAIFMT_I2S | |
758 | SND_SOC_POSSIBLE_DAIFMT_LEFT_J; |
759 | |
760 | static const struct snd_soc_dai_ops ak4613_dai_ops = { |
761 | .startup = ak4613_dai_startup, |
762 | .shutdown = ak4613_dai_shutdown, |
763 | .set_sysclk = ak4613_dai_set_sysclk, |
764 | .set_fmt = ak4613_dai_set_fmt, |
765 | .trigger = ak4613_dai_trigger, |
766 | .hw_params = ak4613_dai_hw_params, |
767 | .auto_selectable_formats = &ak4613_dai_formats, |
768 | .num_auto_selectable_formats = 1, |
769 | }; |
770 | |
771 | #define AK4613_PCM_RATE (SNDRV_PCM_RATE_32000 |\ |
772 | SNDRV_PCM_RATE_44100 |\ |
773 | SNDRV_PCM_RATE_48000 |\ |
774 | SNDRV_PCM_RATE_64000 |\ |
775 | SNDRV_PCM_RATE_88200 |\ |
776 | SNDRV_PCM_RATE_96000 |\ |
777 | SNDRV_PCM_RATE_176400 |\ |
778 | SNDRV_PCM_RATE_192000) |
779 | #define AK4613_PCM_FMTBIT (SNDRV_PCM_FMTBIT_S24_LE) |
780 | |
781 | static struct snd_soc_dai_driver ak4613_dai = { |
782 | .name = "ak4613-hifi" , |
783 | .playback = { |
784 | .stream_name = "Playback" , |
785 | .channels_min = 2, |
786 | .channels_max = 12, |
787 | .rates = AK4613_PCM_RATE, |
788 | .formats = AK4613_PCM_FMTBIT, |
789 | }, |
790 | .capture = { |
791 | .stream_name = "Capture" , |
792 | .channels_min = 2, |
793 | .channels_max = 4, |
794 | .rates = AK4613_PCM_RATE, |
795 | .formats = AK4613_PCM_FMTBIT, |
796 | }, |
797 | .ops = &ak4613_dai_ops, |
798 | .symmetric_rate = 1, |
799 | }; |
800 | |
801 | static int ak4613_suspend(struct snd_soc_component *component) |
802 | { |
803 | struct regmap *regmap = dev_get_regmap(dev: component->dev, NULL); |
804 | |
805 | regcache_cache_only(map: regmap, enable: true); |
806 | regcache_mark_dirty(map: regmap); |
807 | return 0; |
808 | } |
809 | |
810 | static int ak4613_resume(struct snd_soc_component *component) |
811 | { |
812 | struct regmap *regmap = dev_get_regmap(dev: component->dev, NULL); |
813 | |
814 | regcache_cache_only(map: regmap, enable: false); |
815 | return regcache_sync(map: regmap); |
816 | } |
817 | |
818 | static const struct snd_soc_component_driver soc_component_dev_ak4613 = { |
819 | .suspend = ak4613_suspend, |
820 | .resume = ak4613_resume, |
821 | .set_bias_level = ak4613_set_bias_level, |
822 | .controls = ak4613_snd_controls, |
823 | .num_controls = ARRAY_SIZE(ak4613_snd_controls), |
824 | .dapm_widgets = ak4613_dapm_widgets, |
825 | .num_dapm_widgets = ARRAY_SIZE(ak4613_dapm_widgets), |
826 | .dapm_routes = ak4613_intercon, |
827 | .num_dapm_routes = ARRAY_SIZE(ak4613_intercon), |
828 | .idle_bias_on = 1, |
829 | .endianness = 1, |
830 | }; |
831 | |
832 | static void ak4613_parse_of(struct ak4613_priv *priv, |
833 | struct device *dev) |
834 | { |
835 | struct device_node *np = dev->of_node; |
836 | char prop[32]; |
837 | int sdti_num; |
838 | int i; |
839 | |
840 | /* Input 1 - 2 */ |
841 | for (i = 0; i < 2; i++) { |
842 | snprintf(buf: prop, size: sizeof(prop), fmt: "asahi-kasei,in%d-single-end" , i + 1); |
843 | if (!of_get_property(node: np, name: prop, NULL)) |
844 | priv->ic |= 1 << i; |
845 | } |
846 | |
847 | /* Output 1 - 6 */ |
848 | for (i = 0; i < 6; i++) { |
849 | snprintf(buf: prop, size: sizeof(prop), fmt: "asahi-kasei,out%d-single-end" , i + 1); |
850 | if (!of_get_property(node: np, name: prop, NULL)) |
851 | priv->oc |= 1 << i; |
852 | } |
853 | |
854 | /* |
855 | * enable TDM256 test |
856 | * |
857 | * !!! FIXME !!! |
858 | * |
859 | * It should be configured by DT or other way |
860 | * if it was full supported. |
861 | * But it is using ifdef style for now for test |
862 | * purpose. |
863 | */ |
864 | #if defined(AK4613_ENABLE_TDM_TEST) |
865 | AK4613_CONFIG_SET(priv, MODE_TDM256); |
866 | #endif |
867 | |
868 | /* |
869 | * connected STDI |
870 | * TDM support is assuming it is probed via Audio-Graph-Card style here. |
871 | * Default is SDTIx1 if it was probed via Simple-Audio-Card for now. |
872 | */ |
873 | sdti_num = of_graph_get_endpoint_count(np); |
874 | if ((sdti_num >= SDTx_MAX) || (sdti_num < 1)) |
875 | sdti_num = 1; |
876 | |
877 | AK4613_CONFIG_SDTI_set(priv, sdti_num); |
878 | } |
879 | |
880 | static int ak4613_i2c_probe(struct i2c_client *i2c) |
881 | { |
882 | struct device *dev = &i2c->dev; |
883 | const struct regmap_config *regmap_cfg; |
884 | struct regmap *regmap; |
885 | struct ak4613_priv *priv; |
886 | |
887 | regmap_cfg = i2c_get_match_data(client: i2c); |
888 | if (!regmap_cfg) |
889 | return -EINVAL; |
890 | |
891 | priv = devm_kzalloc(dev, size: sizeof(*priv), GFP_KERNEL); |
892 | if (!priv) |
893 | return -ENOMEM; |
894 | |
895 | ak4613_parse_of(priv, dev); |
896 | |
897 | priv->ctrl1 = 0; |
898 | priv->cnt = 0; |
899 | priv->sysclk = 0; |
900 | INIT_WORK(&priv->dummy_write_work, ak4613_dummy_write); |
901 | |
902 | mutex_init(&priv->lock); |
903 | |
904 | i2c_set_clientdata(client: i2c, data: priv); |
905 | |
906 | regmap = devm_regmap_init_i2c(i2c, regmap_cfg); |
907 | if (IS_ERR(ptr: regmap)) |
908 | return PTR_ERR(ptr: regmap); |
909 | |
910 | return devm_snd_soc_register_component(dev, component_driver: &soc_component_dev_ak4613, |
911 | dai_drv: &ak4613_dai, num_dai: 1); |
912 | } |
913 | |
914 | static struct i2c_driver ak4613_i2c_driver = { |
915 | .driver = { |
916 | .name = "ak4613-codec" , |
917 | .of_match_table = ak4613_of_match, |
918 | }, |
919 | .probe = ak4613_i2c_probe, |
920 | .id_table = ak4613_i2c_id, |
921 | }; |
922 | |
923 | module_i2c_driver(ak4613_i2c_driver); |
924 | |
925 | MODULE_DESCRIPTION("Soc AK4613 driver" ); |
926 | MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>" ); |
927 | MODULE_LICENSE("GPL v2" ); |
928 | |