media: v4l: rcar_fdp1: Change platform dependency to ARCH_RENESAS
[linux/fpc-iii.git] / sound / soc / codecs / tscs42xx.c
blobd18ff17719cc617cd0084358dee0623b95223250
1 // SPDX-License-Identifier: GPL-2.0
2 // tscs42xx.c -- TSCS42xx ALSA SoC Audio driver
3 // Copyright 2017 Tempo Semiconductor, Inc.
4 // Author: Steven Eckhoff <steven.eckhoff.opensource@gmail.com>
6 #include <linux/kernel.h>
7 #include <linux/device.h>
8 #include <linux/regmap.h>
9 #include <linux/i2c.h>
10 #include <linux/err.h>
11 #include <linux/string.h>
12 #include <linux/module.h>
13 #include <linux/delay.h>
14 #include <linux/mutex.h>
15 #include <linux/clk.h>
16 #include <sound/tlv.h>
17 #include <sound/pcm_params.h>
18 #include <sound/soc.h>
19 #include <sound/soc-dapm.h>
21 #include "tscs42xx.h"
23 #define COEFF_SIZE 3
24 #define BIQUAD_COEFF_COUNT 5
25 #define BIQUAD_SIZE (COEFF_SIZE * BIQUAD_COEFF_COUNT)
27 #define COEFF_RAM_MAX_ADDR 0xcd
28 #define COEFF_RAM_COEFF_COUNT (COEFF_RAM_MAX_ADDR + 1)
29 #define COEFF_RAM_SIZE (COEFF_SIZE * COEFF_RAM_COEFF_COUNT)
31 struct tscs42xx {
33 int bclk_ratio;
34 int samplerate;
35 struct mutex audio_params_lock;
37 u8 coeff_ram[COEFF_RAM_SIZE];
38 bool coeff_ram_synced;
39 struct mutex coeff_ram_lock;
41 struct mutex pll_lock;
43 struct regmap *regmap;
45 struct clk *sysclk;
46 int sysclk_src_id;
49 struct coeff_ram_ctl {
50 unsigned int addr;
51 struct soc_bytes_ext bytes_ext;
54 static bool tscs42xx_volatile(struct device *dev, unsigned int reg)
56 switch (reg) {
57 case R_DACCRWRL:
58 case R_DACCRWRM:
59 case R_DACCRWRH:
60 case R_DACCRRDL:
61 case R_DACCRRDM:
62 case R_DACCRRDH:
63 case R_DACCRSTAT:
64 case R_DACCRADDR:
65 case R_PLLCTL0:
66 return true;
67 default:
68 return false;
72 static bool tscs42xx_precious(struct device *dev, unsigned int reg)
74 switch (reg) {
75 case R_DACCRWRL:
76 case R_DACCRWRM:
77 case R_DACCRWRH:
78 case R_DACCRRDL:
79 case R_DACCRRDM:
80 case R_DACCRRDH:
81 return true;
82 default:
83 return false;
87 static const struct regmap_config tscs42xx_regmap = {
88 .reg_bits = 8,
89 .val_bits = 8,
91 .volatile_reg = tscs42xx_volatile,
92 .precious_reg = tscs42xx_precious,
93 .max_register = R_DACMBCREL3H,
95 .cache_type = REGCACHE_RBTREE,
96 .can_multi_write = true,
99 #define MAX_PLL_LOCK_20MS_WAITS 1
100 static bool plls_locked(struct snd_soc_component *component)
102 int ret;
103 int count = MAX_PLL_LOCK_20MS_WAITS;
105 do {
106 ret = snd_soc_component_read32(component, R_PLLCTL0);
107 if (ret < 0) {
108 dev_err(component->dev,
109 "Failed to read PLL lock status (%d)\n", ret);
110 return false;
111 } else if (ret > 0) {
112 return true;
114 msleep(20);
115 } while (count--);
117 return false;
120 static int sample_rate_to_pll_freq_out(int sample_rate)
122 switch (sample_rate) {
123 case 11025:
124 case 22050:
125 case 44100:
126 case 88200:
127 return 112896000;
128 case 8000:
129 case 16000:
130 case 32000:
131 case 48000:
132 case 96000:
133 return 122880000;
134 default:
135 return -EINVAL;
139 #define DACCRSTAT_MAX_TRYS 10
140 static int write_coeff_ram(struct snd_soc_component *component, u8 *coeff_ram,
141 unsigned int addr, unsigned int coeff_cnt)
143 struct tscs42xx *tscs42xx = snd_soc_component_get_drvdata(component);
144 int cnt;
145 int trys;
146 int ret;
148 for (cnt = 0; cnt < coeff_cnt; cnt++, addr++) {
150 for (trys = 0; trys < DACCRSTAT_MAX_TRYS; trys++) {
151 ret = snd_soc_component_read32(component, R_DACCRSTAT);
152 if (ret < 0) {
153 dev_err(component->dev,
154 "Failed to read stat (%d)\n", ret);
155 return ret;
157 if (!ret)
158 break;
161 if (trys == DACCRSTAT_MAX_TRYS) {
162 ret = -EIO;
163 dev_err(component->dev,
164 "dac coefficient write error (%d)\n", ret);
165 return ret;
168 ret = regmap_write(tscs42xx->regmap, R_DACCRADDR, addr);
169 if (ret < 0) {
170 dev_err(component->dev,
171 "Failed to write dac ram address (%d)\n", ret);
172 return ret;
175 ret = regmap_bulk_write(tscs42xx->regmap, R_DACCRWRL,
176 &coeff_ram[addr * COEFF_SIZE],
177 COEFF_SIZE);
178 if (ret < 0) {
179 dev_err(component->dev,
180 "Failed to write dac ram (%d)\n", ret);
181 return ret;
185 return 0;
188 static int power_up_audio_plls(struct snd_soc_component *component)
190 struct tscs42xx *tscs42xx = snd_soc_component_get_drvdata(component);
191 int freq_out;
192 int ret;
193 unsigned int mask;
194 unsigned int val;
196 freq_out = sample_rate_to_pll_freq_out(tscs42xx->samplerate);
197 switch (freq_out) {
198 case 122880000: /* 48k */
199 mask = RM_PLLCTL1C_PDB_PLL1;
200 val = RV_PLLCTL1C_PDB_PLL1_ENABLE;
201 break;
202 case 112896000: /* 44.1k */
203 mask = RM_PLLCTL1C_PDB_PLL2;
204 val = RV_PLLCTL1C_PDB_PLL2_ENABLE;
205 break;
206 default:
207 ret = -EINVAL;
208 dev_err(component->dev,
209 "Unrecognized PLL output freq (%d)\n", ret);
210 return ret;
213 mutex_lock(&tscs42xx->pll_lock);
215 ret = snd_soc_component_update_bits(component, R_PLLCTL1C, mask, val);
216 if (ret < 0) {
217 dev_err(component->dev, "Failed to turn PLL on (%d)\n", ret);
218 goto exit;
221 if (!plls_locked(component)) {
222 dev_err(component->dev, "Failed to lock plls\n");
223 ret = -ENOMSG;
224 goto exit;
227 ret = 0;
228 exit:
229 mutex_unlock(&tscs42xx->pll_lock);
231 return ret;
234 static int power_down_audio_plls(struct snd_soc_component *component)
236 struct tscs42xx *tscs42xx = snd_soc_component_get_drvdata(component);
237 int ret;
239 mutex_lock(&tscs42xx->pll_lock);
241 ret = snd_soc_component_update_bits(component, R_PLLCTL1C,
242 RM_PLLCTL1C_PDB_PLL1,
243 RV_PLLCTL1C_PDB_PLL1_DISABLE);
244 if (ret < 0) {
245 dev_err(component->dev, "Failed to turn PLL off (%d)\n", ret);
246 goto exit;
248 ret = snd_soc_component_update_bits(component, R_PLLCTL1C,
249 RM_PLLCTL1C_PDB_PLL2,
250 RV_PLLCTL1C_PDB_PLL2_DISABLE);
251 if (ret < 0) {
252 dev_err(component->dev, "Failed to turn PLL off (%d)\n", ret);
253 goto exit;
256 ret = 0;
257 exit:
258 mutex_unlock(&tscs42xx->pll_lock);
260 return ret;
263 static int coeff_ram_get(struct snd_kcontrol *kcontrol,
264 struct snd_ctl_elem_value *ucontrol)
266 struct snd_soc_component *component =
267 snd_soc_kcontrol_component(kcontrol);
268 struct tscs42xx *tscs42xx = snd_soc_component_get_drvdata(component);
269 struct coeff_ram_ctl *ctl =
270 (struct coeff_ram_ctl *)kcontrol->private_value;
271 struct soc_bytes_ext *params = &ctl->bytes_ext;
273 mutex_lock(&tscs42xx->coeff_ram_lock);
275 memcpy(ucontrol->value.bytes.data,
276 &tscs42xx->coeff_ram[ctl->addr * COEFF_SIZE], params->max);
278 mutex_unlock(&tscs42xx->coeff_ram_lock);
280 return 0;
283 static int coeff_ram_put(struct snd_kcontrol *kcontrol,
284 struct snd_ctl_elem_value *ucontrol)
286 struct snd_soc_component *component =
287 snd_soc_kcontrol_component(kcontrol);
288 struct tscs42xx *tscs42xx = snd_soc_component_get_drvdata(component);
289 struct coeff_ram_ctl *ctl =
290 (struct coeff_ram_ctl *)kcontrol->private_value;
291 struct soc_bytes_ext *params = &ctl->bytes_ext;
292 unsigned int coeff_cnt = params->max / COEFF_SIZE;
293 int ret;
295 mutex_lock(&tscs42xx->coeff_ram_lock);
297 tscs42xx->coeff_ram_synced = false;
299 memcpy(&tscs42xx->coeff_ram[ctl->addr * COEFF_SIZE],
300 ucontrol->value.bytes.data, params->max);
302 mutex_lock(&tscs42xx->pll_lock);
304 if (plls_locked(component)) {
305 ret = write_coeff_ram(component, tscs42xx->coeff_ram,
306 ctl->addr, coeff_cnt);
307 if (ret < 0) {
308 dev_err(component->dev,
309 "Failed to flush coeff ram cache (%d)\n", ret);
310 goto exit;
312 tscs42xx->coeff_ram_synced = true;
315 ret = 0;
316 exit:
317 mutex_unlock(&tscs42xx->pll_lock);
319 mutex_unlock(&tscs42xx->coeff_ram_lock);
321 return ret;
324 /* Input L Capture Route */
325 static char const * const input_select_text[] = {
326 "Line 1", "Line 2", "Line 3", "D2S"
329 static const struct soc_enum left_input_select_enum =
330 SOC_ENUM_SINGLE(R_INSELL, FB_INSELL, ARRAY_SIZE(input_select_text),
331 input_select_text);
333 static const struct snd_kcontrol_new left_input_select =
334 SOC_DAPM_ENUM("LEFT_INPUT_SELECT_ENUM", left_input_select_enum);
336 /* Input R Capture Route */
337 static const struct soc_enum right_input_select_enum =
338 SOC_ENUM_SINGLE(R_INSELR, FB_INSELR, ARRAY_SIZE(input_select_text),
339 input_select_text);
341 static const struct snd_kcontrol_new right_input_select =
342 SOC_DAPM_ENUM("RIGHT_INPUT_SELECT_ENUM", right_input_select_enum);
344 /* Input Channel Mapping */
345 static char const * const ch_map_select_text[] = {
346 "Normal", "Left to Right", "Right to Left", "Swap"
349 static const struct soc_enum ch_map_select_enum =
350 SOC_ENUM_SINGLE(R_AIC2, FB_AIC2_ADCDSEL, ARRAY_SIZE(ch_map_select_text),
351 ch_map_select_text);
353 static int dapm_vref_event(struct snd_soc_dapm_widget *w,
354 struct snd_kcontrol *kcontrol, int event)
356 msleep(20);
357 return 0;
360 static int dapm_micb_event(struct snd_soc_dapm_widget *w,
361 struct snd_kcontrol *kcontrol, int event)
363 msleep(20);
364 return 0;
367 static int pll_event(struct snd_soc_dapm_widget *w,
368 struct snd_kcontrol *kcontrol, int event)
370 struct snd_soc_component *component =
371 snd_soc_dapm_to_component(w->dapm);
372 int ret;
374 if (SND_SOC_DAPM_EVENT_ON(event))
375 ret = power_up_audio_plls(component);
376 else
377 ret = power_down_audio_plls(component);
379 return ret;
382 static int dac_event(struct snd_soc_dapm_widget *w,
383 struct snd_kcontrol *kcontrol, int event)
385 struct snd_soc_component *component =
386 snd_soc_dapm_to_component(w->dapm);
387 struct tscs42xx *tscs42xx = snd_soc_component_get_drvdata(component);
388 int ret;
390 mutex_lock(&tscs42xx->coeff_ram_lock);
392 if (tscs42xx->coeff_ram_synced == false) {
393 ret = write_coeff_ram(component, tscs42xx->coeff_ram, 0x00,
394 COEFF_RAM_COEFF_COUNT);
395 if (ret < 0)
396 goto exit;
397 tscs42xx->coeff_ram_synced = true;
400 ret = 0;
401 exit:
402 mutex_unlock(&tscs42xx->coeff_ram_lock);
404 return ret;
407 static const struct snd_soc_dapm_widget tscs42xx_dapm_widgets[] = {
408 /* Vref */
409 SND_SOC_DAPM_SUPPLY_S("Vref", 1, R_PWRM2, FB_PWRM2_VREF, 0,
410 dapm_vref_event, SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_PRE_PMD),
412 /* PLL */
413 SND_SOC_DAPM_SUPPLY("PLL", SND_SOC_NOPM, 0, 0, pll_event,
414 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
416 /* Headphone */
417 SND_SOC_DAPM_DAC_E("DAC L", "HiFi Playback", R_PWRM2, FB_PWRM2_HPL, 0,
418 dac_event, SND_SOC_DAPM_POST_PMU),
419 SND_SOC_DAPM_DAC_E("DAC R", "HiFi Playback", R_PWRM2, FB_PWRM2_HPR, 0,
420 dac_event, SND_SOC_DAPM_POST_PMU),
421 SND_SOC_DAPM_OUTPUT("Headphone L"),
422 SND_SOC_DAPM_OUTPUT("Headphone R"),
424 /* Speaker */
425 SND_SOC_DAPM_DAC_E("ClassD L", "HiFi Playback",
426 R_PWRM2, FB_PWRM2_SPKL, 0,
427 dac_event, SND_SOC_DAPM_POST_PMU),
428 SND_SOC_DAPM_DAC_E("ClassD R", "HiFi Playback",
429 R_PWRM2, FB_PWRM2_SPKR, 0,
430 dac_event, SND_SOC_DAPM_POST_PMU),
431 SND_SOC_DAPM_OUTPUT("Speaker L"),
432 SND_SOC_DAPM_OUTPUT("Speaker R"),
434 /* Capture */
435 SND_SOC_DAPM_PGA("Analog In PGA L", R_PWRM1, FB_PWRM1_PGAL, 0, NULL, 0),
436 SND_SOC_DAPM_PGA("Analog In PGA R", R_PWRM1, FB_PWRM1_PGAR, 0, NULL, 0),
437 SND_SOC_DAPM_PGA("Analog Boost L", R_PWRM1, FB_PWRM1_BSTL, 0, NULL, 0),
438 SND_SOC_DAPM_PGA("Analog Boost R", R_PWRM1, FB_PWRM1_BSTR, 0, NULL, 0),
439 SND_SOC_DAPM_PGA("ADC Mute", R_CNVRTR0, FB_CNVRTR0_HPOR, true, NULL, 0),
440 SND_SOC_DAPM_ADC("ADC L", "HiFi Capture", R_PWRM1, FB_PWRM1_ADCL, 0),
441 SND_SOC_DAPM_ADC("ADC R", "HiFi Capture", R_PWRM1, FB_PWRM1_ADCR, 0),
443 /* Capture Input */
444 SND_SOC_DAPM_MUX("Input L Capture Route", R_PWRM2,
445 FB_PWRM2_INSELL, 0, &left_input_select),
446 SND_SOC_DAPM_MUX("Input R Capture Route", R_PWRM2,
447 FB_PWRM2_INSELR, 0, &right_input_select),
449 /* Digital Mic */
450 SND_SOC_DAPM_SUPPLY_S("Digital Mic Enable", 2, R_DMICCTL,
451 FB_DMICCTL_DMICEN, 0, NULL,
452 SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_PRE_PMD),
454 /* Analog Mic */
455 SND_SOC_DAPM_SUPPLY_S("Mic Bias", 2, R_PWRM1, FB_PWRM1_MICB,
456 0, dapm_micb_event, SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_PRE_PMD),
458 /* Line In */
459 SND_SOC_DAPM_INPUT("Line In 1 L"),
460 SND_SOC_DAPM_INPUT("Line In 1 R"),
461 SND_SOC_DAPM_INPUT("Line In 2 L"),
462 SND_SOC_DAPM_INPUT("Line In 2 R"),
463 SND_SOC_DAPM_INPUT("Line In 3 L"),
464 SND_SOC_DAPM_INPUT("Line In 3 R"),
467 static const struct snd_soc_dapm_route tscs42xx_intercon[] = {
468 {"DAC L", NULL, "PLL"},
469 {"DAC R", NULL, "PLL"},
470 {"DAC L", NULL, "Vref"},
471 {"DAC R", NULL, "Vref"},
472 {"Headphone L", NULL, "DAC L"},
473 {"Headphone R", NULL, "DAC R"},
475 {"ClassD L", NULL, "PLL"},
476 {"ClassD R", NULL, "PLL"},
477 {"ClassD L", NULL, "Vref"},
478 {"ClassD R", NULL, "Vref"},
479 {"Speaker L", NULL, "ClassD L"},
480 {"Speaker R", NULL, "ClassD R"},
482 {"Input L Capture Route", NULL, "Vref"},
483 {"Input R Capture Route", NULL, "Vref"},
485 {"Mic Bias", NULL, "Vref"},
487 {"Input L Capture Route", "Line 1", "Line In 1 L"},
488 {"Input R Capture Route", "Line 1", "Line In 1 R"},
489 {"Input L Capture Route", "Line 2", "Line In 2 L"},
490 {"Input R Capture Route", "Line 2", "Line In 2 R"},
491 {"Input L Capture Route", "Line 3", "Line In 3 L"},
492 {"Input R Capture Route", "Line 3", "Line In 3 R"},
494 {"Analog In PGA L", NULL, "Input L Capture Route"},
495 {"Analog In PGA R", NULL, "Input R Capture Route"},
496 {"Analog Boost L", NULL, "Analog In PGA L"},
497 {"Analog Boost R", NULL, "Analog In PGA R"},
498 {"ADC Mute", NULL, "Analog Boost L"},
499 {"ADC Mute", NULL, "Analog Boost R"},
500 {"ADC L", NULL, "PLL"},
501 {"ADC R", NULL, "PLL"},
502 {"ADC L", NULL, "ADC Mute"},
503 {"ADC R", NULL, "ADC Mute"},
506 /************
507 * CONTROLS *
508 ************/
510 static char const * const eq_band_enable_text[] = {
511 "Prescale only",
512 "Band1",
513 "Band1:2",
514 "Band1:3",
515 "Band1:4",
516 "Band1:5",
517 "Band1:6",
520 static char const * const level_detection_text[] = {
521 "Average",
522 "Peak",
525 static char const * const level_detection_window_text[] = {
526 "512 Samples",
527 "64 Samples",
530 static char const * const compressor_ratio_text[] = {
531 "Reserved", "1.5:1", "2:1", "3:1", "4:1", "5:1", "6:1",
532 "7:1", "8:1", "9:1", "10:1", "11:1", "12:1", "13:1", "14:1",
533 "15:1", "16:1", "17:1", "18:1", "19:1", "20:1",
536 static DECLARE_TLV_DB_SCALE(hpvol_scale, -8850, 75, 0);
537 static DECLARE_TLV_DB_SCALE(spkvol_scale, -7725, 75, 0);
538 static DECLARE_TLV_DB_SCALE(dacvol_scale, -9563, 38, 0);
539 static DECLARE_TLV_DB_SCALE(adcvol_scale, -7125, 38, 0);
540 static DECLARE_TLV_DB_SCALE(invol_scale, -1725, 75, 0);
541 static DECLARE_TLV_DB_SCALE(mic_boost_scale, 0, 1000, 0);
542 static DECLARE_TLV_DB_MINMAX(mugain_scale, 0, 4650);
543 static DECLARE_TLV_DB_MINMAX(compth_scale, -9562, 0);
545 static const struct soc_enum eq1_band_enable_enum =
546 SOC_ENUM_SINGLE(R_CONFIG1, FB_CONFIG1_EQ1_BE,
547 ARRAY_SIZE(eq_band_enable_text), eq_band_enable_text);
549 static const struct soc_enum eq2_band_enable_enum =
550 SOC_ENUM_SINGLE(R_CONFIG1, FB_CONFIG1_EQ2_BE,
551 ARRAY_SIZE(eq_band_enable_text), eq_band_enable_text);
553 static const struct soc_enum cle_level_detection_enum =
554 SOC_ENUM_SINGLE(R_CLECTL, FB_CLECTL_LVL_MODE,
555 ARRAY_SIZE(level_detection_text),
556 level_detection_text);
558 static const struct soc_enum cle_level_detection_window_enum =
559 SOC_ENUM_SINGLE(R_CLECTL, FB_CLECTL_WINDOWSEL,
560 ARRAY_SIZE(level_detection_window_text),
561 level_detection_window_text);
563 static const struct soc_enum mbc_level_detection_enums[] = {
564 SOC_ENUM_SINGLE(R_DACMBCCTL, FB_DACMBCCTL_LVLMODE1,
565 ARRAY_SIZE(level_detection_text),
566 level_detection_text),
567 SOC_ENUM_SINGLE(R_DACMBCCTL, FB_DACMBCCTL_LVLMODE2,
568 ARRAY_SIZE(level_detection_text),
569 level_detection_text),
570 SOC_ENUM_SINGLE(R_DACMBCCTL, FB_DACMBCCTL_LVLMODE3,
571 ARRAY_SIZE(level_detection_text),
572 level_detection_text),
575 static const struct soc_enum mbc_level_detection_window_enums[] = {
576 SOC_ENUM_SINGLE(R_DACMBCCTL, FB_DACMBCCTL_WINSEL1,
577 ARRAY_SIZE(level_detection_window_text),
578 level_detection_window_text),
579 SOC_ENUM_SINGLE(R_DACMBCCTL, FB_DACMBCCTL_WINSEL2,
580 ARRAY_SIZE(level_detection_window_text),
581 level_detection_window_text),
582 SOC_ENUM_SINGLE(R_DACMBCCTL, FB_DACMBCCTL_WINSEL3,
583 ARRAY_SIZE(level_detection_window_text),
584 level_detection_window_text),
587 static const struct soc_enum compressor_ratio_enum =
588 SOC_ENUM_SINGLE(R_CMPRAT, FB_CMPRAT,
589 ARRAY_SIZE(compressor_ratio_text), compressor_ratio_text);
591 static const struct soc_enum dac_mbc1_compressor_ratio_enum =
592 SOC_ENUM_SINGLE(R_DACMBCRAT1, FB_DACMBCRAT1_RATIO,
593 ARRAY_SIZE(compressor_ratio_text), compressor_ratio_text);
595 static const struct soc_enum dac_mbc2_compressor_ratio_enum =
596 SOC_ENUM_SINGLE(R_DACMBCRAT2, FB_DACMBCRAT2_RATIO,
597 ARRAY_SIZE(compressor_ratio_text), compressor_ratio_text);
599 static const struct soc_enum dac_mbc3_compressor_ratio_enum =
600 SOC_ENUM_SINGLE(R_DACMBCRAT3, FB_DACMBCRAT3_RATIO,
601 ARRAY_SIZE(compressor_ratio_text), compressor_ratio_text);
603 static int bytes_info_ext(struct snd_kcontrol *kcontrol,
604 struct snd_ctl_elem_info *ucontrol)
606 struct coeff_ram_ctl *ctl =
607 (struct coeff_ram_ctl *)kcontrol->private_value;
608 struct soc_bytes_ext *params = &ctl->bytes_ext;
610 ucontrol->type = SNDRV_CTL_ELEM_TYPE_BYTES;
611 ucontrol->count = params->max;
613 return 0;
616 #define COEFF_RAM_CTL(xname, xcount, xaddr) \
617 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
618 .info = bytes_info_ext, \
619 .get = coeff_ram_get, .put = coeff_ram_put, \
620 .private_value = (unsigned long)&(struct coeff_ram_ctl) { \
621 .addr = xaddr, \
622 .bytes_ext = {.max = xcount, }, \
626 static const struct snd_kcontrol_new tscs42xx_snd_controls[] = {
627 /* Volumes */
628 SOC_DOUBLE_R_TLV("Headphone Playback Volume", R_HPVOLL, R_HPVOLR,
629 FB_HPVOLL, 0x7F, 0, hpvol_scale),
630 SOC_DOUBLE_R_TLV("Speaker Playback Volume", R_SPKVOLL, R_SPKVOLR,
631 FB_SPKVOLL, 0x7F, 0, spkvol_scale),
632 SOC_DOUBLE_R_TLV("Master Playback Volume", R_DACVOLL, R_DACVOLR,
633 FB_DACVOLL, 0xFF, 0, dacvol_scale),
634 SOC_DOUBLE_R_TLV("PCM Capture Volume", R_ADCVOLL, R_ADCVOLR,
635 FB_ADCVOLL, 0xFF, 0, adcvol_scale),
636 SOC_DOUBLE_R_TLV("Master Capture Volume", R_INVOLL, R_INVOLR,
637 FB_INVOLL, 0x3F, 0, invol_scale),
639 /* INSEL */
640 SOC_DOUBLE_R_TLV("Mic Boost Capture Volume", R_INSELL, R_INSELR,
641 FB_INSELL_MICBSTL, FV_INSELL_MICBSTL_30DB,
642 0, mic_boost_scale),
644 /* Input Channel Map */
645 SOC_ENUM("Input Channel Map", ch_map_select_enum),
647 /* Coefficient Ram */
648 COEFF_RAM_CTL("Cascade1L BiQuad1", BIQUAD_SIZE, 0x00),
649 COEFF_RAM_CTL("Cascade1L BiQuad2", BIQUAD_SIZE, 0x05),
650 COEFF_RAM_CTL("Cascade1L BiQuad3", BIQUAD_SIZE, 0x0a),
651 COEFF_RAM_CTL("Cascade1L BiQuad4", BIQUAD_SIZE, 0x0f),
652 COEFF_RAM_CTL("Cascade1L BiQuad5", BIQUAD_SIZE, 0x14),
653 COEFF_RAM_CTL("Cascade1L BiQuad6", BIQUAD_SIZE, 0x19),
655 COEFF_RAM_CTL("Cascade1R BiQuad1", BIQUAD_SIZE, 0x20),
656 COEFF_RAM_CTL("Cascade1R BiQuad2", BIQUAD_SIZE, 0x25),
657 COEFF_RAM_CTL("Cascade1R BiQuad3", BIQUAD_SIZE, 0x2a),
658 COEFF_RAM_CTL("Cascade1R BiQuad4", BIQUAD_SIZE, 0x2f),
659 COEFF_RAM_CTL("Cascade1R BiQuad5", BIQUAD_SIZE, 0x34),
660 COEFF_RAM_CTL("Cascade1R BiQuad6", BIQUAD_SIZE, 0x39),
662 COEFF_RAM_CTL("Cascade1L Prescale", COEFF_SIZE, 0x1f),
663 COEFF_RAM_CTL("Cascade1R Prescale", COEFF_SIZE, 0x3f),
665 COEFF_RAM_CTL("Cascade2L BiQuad1", BIQUAD_SIZE, 0x40),
666 COEFF_RAM_CTL("Cascade2L BiQuad2", BIQUAD_SIZE, 0x45),
667 COEFF_RAM_CTL("Cascade2L BiQuad3", BIQUAD_SIZE, 0x4a),
668 COEFF_RAM_CTL("Cascade2L BiQuad4", BIQUAD_SIZE, 0x4f),
669 COEFF_RAM_CTL("Cascade2L BiQuad5", BIQUAD_SIZE, 0x54),
670 COEFF_RAM_CTL("Cascade2L BiQuad6", BIQUAD_SIZE, 0x59),
672 COEFF_RAM_CTL("Cascade2R BiQuad1", BIQUAD_SIZE, 0x60),
673 COEFF_RAM_CTL("Cascade2R BiQuad2", BIQUAD_SIZE, 0x65),
674 COEFF_RAM_CTL("Cascade2R BiQuad3", BIQUAD_SIZE, 0x6a),
675 COEFF_RAM_CTL("Cascade2R BiQuad4", BIQUAD_SIZE, 0x6f),
676 COEFF_RAM_CTL("Cascade2R BiQuad5", BIQUAD_SIZE, 0x74),
677 COEFF_RAM_CTL("Cascade2R BiQuad6", BIQUAD_SIZE, 0x79),
679 COEFF_RAM_CTL("Cascade2L Prescale", COEFF_SIZE, 0x5f),
680 COEFF_RAM_CTL("Cascade2R Prescale", COEFF_SIZE, 0x7f),
682 COEFF_RAM_CTL("Bass Extraction BiQuad1", BIQUAD_SIZE, 0x80),
683 COEFF_RAM_CTL("Bass Extraction BiQuad2", BIQUAD_SIZE, 0x85),
685 COEFF_RAM_CTL("Bass Non Linear Function 1", COEFF_SIZE, 0x8a),
686 COEFF_RAM_CTL("Bass Non Linear Function 2", COEFF_SIZE, 0x8b),
688 COEFF_RAM_CTL("Bass Limiter BiQuad", BIQUAD_SIZE, 0x8c),
690 COEFF_RAM_CTL("Bass Cut Off BiQuad", BIQUAD_SIZE, 0x91),
692 COEFF_RAM_CTL("Bass Mix", COEFF_SIZE, 0x96),
694 COEFF_RAM_CTL("Treb Extraction BiQuad1", BIQUAD_SIZE, 0x97),
695 COEFF_RAM_CTL("Treb Extraction BiQuad2", BIQUAD_SIZE, 0x9c),
697 COEFF_RAM_CTL("Treb Non Linear Function 1", COEFF_SIZE, 0xa1),
698 COEFF_RAM_CTL("Treb Non Linear Function 2", COEFF_SIZE, 0xa2),
700 COEFF_RAM_CTL("Treb Limiter BiQuad", BIQUAD_SIZE, 0xa3),
702 COEFF_RAM_CTL("Treb Cut Off BiQuad", BIQUAD_SIZE, 0xa8),
704 COEFF_RAM_CTL("Treb Mix", COEFF_SIZE, 0xad),
706 COEFF_RAM_CTL("3D", COEFF_SIZE, 0xae),
708 COEFF_RAM_CTL("3D Mix", COEFF_SIZE, 0xaf),
710 COEFF_RAM_CTL("MBC1 BiQuad1", BIQUAD_SIZE, 0xb0),
711 COEFF_RAM_CTL("MBC1 BiQuad2", BIQUAD_SIZE, 0xb5),
713 COEFF_RAM_CTL("MBC2 BiQuad1", BIQUAD_SIZE, 0xba),
714 COEFF_RAM_CTL("MBC2 BiQuad2", BIQUAD_SIZE, 0xbf),
716 COEFF_RAM_CTL("MBC3 BiQuad1", BIQUAD_SIZE, 0xc4),
717 COEFF_RAM_CTL("MBC3 BiQuad2", BIQUAD_SIZE, 0xc9),
719 /* EQ */
720 SOC_SINGLE("EQ1 Switch", R_CONFIG1, FB_CONFIG1_EQ1_EN, 1, 0),
721 SOC_SINGLE("EQ2 Switch", R_CONFIG1, FB_CONFIG1_EQ2_EN, 1, 0),
722 SOC_ENUM("EQ1 Band Enable", eq1_band_enable_enum),
723 SOC_ENUM("EQ2 Band Enable", eq2_band_enable_enum),
725 /* CLE */
726 SOC_ENUM("CLE Level Detect",
727 cle_level_detection_enum),
728 SOC_ENUM("CLE Level Detect Win",
729 cle_level_detection_window_enum),
730 SOC_SINGLE("Expander Switch",
731 R_CLECTL, FB_CLECTL_EXP_EN, 1, 0),
732 SOC_SINGLE("Limiter Switch",
733 R_CLECTL, FB_CLECTL_LIMIT_EN, 1, 0),
734 SOC_SINGLE("Comp Switch",
735 R_CLECTL, FB_CLECTL_COMP_EN, 1, 0),
736 SOC_SINGLE_TLV("CLE Make-Up Gain Playback Volume",
737 R_MUGAIN, FB_MUGAIN_CLEMUG, 0x1f, 0, mugain_scale),
738 SOC_SINGLE_TLV("Comp Thresh Playback Volume",
739 R_COMPTH, FB_COMPTH, 0xff, 0, compth_scale),
740 SOC_ENUM("Comp Ratio", compressor_ratio_enum),
741 SND_SOC_BYTES("Comp Atk Time", R_CATKTCL, 2),
743 /* Effects */
744 SOC_SINGLE("3D Switch", R_FXCTL, FB_FXCTL_3DEN, 1, 0),
745 SOC_SINGLE("Treble Switch", R_FXCTL, FB_FXCTL_TEEN, 1, 0),
746 SOC_SINGLE("Treble Bypass Switch", R_FXCTL, FB_FXCTL_TNLFBYPASS, 1, 0),
747 SOC_SINGLE("Bass Switch", R_FXCTL, FB_FXCTL_BEEN, 1, 0),
748 SOC_SINGLE("Bass Bypass Switch", R_FXCTL, FB_FXCTL_BNLFBYPASS, 1, 0),
750 /* MBC */
751 SOC_SINGLE("MBC Band1 Switch", R_DACMBCEN, FB_DACMBCEN_MBCEN1, 1, 0),
752 SOC_SINGLE("MBC Band2 Switch", R_DACMBCEN, FB_DACMBCEN_MBCEN2, 1, 0),
753 SOC_SINGLE("MBC Band3 Switch", R_DACMBCEN, FB_DACMBCEN_MBCEN3, 1, 0),
754 SOC_ENUM("MBC Band1 Level Detect",
755 mbc_level_detection_enums[0]),
756 SOC_ENUM("MBC Band2 Level Detect",
757 mbc_level_detection_enums[1]),
758 SOC_ENUM("MBC Band3 Level Detect",
759 mbc_level_detection_enums[2]),
760 SOC_ENUM("MBC Band1 Level Detect Win",
761 mbc_level_detection_window_enums[0]),
762 SOC_ENUM("MBC Band2 Level Detect Win",
763 mbc_level_detection_window_enums[1]),
764 SOC_ENUM("MBC Band3 Level Detect Win",
765 mbc_level_detection_window_enums[2]),
767 SOC_SINGLE("MBC1 Phase Invert Switch",
768 R_DACMBCMUG1, FB_DACMBCMUG1_PHASE, 1, 0),
769 SOC_SINGLE_TLV("DAC MBC1 Make-Up Gain Playback Volume",
770 R_DACMBCMUG1, FB_DACMBCMUG1_MUGAIN, 0x1f, 0, mugain_scale),
771 SOC_SINGLE_TLV("DAC MBC1 Comp Thresh Playback Volume",
772 R_DACMBCTHR1, FB_DACMBCTHR1_THRESH, 0xff, 0, compth_scale),
773 SOC_ENUM("DAC MBC1 Comp Ratio",
774 dac_mbc1_compressor_ratio_enum),
775 SND_SOC_BYTES("DAC MBC1 Comp Atk Time", R_DACMBCATK1L, 2),
776 SND_SOC_BYTES("DAC MBC1 Comp Rel Time Const",
777 R_DACMBCREL1L, 2),
779 SOC_SINGLE("MBC2 Phase Invert Switch",
780 R_DACMBCMUG2, FB_DACMBCMUG2_PHASE, 1, 0),
781 SOC_SINGLE_TLV("DAC MBC2 Make-Up Gain Playback Volume",
782 R_DACMBCMUG2, FB_DACMBCMUG2_MUGAIN, 0x1f, 0, mugain_scale),
783 SOC_SINGLE_TLV("DAC MBC2 Comp Thresh Playback Volume",
784 R_DACMBCTHR2, FB_DACMBCTHR2_THRESH, 0xff, 0, compth_scale),
785 SOC_ENUM("DAC MBC2 Comp Ratio",
786 dac_mbc2_compressor_ratio_enum),
787 SND_SOC_BYTES("DAC MBC2 Comp Atk Time", R_DACMBCATK2L, 2),
788 SND_SOC_BYTES("DAC MBC2 Comp Rel Time Const",
789 R_DACMBCREL2L, 2),
791 SOC_SINGLE("MBC3 Phase Invert Switch",
792 R_DACMBCMUG3, FB_DACMBCMUG3_PHASE, 1, 0),
793 SOC_SINGLE_TLV("DAC MBC3 Make-Up Gain Playback Volume",
794 R_DACMBCMUG3, FB_DACMBCMUG3_MUGAIN, 0x1f, 0, mugain_scale),
795 SOC_SINGLE_TLV("DAC MBC3 Comp Thresh Playback Volume",
796 R_DACMBCTHR3, FB_DACMBCTHR3_THRESH, 0xff, 0, compth_scale),
797 SOC_ENUM("DAC MBC3 Comp Ratio",
798 dac_mbc3_compressor_ratio_enum),
799 SND_SOC_BYTES("DAC MBC3 Comp Atk Time", R_DACMBCATK3L, 2),
800 SND_SOC_BYTES("DAC MBC3 Comp Rel Time Const",
801 R_DACMBCREL3L, 2),
804 static int setup_sample_format(struct snd_soc_component *component,
805 snd_pcm_format_t format)
807 unsigned int width;
808 int ret;
810 switch (format) {
811 case SNDRV_PCM_FORMAT_S16_LE:
812 width = RV_AIC1_WL_16;
813 break;
814 case SNDRV_PCM_FORMAT_S20_3LE:
815 width = RV_AIC1_WL_20;
816 break;
817 case SNDRV_PCM_FORMAT_S24_LE:
818 width = RV_AIC1_WL_24;
819 break;
820 case SNDRV_PCM_FORMAT_S32_LE:
821 width = RV_AIC1_WL_32;
822 break;
823 default:
824 ret = -EINVAL;
825 dev_err(component->dev, "Unsupported format width (%d)\n", ret);
826 return ret;
828 ret = snd_soc_component_update_bits(component,
829 R_AIC1, RM_AIC1_WL, width);
830 if (ret < 0) {
831 dev_err(component->dev,
832 "Failed to set sample width (%d)\n", ret);
833 return ret;
836 return 0;
839 static int setup_sample_rate(struct snd_soc_component *component,
840 unsigned int rate)
842 struct tscs42xx *tscs42xx = snd_soc_component_get_drvdata(component);
843 unsigned int br, bm;
844 int ret;
846 switch (rate) {
847 case 8000:
848 br = RV_DACSR_DBR_32;
849 bm = RV_DACSR_DBM_PT25;
850 break;
851 case 16000:
852 br = RV_DACSR_DBR_32;
853 bm = RV_DACSR_DBM_PT5;
854 break;
855 case 24000:
856 br = RV_DACSR_DBR_48;
857 bm = RV_DACSR_DBM_PT5;
858 break;
859 case 32000:
860 br = RV_DACSR_DBR_32;
861 bm = RV_DACSR_DBM_1;
862 break;
863 case 48000:
864 br = RV_DACSR_DBR_48;
865 bm = RV_DACSR_DBM_1;
866 break;
867 case 96000:
868 br = RV_DACSR_DBR_48;
869 bm = RV_DACSR_DBM_2;
870 break;
871 case 11025:
872 br = RV_DACSR_DBR_44_1;
873 bm = RV_DACSR_DBM_PT25;
874 break;
875 case 22050:
876 br = RV_DACSR_DBR_44_1;
877 bm = RV_DACSR_DBM_PT5;
878 break;
879 case 44100:
880 br = RV_DACSR_DBR_44_1;
881 bm = RV_DACSR_DBM_1;
882 break;
883 case 88200:
884 br = RV_DACSR_DBR_44_1;
885 bm = RV_DACSR_DBM_2;
886 break;
887 default:
888 dev_err(component->dev, "Unsupported sample rate %d\n", rate);
889 return -EINVAL;
892 /* DAC and ADC share bit and frame clock */
893 ret = snd_soc_component_update_bits(component,
894 R_DACSR, RM_DACSR_DBR, br);
895 if (ret < 0) {
896 dev_err(component->dev,
897 "Failed to update register (%d)\n", ret);
898 return ret;
900 ret = snd_soc_component_update_bits(component,
901 R_DACSR, RM_DACSR_DBM, bm);
902 if (ret < 0) {
903 dev_err(component->dev,
904 "Failed to update register (%d)\n", ret);
905 return ret;
907 ret = snd_soc_component_update_bits(component,
908 R_ADCSR, RM_DACSR_DBR, br);
909 if (ret < 0) {
910 dev_err(component->dev,
911 "Failed to update register (%d)\n", ret);
912 return ret;
914 ret = snd_soc_component_update_bits(component,
915 R_ADCSR, RM_DACSR_DBM, bm);
916 if (ret < 0) {
917 dev_err(component->dev,
918 "Failed to update register (%d)\n", ret);
919 return ret;
922 mutex_lock(&tscs42xx->audio_params_lock);
924 tscs42xx->samplerate = rate;
926 mutex_unlock(&tscs42xx->audio_params_lock);
928 return 0;
931 struct reg_setting {
932 unsigned int addr;
933 unsigned int val;
934 unsigned int mask;
937 #define PLL_REG_SETTINGS_COUNT 13
938 struct pll_ctl {
939 int input_freq;
940 struct reg_setting settings[PLL_REG_SETTINGS_COUNT];
943 #define PLL_CTL(f, rt, rd, r1b_l, r9, ra, rb, \
944 rc, r12, r1b_h, re, rf, r10, r11) \
946 .input_freq = f, \
947 .settings = { \
948 {R_TIMEBASE, rt, 0xFF}, \
949 {R_PLLCTLD, rd, 0xFF}, \
950 {R_PLLCTL1B, r1b_l, 0x0F}, \
951 {R_PLLCTL9, r9, 0xFF}, \
952 {R_PLLCTLA, ra, 0xFF}, \
953 {R_PLLCTLB, rb, 0xFF}, \
954 {R_PLLCTLC, rc, 0xFF}, \
955 {R_PLLCTL12, r12, 0xFF}, \
956 {R_PLLCTL1B, r1b_h, 0xF0}, \
957 {R_PLLCTLE, re, 0xFF}, \
958 {R_PLLCTLF, rf, 0xFF}, \
959 {R_PLLCTL10, r10, 0xFF}, \
960 {R_PLLCTL11, r11, 0xFF}, \
961 }, \
964 static const struct pll_ctl pll_ctls[] = {
965 PLL_CTL(1411200, 0x05,
966 0x39, 0x04, 0x07, 0x02, 0xC3, 0x04,
967 0x1B, 0x10, 0x03, 0x03, 0xD0, 0x02),
968 PLL_CTL(1536000, 0x05,
969 0x1A, 0x04, 0x02, 0x03, 0xE0, 0x01,
970 0x1A, 0x10, 0x02, 0x03, 0xB9, 0x01),
971 PLL_CTL(2822400, 0x0A,
972 0x23, 0x04, 0x07, 0x04, 0xC3, 0x04,
973 0x22, 0x10, 0x05, 0x03, 0x58, 0x02),
974 PLL_CTL(3072000, 0x0B,
975 0x22, 0x04, 0x07, 0x03, 0x48, 0x03,
976 0x1A, 0x10, 0x04, 0x03, 0xB9, 0x01),
977 PLL_CTL(5644800, 0x15,
978 0x23, 0x04, 0x0E, 0x04, 0xC3, 0x04,
979 0x1A, 0x10, 0x08, 0x03, 0xE0, 0x01),
980 PLL_CTL(6144000, 0x17,
981 0x1A, 0x04, 0x08, 0x03, 0xE0, 0x01,
982 0x1A, 0x10, 0x08, 0x03, 0xB9, 0x01),
983 PLL_CTL(12000000, 0x2E,
984 0x1B, 0x04, 0x19, 0x03, 0x00, 0x03,
985 0x2A, 0x10, 0x19, 0x05, 0x98, 0x04),
986 PLL_CTL(19200000, 0x4A,
987 0x13, 0x04, 0x14, 0x03, 0x80, 0x01,
988 0x1A, 0x10, 0x19, 0x03, 0xB9, 0x01),
989 PLL_CTL(22000000, 0x55,
990 0x2A, 0x04, 0x37, 0x05, 0x00, 0x06,
991 0x22, 0x10, 0x26, 0x03, 0x49, 0x02),
992 PLL_CTL(22579200, 0x57,
993 0x22, 0x04, 0x31, 0x03, 0x20, 0x03,
994 0x1A, 0x10, 0x1D, 0x03, 0xB3, 0x01),
995 PLL_CTL(24000000, 0x5D,
996 0x13, 0x04, 0x19, 0x03, 0x80, 0x01,
997 0x1B, 0x10, 0x19, 0x05, 0x4C, 0x02),
998 PLL_CTL(24576000, 0x5F,
999 0x13, 0x04, 0x1D, 0x03, 0xB3, 0x01,
1000 0x22, 0x10, 0x40, 0x03, 0x72, 0x03),
1001 PLL_CTL(27000000, 0x68,
1002 0x22, 0x04, 0x4B, 0x03, 0x00, 0x04,
1003 0x2A, 0x10, 0x7D, 0x03, 0x20, 0x06),
1004 PLL_CTL(36000000, 0x8C,
1005 0x1B, 0x04, 0x4B, 0x03, 0x00, 0x03,
1006 0x2A, 0x10, 0x7D, 0x03, 0x98, 0x04),
1007 PLL_CTL(25000000, 0x61,
1008 0x1B, 0x04, 0x37, 0x03, 0x2B, 0x03,
1009 0x1A, 0x10, 0x2A, 0x03, 0x39, 0x02),
1010 PLL_CTL(26000000, 0x65,
1011 0x23, 0x04, 0x41, 0x05, 0x00, 0x06,
1012 0x1A, 0x10, 0x26, 0x03, 0xEF, 0x01),
1013 PLL_CTL(12288000, 0x2F,
1014 0x1A, 0x04, 0x12, 0x03, 0x1C, 0x02,
1015 0x22, 0x10, 0x20, 0x03, 0x72, 0x03),
1016 PLL_CTL(40000000, 0x9B,
1017 0x22, 0x08, 0x7D, 0x03, 0x80, 0x04,
1018 0x23, 0x10, 0x7D, 0x05, 0xE4, 0x06),
1019 PLL_CTL(512000, 0x01,
1020 0x22, 0x04, 0x01, 0x03, 0xD0, 0x02,
1021 0x1B, 0x10, 0x01, 0x04, 0x72, 0x03),
1022 PLL_CTL(705600, 0x02,
1023 0x22, 0x04, 0x02, 0x03, 0x15, 0x04,
1024 0x22, 0x10, 0x01, 0x04, 0x80, 0x02),
1025 PLL_CTL(1024000, 0x03,
1026 0x22, 0x04, 0x02, 0x03, 0xD0, 0x02,
1027 0x1B, 0x10, 0x02, 0x04, 0x72, 0x03),
1028 PLL_CTL(2048000, 0x07,
1029 0x22, 0x04, 0x04, 0x03, 0xD0, 0x02,
1030 0x1B, 0x10, 0x04, 0x04, 0x72, 0x03),
1031 PLL_CTL(2400000, 0x08,
1032 0x22, 0x04, 0x05, 0x03, 0x00, 0x03,
1033 0x23, 0x10, 0x05, 0x05, 0x98, 0x04),
1036 static const struct pll_ctl *get_pll_ctl(int input_freq)
1038 int i;
1039 const struct pll_ctl *pll_ctl = NULL;
1041 for (i = 0; i < ARRAY_SIZE(pll_ctls); ++i)
1042 if (input_freq == pll_ctls[i].input_freq) {
1043 pll_ctl = &pll_ctls[i];
1044 break;
1047 return pll_ctl;
1050 static int set_pll_ctl_from_input_freq(struct snd_soc_component *component,
1051 const int input_freq)
1053 int ret;
1054 int i;
1055 const struct pll_ctl *pll_ctl;
1057 pll_ctl = get_pll_ctl(input_freq);
1058 if (!pll_ctl) {
1059 ret = -EINVAL;
1060 dev_err(component->dev, "No PLL input entry for %d (%d)\n",
1061 input_freq, ret);
1062 return ret;
1065 for (i = 0; i < PLL_REG_SETTINGS_COUNT; ++i) {
1066 ret = snd_soc_component_update_bits(component,
1067 pll_ctl->settings[i].addr,
1068 pll_ctl->settings[i].mask,
1069 pll_ctl->settings[i].val);
1070 if (ret < 0) {
1071 dev_err(component->dev, "Failed to set pll ctl (%d)\n",
1072 ret);
1073 return ret;
1077 return 0;
1080 static int tscs42xx_hw_params(struct snd_pcm_substream *substream,
1081 struct snd_pcm_hw_params *params,
1082 struct snd_soc_dai *codec_dai)
1084 struct snd_soc_component *component = codec_dai->component;
1085 int ret;
1087 ret = setup_sample_format(component, params_format(params));
1088 if (ret < 0) {
1089 dev_err(component->dev, "Failed to setup sample format (%d)\n",
1090 ret);
1091 return ret;
1094 ret = setup_sample_rate(component, params_rate(params));
1095 if (ret < 0) {
1096 dev_err(component->dev,
1097 "Failed to setup sample rate (%d)\n", ret);
1098 return ret;
1101 return 0;
1104 static inline int dac_mute(struct snd_soc_component *component)
1106 int ret;
1108 ret = snd_soc_component_update_bits(component,
1109 R_CNVRTR1, RM_CNVRTR1_DACMU,
1110 RV_CNVRTR1_DACMU_ENABLE);
1111 if (ret < 0) {
1112 dev_err(component->dev, "Failed to mute DAC (%d)\n",
1113 ret);
1114 return ret;
1117 return 0;
1120 static inline int dac_unmute(struct snd_soc_component *component)
1122 int ret;
1124 ret = snd_soc_component_update_bits(component,
1125 R_CNVRTR1, RM_CNVRTR1_DACMU,
1126 RV_CNVRTR1_DACMU_DISABLE);
1127 if (ret < 0) {
1128 dev_err(component->dev, "Failed to unmute DAC (%d)\n",
1129 ret);
1130 return ret;
1133 return 0;
1136 static inline int adc_mute(struct snd_soc_component *component)
1138 int ret;
1140 ret = snd_soc_component_update_bits(component,
1141 R_CNVRTR0, RM_CNVRTR0_ADCMU, RV_CNVRTR0_ADCMU_ENABLE);
1142 if (ret < 0) {
1143 dev_err(component->dev, "Failed to mute ADC (%d)\n",
1144 ret);
1145 return ret;
1148 return 0;
1151 static inline int adc_unmute(struct snd_soc_component *component)
1153 int ret;
1155 ret = snd_soc_component_update_bits(component,
1156 R_CNVRTR0, RM_CNVRTR0_ADCMU, RV_CNVRTR0_ADCMU_DISABLE);
1157 if (ret < 0) {
1158 dev_err(component->dev, "Failed to unmute ADC (%d)\n",
1159 ret);
1160 return ret;
1163 return 0;
1166 static int tscs42xx_mute_stream(struct snd_soc_dai *dai, int mute, int stream)
1168 struct snd_soc_component *component = dai->component;
1169 int ret;
1171 if (mute)
1172 if (stream == SNDRV_PCM_STREAM_PLAYBACK)
1173 ret = dac_mute(component);
1174 else
1175 ret = adc_mute(component);
1176 else
1177 if (stream == SNDRV_PCM_STREAM_PLAYBACK)
1178 ret = dac_unmute(component);
1179 else
1180 ret = adc_unmute(component);
1182 return ret;
1185 static int tscs42xx_set_dai_fmt(struct snd_soc_dai *codec_dai,
1186 unsigned int fmt)
1188 struct snd_soc_component *component = codec_dai->component;
1189 int ret;
1191 /* Slave mode not supported since it needs always-on frame clock */
1192 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1193 case SND_SOC_DAIFMT_CBM_CFM:
1194 ret = snd_soc_component_update_bits(component,
1195 R_AIC1, RM_AIC1_MS, RV_AIC1_MS_MASTER);
1196 if (ret < 0) {
1197 dev_err(component->dev,
1198 "Failed to set codec DAI master (%d)\n", ret);
1199 return ret;
1201 break;
1202 default:
1203 ret = -EINVAL;
1204 dev_err(component->dev, "Unsupported format (%d)\n", ret);
1205 return ret;
1208 return 0;
1211 static int tscs42xx_set_dai_bclk_ratio(struct snd_soc_dai *codec_dai,
1212 unsigned int ratio)
1214 struct snd_soc_component *component = codec_dai->component;
1215 struct tscs42xx *tscs42xx = snd_soc_component_get_drvdata(component);
1216 unsigned int value;
1217 int ret = 0;
1219 switch (ratio) {
1220 case 32:
1221 value = RV_DACSR_DBCM_32;
1222 break;
1223 case 40:
1224 value = RV_DACSR_DBCM_40;
1225 break;
1226 case 64:
1227 value = RV_DACSR_DBCM_64;
1228 break;
1229 default:
1230 dev_err(component->dev, "Unsupported bclk ratio (%d)\n", ret);
1231 return -EINVAL;
1234 ret = snd_soc_component_update_bits(component,
1235 R_DACSR, RM_DACSR_DBCM, value);
1236 if (ret < 0) {
1237 dev_err(component->dev,
1238 "Failed to set DAC BCLK ratio (%d)\n", ret);
1239 return ret;
1241 ret = snd_soc_component_update_bits(component,
1242 R_ADCSR, RM_ADCSR_ABCM, value);
1243 if (ret < 0) {
1244 dev_err(component->dev,
1245 "Failed to set ADC BCLK ratio (%d)\n", ret);
1246 return ret;
1249 mutex_lock(&tscs42xx->audio_params_lock);
1251 tscs42xx->bclk_ratio = ratio;
1253 mutex_unlock(&tscs42xx->audio_params_lock);
1255 return 0;
1258 static const struct snd_soc_dai_ops tscs42xx_dai_ops = {
1259 .hw_params = tscs42xx_hw_params,
1260 .mute_stream = tscs42xx_mute_stream,
1261 .set_fmt = tscs42xx_set_dai_fmt,
1262 .set_bclk_ratio = tscs42xx_set_dai_bclk_ratio,
1265 static int part_is_valid(struct tscs42xx *tscs42xx)
1267 int val;
1268 int ret;
1269 unsigned int reg;
1271 ret = regmap_read(tscs42xx->regmap, R_DEVIDH, &reg);
1272 if (ret < 0)
1273 return ret;
1275 val = reg << 8;
1276 ret = regmap_read(tscs42xx->regmap, R_DEVIDL, &reg);
1277 if (ret < 0)
1278 return ret;
1280 val |= reg;
1282 switch (val) {
1283 case 0x4A74:
1284 case 0x4A73:
1285 return true;
1286 default:
1287 return false;
1291 static int set_sysclk(struct snd_soc_component *component)
1293 struct tscs42xx *tscs42xx = snd_soc_component_get_drvdata(component);
1294 unsigned long freq;
1295 int ret;
1297 switch (tscs42xx->sysclk_src_id) {
1298 case TSCS42XX_PLL_SRC_XTAL:
1299 case TSCS42XX_PLL_SRC_MCLK1:
1300 ret = snd_soc_component_write(component, R_PLLREFSEL,
1301 RV_PLLREFSEL_PLL1_REF_SEL_XTAL_MCLK1 |
1302 RV_PLLREFSEL_PLL2_REF_SEL_XTAL_MCLK1);
1303 if (ret < 0) {
1304 dev_err(component->dev,
1305 "Failed to set pll reference input (%d)\n",
1306 ret);
1307 return ret;
1309 break;
1310 case TSCS42XX_PLL_SRC_MCLK2:
1311 ret = snd_soc_component_write(component, R_PLLREFSEL,
1312 RV_PLLREFSEL_PLL1_REF_SEL_MCLK2 |
1313 RV_PLLREFSEL_PLL2_REF_SEL_MCLK2);
1314 if (ret < 0) {
1315 dev_err(component->dev,
1316 "Failed to set PLL reference (%d)\n", ret);
1317 return ret;
1319 break;
1320 default:
1321 dev_err(component->dev, "pll src is unsupported\n");
1322 return -EINVAL;
1325 freq = clk_get_rate(tscs42xx->sysclk);
1326 ret = set_pll_ctl_from_input_freq(component, freq);
1327 if (ret < 0) {
1328 dev_err(component->dev,
1329 "Failed to setup PLL input freq (%d)\n", ret);
1330 return ret;
1333 return 0;
1336 static int tscs42xx_probe(struct snd_soc_component *component)
1338 return set_sysclk(component);
1341 static const struct snd_soc_component_driver soc_codec_dev_tscs42xx = {
1342 .probe = tscs42xx_probe,
1343 .dapm_widgets = tscs42xx_dapm_widgets,
1344 .num_dapm_widgets = ARRAY_SIZE(tscs42xx_dapm_widgets),
1345 .dapm_routes = tscs42xx_intercon,
1346 .num_dapm_routes = ARRAY_SIZE(tscs42xx_intercon),
1347 .controls = tscs42xx_snd_controls,
1348 .num_controls = ARRAY_SIZE(tscs42xx_snd_controls),
1349 .idle_bias_on = 1,
1350 .use_pmdown_time = 1,
1351 .endianness = 1,
1352 .non_legacy_dai_naming = 1,
1355 static inline void init_coeff_ram_cache(struct tscs42xx *tscs42xx)
1357 static const u8 norm_addrs[] = {
1358 0x00, 0x05, 0x0a, 0x0f, 0x14, 0x19, 0x1f, 0x20, 0x25, 0x2a,
1359 0x2f, 0x34, 0x39, 0x3f, 0x40, 0x45, 0x4a, 0x4f, 0x54, 0x59,
1360 0x5f, 0x60, 0x65, 0x6a, 0x6f, 0x74, 0x79, 0x7f, 0x80, 0x85,
1361 0x8c, 0x91, 0x96, 0x97, 0x9c, 0xa3, 0xa8, 0xad, 0xaf, 0xb0,
1362 0xb5, 0xba, 0xbf, 0xc4, 0xc9,
1364 u8 *coeff_ram = tscs42xx->coeff_ram;
1365 int i;
1367 for (i = 0; i < ARRAY_SIZE(norm_addrs); i++)
1368 coeff_ram[((norm_addrs[i] + 1) * COEFF_SIZE) - 1] = 0x40;
1371 #define TSCS42XX_RATES SNDRV_PCM_RATE_8000_96000
1373 #define TSCS42XX_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE \
1374 | SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
1376 static struct snd_soc_dai_driver tscs42xx_dai = {
1377 .name = "tscs42xx-HiFi",
1378 .playback = {
1379 .stream_name = "HiFi Playback",
1380 .channels_min = 2,
1381 .channels_max = 2,
1382 .rates = TSCS42XX_RATES,
1383 .formats = TSCS42XX_FORMATS,},
1384 .capture = {
1385 .stream_name = "HiFi Capture",
1386 .channels_min = 2,
1387 .channels_max = 2,
1388 .rates = TSCS42XX_RATES,
1389 .formats = TSCS42XX_FORMATS,},
1390 .ops = &tscs42xx_dai_ops,
1391 .symmetric_rates = 1,
1392 .symmetric_channels = 1,
1393 .symmetric_samplebits = 1,
1396 static const struct reg_sequence tscs42xx_patch[] = {
1397 { R_AIC2, RV_AIC2_BLRCM_DAC_BCLK_LRCLK_SHARED },
1400 static char const * const src_names[TSCS42XX_PLL_SRC_CNT] = {
1401 "xtal", "mclk1", "mclk2"};
1403 static int tscs42xx_i2c_probe(struct i2c_client *i2c,
1404 const struct i2c_device_id *id)
1406 struct tscs42xx *tscs42xx;
1407 int src;
1408 int ret;
1410 tscs42xx = devm_kzalloc(&i2c->dev, sizeof(*tscs42xx), GFP_KERNEL);
1411 if (!tscs42xx) {
1412 ret = -ENOMEM;
1413 dev_err(&i2c->dev,
1414 "Failed to allocate memory for data (%d)\n", ret);
1415 return ret;
1417 i2c_set_clientdata(i2c, tscs42xx);
1419 for (src = TSCS42XX_PLL_SRC_XTAL; src < TSCS42XX_PLL_SRC_CNT; src++) {
1420 tscs42xx->sysclk = devm_clk_get(&i2c->dev, src_names[src]);
1421 if (!IS_ERR(tscs42xx->sysclk)) {
1422 break;
1423 } else if (PTR_ERR(tscs42xx->sysclk) != -ENOENT) {
1424 ret = PTR_ERR(tscs42xx->sysclk);
1425 dev_err(&i2c->dev, "Failed to get sysclk (%d)\n", ret);
1426 return ret;
1429 if (src == TSCS42XX_PLL_SRC_CNT) {
1430 ret = -EINVAL;
1431 dev_err(&i2c->dev, "Failed to get a valid clock name (%d)\n",
1432 ret);
1433 return ret;
1435 tscs42xx->sysclk_src_id = src;
1437 tscs42xx->regmap = devm_regmap_init_i2c(i2c, &tscs42xx_regmap);
1438 if (IS_ERR(tscs42xx->regmap)) {
1439 ret = PTR_ERR(tscs42xx->regmap);
1440 dev_err(&i2c->dev, "Failed to allocate regmap (%d)\n", ret);
1441 return ret;
1444 init_coeff_ram_cache(tscs42xx);
1446 ret = part_is_valid(tscs42xx);
1447 if (ret <= 0) {
1448 dev_err(&i2c->dev, "No valid part (%d)\n", ret);
1449 ret = -ENODEV;
1450 return ret;
1453 ret = regmap_write(tscs42xx->regmap, R_RESET, RV_RESET_ENABLE);
1454 if (ret < 0) {
1455 dev_err(&i2c->dev, "Failed to reset device (%d)\n", ret);
1456 return ret;
1459 ret = regmap_register_patch(tscs42xx->regmap, tscs42xx_patch,
1460 ARRAY_SIZE(tscs42xx_patch));
1461 if (ret < 0) {
1462 dev_err(&i2c->dev, "Failed to apply patch (%d)\n", ret);
1463 return ret;
1466 mutex_init(&tscs42xx->audio_params_lock);
1467 mutex_init(&tscs42xx->coeff_ram_lock);
1468 mutex_init(&tscs42xx->pll_lock);
1470 ret = devm_snd_soc_register_component(&i2c->dev,
1471 &soc_codec_dev_tscs42xx, &tscs42xx_dai, 1);
1472 if (ret) {
1473 dev_err(&i2c->dev, "Failed to register codec (%d)\n", ret);
1474 return ret;
1477 return 0;
1480 static const struct i2c_device_id tscs42xx_i2c_id[] = {
1481 { "tscs42A1", 0 },
1482 { "tscs42A2", 0 },
1485 MODULE_DEVICE_TABLE(i2c, tscs42xx_i2c_id);
1487 static const struct of_device_id tscs42xx_of_match[] = {
1488 { .compatible = "tempo,tscs42A1", },
1489 { .compatible = "tempo,tscs42A2", },
1492 MODULE_DEVICE_TABLE(of, tscs42xx_of_match);
1494 static struct i2c_driver tscs42xx_i2c_driver = {
1495 .driver = {
1496 .name = "tscs42xx",
1497 .of_match_table = tscs42xx_of_match,
1499 .probe = tscs42xx_i2c_probe,
1500 .id_table = tscs42xx_i2c_id,
1503 module_i2c_driver(tscs42xx_i2c_driver);
1505 MODULE_AUTHOR("Tempo Semiconductor <steven.eckhoff.opensource@gmail.com");
1506 MODULE_DESCRIPTION("ASoC TSCS42xx driver");
1507 MODULE_LICENSE("GPL");