Lines Matching +full:v +full:- +full:dmic +full:- +full:supply

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;
439 /* Some (package) variants have the headset-mic pin not-connected */
671 static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0);
672 static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -6525, 75, 0);
673 static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0);
674 static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -1725, 75, 0);
688 /* {-6, -4.5, -3, -1.5, 0, 0.82, 1.58, 2.28} dB */
690 0, 4, TLV_DB_SCALE_ITEM(-600, 150, 0),
699 uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; in rt5645_hweq_info()
700 uinfo->count = RT5645_HWEQ_NUM * sizeof(struct rt5645_eq_param_s); in rt5645_hweq_info()
711 (struct rt5645_eq_param_s_be16 *)ucontrol->value.bytes.data; in rt5645_hweq_get()
715 eq_param[i].reg = cpu_to_be16(rt5645->eq_param[i].reg); in rt5645_hweq_get()
716 eq_param[i].val = cpu_to_be16(rt5645->eq_param[i].val); in rt5645_hweq_get()
737 (struct rt5645_eq_param_s_be16 *)ucontrol->value.bytes.data; in rt5645_hweq_put()
741 rt5645->eq_param[i].reg = be16_to_cpu(eq_param[i].reg); in rt5645_hweq_put()
742 rt5645->eq_param[i].val = be16_to_cpu(eq_param[i].val); in rt5645_hweq_put()
746 for (i = RT5645_HWEQ_NUM - 1; i >= 0; i--) { in rt5645_hweq_put()
747 if (rt5645->eq_param[i].reg == 0) in rt5645_hweq_put()
749 else if (rt5645->eq_param[i].reg != RT5645_EQ_CTRL2) in rt5645_hweq_put()
756 if (!rt5645_validate_hweq(rt5645->eq_param[i].reg) && in rt5645_hweq_put()
757 rt5645->eq_param[i].reg != 0) in rt5645_hweq_put()
759 else if (rt5645->eq_param[i].reg == 0) in rt5645_hweq_put()
780 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS, in rt5645_spk_put_volsw()
785 mod_delayed_work(system_power_efficient_wq, &rt5645->rcclock_work, in rt5645_spk_put_volsw()
871 * set_dmic_clk - Set parameter of dmic.
881 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in set_dmic_clk()
885 rate = rt5645->sysclk / rl6231_get_pre_div(rt5645->regmap, in set_dmic_clk()
889 dev_err(component->dev, "Failed to set DMIC clock\n"); in set_dmic_clk()
899 struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); in is_sys_clk_from_pll()
913 struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); in is_using_asrc()
916 switch (source->shift) { in is_using_asrc()
964 if (rt5645_validate_hweq(rt5645->eq_param[i].reg)) in rt5645_enable_hweq()
965 regmap_write(rt5645->regmap, rt5645->eq_param[i].reg, in rt5645_enable_hweq()
966 rt5645->eq_param[i].val); in rt5645_enable_hweq()
975 * rt5645_sel_asrc_clk_src - select ASRC clock source for a set of filters
1004 return -EINVAL; in rt5645_sel_asrc_clk_src()
1281 /*DAC1 L/R source*/ /* MX-29 [9:8] [11:10] */
1300 /*DAC2 L/R source*/ /* MX-1B [6:4] [2:0] */
1324 /* MX-27 [12] */
1336 /* MX-27 [11] */
1338 "DAC MIX", "DMIC"
1348 /* MX-27 [8] */
1358 SOC_DAPM_ENUM("Stereo1 DMIC source", rt5645_stereo1_dmic_enum);
1361 /* MX-28 [12] */
1372 /* MX-28 [11] */
1374 "Mono DAC MIXL", "DMIC"
1384 /* MX-28 [8] */
1394 SOC_DAPM_ENUM("Mono DMIC left source", rt5645_mono_dmic_l_enum);
1395 /* MX-28 [1:0] */
1401 SOC_DAPM_ENUM("Mono DMIC Right source", rt5645_mono_dmic_r_enum);
1402 /* MX-28 [4] */
1413 /* MX-28 [3] */
1415 "Mono DAC MIXR", "DMIC"
1425 /* MX-77 [9:8] */
1438 /* MX-78 [4:0] */
1476 /* MX-78 [15:14][13:12][11:10] */
1499 /* MX-77 [7:6][5:4][3:2] */
1518 /* MX-79 [14:12][10:8][6:4][2:0] */
1547 /* MX-7a [14:12][10:8][6:4][2:0] */
1572 /* MX-2d [3] [2] */
1591 /* MX-2d [1] [0] */
1610 /* MX-2F [13:12] */
1622 /* MX-31 [15] [13] [11] [9] */
1641 /* MX-9D [9:8] */
1685 if (rt5645->codec_type == CODEC_TYPE_RT5650) { in hp_amp_power()
1690 regmap_write(rt5645->regmap, RT5645_PR_BASE + in hp_amp_power()
1694 regmap_read(rt5645->regmap, RT5645_PR_BASE + in hp_amp_power()
1701 regmap_write(rt5645->regmap, RT5645_PR_BASE + in hp_amp_power()
1704 regmap_write(rt5645->regmap, RT5645_PR_BASE + in hp_amp_power()
1716 regmap_write(rt5645->regmap, RT5645_PR_BASE + in hp_amp_power()
1738 regmap_write(rt5645->regmap, RT5645_PR_BASE + in hp_amp_power()
1740 regmap_write(rt5645->regmap, RT5645_PR_BASE + in hp_amp_power()
1746 hp_amp_power_count--; in hp_amp_power()
1748 if (rt5645->codec_type == CODEC_TYPE_RT5650) { in hp_amp_power()
1749 regmap_write(rt5645->regmap, RT5645_PR_BASE + in hp_amp_power()
1752 regmap_write(rt5645->regmap, RT5645_PR_BASE + in hp_amp_power()
1782 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5645_hp_event()
1789 if (rt5645->codec_type == CODEC_TYPE_RT5645) { in rt5645_hp_event()
1796 regmap_write(rt5645->regmap, RT5645_PR_BASE + in rt5645_hp_event()
1816 if (rt5645->codec_type == CODEC_TYPE_RT5645) { in rt5645_hp_event()
1823 regmap_write(rt5645->regmap, RT5645_PR_BASE + in rt5645_hp_event()
1848 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5645_spk_event()
1881 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5645_lout_event()
1911 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5645_bst2_event()
1934 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5645_set_micbias1_event()
1959 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5645_set_micbias2_event()
2003 SND_SOC_DAPM_SUPPLY_S("DMIC STO1 ASRC", 1, RT5645_ASRC_1,
2005 SND_SOC_DAPM_SUPPLY_S("DMIC MONO L ASRC", 1, RT5645_ASRC_1,
2007 SND_SOC_DAPM_SUPPLY_S("DMIC MONO R ASRC", 1, RT5645_ASRC_1,
2025 SND_SOC_DAPM_INPUT("DMIC L1"),
2026 SND_SOC_DAPM_INPUT("DMIC R1"),
2027 SND_SOC_DAPM_INPUT("DMIC L2"),
2028 SND_SOC_DAPM_INPUT("DMIC R2"),
2039 SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0,
2071 SND_SOC_DAPM_MUX("Stereo1 DMIC Mux", SND_SOC_NOPM, 0, 0,
2081 SND_SOC_DAPM_MUX("Mono DMIC L Mux", SND_SOC_NOPM, 0, 0,
2083 SND_SOC_DAPM_MUX("Mono DMIC R Mux", SND_SOC_NOPM, 0, 0,
2331 { "DMIC1", NULL, "DMIC L1" },
2332 { "DMIC1", NULL, "DMIC R1" },
2333 { "DMIC2", NULL, "DMIC L2" },
2334 { "DMIC2", NULL, "DMIC R2" },
2363 {"DMIC L1", NULL, "DMIC CLK"},
2364 {"DMIC L1", NULL, "DMIC1 Power"},
2365 {"DMIC R1", NULL, "DMIC CLK"},
2366 {"DMIC R1", NULL, "DMIC1 Power"},
2367 {"DMIC L2", NULL, "DMIC CLK"},
2368 {"DMIC L2", NULL, "DMIC2 Power"},
2369 {"DMIC R2", NULL, "DMIC CLK"},
2370 {"DMIC R2", NULL, "DMIC2 Power"},
2372 { "Stereo1 DMIC Mux", "DMIC1", "DMIC1" },
2373 { "Stereo1 DMIC Mux", "DMIC2", "DMIC2" },
2374 { "Stereo1 DMIC Mux", NULL, "DMIC STO1 ASRC" },
2376 { "Mono DMIC L Mux", "DMIC1", "DMIC L1" },
2377 { "Mono DMIC L Mux", "DMIC2", "DMIC L2" },
2378 { "Mono DMIC L Mux", NULL, "DMIC MONO L ASRC" },
2380 { "Mono DMIC R Mux", "DMIC1", "DMIC R1" },
2381 { "Mono DMIC R Mux", "DMIC2", "DMIC R2" },
2382 { "Mono DMIC R Mux", NULL, "DMIC MONO R ASRC" },
2384 { "Stereo1 ADC L2 Mux", "DMIC", "Stereo1 DMIC Mux" },
2391 { "Stereo1 ADC R2 Mux", "DMIC", "Stereo1 DMIC Mux" },
2394 { "Mono ADC L2 Mux", "DMIC", "Mono DMIC L Mux" },
2401 { "Mono ADC R2 Mux", "DMIC", "Mono DMIC R Mux" },
2755 struct snd_soc_component *component = dai->component; in rt5645_hw_params()
2760 rt5645->lrck[dai->id] = params_rate(params); in rt5645_hw_params()
2761 pre_div = rl6231_get_clk_info(rt5645->sysclk, rt5645->lrck[dai->id]); in rt5645_hw_params()
2763 dev_err(component->dev, "Unsupported clock setting\n"); in rt5645_hw_params()
2764 return -EINVAL; in rt5645_hw_params()
2768 dev_err(component->dev, "Unsupported frame size: %d\n", frame_size); in rt5645_hw_params()
2769 return -EINVAL; in rt5645_hw_params()
2772 switch (rt5645->codec_type) { in rt5645_hw_params()
2782 rt5645->bclk[dai->id] = rt5645->lrck[dai->id] * (32 << bclk_ms); in rt5645_hw_params()
2784 dev_dbg(dai->dev, "bclk is %dHz and lrck is %dHz\n", in rt5645_hw_params()
2785 rt5645->bclk[dai->id], rt5645->lrck[dai->id]); in rt5645_hw_params()
2786 dev_dbg(dai->dev, "bclk_ms is %d and pre_div is %d for iis %d\n", in rt5645_hw_params()
2787 bclk_ms, pre_div, dai->id); in rt5645_hw_params()
2802 return -EINVAL; in rt5645_hw_params()
2805 switch (dai->id) { in rt5645_hw_params()
2822 dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); in rt5645_hw_params()
2823 return -EINVAL; in rt5645_hw_params()
2831 struct snd_soc_component *component = dai->component; in rt5645_set_dai_fmt()
2835 switch (rt5645->codec_type) { in rt5645_set_dai_fmt()
2846 rt5645->master[dai->id] = 1; in rt5645_set_dai_fmt()
2850 rt5645->master[dai->id] = 0; in rt5645_set_dai_fmt()
2853 return -EINVAL; in rt5645_set_dai_fmt()
2863 return -EINVAL; in rt5645_set_dai_fmt()
2879 return -EINVAL; in rt5645_set_dai_fmt()
2881 switch (dai->id) { in rt5645_set_dai_fmt()
2893 dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); in rt5645_set_dai_fmt()
2894 return -EINVAL; in rt5645_set_dai_fmt()
2902 struct snd_soc_component *component = dai->component; in rt5645_set_dai_sysclk()
2906 if (freq == rt5645->sysclk && clk_id == rt5645->sysclk_src) in rt5645_set_dai_sysclk()
2920 dev_err(component->dev, "Invalid clock id (%d)\n", clk_id); in rt5645_set_dai_sysclk()
2921 return -EINVAL; in rt5645_set_dai_sysclk()
2925 rt5645->sysclk = freq; in rt5645_set_dai_sysclk()
2926 rt5645->sysclk_src = clk_id; in rt5645_set_dai_sysclk()
2928 dev_dbg(dai->dev, "Sysclk is %dHz and clock id is %d\n", freq, clk_id); in rt5645_set_dai_sysclk()
2936 struct snd_soc_component *component = dai->component; in rt5645_set_dai_pll()
2941 if (source == rt5645->pll_src && freq_in == rt5645->pll_in && in rt5645_set_dai_pll()
2942 freq_out == rt5645->pll_out) in rt5645_set_dai_pll()
2946 dev_dbg(component->dev, "PLL disabled\n"); in rt5645_set_dai_pll()
2948 rt5645->pll_in = 0; in rt5645_set_dai_pll()
2949 rt5645->pll_out = 0; in rt5645_set_dai_pll()
2962 switch (dai->id) { in rt5645_set_dai_pll()
2972 dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); in rt5645_set_dai_pll()
2973 return -EINVAL; in rt5645_set_dai_pll()
2977 dev_err(component->dev, "Unknown PLL source %d\n", source); in rt5645_set_dai_pll()
2978 return -EINVAL; in rt5645_set_dai_pll()
2983 dev_err(component->dev, "Unsupported input clock %d\n", freq_in); in rt5645_set_dai_pll()
2987 dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n", in rt5645_set_dai_pll()
2997 rt5645->pll_in = freq_in; in rt5645_set_dai_pll()
2998 rt5645->pll_out = freq_out; in rt5645_set_dai_pll()
2999 rt5645->pll_src = source; in rt5645_set_dai_pll()
3007 struct snd_soc_component *component = dai->component; in rt5645_set_tdm_slot()
3012 switch (rt5645->codec_type) { in rt5645_set_tdm_slot()
3030 if (rt5645->codec_type == CODEC_TYPE_RT5645) in rt5645_set_tdm_slot()
3105 if (rt5645->en_button_func) in rt5645_set_bias_level()
3107 &rt5645->jack_detect_work, in rt5645_set_bias_level()
3114 if (!rt5645->en_button_func) in rt5645_set_bias_level()
3177 regmap_write(rt5645->regmap, RT5645_CHARGE_PUMP, 0x0206); in rt5645_jack_detect()
3183 if (!snd_soc_card_is_instantiated(dapm->card)) { in rt5645_jack_detect()
3186 regmap_update_bits(rt5645->regmap, RT5645_PWR_ANLG1, in rt5645_jack_detect()
3189 regmap_update_bits(rt5645->regmap, RT5645_PWR_MIXER, in rt5645_jack_detect()
3191 regmap_update_bits(rt5645->regmap, RT5645_PWR_VOL, in rt5645_jack_detect()
3195 regmap_write(rt5645->regmap, RT5645_JD_CTRL3, 0x00f0); in rt5645_jack_detect()
3196 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2, in rt5645_jack_detect()
3198 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1, in rt5645_jack_detect()
3201 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2, in rt5645_jack_detect()
3204 if (rt5645->gpiod_cbj_sleeve) in rt5645_jack_detect()
3205 gpiod_set_value(rt5645->gpiod_cbj_sleeve, 1); in rt5645_jack_detect()
3208 regmap_read(rt5645->regmap, RT5645_IN1_CTRL3, &val); in rt5645_jack_detect()
3210 dev_dbg(component->dev, "val = %d\n", val); in rt5645_jack_detect()
3212 if ((val == 1 || val == 2) && !rt5645->pdata.no_headset_mic) { in rt5645_jack_detect()
3213 rt5645->jack_type = SND_JACK_HEADSET; in rt5645_jack_detect()
3214 if (rt5645->en_button_func) { in rt5645_jack_detect()
3218 if (rt5645->en_button_func) in rt5645_jack_detect()
3222 rt5645->jack_type = SND_JACK_HEADPHONE; in rt5645_jack_detect()
3223 if (rt5645->gpiod_cbj_sleeve) in rt5645_jack_detect()
3224 gpiod_set_value(rt5645->gpiod_cbj_sleeve, 0); in rt5645_jack_detect()
3226 if (rt5645->pdata.level_trigger_irq) in rt5645_jack_detect()
3227 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2, in rt5645_jack_detect()
3230 regmap_write(rt5645->regmap, RT5645_CHARGE_PUMP, 0x0e06); in rt5645_jack_detect()
3232 rt5645->jack_type = 0; in rt5645_jack_detect()
3234 regmap_update_bits(rt5645->regmap, RT5645_HP_VOL, in rt5645_jack_detect()
3237 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2, in rt5645_jack_detect()
3239 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1, in rt5645_jack_detect()
3242 if (rt5645->en_button_func) in rt5645_jack_detect()
3245 if (rt5645->pdata.jd_mode == 0) in rt5645_jack_detect()
3249 if (rt5645->pdata.level_trigger_irq) in rt5645_jack_detect()
3250 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2, in rt5645_jack_detect()
3253 if (rt5645->gpiod_cbj_sleeve) in rt5645_jack_detect()
3254 gpiod_set_value(rt5645->gpiod_cbj_sleeve, 0); in rt5645_jack_detect()
3257 return rt5645->jack_type; in rt5645_jack_detect()
3280 rt5645->hp_jack = hp_jack; in rt5645_set_jack_detect()
3281 rt5645->mic_jack = mic_jack; in rt5645_set_jack_detect()
3282 rt5645->btn_jack = btn_jack; in rt5645_set_jack_detect()
3283 if (rt5645->btn_jack && rt5645->codec_type == CODEC_TYPE_RT5650) { in rt5645_set_jack_detect()
3284 rt5645->en_button_func = true; in rt5645_set_jack_detect()
3285 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_set_jack_detect()
3287 regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL1, in rt5645_set_jack_detect()
3289 regmap_update_bits(rt5645->regmap, RT5645_DEPOP_M1, in rt5645_set_jack_detect()
3324 if (!rt5645->component) in rt5645_jack_detect_work()
3327 mutex_lock(&rt5645->jd_mutex); in rt5645_jack_detect_work()
3329 switch (rt5645->pdata.jd_mode) { in rt5645_jack_detect_work()
3331 if (rt5645->gpiod_hp_det) { in rt5645_jack_detect_work()
3332 gpio_state = gpiod_get_value(rt5645->gpiod_hp_det); in rt5645_jack_detect_work()
3333 if (rt5645->pdata.inv_hp_pol) in rt5645_jack_detect_work()
3335 dev_dbg(rt5645->component->dev, "gpio_state = %d\n", in rt5645_jack_detect_work()
3337 report = rt5645_jack_detect(rt5645->component, gpio_state); in rt5645_jack_detect_work()
3339 snd_soc_jack_report(rt5645->hp_jack, in rt5645_jack_detect_work()
3341 snd_soc_jack_report(rt5645->mic_jack, in rt5645_jack_detect_work()
3343 mutex_unlock(&rt5645->jd_mutex); in rt5645_jack_detect_work()
3346 val = snd_soc_component_read(rt5645->component, RT5645_A_JD_CTRL1) & 0x0020; in rt5645_jack_detect_work()
3349 val = snd_soc_component_read(rt5645->component, RT5645_INT_IRQ_ST) & 0x1000; in rt5645_jack_detect_work()
3354 if (!val && (rt5645->jack_type == 0)) { /* jack in */ in rt5645_jack_detect_work()
3355 report = rt5645_jack_detect(rt5645->component, 1); in rt5645_jack_detect_work()
3356 } else if (!val && rt5645->jack_type == SND_JACK_HEADSET) { in rt5645_jack_detect_work()
3359 if (snd_soc_component_read(rt5645->component, RT5645_INT_IRQ_ST) & 0x4) { in rt5645_jack_detect_work()
3362 btn_type = rt5645_button_detect(rt5645->component); in rt5645_jack_detect_work()
3392 dev_err(rt5645->component->dev, in rt5645_jack_detect_work()
3399 report = rt5645->jack_type; in rt5645_jack_detect_work()
3401 mod_timer(&rt5645->btn_check_timer, in rt5645_jack_detect_work()
3407 snd_soc_component_update_bits(rt5645->component, in rt5645_jack_detect_work()
3409 rt5645_jack_detect(rt5645->component, 0); in rt5645_jack_detect_work()
3412 mutex_unlock(&rt5645->jd_mutex); in rt5645_jack_detect_work()
3414 snd_soc_jack_report(rt5645->hp_jack, report, SND_JACK_HEADPHONE); in rt5645_jack_detect_work()
3415 snd_soc_jack_report(rt5645->mic_jack, report, SND_JACK_MICROPHONE); in rt5645_jack_detect_work()
3416 if (rt5645->en_button_func) in rt5645_jack_detect_work()
3417 snd_soc_jack_report(rt5645->btn_jack, in rt5645_jack_detect_work()
3427 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS, in rt5645_rcclock_work()
3436 &rt5645->jack_detect_work, msecs_to_jiffies(250)); in rt5645_irq()
3447 &rt5645->jack_detect_work, msecs_to_jiffies(5)); in rt5645_btn_check_callback()
3455 rt5645->component = component; in rt5645_probe()
3457 switch (rt5645->codec_type) { in rt5645_probe()
3465 if (rt5645->v_id < 3) { in rt5645_probe()
3484 if (rt5645->pdata.jd_mode) { in rt5645_probe()
3490 if (rt5645->pdata.long_name) in rt5645_probe()
3491 component->card->long_name = rt5645->pdata.long_name; in rt5645_probe()
3493 rt5645->eq_param = devm_kcalloc(component->dev, in rt5645_probe()
3497 if (!rt5645->eq_param) in rt5645_probe()
3498 return -ENOMEM; in rt5645_probe()
3513 regcache_cache_only(rt5645->regmap, true); in rt5645_suspend()
3514 regcache_mark_dirty(rt5645->regmap); in rt5645_suspend()
3523 regcache_cache_only(rt5645->regmap, false); in rt5645_resume()
3524 regcache_sync(rt5645->regmap); in rt5645_resume()
3547 .name = "rt5645-aif1",
3566 .name = "rt5645-aif2",
3692 .long_name = "gpd-win-pocket-rt5645",
3749 { "hp-detect-gpios", &ef20_hp_detect, 1 },
3831 .ident = "MINIX Z83-4",
3834 DMI_MATCH(DMI_PRODUCT_NAME, "Z83-4"),
3851 DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "MIIX 310-10ICR"),
3860 DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "Lenovo MIIX 320-10ICR"),
3873 * DF-BI-7-S70CR100-*
3874 * DF-BI-7-S70CR110-*
3875 * DF-BI-7-S70CR200-*
3876 * LP-BS-7-S70CR700-*
3907 .ident = "Acer Switch V 10 (SW5-017)",
3910 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "SW5-017"),
3929 if (device_property_present(dev, "realtek,in2-differential") || in rt5645_check_dp()
3930 device_property_present(dev, "realtek,dmic1-data-pin") || in rt5645_check_dp()
3931 device_property_present(dev, "realtek,dmic2-data-pin") || in rt5645_check_dp()
3932 device_property_present(dev, "realtek,jd-mode")) in rt5645_check_dp()
3940 pdata->in2_diff = device_property_read_bool(dev, "realtek,in2-differential"); in rt5645_parse_dt()
3941 device_property_read_u32(dev, "realtek,dmic1-data-pin", &pdata->dmic1_data_pin); in rt5645_parse_dt()
3942 device_property_read_u32(dev, "realtek,dmic2-data-pin", &pdata->dmic2_data_pin); in rt5645_parse_dt()
3943 device_property_read_u32(dev, "realtek,jd-mode", &pdata->jd_mode); in rt5645_parse_dt()
3952 dev_info(codec_dev, "Detected %s platform\n", dmi_data->ident); in rt5645_get_pdata()
3953 *pdata = *((struct rt5645_platform_data *)dmi_data->driver_data); in rt5645_get_pdata()
3960 if (quirk != -1) { in rt5645_get_pdata()
3961 pdata->in2_diff = QUIRK_IN2_DIFF(quirk); in rt5645_get_pdata()
3962 pdata->level_trigger_irq = QUIRK_LEVEL_IRQ(quirk); in rt5645_get_pdata()
3963 pdata->inv_jd1_1 = QUIRK_INV_JD1_1(quirk); in rt5645_get_pdata()
3964 pdata->inv_hp_pol = QUIRK_INV_HP_POL(quirk); in rt5645_get_pdata()
3965 pdata->jd_mode = QUIRK_JD_MODE(quirk); in rt5645_get_pdata()
3966 pdata->dmic1_data_pin = QUIRK_DMIC1_DATA_PIN(quirk); in rt5645_get_pdata()
3967 pdata->dmic2_data_pin = QUIRK_DMIC2_DATA_PIN(quirk); in rt5645_get_pdata()
3992 snprintf(buf, sizeof(buf), "cfg-spk:%d cfg-mic:%s", spk, mic); in rt5645_components()
4005 rt5645 = devm_kzalloc(&i2c->dev, sizeof(struct rt5645_priv), in rt5645_i2c_probe()
4008 return -ENOMEM; in rt5645_i2c_probe()
4010 rt5645->i2c = i2c; in rt5645_i2c_probe()
4012 rt5645_get_pdata(&i2c->dev, &rt5645->pdata); in rt5645_i2c_probe()
4014 if (has_acpi_companion(&i2c->dev)) { in rt5645_i2c_probe()
4016 if (devm_acpi_dev_add_driver_gpios(&i2c->dev, cht_rt5645_gpios)) in rt5645_i2c_probe()
4017 dev_dbg(&i2c->dev, "Failed to add driver gpios\n"); in rt5645_i2c_probe()
4020 /* The ALC3270 package has the headset-mic pin not-connected */ in rt5645_i2c_probe()
4021 if (acpi_dev_hid_uid_match(ACPI_COMPANION(&i2c->dev), "10EC3270", NULL)) in rt5645_i2c_probe()
4022 rt5645->pdata.no_headset_mic = true; in rt5645_i2c_probe()
4025 rt5645->gpiod_hp_det = devm_gpiod_get_optional(&i2c->dev, "hp-detect", in rt5645_i2c_probe()
4028 if (IS_ERR(rt5645->gpiod_hp_det)) { in rt5645_i2c_probe()
4029 dev_info(&i2c->dev, "failed to initialize gpiod\n"); in rt5645_i2c_probe()
4030 ret = PTR_ERR(rt5645->gpiod_hp_det); in rt5645_i2c_probe()
4033 * errors, including -EPROBE_DEFER in rt5645_i2c_probe()
4035 if (ret != -ENOENT) in rt5645_i2c_probe()
4039 rt5645->gpiod_cbj_sleeve = devm_gpiod_get_optional(&i2c->dev, "cbj-sleeve", in rt5645_i2c_probe()
4042 if (IS_ERR(rt5645->gpiod_cbj_sleeve)) { in rt5645_i2c_probe()
4043 ret = PTR_ERR(rt5645->gpiod_cbj_sleeve); in rt5645_i2c_probe()
4044 dev_info(&i2c->dev, "failed to initialize gpiod, ret=%d\n", ret); in rt5645_i2c_probe()
4045 if (ret != -ENOENT) in rt5645_i2c_probe()
4049 for (i = 0; i < ARRAY_SIZE(rt5645->supplies); i++) in rt5645_i2c_probe()
4050 rt5645->supplies[i].supply = rt5645_supply_names[i]; in rt5645_i2c_probe()
4052 ret = devm_regulator_bulk_get(&i2c->dev, in rt5645_i2c_probe()
4053 ARRAY_SIZE(rt5645->supplies), in rt5645_i2c_probe()
4054 rt5645->supplies); in rt5645_i2c_probe()
4056 dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret); in rt5645_i2c_probe()
4060 ret = regulator_bulk_enable(ARRAY_SIZE(rt5645->supplies), in rt5645_i2c_probe()
4061 rt5645->supplies); in rt5645_i2c_probe()
4063 dev_err(&i2c->dev, "Failed to enable supplies: %d\n", ret); in rt5645_i2c_probe()
4070 dev_err(&i2c->dev, "Failed to allocate temp register map: %d\n", in rt5645_i2c_probe()
4082 dev_err(&i2c->dev, "Failed to read: 0x%02X\n, ret = %d", RT5645_VENDOR_ID2, ret); in rt5645_i2c_probe()
4088 rt5645->regmap = devm_regmap_init_i2c(i2c, &rt5645_regmap); in rt5645_i2c_probe()
4089 rt5645->codec_type = CODEC_TYPE_RT5645; in rt5645_i2c_probe()
4092 rt5645->regmap = devm_regmap_init_i2c(i2c, &rt5650_regmap); in rt5645_i2c_probe()
4093 rt5645->codec_type = CODEC_TYPE_RT5650; in rt5645_i2c_probe()
4096 dev_err(&i2c->dev, in rt5645_i2c_probe()
4099 ret = -ENODEV; in rt5645_i2c_probe()
4103 if (IS_ERR(rt5645->regmap)) { in rt5645_i2c_probe()
4104 ret = PTR_ERR(rt5645->regmap); in rt5645_i2c_probe()
4105 dev_err(&i2c->dev, "Failed to allocate register map: %d\n", in rt5645_i2c_probe()
4110 regmap_write(rt5645->regmap, RT5645_RESET, 0); in rt5645_i2c_probe()
4113 rt5645->v_id = val & 0xff; in rt5645_i2c_probe()
4115 regmap_write(rt5645->regmap, RT5645_AD_DA_MIXER, 0x8080); in rt5645_i2c_probe()
4117 ret = regmap_multi_reg_write(rt5645->regmap, init_list, in rt5645_i2c_probe()
4120 dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret); in rt5645_i2c_probe()
4122 if (rt5645->codec_type == CODEC_TYPE_RT5650) { in rt5645_i2c_probe()
4123 ret = regmap_multi_reg_write(rt5645->regmap, rt5650_init_list, in rt5645_i2c_probe()
4126 dev_warn(&i2c->dev, "Apply rt5650 patch failed: %d\n", in rt5645_i2c_probe()
4130 regmap_update_bits(rt5645->regmap, RT5645_CLSD_OUT_CTRL, 0xc0, 0xc0); in rt5645_i2c_probe()
4132 if (rt5645->pdata.in2_diff) in rt5645_i2c_probe()
4133 regmap_update_bits(rt5645->regmap, RT5645_IN2_CTRL, in rt5645_i2c_probe()
4136 if (rt5645->pdata.dmic1_data_pin || rt5645->pdata.dmic2_data_pin) { in rt5645_i2c_probe()
4137 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
4140 switch (rt5645->pdata.dmic1_data_pin) { in rt5645_i2c_probe()
4142 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, in rt5645_i2c_probe()
4147 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
4149 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, in rt5645_i2c_probe()
4151 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
4156 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, in rt5645_i2c_probe()
4158 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
4167 switch (rt5645->pdata.dmic2_data_pin) { in rt5645_i2c_probe()
4169 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, in rt5645_i2c_probe()
4174 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, in rt5645_i2c_probe()
4176 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
4181 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, in rt5645_i2c_probe()
4183 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
4189 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, in rt5645_i2c_probe()
4191 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
4200 if (rt5645->pdata.jd_mode) { in rt5645_i2c_probe()
4201 regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL3, in rt5645_i2c_probe()
4204 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS, in rt5645_i2c_probe()
4206 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2, in rt5645_i2c_probe()
4208 regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL3, in rt5645_i2c_probe()
4210 regmap_update_bits(rt5645->regmap, RT5645_HPO_MIXER, in rt5645_i2c_probe()
4212 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS, in rt5645_i2c_probe()
4214 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
4216 switch (rt5645->pdata.jd_mode) { in rt5645_i2c_probe()
4218 regmap_update_bits(rt5645->regmap, RT5645_A_JD_CTRL1, in rt5645_i2c_probe()
4223 regmap_update_bits(rt5645->regmap, RT5645_A_JD_CTRL1, in rt5645_i2c_probe()
4229 regmap_update_bits(rt5645->regmap, RT5645_A_JD_CTRL1, in rt5645_i2c_probe()
4236 if (rt5645->pdata.inv_jd1_1) { in rt5645_i2c_probe()
4237 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2, in rt5645_i2c_probe()
4242 regmap_update_bits(rt5645->regmap, RT5645_ADDA_CLK1, in rt5645_i2c_probe()
4245 if (rt5645->pdata.level_trigger_irq) { in rt5645_i2c_probe()
4246 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2, in rt5645_i2c_probe()
4249 timer_setup(&rt5645->btn_check_timer, rt5645_btn_check_callback, 0); in rt5645_i2c_probe()
4251 mutex_init(&rt5645->jd_mutex); in rt5645_i2c_probe()
4252 INIT_DELAYED_WORK(&rt5645->jack_detect_work, rt5645_jack_detect_work); in rt5645_i2c_probe()
4253 INIT_DELAYED_WORK(&rt5645->rcclock_work, rt5645_rcclock_work); in rt5645_i2c_probe()
4255 if (rt5645->i2c->irq) { in rt5645_i2c_probe()
4256 ret = request_threaded_irq(rt5645->i2c->irq, NULL, rt5645_irq, in rt5645_i2c_probe()
4260 dev_err(&i2c->dev, "Failed to request IRQ: %d\n", ret); in rt5645_i2c_probe()
4265 ret = devm_snd_soc_register_component(&i2c->dev, &soc_component_dev_rt5645, in rt5645_i2c_probe()
4273 if (rt5645->i2c->irq) in rt5645_i2c_probe()
4274 free_irq(rt5645->i2c->irq, rt5645); in rt5645_i2c_probe()
4276 regulator_bulk_disable(ARRAY_SIZE(rt5645->supplies), rt5645->supplies); in rt5645_i2c_probe()
4284 if (i2c->irq) in rt5645_i2c_remove()
4285 free_irq(i2c->irq, rt5645); in rt5645_i2c_remove()
4291 timer_delete_sync(&rt5645->btn_check_timer); in rt5645_i2c_remove()
4293 cancel_delayed_work_sync(&rt5645->jack_detect_work); in rt5645_i2c_remove()
4294 cancel_delayed_work_sync(&rt5645->rcclock_work); in rt5645_i2c_remove()
4296 if (rt5645->gpiod_cbj_sleeve) in rt5645_i2c_remove()
4297 gpiod_set_value(rt5645->gpiod_cbj_sleeve, 0); in rt5645_i2c_remove()
4299 regulator_bulk_disable(ARRAY_SIZE(rt5645->supplies), rt5645->supplies); in rt5645_i2c_remove()
4306 regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL3, in rt5645_i2c_shutdown()
4308 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2, RT5645_CBJ_MN_JD, in rt5645_i2c_shutdown()
4310 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1, RT5645_CBJ_BST1_EN, in rt5645_i2c_shutdown()
4313 regmap_write(rt5645->regmap, RT5645_RESET, 0); in rt5645_i2c_shutdown()
4315 if (rt5645->gpiod_cbj_sleeve) in rt5645_i2c_shutdown()
4316 gpiod_set_value(rt5645->gpiod_cbj_sleeve, 0); in rt5645_i2c_shutdown()
4323 timer_delete_sync(&rt5645->btn_check_timer); in rt5645_sys_suspend()
4324 cancel_delayed_work_sync(&rt5645->jack_detect_work); in rt5645_sys_suspend()
4325 cancel_delayed_work_sync(&rt5645->rcclock_work); in rt5645_sys_suspend()
4327 regcache_cache_only(rt5645->regmap, true); in rt5645_sys_suspend()
4328 regcache_mark_dirty(rt5645->regmap); in rt5645_sys_suspend()
4336 regcache_cache_only(rt5645->regmap, false); in rt5645_sys_resume()
4337 regcache_sync(rt5645->regmap); in rt5645_sys_resume()
4339 if (rt5645->hp_jack) { in rt5645_sys_resume()
4340 rt5645->jack_type = 0; in rt5645_sys_resume()
4341 rt5645_jack_detect_work(&rt5645->jack_detect_work.work); in rt5645_sys_resume()