Lines Matching +full:adc +full:- +full:mux

1 // SPDX-License-Identifier: GPL-2.0-only
3 * rt5645.c -- RT5645 ALSA SoC audio codec driver
26 #include <sound/soc-dapm.h>
41 static unsigned int quirk = -1;
437 /* Some (package) variants have the headset-mic pin not-connected */
668 static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0);
669 static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -6525, 75, 0);
670 static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0);
671 static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -1725, 75, 0);
685 /* {-6, -4.5, -3, -1.5, 0, 0.82, 1.58, 2.28} dB */
687 0, 4, TLV_DB_SCALE_ITEM(-600, 150, 0),
696 uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; in rt5645_hweq_info()
697 uinfo->count = RT5645_HWEQ_NUM * sizeof(struct rt5645_eq_param_s); in rt5645_hweq_info()
708 (struct rt5645_eq_param_s_be16 *)ucontrol->value.bytes.data; in rt5645_hweq_get()
712 eq_param[i].reg = cpu_to_be16(rt5645->eq_param[i].reg); in rt5645_hweq_get()
713 eq_param[i].val = cpu_to_be16(rt5645->eq_param[i].val); in rt5645_hweq_get()
734 (struct rt5645_eq_param_s_be16 *)ucontrol->value.bytes.data; in rt5645_hweq_put()
738 rt5645->eq_param[i].reg = be16_to_cpu(eq_param[i].reg); in rt5645_hweq_put()
739 rt5645->eq_param[i].val = be16_to_cpu(eq_param[i].val); in rt5645_hweq_put()
743 for (i = RT5645_HWEQ_NUM - 1; i >= 0; i--) { in rt5645_hweq_put()
744 if (rt5645->eq_param[i].reg == 0) in rt5645_hweq_put()
746 else if (rt5645->eq_param[i].reg != RT5645_EQ_CTRL2) in rt5645_hweq_put()
753 if (!rt5645_validate_hweq(rt5645->eq_param[i].reg) && in rt5645_hweq_put()
754 rt5645->eq_param[i].reg != 0) in rt5645_hweq_put()
756 else if (rt5645->eq_param[i].reg == 0) in rt5645_hweq_put()
777 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS, in rt5645_spk_put_volsw()
782 mod_delayed_work(system_power_efficient_wq, &rt5645->rcclock_work, in rt5645_spk_put_volsw()
840 /* ADC Digital Volume Control */
841 SOC_DOUBLE("ADC Capture Switch", RT5645_STO1_ADC_DIG_VOL,
843 SOC_DOUBLE_TLV("ADC Capture Volume", RT5645_STO1_ADC_DIG_VOL,
845 SOC_DOUBLE("Mono ADC Capture Switch", RT5645_MONO_ADC_DIG_VOL,
847 SOC_DOUBLE_TLV("Mono ADC Capture Volume", RT5645_MONO_ADC_DIG_VOL,
850 /* ADC Boost Volume Control */
851 SOC_DOUBLE_TLV("ADC Boost Capture Volume", RT5645_ADC_BST_VOL1,
854 SOC_DOUBLE_TLV("Mono ADC Boost Capture Volume", RT5645_ADC_BST_VOL2,
868 * set_dmic_clk - Set parameter of dmic.
878 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in set_dmic_clk()
882 rate = rt5645->sysclk / rl6231_get_pre_div(rt5645->regmap, in set_dmic_clk()
886 dev_err(component->dev, "Failed to set DMIC clock\n"); in set_dmic_clk()
896 struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); in is_sys_clk_from_pll()
910 struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); in is_using_asrc()
913 switch (source->shift) { in is_using_asrc()
961 if (rt5645_validate_hweq(rt5645->eq_param[i].reg)) in rt5645_enable_hweq()
962 regmap_write(rt5645->regmap, rt5645->eq_param[i].reg, in rt5645_enable_hweq()
963 rt5645->eq_param[i].val); in rt5645_enable_hweq()
972 * rt5645_sel_asrc_clk_src - select ASRC clock source for a set of filters
1001 return -EINVAL; in rt5645_sel_asrc_clk_src()
1082 SOC_DAPM_SINGLE("Stereo ADC Switch", RT5645_AD_DA_MIXER,
1089 SOC_DAPM_SINGLE("Stereo ADC Switch", RT5645_AD_DA_MIXER,
1278 /*DAC1 L/R source*/ /* MX-29 [9:8] [11:10] */
1297 /*DAC2 L/R source*/ /* MX-1B [6:4] [2:0] */
1299 "IF1 DAC", "IF2 DAC", "IF3 DAC", "Mono ADC", "VAD_ADC"
1310 "IF1 DAC", "IF2 DAC", "IF3 DAC", "Mono ADC", "Haptic"
1320 /* Stereo1 ADC source */
1321 /* MX-27 [12] */
1323 "DAC MIX", "ADC"
1331 SOC_DAPM_ENUM("Stereo1 ADC1 Mux", rt5645_stereo1_adc1_enum);
1333 /* MX-27 [11] */
1343 SOC_DAPM_ENUM("Stereo1 ADC2 Mux", rt5645_stereo1_adc2_enum);
1345 /* MX-27 [8] */
1357 /* Mono ADC source */
1358 /* MX-28 [12] */
1360 "Mono DAC MIXL", "ADC"
1369 /* MX-28 [11] */
1381 /* MX-28 [8] */
1392 /* MX-28 [1:0] */
1399 /* MX-28 [4] */
1401 "Mono DAC MIXR", "ADC"
1410 /* MX-28 [3] */
1422 /* MX-77 [9:8] */
1433 SOC_DAPM_ENUM("IF1 ADC IN source", rt5645_if1_adc_in_enum);
1435 /* MX-78 [4:0] */
1471 SOC_DAPM_ENUM("IF1 ADC IN source", rt5650_if1_adc_in_enum);
1473 /* MX-78 [15:14][13:12][11:10] */
1496 /* MX-77 [7:6][5:4][3:2] */
1515 /* MX-79 [14:12][10:8][6:4][2:0] */
1544 /* MX-7a [14:12][10:8][6:4][2:0] */
1569 /* MX-2d [3] [2] */
1588 /* MX-2d [1] [0] */
1607 /* MX-2F [13:12] */
1617 SOC_DAPM_ENUM("IF2 ADC IN source", rt5645_if2_adc_in_enum);
1619 /* MX-31 [15] [13] [11] [9] */
1638 /* MX-9D [9:8] */
1640 "Sto1 ADC L", "Mono ADC L", "Mono ADC R"
1648 SOC_DAPM_ENUM("VAD ADC source", rt5645_vad_adc_enum);
1682 if (rt5645->codec_type == CODEC_TYPE_RT5650) { in hp_amp_power()
1687 regmap_write(rt5645->regmap, RT5645_PR_BASE + in hp_amp_power()
1691 regmap_read(rt5645->regmap, RT5645_PR_BASE + in hp_amp_power()
1698 regmap_write(rt5645->regmap, RT5645_PR_BASE + in hp_amp_power()
1701 regmap_write(rt5645->regmap, RT5645_PR_BASE + in hp_amp_power()
1713 regmap_write(rt5645->regmap, RT5645_PR_BASE + in hp_amp_power()
1735 regmap_write(rt5645->regmap, RT5645_PR_BASE + in hp_amp_power()
1737 regmap_write(rt5645->regmap, RT5645_PR_BASE + in hp_amp_power()
1743 hp_amp_power_count--; in hp_amp_power()
1745 if (rt5645->codec_type == CODEC_TYPE_RT5650) { in hp_amp_power()
1746 regmap_write(rt5645->regmap, RT5645_PR_BASE + in hp_amp_power()
1749 regmap_write(rt5645->regmap, RT5645_PR_BASE + in hp_amp_power()
1779 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5645_hp_event()
1786 if (rt5645->codec_type == CODEC_TYPE_RT5645) { in rt5645_hp_event()
1793 regmap_write(rt5645->regmap, RT5645_PR_BASE + in rt5645_hp_event()
1813 if (rt5645->codec_type == CODEC_TYPE_RT5645) { in rt5645_hp_event()
1820 regmap_write(rt5645->regmap, RT5645_PR_BASE + in rt5645_hp_event()
1845 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5645_spk_event()
1878 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5645_lout_event()
1908 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5645_bst2_event()
1931 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5645_set_micbias1_event()
1956 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5645_set_micbias2_event()
2006 SND_SOC_DAPM_SUPPLY_S("ADC STO1 ASRC", 1, RT5645_ASRC_1,
2008 SND_SOC_DAPM_SUPPLY_S("ADC MONO L ASRC", 1, RT5645_ASRC_1,
2010 SND_SOC_DAPM_SUPPLY_S("ADC MONO R ASRC", 1, RT5645_ASRC_1,
2059 SND_SOC_DAPM_ADC("ADC L", NULL, SND_SOC_NOPM, 0, 0),
2060 SND_SOC_DAPM_ADC("ADC R", NULL, SND_SOC_NOPM, 0, 0),
2062 SND_SOC_DAPM_SUPPLY("ADC L power", RT5645_PWR_DIG1,
2064 SND_SOC_DAPM_SUPPLY("ADC R power", RT5645_PWR_DIG1,
2067 /* ADC Mux */
2068 SND_SOC_DAPM_MUX("Stereo1 DMIC Mux", SND_SOC_NOPM, 0, 0,
2070 SND_SOC_DAPM_MUX("Stereo1 ADC L2 Mux", SND_SOC_NOPM, 0, 0,
2072 SND_SOC_DAPM_MUX("Stereo1 ADC R2 Mux", SND_SOC_NOPM, 0, 0,
2074 SND_SOC_DAPM_MUX("Stereo1 ADC L1 Mux", SND_SOC_NOPM, 0, 0,
2076 SND_SOC_DAPM_MUX("Stereo1 ADC R1 Mux", SND_SOC_NOPM, 0, 0,
2078 SND_SOC_DAPM_MUX("Mono DMIC L Mux", SND_SOC_NOPM, 0, 0,
2080 SND_SOC_DAPM_MUX("Mono DMIC R Mux", SND_SOC_NOPM, 0, 0,
2082 SND_SOC_DAPM_MUX("Mono ADC L2 Mux", SND_SOC_NOPM, 0, 0,
2084 SND_SOC_DAPM_MUX("Mono ADC L1 Mux", SND_SOC_NOPM, 0, 0,
2086 SND_SOC_DAPM_MUX("Mono ADC R1 Mux", SND_SOC_NOPM, 0, 0,
2088 SND_SOC_DAPM_MUX("Mono ADC R2 Mux", SND_SOC_NOPM, 0, 0,
2090 /* ADC Mixer */
2092 SND_SOC_DAPM_SUPPLY_S("adc stereo1 filter", 1, RT5645_PWR_DIG2,
2094 SND_SOC_DAPM_MIXER_E("Sto1 ADC MIXL", SND_SOC_NOPM, 0, 0,
2097 SND_SOC_DAPM_MIXER_E("Sto1 ADC MIXR", SND_SOC_NOPM, 0, 0,
2100 SND_SOC_DAPM_SUPPLY_S("adc mono left filter", 1, RT5645_PWR_DIG2,
2102 SND_SOC_DAPM_MIXER_E("Mono ADC MIXL", SND_SOC_NOPM, 0, 0,
2105 SND_SOC_DAPM_SUPPLY_S("adc mono right filter", 1, RT5645_PWR_DIG2,
2107 SND_SOC_DAPM_MIXER_E("Mono ADC MIXR", SND_SOC_NOPM, 0, 0,
2111 /* ADC PGA */
2112 SND_SOC_DAPM_PGA("Stereo1 ADC MIXL", SND_SOC_NOPM, 0, 0, NULL, 0),
2113 SND_SOC_DAPM_PGA("Stereo1 ADC MIXR", SND_SOC_NOPM, 0, 0, NULL, 0),
2114 SND_SOC_DAPM_PGA("Sto2 ADC LR MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
2123 /* IF1 2 Mux */
2124 SND_SOC_DAPM_MUX("IF2 ADC Mux", SND_SOC_NOPM,
2134 SND_SOC_DAPM_PGA("IF1 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
2135 SND_SOC_DAPM_PGA("IF1 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0),
2136 SND_SOC_DAPM_PGA("IF1 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0),
2142 SND_SOC_DAPM_PGA("IF2 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
2145 SND_SOC_DAPM_MUX("VAD ADC Mux", SND_SOC_NOPM,
2161 /* DAC2 channel Mux */
2162 SND_SOC_DAPM_MUX("DAC L2 Mux", SND_SOC_NOPM, 0, 0, &rt5645_dac_l2_mux),
2163 SND_SOC_DAPM_MUX("DAC R2 Mux", SND_SOC_NOPM, 0, 0, &rt5645_dac_r2_mux),
2169 SND_SOC_DAPM_MUX("DAC1 L Mux", SND_SOC_NOPM, 0, 0, &rt5645_dac1l_mux),
2170 SND_SOC_DAPM_MUX("DAC1 R Mux", SND_SOC_NOPM, 0, 0, &rt5645_dac1r_mux),
2249 SND_SOC_DAPM_MUX("PDM1 L Mux", SND_SOC_NOPM, 0, 0, &rt5645_pdm1_l_mux),
2250 SND_SOC_DAPM_MUX("PDM1 R Mux", SND_SOC_NOPM, 0, 0, &rt5645_pdm1_r_mux),
2267 SND_SOC_DAPM_MUX("RT5645 IF1 DAC1 L Mux", SND_SOC_NOPM, 0, 0,
2269 SND_SOC_DAPM_MUX("RT5645 IF1 DAC1 R Mux", SND_SOC_NOPM, 0, 0,
2271 SND_SOC_DAPM_MUX("RT5645 IF1 DAC2 L Mux", SND_SOC_NOPM, 0, 0,
2273 SND_SOC_DAPM_MUX("RT5645 IF1 DAC2 R Mux", SND_SOC_NOPM, 0, 0,
2275 SND_SOC_DAPM_MUX("RT5645 IF1 ADC Mux", SND_SOC_NOPM,
2277 SND_SOC_DAPM_MUX("RT5645 IF1 ADC1 Swap Mux", SND_SOC_NOPM,
2279 SND_SOC_DAPM_MUX("RT5645 IF1 ADC2 Swap Mux", SND_SOC_NOPM,
2281 SND_SOC_DAPM_MUX("RT5645 IF1 ADC3 Swap Mux", SND_SOC_NOPM,
2286 SND_SOC_DAPM_MUX("A DAC1 L Mux", SND_SOC_NOPM,
2288 SND_SOC_DAPM_MUX("A DAC1 R Mux", SND_SOC_NOPM,
2290 SND_SOC_DAPM_MUX("A DAC2 L Mux", SND_SOC_NOPM,
2292 SND_SOC_DAPM_MUX("A DAC2 R Mux", SND_SOC_NOPM,
2295 SND_SOC_DAPM_MUX("RT5650 IF1 ADC1 Swap Mux", SND_SOC_NOPM,
2297 SND_SOC_DAPM_MUX("RT5650 IF1 ADC2 Swap Mux", SND_SOC_NOPM,
2299 SND_SOC_DAPM_MUX("RT5650 IF1 ADC3 Swap Mux", SND_SOC_NOPM,
2301 SND_SOC_DAPM_MUX("RT5650 IF1 ADC Mux", SND_SOC_NOPM,
2304 SND_SOC_DAPM_MUX("RT5650 IF1 DAC1 L Mux", SND_SOC_NOPM, 0, 0,
2306 SND_SOC_DAPM_MUX("RT5650 IF1 DAC1 R Mux", SND_SOC_NOPM, 0, 0,
2308 SND_SOC_DAPM_MUX("RT5650 IF1 DAC2 L Mux", SND_SOC_NOPM, 0, 0,
2310 SND_SOC_DAPM_MUX("RT5650 IF1 DAC2 R Mux", SND_SOC_NOPM, 0, 0,
2315 { "adc stereo1 filter", NULL, "ADC STO1 ASRC", is_using_asrc },
2316 { "adc mono left filter", NULL, "ADC MONO L ASRC", is_using_asrc },
2317 { "adc mono right filter", NULL, "ADC MONO R ASRC", is_using_asrc },
2355 { "ADC L", NULL, "RECMIXL" },
2356 { "ADC L", NULL, "ADC L power" },
2357 { "ADC R", NULL, "RECMIXR" },
2358 { "ADC R", NULL, "ADC R power" },
2369 { "Stereo1 DMIC Mux", "DMIC1", "DMIC1" },
2370 { "Stereo1 DMIC Mux", "DMIC2", "DMIC2" },
2371 { "Stereo1 DMIC Mux", NULL, "DMIC STO1 ASRC" },
2373 { "Mono DMIC L Mux", "DMIC1", "DMIC L1" },
2374 { "Mono DMIC L Mux", "DMIC2", "DMIC L2" },
2375 { "Mono DMIC L Mux", NULL, "DMIC MONO L ASRC" },
2377 { "Mono DMIC R Mux", "DMIC1", "DMIC R1" },
2378 { "Mono DMIC R Mux", "DMIC2", "DMIC R2" },
2379 { "Mono DMIC R Mux", NULL, "DMIC MONO R ASRC" },
2381 { "Stereo1 ADC L2 Mux", "DMIC", "Stereo1 DMIC Mux" },
2382 { "Stereo1 ADC L2 Mux", "DAC MIX", "DAC MIXL" },
2383 { "Stereo1 ADC L1 Mux", "ADC", "ADC L" },
2384 { "Stereo1 ADC L1 Mux", "DAC MIX", "DAC MIXL" },
2386 { "Stereo1 ADC R1 Mux", "ADC", "ADC R" },
2387 { "Stereo1 ADC R1 Mux", "DAC MIX", "DAC MIXR" },
2388 { "Stereo1 ADC R2 Mux", "DMIC", "Stereo1 DMIC Mux" },
2389 { "Stereo1 ADC R2 Mux", "DAC MIX", "DAC MIXR" },
2391 { "Mono ADC L2 Mux", "DMIC", "Mono DMIC L Mux" },
2392 { "Mono ADC L2 Mux", "Mono DAC MIXL", "Mono DAC MIXL" },
2393 { "Mono ADC L1 Mux", "Mono DAC MIXL", "Mono DAC MIXL" },
2394 { "Mono ADC L1 Mux", "ADC", "ADC L" },
2396 { "Mono ADC R1 Mux", "Mono DAC MIXR", "Mono DAC MIXR" },
2397 { "Mono ADC R1 Mux", "ADC", "ADC R" },
2398 { "Mono ADC R2 Mux", "DMIC", "Mono DMIC R Mux" },
2399 { "Mono ADC R2 Mux", "Mono DAC MIXR", "Mono DAC MIXR" },
2401 { "Sto1 ADC MIXL", "ADC1 Switch", "Stereo1 ADC L1 Mux" },
2402 { "Sto1 ADC MIXL", "ADC2 Switch", "Stereo1 ADC L2 Mux" },
2403 { "Sto1 ADC MIXR", "ADC1 Switch", "Stereo1 ADC R1 Mux" },
2404 { "Sto1 ADC MIXR", "ADC2 Switch", "Stereo1 ADC R2 Mux" },
2406 { "Stereo1 ADC MIXL", NULL, "Sto1 ADC MIXL" },
2407 { "Stereo1 ADC MIXL", NULL, "adc stereo1 filter" },
2408 { "adc stereo1 filter", NULL, "PLL1", is_sys_clk_from_pll },
2410 { "Stereo1 ADC MIXR", NULL, "Sto1 ADC MIXR" },
2411 { "Stereo1 ADC MIXR", NULL, "adc stereo1 filter" },
2412 { "adc stereo1 filter", NULL, "PLL1", is_sys_clk_from_pll },
2414 { "Mono ADC MIXL", "ADC1 Switch", "Mono ADC L1 Mux" },
2415 { "Mono ADC MIXL", "ADC2 Switch", "Mono ADC L2 Mux" },
2416 { "Mono ADC MIXL", NULL, "adc mono left filter" },
2417 { "adc mono left filter", NULL, "PLL1", is_sys_clk_from_pll },
2419 { "Mono ADC MIXR", "ADC1 Switch", "Mono ADC R1 Mux" },
2420 { "Mono ADC MIXR", "ADC2 Switch", "Mono ADC R2 Mux" },
2421 { "Mono ADC MIXR", NULL, "adc mono right filter" },
2422 { "adc mono right filter", NULL, "PLL1", is_sys_clk_from_pll },
2424 { "VAD ADC Mux", "Sto1 ADC L", "Stereo1 ADC MIXL" },
2425 { "VAD ADC Mux", "Mono ADC L", "Mono ADC MIXL" },
2426 { "VAD ADC Mux", "Mono ADC R", "Mono ADC MIXR" },
2428 { "IF_ADC1", NULL, "Stereo1 ADC MIXL" },
2429 { "IF_ADC1", NULL, "Stereo1 ADC MIXR" },
2430 { "IF_ADC2", NULL, "Mono ADC MIXL" },
2431 { "IF_ADC2", NULL, "Mono ADC MIXR" },
2432 { "VAD_ADC", NULL, "VAD ADC Mux" },
2434 { "IF2 ADC Mux", "IF_ADC1", "IF_ADC1" },
2435 { "IF2 ADC Mux", "IF_ADC2", "IF_ADC2" },
2436 { "IF2 ADC Mux", "VAD_ADC", "VAD_ADC" },
2438 { "IF1 ADC", NULL, "I2S1" },
2439 { "IF2 ADC", NULL, "I2S2" },
2440 { "IF2 ADC", NULL, "IF2 ADC Mux" },
2442 { "AIF2TX", NULL, "IF2 ADC" },
2459 { "DAC1 L Mux", "IF2 DAC", "IF2 DAC L" },
2460 { "DAC1 R Mux", "IF2 DAC", "IF2 DAC R" },
2462 { "DAC1 MIXL", "Stereo ADC Switch", "Stereo1 ADC MIXL" },
2463 { "DAC1 MIXL", "DAC1 Switch", "DAC1 L Mux" },
2465 { "DAC1 MIXR", "Stereo ADC Switch", "Stereo1 ADC MIXR" },
2466 { "DAC1 MIXR", "DAC1 Switch", "DAC1 R Mux" },
2469 { "DAC L2 Mux", "IF2 DAC", "IF2 DAC L" },
2470 { "DAC L2 Mux", "Mono ADC", "Mono ADC MIXL" },
2471 { "DAC L2 Mux", "VAD_ADC", "VAD_ADC" },
2472 { "DAC L2 Volume", NULL, "DAC L2 Mux" },
2475 { "DAC R2 Mux", "IF2 DAC", "IF2 DAC R" },
2476 { "DAC R2 Mux", "Mono ADC", "Mono ADC MIXR" },
2477 { "DAC R2 Mux", "Haptic", "Haptic Generator" },
2478 { "DAC R2 Volume", NULL, "DAC R2 Mux" },
2565 { "PDM1 L Mux", "Stereo DAC", "Stereo DAC MIXL" },
2566 { "PDM1 L Mux", "Mono DAC", "Mono DAC MIXL" },
2567 { "PDM1 L Mux", NULL, "PDM1 Power" },
2568 { "PDM1 R Mux", "Stereo DAC", "Stereo DAC MIXR" },
2569 { "PDM1 R Mux", "Mono DAC", "Mono DAC MIXR" },
2570 { "PDM1 R Mux", NULL, "PDM1 Power" },
2583 { "PDM1 L", "Switch", "PDM1 L Mux" },
2584 { "PDM1 R", "Switch", "PDM1 R Mux" },
2596 { "A DAC1 L Mux", "DAC1", "DAC1 MIXL"},
2597 { "A DAC1 L Mux", "Stereo DAC Mixer", "Stereo DAC MIXL"},
2598 { "A DAC1 R Mux", "DAC1", "DAC1 MIXR"},
2599 { "A DAC1 R Mux", "Stereo DAC Mixer", "Stereo DAC MIXR"},
2601 { "A DAC2 L Mux", "Stereo DAC Mixer", "Stereo DAC MIXL"},
2602 { "A DAC2 L Mux", "Mono DAC Mixer", "Mono DAC MIXL"},
2603 { "A DAC2 R Mux", "Stereo DAC Mixer", "Stereo DAC MIXR"},
2604 { "A DAC2 R Mux", "Mono DAC Mixer", "Mono DAC MIXR"},
2606 { "DAC L1", NULL, "A DAC1 L Mux" },
2607 { "DAC R1", NULL, "A DAC1 R Mux" },
2608 { "DAC L2", NULL, "A DAC2 L Mux" },
2609 { "DAC R2", NULL, "A DAC2 R Mux" },
2611 { "RT5650 IF1 ADC1 Swap Mux", "L/R", "IF_ADC1" },
2612 { "RT5650 IF1 ADC1 Swap Mux", "R/L", "IF_ADC1" },
2613 { "RT5650 IF1 ADC1 Swap Mux", "L/L", "IF_ADC1" },
2614 { "RT5650 IF1 ADC1 Swap Mux", "R/R", "IF_ADC1" },
2616 { "RT5650 IF1 ADC2 Swap Mux", "L/R", "IF_ADC2" },
2617 { "RT5650 IF1 ADC2 Swap Mux", "R/L", "IF_ADC2" },
2618 { "RT5650 IF1 ADC2 Swap Mux", "L/L", "IF_ADC2" },
2619 { "RT5650 IF1 ADC2 Swap Mux", "R/R", "IF_ADC2" },
2621 { "RT5650 IF1 ADC3 Swap Mux", "L/R", "VAD_ADC" },
2622 { "RT5650 IF1 ADC3 Swap Mux", "R/L", "VAD_ADC" },
2623 { "RT5650 IF1 ADC3 Swap Mux", "L/L", "VAD_ADC" },
2624 { "RT5650 IF1 ADC3 Swap Mux", "R/R", "VAD_ADC" },
2626 { "IF1 ADC", NULL, "RT5650 IF1 ADC1 Swap Mux" },
2627 { "IF1 ADC", NULL, "RT5650 IF1 ADC2 Swap Mux" },
2628 { "IF1 ADC", NULL, "RT5650 IF1 ADC3 Swap Mux" },
2630 { "RT5650 IF1 ADC Mux", "IF_ADC1/IF_ADC2/DAC_REF/Null", "IF1 ADC" },
2631 { "RT5650 IF1 ADC Mux", "IF_ADC1/IF_ADC2/Null/DAC_REF", "IF1 ADC" },
2632 { "RT5650 IF1 ADC Mux", "IF_ADC1/DAC_REF/IF_ADC2/Null", "IF1 ADC" },
2633 { "RT5650 IF1 ADC Mux", "IF_ADC1/DAC_REF/Null/IF_ADC2", "IF1 ADC" },
2634 { "RT5650 IF1 ADC Mux", "IF_ADC1/Null/DAC_REF/IF_ADC2", "IF1 ADC" },
2635 { "RT5650 IF1 ADC Mux", "IF_ADC1/Null/IF_ADC2/DAC_REF", "IF1 ADC" },
2637 { "RT5650 IF1 ADC Mux", "IF_ADC2/IF_ADC1/DAC_REF/Null", "IF1 ADC" },
2638 { "RT5650 IF1 ADC Mux", "IF_ADC2/IF_ADC1/Null/DAC_REF", "IF1 ADC" },
2639 { "RT5650 IF1 ADC Mux", "IF_ADC2/DAC_REF/IF_ADC1/Null", "IF1 ADC" },
2640 { "RT5650 IF1 ADC Mux", "IF_ADC2/DAC_REF/Null/IF_ADC1", "IF1 ADC" },
2641 { "RT5650 IF1 ADC Mux", "IF_ADC2/Null/DAC_REF/IF_ADC1", "IF1 ADC" },
2642 { "RT5650 IF1 ADC Mux", "IF_ADC2/Null/IF_ADC1/DAC_REF", "IF1 ADC" },
2644 { "RT5650 IF1 ADC Mux", "DAC_REF/IF_ADC1/IF_ADC2/Null", "IF1 ADC" },
2645 { "RT5650 IF1 ADC Mux", "DAC_REF/IF_ADC1/Null/IF_ADC2", "IF1 ADC" },
2646 { "RT5650 IF1 ADC Mux", "DAC_REF/IF_ADC2/IF_ADC1/Null", "IF1 ADC" },
2647 { "RT5650 IF1 ADC Mux", "DAC_REF/IF_ADC2/Null/IF_ADC1", "IF1 ADC" },
2648 { "RT5650 IF1 ADC Mux", "DAC_REF/Null/IF_ADC1/IF_ADC2", "IF1 ADC" },
2649 { "RT5650 IF1 ADC Mux", "DAC_REF/Null/IF_ADC2/IF_ADC1", "IF1 ADC" },
2651 { "RT5650 IF1 ADC Mux", "Null/IF_ADC1/IF_ADC2/DAC_REF", "IF1 ADC" },
2652 { "RT5650 IF1 ADC Mux", "Null/IF_ADC1/DAC_REF/IF_ADC2", "IF1 ADC" },
2653 { "RT5650 IF1 ADC Mux", "Null/IF_ADC2/IF_ADC1/DAC_REF", "IF1 ADC" },
2654 { "RT5650 IF1 ADC Mux", "Null/IF_ADC2/DAC_REF/IF_ADC1", "IF1 ADC" },
2655 { "RT5650 IF1 ADC Mux", "Null/DAC_REF/IF_ADC1/IF_ADC2", "IF1 ADC" },
2656 { "RT5650 IF1 ADC Mux", "Null/DAC_REF/IF_ADC2/IF_ADC1", "IF1 ADC" },
2657 { "AIF1TX", NULL, "RT5650 IF1 ADC Mux" },
2659 { "RT5650 IF1 DAC1 L Mux", "Slot0", "IF1 DAC0" },
2660 { "RT5650 IF1 DAC1 L Mux", "Slot1", "IF1 DAC1" },
2661 { "RT5650 IF1 DAC1 L Mux", "Slot2", "IF1 DAC2" },
2662 { "RT5650 IF1 DAC1 L Mux", "Slot3", "IF1 DAC3" },
2664 { "RT5650 IF1 DAC1 R Mux", "Slot0", "IF1 DAC0" },
2665 { "RT5650 IF1 DAC1 R Mux", "Slot1", "IF1 DAC1" },
2666 { "RT5650 IF1 DAC1 R Mux", "Slot2", "IF1 DAC2" },
2667 { "RT5650 IF1 DAC1 R Mux", "Slot3", "IF1 DAC3" },
2669 { "RT5650 IF1 DAC2 L Mux", "Slot0", "IF1 DAC0" },
2670 { "RT5650 IF1 DAC2 L Mux", "Slot1", "IF1 DAC1" },
2671 { "RT5650 IF1 DAC2 L Mux", "Slot2", "IF1 DAC2" },
2672 { "RT5650 IF1 DAC2 L Mux", "Slot3", "IF1 DAC3" },
2674 { "RT5650 IF1 DAC2 R Mux", "Slot0", "IF1 DAC0" },
2675 { "RT5650 IF1 DAC2 R Mux", "Slot1", "IF1 DAC1" },
2676 { "RT5650 IF1 DAC2 R Mux", "Slot2", "IF1 DAC2" },
2677 { "RT5650 IF1 DAC2 R Mux", "Slot3", "IF1 DAC3" },
2679 { "DAC1 L Mux", "IF1 DAC", "RT5650 IF1 DAC1 L Mux" },
2680 { "DAC1 R Mux", "IF1 DAC", "RT5650 IF1 DAC1 R Mux" },
2682 { "DAC L2 Mux", "IF1 DAC", "RT5650 IF1 DAC2 L Mux" },
2683 { "DAC R2 Mux", "IF1 DAC", "RT5650 IF1 DAC2 R Mux" },
2692 { "RT5645 IF1 ADC1 Swap Mux", "L/R", "IF_ADC1" },
2693 { "RT5645 IF1 ADC1 Swap Mux", "R/L", "IF_ADC1" },
2694 { "RT5645 IF1 ADC1 Swap Mux", "L/L", "IF_ADC1" },
2695 { "RT5645 IF1 ADC1 Swap Mux", "R/R", "IF_ADC1" },
2697 { "RT5645 IF1 ADC2 Swap Mux", "L/R", "IF_ADC2" },
2698 { "RT5645 IF1 ADC2 Swap Mux", "R/L", "IF_ADC2" },
2699 { "RT5645 IF1 ADC2 Swap Mux", "L/L", "IF_ADC2" },
2700 { "RT5645 IF1 ADC2 Swap Mux", "R/R", "IF_ADC2" },
2702 { "RT5645 IF1 ADC3 Swap Mux", "L/R", "VAD_ADC" },
2703 { "RT5645 IF1 ADC3 Swap Mux", "R/L", "VAD_ADC" },
2704 { "RT5645 IF1 ADC3 Swap Mux", "L/L", "VAD_ADC" },
2705 { "RT5645 IF1 ADC3 Swap Mux", "R/R", "VAD_ADC" },
2707 { "IF1 ADC", NULL, "RT5645 IF1 ADC1 Swap Mux" },
2708 { "IF1 ADC", NULL, "RT5645 IF1 ADC2 Swap Mux" },
2709 { "IF1 ADC", NULL, "RT5645 IF1 ADC3 Swap Mux" },
2711 { "RT5645 IF1 ADC Mux", "IF_ADC1/IF_ADC2/VAD_ADC", "IF1 ADC" },
2712 { "RT5645 IF1 ADC Mux", "IF_ADC2/IF_ADC1/VAD_ADC", "IF1 ADC" },
2713 { "RT5645 IF1 ADC Mux", "VAD_ADC/IF_ADC1/IF_ADC2", "IF1 ADC" },
2714 { "RT5645 IF1 ADC Mux", "VAD_ADC/IF_ADC2/IF_ADC1", "IF1 ADC" },
2715 { "AIF1TX", NULL, "RT5645 IF1 ADC Mux" },
2717 { "RT5645 IF1 DAC1 L Mux", "Slot0", "IF1 DAC0" },
2718 { "RT5645 IF1 DAC1 L Mux", "Slot1", "IF1 DAC1" },
2719 { "RT5645 IF1 DAC1 L Mux", "Slot2", "IF1 DAC2" },
2720 { "RT5645 IF1 DAC1 L Mux", "Slot3", "IF1 DAC3" },
2722 { "RT5645 IF1 DAC1 R Mux", "Slot0", "IF1 DAC0" },
2723 { "RT5645 IF1 DAC1 R Mux", "Slot1", "IF1 DAC1" },
2724 { "RT5645 IF1 DAC1 R Mux", "Slot2", "IF1 DAC2" },
2725 { "RT5645 IF1 DAC1 R Mux", "Slot3", "IF1 DAC3" },
2727 { "RT5645 IF1 DAC2 L Mux", "Slot0", "IF1 DAC0" },
2728 { "RT5645 IF1 DAC2 L Mux", "Slot1", "IF1 DAC1" },
2729 { "RT5645 IF1 DAC2 L Mux", "Slot2", "IF1 DAC2" },
2730 { "RT5645 IF1 DAC2 L Mux", "Slot3", "IF1 DAC3" },
2732 { "RT5645 IF1 DAC2 R Mux", "Slot0", "IF1 DAC0" },
2733 { "RT5645 IF1 DAC2 R Mux", "Slot1", "IF1 DAC1" },
2734 { "RT5645 IF1 DAC2 R Mux", "Slot2", "IF1 DAC2" },
2735 { "RT5645 IF1 DAC2 R Mux", "Slot3", "IF1 DAC3" },
2737 { "DAC1 L Mux", "IF1 DAC", "RT5645 IF1 DAC1 L Mux" },
2738 { "DAC1 R Mux", "IF1 DAC", "RT5645 IF1 DAC1 R Mux" },
2740 { "DAC L2 Mux", "IF1 DAC", "RT5645 IF1 DAC2 L Mux" },
2741 { "DAC R2 Mux", "IF1 DAC", "RT5645 IF1 DAC2 R Mux" },
2752 struct snd_soc_component *component = dai->component; in rt5645_hw_params()
2757 rt5645->lrck[dai->id] = params_rate(params); in rt5645_hw_params()
2758 pre_div = rl6231_get_clk_info(rt5645->sysclk, rt5645->lrck[dai->id]); in rt5645_hw_params()
2760 dev_err(component->dev, "Unsupported clock setting\n"); in rt5645_hw_params()
2761 return -EINVAL; in rt5645_hw_params()
2765 dev_err(component->dev, "Unsupported frame size: %d\n", frame_size); in rt5645_hw_params()
2766 return -EINVAL; in rt5645_hw_params()
2769 switch (rt5645->codec_type) { in rt5645_hw_params()
2779 rt5645->bclk[dai->id] = rt5645->lrck[dai->id] * (32 << bclk_ms); in rt5645_hw_params()
2781 dev_dbg(dai->dev, "bclk is %dHz and lrck is %dHz\n", in rt5645_hw_params()
2782 rt5645->bclk[dai->id], rt5645->lrck[dai->id]); in rt5645_hw_params()
2783 dev_dbg(dai->dev, "bclk_ms is %d and pre_div is %d for iis %d\n", in rt5645_hw_params()
2784 bclk_ms, pre_div, dai->id); in rt5645_hw_params()
2799 return -EINVAL; in rt5645_hw_params()
2802 switch (dai->id) { in rt5645_hw_params()
2819 dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); in rt5645_hw_params()
2820 return -EINVAL; in rt5645_hw_params()
2828 struct snd_soc_component *component = dai->component; in rt5645_set_dai_fmt()
2832 switch (rt5645->codec_type) { in rt5645_set_dai_fmt()
2843 rt5645->master[dai->id] = 1; in rt5645_set_dai_fmt()
2847 rt5645->master[dai->id] = 0; in rt5645_set_dai_fmt()
2850 return -EINVAL; in rt5645_set_dai_fmt()
2860 return -EINVAL; in rt5645_set_dai_fmt()
2876 return -EINVAL; in rt5645_set_dai_fmt()
2878 switch (dai->id) { in rt5645_set_dai_fmt()
2890 dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); in rt5645_set_dai_fmt()
2891 return -EINVAL; in rt5645_set_dai_fmt()
2899 struct snd_soc_component *component = dai->component; in rt5645_set_dai_sysclk()
2903 if (freq == rt5645->sysclk && clk_id == rt5645->sysclk_src) in rt5645_set_dai_sysclk()
2917 dev_err(component->dev, "Invalid clock id (%d)\n", clk_id); in rt5645_set_dai_sysclk()
2918 return -EINVAL; in rt5645_set_dai_sysclk()
2922 rt5645->sysclk = freq; in rt5645_set_dai_sysclk()
2923 rt5645->sysclk_src = clk_id; in rt5645_set_dai_sysclk()
2925 dev_dbg(dai->dev, "Sysclk is %dHz and clock id is %d\n", freq, clk_id); in rt5645_set_dai_sysclk()
2933 struct snd_soc_component *component = dai->component; in rt5645_set_dai_pll()
2938 if (source == rt5645->pll_src && freq_in == rt5645->pll_in && in rt5645_set_dai_pll()
2939 freq_out == rt5645->pll_out) in rt5645_set_dai_pll()
2943 dev_dbg(component->dev, "PLL disabled\n"); in rt5645_set_dai_pll()
2945 rt5645->pll_in = 0; in rt5645_set_dai_pll()
2946 rt5645->pll_out = 0; in rt5645_set_dai_pll()
2959 switch (dai->id) { in rt5645_set_dai_pll()
2969 dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); in rt5645_set_dai_pll()
2970 return -EINVAL; in rt5645_set_dai_pll()
2974 dev_err(component->dev, "Unknown PLL source %d\n", source); in rt5645_set_dai_pll()
2975 return -EINVAL; in rt5645_set_dai_pll()
2980 dev_err(component->dev, "Unsupported input clock %d\n", freq_in); in rt5645_set_dai_pll()
2984 dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n", in rt5645_set_dai_pll()
2994 rt5645->pll_in = freq_in; in rt5645_set_dai_pll()
2995 rt5645->pll_out = freq_out; in rt5645_set_dai_pll()
2996 rt5645->pll_src = source; in rt5645_set_dai_pll()
3004 struct snd_soc_component *component = dai->component; in rt5645_set_tdm_slot()
3009 switch (rt5645->codec_type) { in rt5645_set_tdm_slot()
3027 if (rt5645->codec_type == CODEC_TYPE_RT5645) in rt5645_set_tdm_slot()
3102 if (rt5645->en_button_func) in rt5645_set_bias_level()
3104 &rt5645->jack_detect_work, in rt5645_set_bias_level()
3111 if (!rt5645->en_button_func) in rt5645_set_bias_level()
3133 snd_soc_dapm_force_enable_pin(dapm, "ADC L power"); in rt5645_enable_push_button_irq()
3134 snd_soc_dapm_force_enable_pin(dapm, "ADC R power"); in rt5645_enable_push_button_irq()
3149 snd_soc_dapm_disable_pin(dapm, "ADC L power"); in rt5645_enable_push_button_irq()
3150 snd_soc_dapm_disable_pin(dapm, "ADC R power"); in rt5645_enable_push_button_irq()
3162 regmap_write(rt5645->regmap, RT5645_CHARGE_PUMP, 0x0206); in rt5645_jack_detect()
3168 if (!snd_soc_card_is_instantiated(dapm->card)) { in rt5645_jack_detect()
3171 regmap_update_bits(rt5645->regmap, RT5645_PWR_ANLG1, in rt5645_jack_detect()
3174 regmap_update_bits(rt5645->regmap, RT5645_PWR_MIXER, in rt5645_jack_detect()
3176 regmap_update_bits(rt5645->regmap, RT5645_PWR_VOL, in rt5645_jack_detect()
3180 regmap_write(rt5645->regmap, RT5645_JD_CTRL3, 0x00f0); in rt5645_jack_detect()
3181 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2, in rt5645_jack_detect()
3183 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1, in rt5645_jack_detect()
3186 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2, in rt5645_jack_detect()
3190 regmap_read(rt5645->regmap, RT5645_IN1_CTRL3, &val); in rt5645_jack_detect()
3192 dev_dbg(component->dev, "val = %d\n", val); in rt5645_jack_detect()
3194 if ((val == 1 || val == 2) && !rt5645->pdata.no_headset_mic) { in rt5645_jack_detect()
3195 rt5645->jack_type = SND_JACK_HEADSET; in rt5645_jack_detect()
3196 if (rt5645->en_button_func) { in rt5645_jack_detect()
3200 if (rt5645->en_button_func) in rt5645_jack_detect()
3204 rt5645->jack_type = SND_JACK_HEADPHONE; in rt5645_jack_detect()
3206 if (rt5645->pdata.level_trigger_irq) in rt5645_jack_detect()
3207 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2, in rt5645_jack_detect()
3210 regmap_write(rt5645->regmap, RT5645_CHARGE_PUMP, 0x0e06); in rt5645_jack_detect()
3212 rt5645->jack_type = 0; in rt5645_jack_detect()
3214 regmap_update_bits(rt5645->regmap, RT5645_HP_VOL, in rt5645_jack_detect()
3217 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2, in rt5645_jack_detect()
3219 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1, in rt5645_jack_detect()
3222 if (rt5645->en_button_func) in rt5645_jack_detect()
3225 if (rt5645->pdata.jd_mode == 0) in rt5645_jack_detect()
3229 if (rt5645->pdata.level_trigger_irq) in rt5645_jack_detect()
3230 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2, in rt5645_jack_detect()
3234 return rt5645->jack_type; in rt5645_jack_detect()
3257 rt5645->hp_jack = hp_jack; in rt5645_set_jack_detect()
3258 rt5645->mic_jack = mic_jack; in rt5645_set_jack_detect()
3259 rt5645->btn_jack = btn_jack; in rt5645_set_jack_detect()
3260 if (rt5645->btn_jack && rt5645->codec_type == CODEC_TYPE_RT5650) { in rt5645_set_jack_detect()
3261 rt5645->en_button_func = true; in rt5645_set_jack_detect()
3262 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_set_jack_detect()
3264 regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL1, in rt5645_set_jack_detect()
3266 regmap_update_bits(rt5645->regmap, RT5645_DEPOP_M1, in rt5645_set_jack_detect()
3301 if (!rt5645->component) in rt5645_jack_detect_work()
3304 mutex_lock(&rt5645->jd_mutex); in rt5645_jack_detect_work()
3306 switch (rt5645->pdata.jd_mode) { in rt5645_jack_detect_work()
3308 if (rt5645->gpiod_hp_det) { in rt5645_jack_detect_work()
3309 gpio_state = gpiod_get_value(rt5645->gpiod_hp_det); in rt5645_jack_detect_work()
3310 if (rt5645->pdata.inv_hp_pol) in rt5645_jack_detect_work()
3312 dev_dbg(rt5645->component->dev, "gpio_state = %d\n", in rt5645_jack_detect_work()
3314 report = rt5645_jack_detect(rt5645->component, gpio_state); in rt5645_jack_detect_work()
3316 snd_soc_jack_report(rt5645->hp_jack, in rt5645_jack_detect_work()
3318 snd_soc_jack_report(rt5645->mic_jack, in rt5645_jack_detect_work()
3320 mutex_unlock(&rt5645->jd_mutex); in rt5645_jack_detect_work()
3323 val = snd_soc_component_read(rt5645->component, RT5645_A_JD_CTRL1) & 0x0020; in rt5645_jack_detect_work()
3326 val = snd_soc_component_read(rt5645->component, RT5645_INT_IRQ_ST) & 0x1000; in rt5645_jack_detect_work()
3331 if (!val && (rt5645->jack_type == 0)) { /* jack in */ in rt5645_jack_detect_work()
3332 report = rt5645_jack_detect(rt5645->component, 1); in rt5645_jack_detect_work()
3333 } else if (!val && rt5645->jack_type == SND_JACK_HEADSET) { in rt5645_jack_detect_work()
3336 if (snd_soc_component_read(rt5645->component, RT5645_INT_IRQ_ST) & 0x4) { in rt5645_jack_detect_work()
3339 btn_type = rt5645_button_detect(rt5645->component); in rt5645_jack_detect_work()
3369 dev_err(rt5645->component->dev, in rt5645_jack_detect_work()
3376 report = rt5645->jack_type; in rt5645_jack_detect_work()
3378 mod_timer(&rt5645->btn_check_timer, in rt5645_jack_detect_work()
3384 snd_soc_component_update_bits(rt5645->component, in rt5645_jack_detect_work()
3386 rt5645_jack_detect(rt5645->component, 0); in rt5645_jack_detect_work()
3389 mutex_unlock(&rt5645->jd_mutex); in rt5645_jack_detect_work()
3391 snd_soc_jack_report(rt5645->hp_jack, report, SND_JACK_HEADPHONE); in rt5645_jack_detect_work()
3392 snd_soc_jack_report(rt5645->mic_jack, report, SND_JACK_MICROPHONE); in rt5645_jack_detect_work()
3393 if (rt5645->en_button_func) in rt5645_jack_detect_work()
3394 snd_soc_jack_report(rt5645->btn_jack, in rt5645_jack_detect_work()
3404 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS, in rt5645_rcclock_work()
3413 &rt5645->jack_detect_work, msecs_to_jiffies(250)); in rt5645_irq()
3423 &rt5645->jack_detect_work, msecs_to_jiffies(5)); in rt5645_btn_check_callback()
3431 rt5645->component = component; in rt5645_probe()
3433 switch (rt5645->codec_type) { in rt5645_probe()
3441 if (rt5645->v_id < 3) { in rt5645_probe()
3460 if (rt5645->pdata.jd_mode) { in rt5645_probe()
3466 if (rt5645->pdata.long_name) in rt5645_probe()
3467 component->card->long_name = rt5645->pdata.long_name; in rt5645_probe()
3469 rt5645->eq_param = devm_kcalloc(component->dev, in rt5645_probe()
3473 if (!rt5645->eq_param) in rt5645_probe()
3474 return -ENOMEM; in rt5645_probe()
3489 regcache_cache_only(rt5645->regmap, true); in rt5645_suspend()
3490 regcache_mark_dirty(rt5645->regmap); in rt5645_suspend()
3499 regcache_cache_only(rt5645->regmap, false); in rt5645_resume()
3500 regcache_sync(rt5645->regmap); in rt5645_resume()
3523 .name = "rt5645-aif1",
3542 .name = "rt5645-aif2",
3668 .long_name = "gpd-win-pocket-rt5645",
3725 { "hp-detect-gpios", &ef20_hp_detect, 1 },
3807 .ident = "MINIX Z83-4",
3810 DMI_MATCH(DMI_PRODUCT_NAME, "Z83-4"),
3827 DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "MIIX 310-10ICR"),
3836 DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "Lenovo MIIX 320-10ICR"),
3849 * DF-BI-7-S70CR100-*
3850 * DF-BI-7-S70CR110-*
3851 * DF-BI-7-S70CR200-*
3852 * LP-BS-7-S70CR700-*
3883 .ident = "Acer Switch V 10 (SW5-017)",
3886 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "SW5-017"),
3905 if (device_property_present(dev, "realtek,in2-differential") || in rt5645_check_dp()
3906 device_property_present(dev, "realtek,dmic1-data-pin") || in rt5645_check_dp()
3907 device_property_present(dev, "realtek,dmic2-data-pin") || in rt5645_check_dp()
3908 device_property_present(dev, "realtek,jd-mode")) in rt5645_check_dp()
3916 pdata->in2_diff = device_property_read_bool(dev, "realtek,in2-differential"); in rt5645_parse_dt()
3917 device_property_read_u32(dev, "realtek,dmic1-data-pin", &pdata->dmic1_data_pin); in rt5645_parse_dt()
3918 device_property_read_u32(dev, "realtek,dmic2-data-pin", &pdata->dmic2_data_pin); in rt5645_parse_dt()
3919 device_property_read_u32(dev, "realtek,jd-mode", &pdata->jd_mode); in rt5645_parse_dt()
3928 dev_info(codec_dev, "Detected %s platform\n", dmi_data->ident); in rt5645_get_pdata()
3929 *pdata = *((struct rt5645_platform_data *)dmi_data->driver_data); in rt5645_get_pdata()
3936 if (quirk != -1) { in rt5645_get_pdata()
3937 pdata->in2_diff = QUIRK_IN2_DIFF(quirk); in rt5645_get_pdata()
3938 pdata->level_trigger_irq = QUIRK_LEVEL_IRQ(quirk); in rt5645_get_pdata()
3939 pdata->inv_jd1_1 = QUIRK_INV_JD1_1(quirk); in rt5645_get_pdata()
3940 pdata->inv_hp_pol = QUIRK_INV_HP_POL(quirk); in rt5645_get_pdata()
3941 pdata->jd_mode = QUIRK_JD_MODE(quirk); in rt5645_get_pdata()
3942 pdata->dmic1_data_pin = QUIRK_DMIC1_DATA_PIN(quirk); in rt5645_get_pdata()
3943 pdata->dmic2_data_pin = QUIRK_DMIC2_DATA_PIN(quirk); in rt5645_get_pdata()
3968 snprintf(buf, sizeof(buf), "cfg-spk:%d cfg-mic:%s", spk, mic); in rt5645_components()
3981 rt5645 = devm_kzalloc(&i2c->dev, sizeof(struct rt5645_priv), in rt5645_i2c_probe()
3984 return -ENOMEM; in rt5645_i2c_probe()
3986 rt5645->i2c = i2c; in rt5645_i2c_probe()
3988 rt5645_get_pdata(&i2c->dev, &rt5645->pdata); in rt5645_i2c_probe()
3990 if (has_acpi_companion(&i2c->dev)) { in rt5645_i2c_probe()
3992 if (devm_acpi_dev_add_driver_gpios(&i2c->dev, cht_rt5645_gpios)) in rt5645_i2c_probe()
3993 dev_dbg(&i2c->dev, "Failed to add driver gpios\n"); in rt5645_i2c_probe()
3996 /* The ALC3270 package has the headset-mic pin not-connected */ in rt5645_i2c_probe()
3997 if (acpi_dev_hid_uid_match(ACPI_COMPANION(&i2c->dev), "10EC3270", NULL)) in rt5645_i2c_probe()
3998 rt5645->pdata.no_headset_mic = true; in rt5645_i2c_probe()
4001 rt5645->gpiod_hp_det = devm_gpiod_get_optional(&i2c->dev, "hp-detect", in rt5645_i2c_probe()
4004 if (IS_ERR(rt5645->gpiod_hp_det)) { in rt5645_i2c_probe()
4005 dev_info(&i2c->dev, "failed to initialize gpiod\n"); in rt5645_i2c_probe()
4006 ret = PTR_ERR(rt5645->gpiod_hp_det); in rt5645_i2c_probe()
4009 * errors, including -EPROBE_DEFER in rt5645_i2c_probe()
4011 if (ret != -ENOENT) in rt5645_i2c_probe()
4015 for (i = 0; i < ARRAY_SIZE(rt5645->supplies); i++) in rt5645_i2c_probe()
4016 rt5645->supplies[i].supply = rt5645_supply_names[i]; in rt5645_i2c_probe()
4018 ret = devm_regulator_bulk_get(&i2c->dev, in rt5645_i2c_probe()
4019 ARRAY_SIZE(rt5645->supplies), in rt5645_i2c_probe()
4020 rt5645->supplies); in rt5645_i2c_probe()
4022 dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret); in rt5645_i2c_probe()
4026 ret = regulator_bulk_enable(ARRAY_SIZE(rt5645->supplies), in rt5645_i2c_probe()
4027 rt5645->supplies); in rt5645_i2c_probe()
4029 dev_err(&i2c->dev, "Failed to enable supplies: %d\n", ret); in rt5645_i2c_probe()
4036 dev_err(&i2c->dev, "Failed to allocate temp register map: %d\n", in rt5645_i2c_probe()
4048 dev_err(&i2c->dev, "Failed to read: 0x%02X\n, ret = %d", RT5645_VENDOR_ID2, ret); in rt5645_i2c_probe()
4054 rt5645->regmap = devm_regmap_init_i2c(i2c, &rt5645_regmap); in rt5645_i2c_probe()
4055 rt5645->codec_type = CODEC_TYPE_RT5645; in rt5645_i2c_probe()
4058 rt5645->regmap = devm_regmap_init_i2c(i2c, &rt5650_regmap); in rt5645_i2c_probe()
4059 rt5645->codec_type = CODEC_TYPE_RT5650; in rt5645_i2c_probe()
4062 dev_err(&i2c->dev, in rt5645_i2c_probe()
4065 ret = -ENODEV; in rt5645_i2c_probe()
4069 if (IS_ERR(rt5645->regmap)) { in rt5645_i2c_probe()
4070 ret = PTR_ERR(rt5645->regmap); in rt5645_i2c_probe()
4071 dev_err(&i2c->dev, "Failed to allocate register map: %d\n", in rt5645_i2c_probe()
4076 regmap_write(rt5645->regmap, RT5645_RESET, 0); in rt5645_i2c_probe()
4079 rt5645->v_id = val & 0xff; in rt5645_i2c_probe()
4081 regmap_write(rt5645->regmap, RT5645_AD_DA_MIXER, 0x8080); in rt5645_i2c_probe()
4083 ret = regmap_multi_reg_write(rt5645->regmap, init_list, in rt5645_i2c_probe()
4086 dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret); in rt5645_i2c_probe()
4088 if (rt5645->codec_type == CODEC_TYPE_RT5650) { in rt5645_i2c_probe()
4089 ret = regmap_multi_reg_write(rt5645->regmap, rt5650_init_list, in rt5645_i2c_probe()
4092 dev_warn(&i2c->dev, "Apply rt5650 patch failed: %d\n", in rt5645_i2c_probe()
4096 regmap_update_bits(rt5645->regmap, RT5645_CLSD_OUT_CTRL, 0xc0, 0xc0); in rt5645_i2c_probe()
4098 if (rt5645->pdata.in2_diff) in rt5645_i2c_probe()
4099 regmap_update_bits(rt5645->regmap, RT5645_IN2_CTRL, in rt5645_i2c_probe()
4102 if (rt5645->pdata.dmic1_data_pin || rt5645->pdata.dmic2_data_pin) { in rt5645_i2c_probe()
4103 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
4106 switch (rt5645->pdata.dmic1_data_pin) { in rt5645_i2c_probe()
4108 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, in rt5645_i2c_probe()
4113 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
4115 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, in rt5645_i2c_probe()
4117 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
4122 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, in rt5645_i2c_probe()
4124 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
4133 switch (rt5645->pdata.dmic2_data_pin) { in rt5645_i2c_probe()
4135 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, in rt5645_i2c_probe()
4140 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, in rt5645_i2c_probe()
4142 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
4147 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, in rt5645_i2c_probe()
4149 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
4155 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, in rt5645_i2c_probe()
4157 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
4166 if (rt5645->pdata.jd_mode) { in rt5645_i2c_probe()
4167 regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL3, in rt5645_i2c_probe()
4170 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS, in rt5645_i2c_probe()
4172 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2, in rt5645_i2c_probe()
4174 regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL3, in rt5645_i2c_probe()
4176 regmap_update_bits(rt5645->regmap, RT5645_HPO_MIXER, in rt5645_i2c_probe()
4178 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS, in rt5645_i2c_probe()
4180 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
4182 switch (rt5645->pdata.jd_mode) { in rt5645_i2c_probe()
4184 regmap_update_bits(rt5645->regmap, RT5645_A_JD_CTRL1, in rt5645_i2c_probe()
4189 regmap_update_bits(rt5645->regmap, RT5645_A_JD_CTRL1, in rt5645_i2c_probe()
4195 regmap_update_bits(rt5645->regmap, RT5645_A_JD_CTRL1, in rt5645_i2c_probe()
4202 if (rt5645->pdata.inv_jd1_1) { in rt5645_i2c_probe()
4203 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2, in rt5645_i2c_probe()
4208 regmap_update_bits(rt5645->regmap, RT5645_ADDA_CLK1, in rt5645_i2c_probe()
4211 if (rt5645->pdata.level_trigger_irq) { in rt5645_i2c_probe()
4212 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2, in rt5645_i2c_probe()
4215 timer_setup(&rt5645->btn_check_timer, rt5645_btn_check_callback, 0); in rt5645_i2c_probe()
4217 mutex_init(&rt5645->jd_mutex); in rt5645_i2c_probe()
4218 INIT_DELAYED_WORK(&rt5645->jack_detect_work, rt5645_jack_detect_work); in rt5645_i2c_probe()
4219 INIT_DELAYED_WORK(&rt5645->rcclock_work, rt5645_rcclock_work); in rt5645_i2c_probe()
4221 if (rt5645->i2c->irq) { in rt5645_i2c_probe()
4222 ret = request_threaded_irq(rt5645->i2c->irq, NULL, rt5645_irq, in rt5645_i2c_probe()
4226 dev_err(&i2c->dev, "Failed to reguest IRQ: %d\n", ret); in rt5645_i2c_probe()
4231 ret = devm_snd_soc_register_component(&i2c->dev, &soc_component_dev_rt5645, in rt5645_i2c_probe()
4239 if (rt5645->i2c->irq) in rt5645_i2c_probe()
4240 free_irq(rt5645->i2c->irq, rt5645); in rt5645_i2c_probe()
4242 regulator_bulk_disable(ARRAY_SIZE(rt5645->supplies), rt5645->supplies); in rt5645_i2c_probe()
4250 if (i2c->irq) in rt5645_i2c_remove()
4251 free_irq(i2c->irq, rt5645); in rt5645_i2c_remove()
4257 del_timer_sync(&rt5645->btn_check_timer); in rt5645_i2c_remove()
4259 cancel_delayed_work_sync(&rt5645->jack_detect_work); in rt5645_i2c_remove()
4260 cancel_delayed_work_sync(&rt5645->rcclock_work); in rt5645_i2c_remove()
4262 regulator_bulk_disable(ARRAY_SIZE(rt5645->supplies), rt5645->supplies); in rt5645_i2c_remove()
4269 regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL3, in rt5645_i2c_shutdown()
4271 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2, RT5645_CBJ_MN_JD, in rt5645_i2c_shutdown()
4273 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1, RT5645_CBJ_BST1_EN, in rt5645_i2c_shutdown()
4276 regmap_write(rt5645->regmap, RT5645_RESET, 0); in rt5645_i2c_shutdown()
4283 del_timer_sync(&rt5645->btn_check_timer); in rt5645_sys_suspend()
4284 cancel_delayed_work_sync(&rt5645->jack_detect_work); in rt5645_sys_suspend()
4285 cancel_delayed_work_sync(&rt5645->rcclock_work); in rt5645_sys_suspend()
4287 regcache_cache_only(rt5645->regmap, true); in rt5645_sys_suspend()
4288 regcache_mark_dirty(rt5645->regmap); in rt5645_sys_suspend()
4296 regcache_cache_only(rt5645->regmap, false); in rt5645_sys_resume()
4297 regcache_sync(rt5645->regmap); in rt5645_sys_resume()
4299 if (rt5645->hp_jack) { in rt5645_sys_resume()
4300 rt5645->jack_type = 0; in rt5645_sys_resume()
4301 rt5645_jack_detect_work(&rt5645->jack_detect_work.work); in rt5645_sys_resume()