~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/sound/soc/codecs/rt715.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0
  2 /*
  3  * rt715.c -- rt715 ALSA SoC audio driver
  4  *
  5  * Copyright(c) 2019 Realtek Semiconductor Corp.
  6  *
  7  * ALC715 ASoC Codec Driver based Intel Dummy SdW codec driver
  8  *
  9  */
 10 
 11 #include <linux/module.h>
 12 #include <linux/kernel.h>
 13 #include <linux/init.h>
 14 #include <linux/delay.h>
 15 #include <linux/i2c.h>
 16 #include <linux/pm_runtime.h>
 17 #include <linux/pm.h>
 18 #include <linux/soundwire/sdw.h>
 19 #include <linux/regmap.h>
 20 #include <linux/slab.h>
 21 #include <linux/platform_device.h>
 22 #include <linux/regulator/consumer.h>
 23 #include <sound/core.h>
 24 #include <sound/pcm.h>
 25 #include <sound/pcm_params.h>
 26 #include <sound/sdw.h>
 27 #include <sound/soc.h>
 28 #include <sound/soc-dapm.h>
 29 #include <sound/initval.h>
 30 #include <sound/tlv.h>
 31 #include <sound/hda_verbs.h>
 32 
 33 #include "rt715.h"
 34 
 35 static int rt715_index_write(struct regmap *regmap, unsigned int reg,
 36                 unsigned int value)
 37 {
 38         int ret;
 39         unsigned int addr = ((RT715_PRIV_INDEX_W_H) << 8) | reg;
 40 
 41         ret = regmap_write(regmap, addr, value);
 42         if (ret < 0) {
 43                 pr_err("%s: Failed to set private value: %08x <= %04x %d\n",
 44                        __func__, addr, value, ret);
 45         }
 46 
 47         return ret;
 48 }
 49 
 50 static int rt715_index_write_nid(struct regmap *regmap,
 51                 unsigned int nid, unsigned int reg, unsigned int value)
 52 {
 53         int ret;
 54         unsigned int addr = ((RT715_PRIV_INDEX_W_H_2 | nid) << 8) | reg;
 55 
 56         ret = regmap_write(regmap, addr, value);
 57         if (ret < 0)
 58                 pr_err("%s: Failed to set private value: %06x <= %04x ret=%d\n",
 59                        __func__, addr, value, ret);
 60 
 61         return ret;
 62 }
 63 
 64 static int rt715_index_read_nid(struct regmap *regmap,
 65                 unsigned int nid, unsigned int reg, unsigned int *value)
 66 {
 67         int ret;
 68         unsigned int addr = ((RT715_PRIV_INDEX_W_H_2 | nid) << 8) | reg;
 69 
 70         *value = 0;
 71         ret = regmap_read(regmap, addr, value);
 72         if (ret < 0)
 73                 pr_err("%s: Failed to get private value: %06x => %04x ret=%d\n",
 74                        __func__, addr, *value, ret);
 75 
 76         return ret;
 77 }
 78 
 79 static int rt715_index_update_bits(struct regmap *regmap, unsigned int nid,
 80                         unsigned int reg, unsigned int mask, unsigned int val)
 81 {
 82         unsigned int tmp, orig;
 83         int ret;
 84 
 85         ret = rt715_index_read_nid(regmap, nid, reg, &orig);
 86         if (ret < 0)
 87                 return ret;
 88 
 89         tmp = orig & ~mask;
 90         tmp |= val & mask;
 91 
 92         return rt715_index_write_nid(regmap, nid, reg, tmp);
 93 }
 94 
 95 static void rt715_reset(struct regmap *regmap)
 96 {
 97         regmap_write(regmap, RT715_FUNC_RESET, 0);
 98         rt715_index_update_bits(regmap, RT715_VENDOR_REGISTERS,
 99                 RT715_VD_CLEAR_CTRL, RT715_CLEAR_HIDDEN_REG,
100                 RT715_CLEAR_HIDDEN_REG);
101 }
102 
103 
104 static void rt715_get_gain(struct rt715_priv *rt715, unsigned int addr_h,
105                                 unsigned int addr_l, unsigned int val_h,
106                                 unsigned int *r_val, unsigned int *l_val)
107 {
108         int ret;
109         /* R Channel */
110         *r_val = val_h << 8;
111         ret = regmap_read(rt715->regmap, addr_l, r_val);
112         if (ret < 0)
113                 pr_err("Failed to get R channel gain.\n");
114 
115         /* L Channel */
116         val_h |= 0x20;
117         *l_val = val_h << 8;
118         ret = regmap_read(rt715->regmap, addr_h, l_val);
119         if (ret < 0)
120                 pr_err("Failed to get L channel gain.\n");
121 }
122 
123 /* For Verb-Set Amplifier Gain (Verb ID = 3h) */
124 static int rt715_set_amp_gain_put(struct snd_kcontrol *kcontrol,
125                                         struct snd_ctl_elem_value *ucontrol)
126 {
127         struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
128         struct snd_soc_dapm_context *dapm =
129                 snd_soc_component_get_dapm(component);
130         struct soc_mixer_control *mc =
131                 (struct soc_mixer_control *)kcontrol->private_value;
132         struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
133         unsigned int addr_h, addr_l, val_h, val_ll, val_lr;
134         unsigned int read_ll, read_rl, i;
135         unsigned int k_vol_changed = 0;
136 
137         for (i = 0; i < 2; i++) {
138                 if (ucontrol->value.integer.value[i] != rt715->kctl_2ch_vol_ori[i]) {
139                         k_vol_changed = 1;
140                         break;
141                 }
142         }
143 
144         /* Can't use update bit function, so read the original value first */
145         addr_h = mc->reg;
146         addr_l = mc->rreg;
147 
148         if (mc->shift == RT715_DIR_OUT_SFT) /* output */
149                 val_h = 0x80;
150         else /* input */
151                 val_h = 0x0;
152 
153         rt715_get_gain(rt715, addr_h, addr_l, val_h, &read_rl, &read_ll);
154 
155         if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
156                 regmap_write(rt715->regmap,
157                                 RT715_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
158 
159         /* L Channel */
160         rt715->kctl_2ch_vol_ori[0] = ucontrol->value.integer.value[0];
161         /* for gain */
162         val_ll = ((ucontrol->value.integer.value[0]) & 0x7f);
163         if (val_ll > mc->max)
164                 val_ll = mc->max;
165         /* keep mute status */
166         val_ll |= read_ll & 0x80;
167 
168         /* R Channel */
169         rt715->kctl_2ch_vol_ori[1] = ucontrol->value.integer.value[1];
170         /* for gain */
171         val_lr = ((ucontrol->value.integer.value[1]) & 0x7f);
172         if (val_lr > mc->max)
173                 val_lr = mc->max;
174         /* keep mute status */
175         val_lr |= read_rl & 0x80;
176 
177         for (i = 0; i < 3; i++) { /* retry 3 times at most */
178 
179                 if (val_ll == val_lr) {
180                         /* Set both L/R channels at the same time */
181                         val_h = (1 << mc->shift) | (3 << 4);
182                         regmap_write(rt715->regmap, addr_h,
183                                 (val_h << 8) | val_ll);
184                         regmap_write(rt715->regmap, addr_l,
185                                 (val_h << 8) | val_ll);
186                 } else {
187                         /* Lch*/
188                         val_h = (1 << mc->shift) | (1 << 5);
189                         regmap_write(rt715->regmap, addr_h,
190                                 (val_h << 8) | val_ll);
191                         /* Rch */
192                         val_h = (1 << mc->shift) | (1 << 4);
193                         regmap_write(rt715->regmap, addr_l,
194                                 (val_h << 8) | val_lr);
195                 }
196                 /* check result */
197                 if (mc->shift == RT715_DIR_OUT_SFT) /* output */
198                         val_h = 0x80;
199                 else /* input */
200                         val_h = 0x0;
201 
202                 rt715_get_gain(rt715, addr_h, addr_l, val_h,
203                                 &read_rl, &read_ll);
204                 if (read_rl == val_lr && read_ll == val_ll)
205                         break;
206         }
207 
208         /* D0:power on state, D3: power saving mode */
209         if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
210                 regmap_write(rt715->regmap,
211                                 RT715_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
212         return k_vol_changed;
213 }
214 
215 static int rt715_set_amp_gain_get(struct snd_kcontrol *kcontrol,
216                                   struct snd_ctl_elem_value *ucontrol)
217 {
218         struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
219         struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
220         struct soc_mixer_control *mc =
221                 (struct soc_mixer_control *)kcontrol->private_value;
222         unsigned int addr_h, addr_l, val_h;
223         unsigned int read_ll, read_rl;
224 
225         addr_h = mc->reg;
226         addr_l = mc->rreg;
227         if (mc->shift == RT715_DIR_OUT_SFT) /* output */
228                 val_h = 0x80;
229         else /* input */
230                 val_h = 0x0;
231 
232         rt715_get_gain(rt715, addr_h, addr_l, val_h, &read_rl, &read_ll);
233 
234         if (mc->invert) {
235                 /* for mute status */
236                 read_ll = !(read_ll & 0x80);
237                 read_rl = !(read_rl & 0x80);
238         } else {
239                 /* for gain */
240                 read_ll = read_ll & 0x7f;
241                 read_rl = read_rl & 0x7f;
242         }
243         ucontrol->value.integer.value[0] = read_ll;
244         ucontrol->value.integer.value[1] = read_rl;
245 
246         return 0;
247 }
248 
249 static int rt715_set_main_switch_put(struct snd_kcontrol *kcontrol,
250                                         struct snd_ctl_elem_value *ucontrol)
251 {
252         struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
253         struct snd_soc_dapm_context *dapm =
254                 snd_soc_component_get_dapm(component);
255         struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
256         static const unsigned int capture_reg_H[] = {
257                 RT715_SET_GAIN_MIC_ADC_H, RT715_SET_GAIN_LINE_ADC_H,
258                 RT715_SET_GAIN_MIX_ADC_H, RT715_SET_GAIN_MIX_ADC2_H };
259         static const unsigned int capture_reg_L[] = {
260                 RT715_SET_GAIN_MIC_ADC_L, RT715_SET_GAIN_LINE_ADC_L,
261                 RT715_SET_GAIN_MIX_ADC_L, RT715_SET_GAIN_MIX_ADC2_L };
262         unsigned int addr_h, addr_l, val_h = 0x0, val_ll, val_lr;
263         unsigned int k_shift = RT715_DIR_IN_SFT, k_changed = 0;
264         unsigned int read_ll, read_rl, i, j, loop_cnt = 4;
265 
266         for (i = 0; i < 8; i++) {
267                 if (ucontrol->value.integer.value[i] != rt715->kctl_8ch_switch_ori[i])
268                         k_changed = 1;
269         }
270 
271         for (j = 0; j < loop_cnt; j++) {
272                 /* Can't use update bit function, so read the original value first */
273                 addr_h = capture_reg_H[j];
274                 addr_l = capture_reg_L[j];
275                 rt715_get_gain(rt715, addr_h, addr_l, val_h, &read_rl, &read_ll);
276 
277                 if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
278                         regmap_write(rt715->regmap,
279                                         RT715_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
280 
281                 /* L Channel */
282                 /* for mute */
283                 rt715->kctl_8ch_switch_ori[j * 2] =
284                         ucontrol->value.integer.value[j * 2];
285                 val_ll = (!ucontrol->value.integer.value[j * 2]) << 7;
286                 /* keep gain */
287                 val_ll |= read_ll & 0x7f;
288 
289                 /* R Channel */
290                 /* for mute */
291                 rt715->kctl_8ch_switch_ori[j * 2 + 1] =
292                         ucontrol->value.integer.value[j * 2 + 1];
293                 val_lr = (!ucontrol->value.integer.value[j * 2 + 1]) << 7;
294                 /* keep gain */
295                 val_lr |= read_rl & 0x7f;
296 
297                 for (i = 0; i < 3; i++) { /* retry 3 times at most */
298 
299                         if (val_ll == val_lr) {
300                                 /* Set both L/R channels at the same time */
301                                 val_h = (1 << k_shift) | (3 << 4);
302                                 regmap_write(rt715->regmap, addr_h,
303                                         (val_h << 8) | val_ll);
304                                 regmap_write(rt715->regmap, addr_l,
305                                         (val_h << 8) | val_ll);
306                         } else {
307                                 /* Lch*/
308                                 val_h = (1 << k_shift) | (1 << 5);
309                                 regmap_write(rt715->regmap, addr_h,
310                                         (val_h << 8) | val_ll);
311                                 /* Rch */
312                                 val_h = (1 << k_shift) | (1 << 4);
313                                 regmap_write(rt715->regmap, addr_l,
314                                         (val_h << 8) | val_lr);
315                         }
316                         val_h = 0x0;
317                         rt715_get_gain(rt715, addr_h, addr_l, val_h,
318                                         &read_rl, &read_ll);
319                         if (read_rl == val_lr && read_ll == val_ll)
320                                 break;
321                 }
322         }
323 
324         /* D0:power on state, D3: power saving mode */
325         if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
326                 regmap_write(rt715->regmap,
327                                 RT715_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
328         return k_changed;
329 }
330 
331 static int rt715_set_main_switch_get(struct snd_kcontrol *kcontrol,
332                                   struct snd_ctl_elem_value *ucontrol)
333 {
334         struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
335         struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
336         static const unsigned int capture_reg_H[] = {
337                 RT715_SET_GAIN_MIC_ADC_H, RT715_SET_GAIN_LINE_ADC_H,
338                 RT715_SET_GAIN_MIX_ADC_H, RT715_SET_GAIN_MIX_ADC2_H };
339         static const unsigned int capture_reg_L[] = {
340                 RT715_SET_GAIN_MIC_ADC_L, RT715_SET_GAIN_LINE_ADC_L,
341                 RT715_SET_GAIN_MIX_ADC_L, RT715_SET_GAIN_MIX_ADC2_L };
342         unsigned int addr_h, addr_l, val_h = 0x0, i, loop_cnt = 4;
343         unsigned int read_ll, read_rl;
344 
345         for (i = 0; i < loop_cnt; i++) {
346                 addr_h = capture_reg_H[i];
347                 addr_l = capture_reg_L[i];
348                 rt715_get_gain(rt715, addr_h, addr_l, val_h, &read_rl, &read_ll);
349 
350                 ucontrol->value.integer.value[i * 2] = !(read_ll & 0x80);
351                 ucontrol->value.integer.value[i * 2 + 1] = !(read_rl & 0x80);
352         }
353 
354         return 0;
355 }
356 
357 static int rt715_set_main_vol_put(struct snd_kcontrol *kcontrol,
358                                         struct snd_ctl_elem_value *ucontrol)
359 {
360         struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
361         struct snd_soc_dapm_context *dapm =
362                 snd_soc_component_get_dapm(component);
363         struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
364         static const unsigned int capture_reg_H[] = {
365                 RT715_SET_GAIN_MIC_ADC_H, RT715_SET_GAIN_LINE_ADC_H,
366                 RT715_SET_GAIN_MIX_ADC_H, RT715_SET_GAIN_MIX_ADC2_H };
367         static const unsigned int capture_reg_L[] = {
368                 RT715_SET_GAIN_MIC_ADC_L, RT715_SET_GAIN_LINE_ADC_L,
369                 RT715_SET_GAIN_MIX_ADC_L, RT715_SET_GAIN_MIX_ADC2_L};
370         unsigned int addr_h, addr_l, val_h = 0x0, val_ll, val_lr;
371         unsigned int read_ll, read_rl, i, j, loop_cnt = 4, k_changed = 0;
372         unsigned int k_shift = RT715_DIR_IN_SFT, k_max = 0x3f;
373 
374         for (i = 0; i < 8; i++) {
375                 if (ucontrol->value.integer.value[i] != rt715->kctl_8ch_vol_ori[i])
376                         k_changed = 1;
377         }
378 
379         for (j = 0; j < loop_cnt; j++) {
380                 addr_h = capture_reg_H[j];
381                 addr_l = capture_reg_L[j];
382                 rt715_get_gain(rt715, addr_h, addr_l, val_h, &read_rl, &read_ll);
383 
384                 if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
385                         regmap_write(rt715->regmap,
386                                         RT715_SET_AUDIO_POWER_STATE, AC_PWRST_D0);
387 
388                 /* L Channel */
389                 /* for gain */
390                 rt715->kctl_8ch_vol_ori[j * 2] = ucontrol->value.integer.value[j * 2];
391                 val_ll = ((ucontrol->value.integer.value[j * 2]) & 0x7f);
392                 if (val_ll > k_max)
393                         val_ll = k_max;
394                 /* keep mute status */
395                 val_ll |= read_ll & 0x80;
396 
397                 /* R Channel */
398                 /* for gain */
399                 rt715->kctl_8ch_vol_ori[j * 2 + 1] =
400                         ucontrol->value.integer.value[j * 2 + 1];
401                 val_lr = ((ucontrol->value.integer.value[j * 2 + 1]) & 0x7f);
402                 if (val_lr > k_max)
403                         val_lr = k_max;
404                 /* keep mute status */
405                 val_lr |= read_rl & 0x80;
406 
407                 for (i = 0; i < 3; i++) { /* retry 3 times at most */
408                         if (val_ll == val_lr) {
409                                 /* Set both L/R channels at the same time */
410                                 val_h = (1 << k_shift) | (3 << 4);
411                                 regmap_write(rt715->regmap, addr_h,
412                                         (val_h << 8) | val_ll);
413                                 regmap_write(rt715->regmap, addr_l,
414                                         (val_h << 8) | val_ll);
415                         } else {
416                                 /* Lch*/
417                                 val_h = (1 << k_shift) | (1 << 5);
418                                 regmap_write(rt715->regmap, addr_h,
419                                         (val_h << 8) | val_ll);
420                                 /* Rch */
421                                 val_h = (1 << k_shift) | (1 << 4);
422                                 regmap_write(rt715->regmap, addr_l,
423                                         (val_h << 8) | val_lr);
424                         }
425                         val_h = 0x0;
426                         rt715_get_gain(rt715, addr_h, addr_l, val_h,
427                                         &read_rl, &read_ll);
428                         if (read_rl == val_lr && read_ll == val_ll)
429                                 break;
430                 }
431         }
432 
433         /* D0:power on state, D3: power saving mode */
434         if (dapm->bias_level <= SND_SOC_BIAS_STANDBY)
435                 regmap_write(rt715->regmap,
436                                 RT715_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
437         return k_changed;
438 }
439 
440 static int rt715_set_main_vol_get(struct snd_kcontrol *kcontrol,
441                                   struct snd_ctl_elem_value *ucontrol)
442 {
443         struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
444         struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
445         static const unsigned int capture_reg_H[] = {
446                 RT715_SET_GAIN_MIC_ADC_H, RT715_SET_GAIN_LINE_ADC_H,
447                 RT715_SET_GAIN_MIX_ADC_H, RT715_SET_GAIN_MIX_ADC2_H };
448         static const unsigned int capture_reg_L[] = {
449                 RT715_SET_GAIN_MIC_ADC_L, RT715_SET_GAIN_LINE_ADC_L,
450                 RT715_SET_GAIN_MIX_ADC_L, RT715_SET_GAIN_MIX_ADC2_L };
451         unsigned int addr_h, addr_l, val_h = 0x0, i, loop_cnt = 4;
452         unsigned int read_ll, read_rl;
453 
454         for (i = 0; i < loop_cnt; i++) {
455                 addr_h = capture_reg_H[i];
456                 addr_l = capture_reg_L[i];
457                 rt715_get_gain(rt715, addr_h, addr_l, val_h, &read_rl, &read_ll);
458 
459                 ucontrol->value.integer.value[i * 2] = read_ll & 0x7f;
460                 ucontrol->value.integer.value[i * 2 + 1] = read_rl & 0x7f;
461         }
462 
463         return 0;
464 }
465 
466 static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -1725, 75, 0);
467 static const DECLARE_TLV_DB_SCALE(mic_vol_tlv, 0, 1000, 0);
468 
469 static int rt715_switch_info(struct snd_kcontrol *kcontrol,
470         struct snd_ctl_elem_info *uinfo)
471 {
472         uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
473         uinfo->count = 8;
474         uinfo->value.integer.min = 0;
475         uinfo->value.integer.max = 1;
476         return 0;
477 }
478 
479 static int rt715_vol_info(struct snd_kcontrol *kcontrol,
480         struct snd_ctl_elem_info *uinfo)
481 {
482         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
483         uinfo->count = 8;
484         uinfo->value.integer.min = 0;
485         uinfo->value.integer.max = 0x3f;
486         return 0;
487 }
488 
489 #define SOC_DOUBLE_R_EXT(xname, reg_left, reg_right, xshift, xmax, xinvert,\
490          xhandler_get, xhandler_put) \
491 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
492         .info = snd_soc_info_volsw, \
493         .get = xhandler_get, .put = xhandler_put, \
494         .private_value = SOC_DOUBLE_R_VALUE(reg_left, reg_right, xshift, \
495                                             xmax, xinvert) }
496 
497 #define RT715_MAIN_SWITCH_EXT(xname, xhandler_get, xhandler_put) \
498 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
499         .info = rt715_switch_info, \
500         .get = xhandler_get, .put = xhandler_put, \
501 }
502 
503 #define RT715_MAIN_VOL_EXT_TLV(xname, xhandler_get, xhandler_put, tlv_array) \
504 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
505         .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
506                  SNDRV_CTL_ELEM_ACCESS_READWRITE, \
507         .tlv.p = (tlv_array), \
508         .info = rt715_vol_info, \
509         .get = xhandler_get, .put = xhandler_put, \
510 }
511 
512 static const struct snd_kcontrol_new rt715_snd_controls[] = {
513         /* Capture switch */
514         RT715_MAIN_SWITCH_EXT("Capture Switch",
515                         rt715_set_main_switch_get, rt715_set_main_switch_put),
516         /* Volume Control */
517         RT715_MAIN_VOL_EXT_TLV("Capture Volume",
518                         rt715_set_main_vol_get, rt715_set_main_vol_put, in_vol_tlv),
519         /* MIC Boost Control */
520         SOC_DOUBLE_R_EXT_TLV("DMIC1 Boost", RT715_SET_GAIN_DMIC1_H,
521                         RT715_SET_GAIN_DMIC1_L, RT715_DIR_IN_SFT, 3, 0,
522                         rt715_set_amp_gain_get, rt715_set_amp_gain_put,
523                         mic_vol_tlv),
524         SOC_DOUBLE_R_EXT_TLV("DMIC2 Boost", RT715_SET_GAIN_DMIC2_H,
525                         RT715_SET_GAIN_DMIC2_L, RT715_DIR_IN_SFT, 3, 0,
526                         rt715_set_amp_gain_get, rt715_set_amp_gain_put,
527                         mic_vol_tlv),
528         SOC_DOUBLE_R_EXT_TLV("DMIC3 Boost", RT715_SET_GAIN_DMIC3_H,
529                         RT715_SET_GAIN_DMIC3_L, RT715_DIR_IN_SFT, 3, 0,
530                         rt715_set_amp_gain_get, rt715_set_amp_gain_put,
531                         mic_vol_tlv),
532         SOC_DOUBLE_R_EXT_TLV("DMIC4 Boost", RT715_SET_GAIN_DMIC4_H,
533                         RT715_SET_GAIN_DMIC4_L, RT715_DIR_IN_SFT, 3, 0,
534                         rt715_set_amp_gain_get, rt715_set_amp_gain_put,
535                         mic_vol_tlv),
536         SOC_DOUBLE_R_EXT_TLV("MIC1 Boost", RT715_SET_GAIN_MIC1_H,
537                         RT715_SET_GAIN_MIC1_L, RT715_DIR_IN_SFT, 3, 0,
538                         rt715_set_amp_gain_get, rt715_set_amp_gain_put,
539                         mic_vol_tlv),
540         SOC_DOUBLE_R_EXT_TLV("MIC2 Boost", RT715_SET_GAIN_MIC2_H,
541                         RT715_SET_GAIN_MIC2_L, RT715_DIR_IN_SFT, 3, 0,
542                         rt715_set_amp_gain_get, rt715_set_amp_gain_put,
543                         mic_vol_tlv),
544         SOC_DOUBLE_R_EXT_TLV("LINE1 Boost", RT715_SET_GAIN_LINE1_H,
545                         RT715_SET_GAIN_LINE1_L, RT715_DIR_IN_SFT, 3, 0,
546                         rt715_set_amp_gain_get, rt715_set_amp_gain_put,
547                         mic_vol_tlv),
548         SOC_DOUBLE_R_EXT_TLV("LINE2 Boost", RT715_SET_GAIN_LINE2_H,
549                         RT715_SET_GAIN_LINE2_L, RT715_DIR_IN_SFT, 3, 0,
550                         rt715_set_amp_gain_get, rt715_set_amp_gain_put,
551                         mic_vol_tlv),
552 };
553 
554 static int rt715_mux_get(struct snd_kcontrol *kcontrol,
555                         struct snd_ctl_elem_value *ucontrol)
556 {
557         struct snd_soc_component *component =
558                 snd_soc_dapm_kcontrol_component(kcontrol);
559         struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
560         struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
561         unsigned int reg, val;
562         int ret;
563 
564         /* nid = e->reg, vid = 0xf01 */
565         reg = RT715_VERB_SET_CONNECT_SEL | e->reg;
566         ret = regmap_read(rt715->regmap, reg, &val);
567         if (ret < 0) {
568                 dev_err(component->dev, "%s: sdw read failed: %d\n",
569                         __func__, ret);
570                 return ret;
571         }
572 
573         /*
574          * The first two indices of ADC Mux 24/25 are routed to the same
575          * hardware source. ie, ADC Mux 24 0/1 will both connect to MIC2.
576          * To have a unique set of inputs, we skip the index1 of the muxes.
577          */
578         if ((e->reg == RT715_MUX_IN3 || e->reg == RT715_MUX_IN4) && (val > 0))
579                 val -= 1;
580         ucontrol->value.enumerated.item[0] = val;
581 
582         return 0;
583 }
584 
585 static int rt715_mux_put(struct snd_kcontrol *kcontrol,
586                         struct snd_ctl_elem_value *ucontrol)
587 {
588         struct snd_soc_component *component =
589                 snd_soc_dapm_kcontrol_component(kcontrol);
590         struct snd_soc_dapm_context *dapm =
591                                 snd_soc_dapm_kcontrol_dapm(kcontrol);
592         struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
593         struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
594         unsigned int *item = ucontrol->value.enumerated.item;
595         unsigned int val, val2 = 0, change, reg;
596         int ret;
597 
598         if (item[0] >= e->items)
599                 return -EINVAL;
600 
601         /* Verb ID = 0x701h, nid = e->reg */
602         val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l;
603 
604         reg = RT715_VERB_SET_CONNECT_SEL | e->reg;
605         ret = regmap_read(rt715->regmap, reg, &val2);
606         if (ret < 0) {
607                 dev_err(component->dev, "%s: sdw read failed: %d\n",
608                         __func__, ret);
609                 return ret;
610         }
611 
612         if (val == val2)
613                 change = 0;
614         else
615                 change = 1;
616 
617         if (change) {
618                 reg = RT715_VERB_SET_CONNECT_SEL | e->reg;
619                 regmap_write(rt715->regmap, reg, val);
620         }
621 
622         snd_soc_dapm_mux_update_power(dapm, kcontrol,
623                                                 item[0], e, NULL);
624 
625         return change;
626 }
627 
628 static const char * const adc_22_23_mux_text[] = {
629         "MIC1",
630         "MIC2",
631         "LINE1",
632         "LINE2",
633         "DMIC1",
634         "DMIC2",
635         "DMIC3",
636         "DMIC4",
637 };
638 
639 /*
640  * Due to mux design for nid 24 (MUX_IN3)/25 (MUX_IN4), connection index 0 and
641  * 1 will be connected to the same dmic source, therefore we skip index 1 to
642  * avoid misunderstanding on usage of dapm routing.
643  */
644 static const unsigned int rt715_adc_24_25_values[] = {
645         0,
646         2,
647         3,
648         4,
649         5,
650 };
651 
652 static const char * const adc_24_mux_text[] = {
653         "MIC2",
654         "DMIC1",
655         "DMIC2",
656         "DMIC3",
657         "DMIC4",
658 };
659 
660 static const char * const adc_25_mux_text[] = {
661         "MIC1",
662         "DMIC1",
663         "DMIC2",
664         "DMIC3",
665         "DMIC4",
666 };
667 
668 static SOC_ENUM_SINGLE_DECL(
669         rt715_adc22_enum, RT715_MUX_IN1, 0, adc_22_23_mux_text);
670 
671 static SOC_ENUM_SINGLE_DECL(
672         rt715_adc23_enum, RT715_MUX_IN2, 0, adc_22_23_mux_text);
673 
674 static SOC_VALUE_ENUM_SINGLE_DECL(rt715_adc24_enum,
675         RT715_MUX_IN3, 0, 0xf,
676         adc_24_mux_text, rt715_adc_24_25_values);
677 
678 static SOC_VALUE_ENUM_SINGLE_DECL(rt715_adc25_enum,
679         RT715_MUX_IN4, 0, 0xf,
680         adc_25_mux_text, rt715_adc_24_25_values);
681 
682 static const struct snd_kcontrol_new rt715_adc22_mux =
683         SOC_DAPM_ENUM_EXT("ADC 22 Mux", rt715_adc22_enum,
684                         rt715_mux_get, rt715_mux_put);
685 
686 static const struct snd_kcontrol_new rt715_adc23_mux =
687         SOC_DAPM_ENUM_EXT("ADC 23 Mux", rt715_adc23_enum,
688                         rt715_mux_get, rt715_mux_put);
689 
690 static const struct snd_kcontrol_new rt715_adc24_mux =
691         SOC_DAPM_ENUM_EXT("ADC 24 Mux", rt715_adc24_enum,
692                         rt715_mux_get, rt715_mux_put);
693 
694 static const struct snd_kcontrol_new rt715_adc25_mux =
695         SOC_DAPM_ENUM_EXT("ADC 25 Mux", rt715_adc25_enum,
696                         rt715_mux_get, rt715_mux_put);
697 
698 static const struct snd_soc_dapm_widget rt715_dapm_widgets[] = {
699         SND_SOC_DAPM_INPUT("DMIC1"),
700         SND_SOC_DAPM_INPUT("DMIC2"),
701         SND_SOC_DAPM_INPUT("DMIC3"),
702         SND_SOC_DAPM_INPUT("DMIC4"),
703         SND_SOC_DAPM_INPUT("MIC1"),
704         SND_SOC_DAPM_INPUT("MIC2"),
705         SND_SOC_DAPM_INPUT("LINE1"),
706         SND_SOC_DAPM_INPUT("LINE2"),
707         SND_SOC_DAPM_ADC("ADC 07", NULL, RT715_SET_STREAMID_MIC_ADC, 4, 0),
708         SND_SOC_DAPM_ADC("ADC 08", NULL, RT715_SET_STREAMID_LINE_ADC, 4, 0),
709         SND_SOC_DAPM_ADC("ADC 09", NULL, RT715_SET_STREAMID_MIX_ADC, 4, 0),
710         SND_SOC_DAPM_ADC("ADC 27", NULL, RT715_SET_STREAMID_MIX_ADC2, 4, 0),
711         SND_SOC_DAPM_MUX("ADC 22 Mux", SND_SOC_NOPM, 0, 0,
712                 &rt715_adc22_mux),
713         SND_SOC_DAPM_MUX("ADC 23 Mux", SND_SOC_NOPM, 0, 0,
714                 &rt715_adc23_mux),
715         SND_SOC_DAPM_MUX("ADC 24 Mux", SND_SOC_NOPM, 0, 0,
716                 &rt715_adc24_mux),
717         SND_SOC_DAPM_MUX("ADC 25 Mux", SND_SOC_NOPM, 0, 0,
718                 &rt715_adc25_mux),
719         SND_SOC_DAPM_AIF_OUT("DP4TX", "DP4 Capture", 0, SND_SOC_NOPM, 0, 0),
720         SND_SOC_DAPM_AIF_OUT("DP6TX", "DP6 Capture", 0, SND_SOC_NOPM, 0, 0),
721 };
722 
723 static const struct snd_soc_dapm_route rt715_audio_map[] = {
724         {"DP6TX", NULL, "ADC 09"},
725         {"DP6TX", NULL, "ADC 08"},
726         {"DP4TX", NULL, "ADC 07"},
727         {"DP4TX", NULL, "ADC 27"},
728         {"ADC 09", NULL, "ADC 22 Mux"},
729         {"ADC 08", NULL, "ADC 23 Mux"},
730         {"ADC 07", NULL, "ADC 24 Mux"},
731         {"ADC 27", NULL, "ADC 25 Mux"},
732         {"ADC 22 Mux", "MIC1", "MIC1"},
733         {"ADC 22 Mux", "MIC2", "MIC2"},
734         {"ADC 22 Mux", "LINE1", "LINE1"},
735         {"ADC 22 Mux", "LINE2", "LINE2"},
736         {"ADC 22 Mux", "DMIC1", "DMIC1"},
737         {"ADC 22 Mux", "DMIC2", "DMIC2"},
738         {"ADC 22 Mux", "DMIC3", "DMIC3"},
739         {"ADC 22 Mux", "DMIC4", "DMIC4"},
740         {"ADC 23 Mux", "MIC1", "MIC1"},
741         {"ADC 23 Mux", "MIC2", "MIC2"},
742         {"ADC 23 Mux", "LINE1", "LINE1"},
743         {"ADC 23 Mux", "LINE2", "LINE2"},
744         {"ADC 23 Mux", "DMIC1", "DMIC1"},
745         {"ADC 23 Mux", "DMIC2", "DMIC2"},
746         {"ADC 23 Mux", "DMIC3", "DMIC3"},
747         {"ADC 23 Mux", "DMIC4", "DMIC4"},
748         {"ADC 24 Mux", "MIC2", "MIC2"},
749         {"ADC 24 Mux", "DMIC1", "DMIC1"},
750         {"ADC 24 Mux", "DMIC2", "DMIC2"},
751         {"ADC 24 Mux", "DMIC3", "DMIC3"},
752         {"ADC 24 Mux", "DMIC4", "DMIC4"},
753         {"ADC 25 Mux", "MIC1", "MIC1"},
754         {"ADC 25 Mux", "DMIC1", "DMIC1"},
755         {"ADC 25 Mux", "DMIC2", "DMIC2"},
756         {"ADC 25 Mux", "DMIC3", "DMIC3"},
757         {"ADC 25 Mux", "DMIC4", "DMIC4"},
758 };
759 
760 static int rt715_set_bias_level(struct snd_soc_component *component,
761                                 enum snd_soc_bias_level level)
762 {
763         struct snd_soc_dapm_context *dapm =
764                 snd_soc_component_get_dapm(component);
765         struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
766 
767         switch (level) {
768         case SND_SOC_BIAS_PREPARE:
769                 if (dapm->bias_level == SND_SOC_BIAS_STANDBY) {
770                         regmap_write(rt715->regmap,
771                                                 RT715_SET_AUDIO_POWER_STATE,
772                                                 AC_PWRST_D0);
773                         msleep(RT715_POWER_UP_DELAY_MS);
774                 }
775                 break;
776 
777         case SND_SOC_BIAS_STANDBY:
778                 regmap_write(rt715->regmap,
779                                         RT715_SET_AUDIO_POWER_STATE,
780                                         AC_PWRST_D3);
781                 break;
782 
783         default:
784                 break;
785         }
786         dapm->bias_level = level;
787         return 0;
788 }
789 
790 static int rt715_probe(struct snd_soc_component *component)
791 {
792         struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
793         int ret;
794 
795         if (!rt715->first_hw_init)
796                 return 0;
797 
798         ret = pm_runtime_resume(component->dev);
799         if (ret < 0 && ret != -EACCES)
800                 return ret;
801 
802         return 0;
803 }
804 
805 static const struct snd_soc_component_driver soc_codec_dev_rt715 = {
806         .probe = rt715_probe,
807         .set_bias_level = rt715_set_bias_level,
808         .controls = rt715_snd_controls,
809         .num_controls = ARRAY_SIZE(rt715_snd_controls),
810         .dapm_widgets = rt715_dapm_widgets,
811         .num_dapm_widgets = ARRAY_SIZE(rt715_dapm_widgets),
812         .dapm_routes = rt715_audio_map,
813         .num_dapm_routes = ARRAY_SIZE(rt715_audio_map),
814         .endianness = 1,
815 };
816 
817 static int rt715_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream,
818                                 int direction)
819 {
820 
821         snd_soc_dai_dma_data_set(dai, direction, sdw_stream);
822 
823         return 0;
824 }
825 
826 static void rt715_shutdown(struct snd_pcm_substream *substream,
827                                 struct snd_soc_dai *dai)
828 
829 {
830         snd_soc_dai_set_dma_data(dai, substream, NULL);
831 }
832 
833 static int rt715_pcm_hw_params(struct snd_pcm_substream *substream,
834                                 struct snd_pcm_hw_params *params,
835                                 struct snd_soc_dai *dai)
836 {
837         struct snd_soc_component *component = dai->component;
838         struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
839         struct sdw_stream_config stream_config = {0};
840         struct sdw_port_config port_config = {0};
841         struct sdw_stream_runtime *sdw_stream;
842         int retval;
843         unsigned int val = 0;
844 
845         sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
846 
847         if (!sdw_stream)
848                 return -EINVAL;
849 
850         if (!rt715->slave)
851                 return -EINVAL;
852 
853         snd_sdw_params_to_config(substream, params, &stream_config, &port_config);
854 
855         switch (dai->id) {
856         case RT715_AIF1:
857                 port_config.num = 6;
858                 rt715_index_write(rt715->regmap, RT715_SDW_INPUT_SEL, 0xa500);
859                 break;
860         case RT715_AIF2:
861                 port_config.num = 4;
862                 rt715_index_write(rt715->regmap, RT715_SDW_INPUT_SEL, 0xa000);
863                 break;
864         default:
865                 dev_err(component->dev, "%s: Invalid DAI id %d\n", __func__, dai->id);
866                 return -EINVAL;
867         }
868 
869         retval = sdw_stream_add_slave(rt715->slave, &stream_config,
870                                         &port_config, 1, sdw_stream);
871         if (retval) {
872                 dev_err(dai->dev, "%s: Unable to configure port\n", __func__);
873                 return retval;
874         }
875 
876         switch (params_rate(params)) {
877         /* bit 14 0:48K 1:44.1K */
878         /* bit 15 Stream Type 0:PCM 1:Non-PCM, should always be PCM */
879         case 44100:
880                 val |= 0x40 << 8;
881                 break;
882         case 48000:
883                 val |= 0x0 << 8;
884                 break;
885         default:
886                 dev_err(component->dev, "%s: Unsupported sample rate %d\n",
887                         __func__, params_rate(params));
888                 return -EINVAL;
889         }
890 
891         if (params_channels(params) <= 16) {
892                 /* bit 3:0 Number of Channel */
893                 val |= (params_channels(params) - 1);
894         } else {
895                 dev_err(component->dev, "%s: Unsupported channels %d\n",
896                         __func__, params_channels(params));
897                 return -EINVAL;
898         }
899 
900         switch (params_width(params)) {
901         /* bit 6:4 Bits per Sample */
902         case 8:
903                 break;
904         case 16:
905                 val |= (0x1 << 4);
906                 break;
907         case 20:
908                 val |= (0x2 << 4);
909                 break;
910         case 24:
911                 val |= (0x3 << 4);
912                 break;
913         case 32:
914                 val |= (0x4 << 4);
915                 break;
916         default:
917                 return -EINVAL;
918         }
919 
920         regmap_write(rt715->regmap, RT715_MIC_ADC_FORMAT_H, val);
921         regmap_write(rt715->regmap, RT715_MIC_LINE_FORMAT_H, val);
922         regmap_write(rt715->regmap, RT715_MIX_ADC_FORMAT_H, val);
923         regmap_write(rt715->regmap, RT715_MIX_ADC2_FORMAT_H, val);
924 
925         return retval;
926 }
927 
928 static int rt715_pcm_hw_free(struct snd_pcm_substream *substream,
929                                 struct snd_soc_dai *dai)
930 {
931         struct snd_soc_component *component = dai->component;
932         struct rt715_priv *rt715 = snd_soc_component_get_drvdata(component);
933         struct sdw_stream_runtime *sdw_stream =
934                 snd_soc_dai_get_dma_data(dai, substream);
935 
936         if (!rt715->slave)
937                 return -EINVAL;
938 
939         sdw_stream_remove_slave(rt715->slave, sdw_stream);
940         return 0;
941 }
942 
943 #define RT715_STEREO_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
944 #define RT715_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
945                         SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)
946 
947 static const struct snd_soc_dai_ops rt715_ops = {
948         .hw_params      = rt715_pcm_hw_params,
949         .hw_free        = rt715_pcm_hw_free,
950         .set_stream     = rt715_set_sdw_stream,
951         .shutdown       = rt715_shutdown,
952 };
953 
954 static struct snd_soc_dai_driver rt715_dai[] = {
955         {
956                 .name = "rt715-aif1",
957                 .id = RT715_AIF1,
958                 .capture = {
959                         .stream_name = "DP6 Capture",
960                         .channels_min = 1,
961                         .channels_max = 2,
962                         .rates = RT715_STEREO_RATES,
963                         .formats = RT715_FORMATS,
964                 },
965                 .ops = &rt715_ops,
966         },
967         {
968                 .name = "rt715-aif2",
969                 .id = RT715_AIF2,
970                 .capture = {
971                         .stream_name = "DP4 Capture",
972                         .channels_min = 1,
973                         .channels_max = 2,
974                         .rates = RT715_STEREO_RATES,
975                         .formats = RT715_FORMATS,
976                 },
977                 .ops = &rt715_ops,
978         },
979 };
980 
981 /* Bus clock frequency */
982 #define RT715_CLK_FREQ_9600000HZ 9600000
983 #define RT715_CLK_FREQ_12000000HZ 12000000
984 #define RT715_CLK_FREQ_6000000HZ 6000000
985 #define RT715_CLK_FREQ_4800000HZ 4800000
986 #define RT715_CLK_FREQ_2400000HZ 2400000
987 #define RT715_CLK_FREQ_12288000HZ 12288000
988 
989 int rt715_clock_config(struct device *dev)
990 {
991         struct rt715_priv *rt715 = dev_get_drvdata(dev);
992         unsigned int clk_freq, value;
993 
994         clk_freq = (rt715->params.curr_dr_freq >> 1);
995 
996         switch (clk_freq) {
997         case RT715_CLK_FREQ_12000000HZ:
998                 value = 0x0;
999                 break;
1000         case RT715_CLK_FREQ_6000000HZ:
1001                 value = 0x1;
1002                 break;
1003         case RT715_CLK_FREQ_9600000HZ:
1004                 value = 0x2;
1005                 break;
1006         case RT715_CLK_FREQ_4800000HZ:
1007                 value = 0x3;
1008                 break;
1009         case RT715_CLK_FREQ_2400000HZ:
1010                 value = 0x4;
1011                 break;
1012         case RT715_CLK_FREQ_12288000HZ:
1013                 value = 0x5;
1014                 break;
1015         default:
1016                 return -EINVAL;
1017         }
1018 
1019         regmap_write(rt715->regmap, 0xe0, value);
1020         regmap_write(rt715->regmap, 0xf0, value);
1021 
1022         return 0;
1023 }
1024 
1025 int rt715_init(struct device *dev, struct regmap *sdw_regmap,
1026         struct regmap *regmap, struct sdw_slave *slave)
1027 {
1028         struct rt715_priv *rt715;
1029         int ret;
1030 
1031         rt715 = devm_kzalloc(dev, sizeof(*rt715), GFP_KERNEL);
1032         if (!rt715)
1033                 return -ENOMEM;
1034 
1035         dev_set_drvdata(dev, rt715);
1036         rt715->slave = slave;
1037         rt715->regmap = regmap;
1038         rt715->sdw_regmap = sdw_regmap;
1039 
1040         regcache_cache_only(rt715->regmap, true);
1041 
1042         /*
1043          * Mark hw_init to false
1044          * HW init will be performed when device reports present
1045          */
1046         rt715->hw_init = false;
1047         rt715->first_hw_init = false;
1048 
1049         ret = devm_snd_soc_register_component(dev,
1050                                                 &soc_codec_dev_rt715,
1051                                                 rt715_dai,
1052                                                 ARRAY_SIZE(rt715_dai));
1053         if (ret < 0)
1054                 return ret;
1055 
1056         /* set autosuspend parameters */
1057         pm_runtime_set_autosuspend_delay(dev, 3000);
1058         pm_runtime_use_autosuspend(dev);
1059 
1060         /* make sure the device does not suspend immediately */
1061         pm_runtime_mark_last_busy(dev);
1062 
1063         pm_runtime_enable(dev);
1064 
1065         /* important note: the device is NOT tagged as 'active' and will remain
1066          * 'suspended' until the hardware is enumerated/initialized. This is required
1067          * to make sure the ASoC framework use of pm_runtime_get_sync() does not silently
1068          * fail with -EACCESS because of race conditions between card creation and enumeration
1069          */
1070 
1071         return 0;
1072 }
1073 
1074 int rt715_io_init(struct device *dev, struct sdw_slave *slave)
1075 {
1076         struct rt715_priv *rt715 = dev_get_drvdata(dev);
1077 
1078         if (rt715->hw_init)
1079                 return 0;
1080 
1081         regcache_cache_only(rt715->regmap, false);
1082 
1083         /*
1084          *  PM runtime status is marked as 'active' only when a Slave reports as Attached
1085          */
1086         if (!rt715->first_hw_init)
1087                 /* update count of parent 'active' children */
1088                 pm_runtime_set_active(&slave->dev);
1089 
1090         pm_runtime_get_noresume(&slave->dev);
1091 
1092         rt715_reset(rt715->regmap);
1093 
1094         /* Mute nid=08h/09h */
1095         regmap_write(rt715->regmap, RT715_SET_GAIN_LINE_ADC_H, 0xb080);
1096         regmap_write(rt715->regmap, RT715_SET_GAIN_MIX_ADC_H, 0xb080);
1097         /* Mute nid=07h/27h */
1098         regmap_write(rt715->regmap, RT715_SET_GAIN_MIC_ADC_H, 0xb080);
1099         regmap_write(rt715->regmap, RT715_SET_GAIN_MIX_ADC2_H, 0xb080);
1100 
1101         /* Set Pin Widget */
1102         regmap_write(rt715->regmap, RT715_SET_PIN_DMIC1, 0x20);
1103         regmap_write(rt715->regmap, RT715_SET_PIN_DMIC2, 0x20);
1104         regmap_write(rt715->regmap, RT715_SET_PIN_DMIC3, 0x20);
1105         regmap_write(rt715->regmap, RT715_SET_PIN_DMIC4, 0x20);
1106         /* Set Converter Stream */
1107         regmap_write(rt715->regmap, RT715_SET_STREAMID_LINE_ADC, 0x10);
1108         regmap_write(rt715->regmap, RT715_SET_STREAMID_MIX_ADC, 0x10);
1109         regmap_write(rt715->regmap, RT715_SET_STREAMID_MIC_ADC, 0x10);
1110         regmap_write(rt715->regmap, RT715_SET_STREAMID_MIX_ADC2, 0x10);
1111         /* Set Configuration Default */
1112         regmap_write(rt715->regmap, RT715_SET_DMIC1_CONFIG_DEFAULT1, 0xd0);
1113         regmap_write(rt715->regmap, RT715_SET_DMIC1_CONFIG_DEFAULT2, 0x11);
1114         regmap_write(rt715->regmap, RT715_SET_DMIC1_CONFIG_DEFAULT3, 0xa1);
1115         regmap_write(rt715->regmap, RT715_SET_DMIC1_CONFIG_DEFAULT4, 0x81);
1116         regmap_write(rt715->regmap, RT715_SET_DMIC2_CONFIG_DEFAULT1, 0xd1);
1117         regmap_write(rt715->regmap, RT715_SET_DMIC2_CONFIG_DEFAULT2, 0x11);
1118         regmap_write(rt715->regmap, RT715_SET_DMIC2_CONFIG_DEFAULT3, 0xa1);
1119         regmap_write(rt715->regmap, RT715_SET_DMIC2_CONFIG_DEFAULT4, 0x81);
1120         regmap_write(rt715->regmap, RT715_SET_DMIC3_CONFIG_DEFAULT1, 0xd0);
1121         regmap_write(rt715->regmap, RT715_SET_DMIC3_CONFIG_DEFAULT2, 0x11);
1122         regmap_write(rt715->regmap, RT715_SET_DMIC3_CONFIG_DEFAULT3, 0xa1);
1123         regmap_write(rt715->regmap, RT715_SET_DMIC3_CONFIG_DEFAULT4, 0x81);
1124         regmap_write(rt715->regmap, RT715_SET_DMIC4_CONFIG_DEFAULT1, 0xd1);
1125         regmap_write(rt715->regmap, RT715_SET_DMIC4_CONFIG_DEFAULT2, 0x11);
1126         regmap_write(rt715->regmap, RT715_SET_DMIC4_CONFIG_DEFAULT3, 0xa1);
1127         regmap_write(rt715->regmap, RT715_SET_DMIC4_CONFIG_DEFAULT4, 0x81);
1128 
1129         /* Finish Initial Settings, set power to D3 */
1130         regmap_write(rt715->regmap, RT715_SET_AUDIO_POWER_STATE, AC_PWRST_D3);
1131 
1132         if (rt715->first_hw_init)
1133                 regcache_mark_dirty(rt715->regmap);
1134         else
1135                 rt715->first_hw_init = true;
1136 
1137         /* Mark Slave initialization complete */
1138         rt715->hw_init = true;
1139 
1140         pm_runtime_mark_last_busy(&slave->dev);
1141         pm_runtime_put_autosuspend(&slave->dev);
1142 
1143         return 0;
1144 }
1145 
1146 MODULE_DESCRIPTION("ASoC rt715 driver");
1147 MODULE_DESCRIPTION("ASoC rt715 driver SDW");
1148 MODULE_AUTHOR("Jack Yu <jack.yu@realtek.com>");
1149 MODULE_LICENSE("GPL v2");
1150 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php