• Home
  • Raw
  • Download

Lines Matching +full:out +full:- +full:mono

2  * rt5645.c  --  RT5645 ALSA SoC audio codec driver
30 #include <sound/soc-dapm.h>
44 static unsigned int quirk = -1;
636 static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0);
637 static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -6525, 75, 0);
638 static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0);
639 static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -1725, 75, 0);
653 /* {-6, -4.5, -3, -1.5, 0, 0.82, 1.58, 2.28} dB */
655 0, 4, TLV_DB_SCALE_ITEM(-600, 150, 0),
664 uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; in rt5645_hweq_info()
665 uinfo->count = RT5645_HWEQ_NUM * sizeof(struct rt5645_eq_param_s); in rt5645_hweq_info()
676 (struct rt5645_eq_param_s *)ucontrol->value.bytes.data; in rt5645_hweq_get()
680 eq_param[i].reg = cpu_to_be16(rt5645->eq_param[i].reg); in rt5645_hweq_get()
681 eq_param[i].val = cpu_to_be16(rt5645->eq_param[i].val); in rt5645_hweq_get()
702 (struct rt5645_eq_param_s *)ucontrol->value.bytes.data; in rt5645_hweq_put()
711 for (i = RT5645_HWEQ_NUM - 1; i >= 0; i--) { in rt5645_hweq_put()
728 memcpy(rt5645->eq_param, eq_param, in rt5645_hweq_put()
748 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS, in rt5645_spk_put_volsw()
753 mod_delayed_work(system_power_efficient_wq, &rt5645->rcclock_work, in rt5645_spk_put_volsw()
786 SOC_DOUBLE("OUT Playback Switch", RT5645_LOUT1,
788 SOC_DOUBLE("OUT Channel Switch", RT5645_LOUT1,
790 SOC_DOUBLE_TLV("OUT Playback Volume", RT5645_LOUT1,
798 SOC_DOUBLE_TLV("Mono DAC Playback Volume", RT5645_DAC2_DIG_VOL,
816 SOC_DOUBLE("Mono ADC Capture Switch", RT5645_MONO_ADC_DIG_VOL,
818 SOC_DOUBLE_TLV("Mono ADC Capture Volume", RT5645_MONO_ADC_DIG_VOL,
825 SOC_DOUBLE_TLV("Mono ADC Boost Capture Volume", RT5645_ADC_BST_VOL2,
839 * set_dmic_clk - Set parameter of dmic.
849 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in set_dmic_clk()
853 rate = rt5645->sysclk / rl6231_get_pre_div(rt5645->regmap, in set_dmic_clk()
857 dev_err(component->dev, "Failed to set DMIC clock\n"); in set_dmic_clk()
867 struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); in is_sys_clk_from_pll()
881 struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); in is_using_asrc()
884 switch (source->shift) { in is_using_asrc()
932 if (rt5645_validate_hweq(rt5645->eq_param[i].reg)) in rt5645_enable_hweq()
933 regmap_write(rt5645->regmap, rt5645->eq_param[i].reg, in rt5645_enable_hweq()
934 rt5645->eq_param[i].val); in rt5645_enable_hweq()
943 * rt5645_sel_asrc_clk_src - select ASRC clock source for a set of filters
972 return -EINVAL; in rt5645_sel_asrc_clk_src()
1130 SOC_DAPM_SINGLE("OUT MIXL Switch", RT5645_REC_L2_MIXER,
1143 SOC_DAPM_SINGLE("OUT MIXR Switch", RT5645_REC_R2_MIXER,
1249 /*DAC1 L/R source*/ /* MX-29 [9:8] [11:10] */
1268 /*DAC2 L/R source*/ /* MX-1B [6:4] [2:0] */
1270 "IF1 DAC", "IF2 DAC", "IF3 DAC", "Mono ADC", "VAD_ADC"
1281 "IF1 DAC", "IF2 DAC", "IF3 DAC", "Mono ADC", "Haptic"
1316 /* MX-27 [12] */
1328 /* MX-27 [11] */
1340 /* MX-27 [8] */
1352 /* Mono ADC source */
1353 /* MX-28 [12] */
1355 "Mono DAC MIXL", "ADC"
1363 SOC_DAPM_ENUM("Mono ADC1 left source", rt5645_mono_adc_l1_enum);
1364 /* MX-28 [11] */
1366 "Mono DAC MIXL", "DMIC"
1374 SOC_DAPM_ENUM("Mono ADC2 left source", rt5645_mono_adc_l2_enum);
1376 /* MX-28 [8] */
1386 SOC_DAPM_ENUM("Mono DMIC left source", rt5645_mono_dmic_l_enum);
1387 /* MX-28 [1:0] */
1393 SOC_DAPM_ENUM("Mono DMIC Right source", rt5645_mono_dmic_r_enum);
1394 /* MX-28 [4] */
1396 "Mono DAC MIXR", "ADC"
1404 SOC_DAPM_ENUM("Mono ADC1 right source", rt5645_mono_adc_r1_enum);
1405 /* MX-28 [3] */
1407 "Mono DAC MIXR", "DMIC"
1415 SOC_DAPM_ENUM("Mono ADC2 right source", rt5645_mono_adc_r2_enum);
1417 /* MX-77 [9:8] */
1430 /* MX-78 [4:0] */
1468 /* MX-78 [15:14][13:12][11:10] */
1491 /* MX-77 [7:6][5:4][3:2] */
1510 /* MX-79 [14:12][10:8][6:4][2:0] */
1539 /* MX-7a [14:12][10:8][6:4][2:0] */
1564 /* MX-2d [3] [2] */
1583 /* MX-2d [1] [0] */
1585 "Stereo DAC Mixer", "Mono DAC Mixer"
1602 /* MX-2F [13:12] */
1614 /* MX-2F [1:0] */
1626 /* MX-31 [15] [13] [11] [9] */
1628 "Mono DAC", "Stereo DAC"
1645 /* MX-9D [9:8] */
1647 "Sto1 ADC L", "Mono ADC L", "Mono ADC R"
1688 if (rt5645->codec_type == CODEC_TYPE_RT5650) { in hp_amp_power()
1693 regmap_write(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()
1705 rt5645->hp_on = true; in hp_amp_power()
1711 regmap_write(rt5645->regmap, RT5645_PR_BASE + in hp_amp_power()
1733 regmap_write(rt5645->regmap, RT5645_PR_BASE + in hp_amp_power()
1735 regmap_write(rt5645->regmap, RT5645_PR_BASE + in hp_amp_power()
1741 hp_amp_power_count--; in hp_amp_power()
1743 if (rt5645->codec_type == CODEC_TYPE_RT5650) { in hp_amp_power()
1744 regmap_write(rt5645->regmap, RT5645_PR_BASE + in hp_amp_power()
1747 regmap_write(rt5645->regmap, RT5645_PR_BASE + in hp_amp_power()
1776 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5645_hp_event()
1783 if (rt5645->codec_type == CODEC_TYPE_RT5645) { in rt5645_hp_event()
1790 regmap_write(rt5645->regmap, RT5645_PR_BASE + in rt5645_hp_event()
1810 if (rt5645->codec_type == CODEC_TYPE_RT5645) { in rt5645_hp_event()
1817 regmap_write(rt5645->regmap, RT5645_PR_BASE + in rt5645_hp_event()
1842 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5645_spk_event()
1875 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5645_lout_event()
1905 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5645_bst2_event()
1928 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5650_hp_event()
1933 if (rt5645->hp_on) { in rt5650_hp_event()
1935 rt5645->hp_on = false; in rt5650_hp_event()
1949 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5645_set_micbias1_event()
1974 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5645_set_micbias2_event()
2014 SND_SOC_DAPM_SUPPLY_S("DAC MONO L ASRC", 1, RT5645_ASRC_1,
2016 SND_SOC_DAPM_SUPPLY_S("DAC MONO R ASRC", 1, RT5645_ASRC_1,
2020 SND_SOC_DAPM_SUPPLY_S("DMIC MONO L ASRC", 1, RT5645_ASRC_1,
2022 SND_SOC_DAPM_SUPPLY_S("DMIC MONO R ASRC", 1, RT5645_ASRC_1,
2026 SND_SOC_DAPM_SUPPLY_S("ADC MONO L ASRC", 1, RT5645_ASRC_1,
2028 SND_SOC_DAPM_SUPPLY_S("ADC MONO R ASRC", 1, RT5645_ASRC_1,
2096 SND_SOC_DAPM_MUX("Mono DMIC L Mux", SND_SOC_NOPM, 0, 0,
2098 SND_SOC_DAPM_MUX("Mono DMIC R Mux", SND_SOC_NOPM, 0, 0,
2100 SND_SOC_DAPM_MUX("Mono ADC L2 Mux", SND_SOC_NOPM, 0, 0,
2102 SND_SOC_DAPM_MUX("Mono ADC L1 Mux", SND_SOC_NOPM, 0, 0,
2104 SND_SOC_DAPM_MUX("Mono ADC R1 Mux", SND_SOC_NOPM, 0, 0,
2106 SND_SOC_DAPM_MUX("Mono ADC R2 Mux", SND_SOC_NOPM, 0, 0,
2118 SND_SOC_DAPM_SUPPLY_S("adc mono left filter", 1, RT5645_PWR_DIG2,
2120 SND_SOC_DAPM_MIXER_E("Mono ADC MIXL", SND_SOC_NOPM, 0, 0,
2123 SND_SOC_DAPM_SUPPLY_S("adc mono right filter", 1, RT5645_PWR_DIG2,
2125 SND_SOC_DAPM_MIXER_E("Mono ADC MIXR", SND_SOC_NOPM, 0, 0,
2193 SND_SOC_DAPM_SUPPLY_S("dac mono left filter", 1, RT5645_PWR_DIG2,
2195 SND_SOC_DAPM_SUPPLY_S("dac mono right filter", 1, RT5645_PWR_DIG2,
2201 SND_SOC_DAPM_MIXER("Mono DAC MIXL", SND_SOC_NOPM, 0, 0,
2203 SND_SOC_DAPM_MIXER("Mono DAC MIXR", SND_SOC_NOPM, 0, 0,
2219 /* OUT Mixer */
2224 SND_SOC_DAPM_MIXER("OUT MIXL", RT5645_PWR_MIXER, RT5645_PWR_OM_L_BIT,
2226 SND_SOC_DAPM_MIXER("OUT MIXR", RT5645_PWR_MIXER, RT5645_PWR_OM_R_BIT,
2247 /* HPO/LOUT/Mono Mixer */
2335 { "adc mono left filter", NULL, "ADC MONO L ASRC", is_using_asrc },
2336 { "adc mono right filter", NULL, "ADC MONO R ASRC", is_using_asrc },
2337 { "dac mono left filter", NULL, "DAC MONO L ASRC", is_using_asrc },
2338 { "dac mono right filter", NULL, "DAC MONO R ASRC", is_using_asrc },
2366 { "RECMIXL", "OUT MIXL Switch", "OUT MIXL" },
2372 { "RECMIXR", "OUT MIXR Switch", "OUT MIXR" },
2392 { "Mono DMIC L Mux", "DMIC1", "DMIC L1" },
2393 { "Mono DMIC L Mux", "DMIC2", "DMIC L2" },
2394 { "Mono DMIC L Mux", NULL, "DMIC MONO L ASRC" },
2396 { "Mono DMIC R Mux", "DMIC1", "DMIC R1" },
2397 { "Mono DMIC R Mux", "DMIC2", "DMIC R2" },
2398 { "Mono DMIC R Mux", NULL, "DMIC MONO R ASRC" },
2410 { "Mono ADC L2 Mux", "DMIC", "Mono DMIC L Mux" },
2411 { "Mono ADC L2 Mux", "Mono DAC MIXL", "Mono DAC MIXL" },
2412 { "Mono ADC L1 Mux", "Mono DAC MIXL", "Mono DAC MIXL" },
2413 { "Mono ADC L1 Mux", "ADC", "ADC L" },
2415 { "Mono ADC R1 Mux", "Mono DAC MIXR", "Mono DAC MIXR" },
2416 { "Mono ADC R1 Mux", "ADC", "ADC R" },
2417 { "Mono ADC R2 Mux", "DMIC", "Mono DMIC R Mux" },
2418 { "Mono ADC R2 Mux", "Mono DAC MIXR", "Mono DAC MIXR" },
2433 { "Mono ADC MIXL", "ADC1 Switch", "Mono ADC L1 Mux" },
2434 { "Mono ADC MIXL", "ADC2 Switch", "Mono ADC L2 Mux" },
2435 { "Mono ADC MIXL", NULL, "adc mono left filter" },
2436 { "adc mono left filter", NULL, "PLL1", is_sys_clk_from_pll },
2438 { "Mono ADC MIXR", "ADC1 Switch", "Mono ADC R1 Mux" },
2439 { "Mono ADC MIXR", "ADC2 Switch", "Mono ADC R2 Mux" },
2440 { "Mono ADC MIXR", NULL, "adc mono right filter" },
2441 { "adc mono right filter", NULL, "PLL1", is_sys_clk_from_pll },
2444 { "VAD ADC Mux", "Mono ADC L", "Mono ADC MIXL" },
2445 { "VAD ADC Mux", "Mono ADC R", "Mono ADC MIXR" },
2449 { "IF_ADC2", NULL, "Mono ADC MIXL" },
2450 { "IF_ADC2", NULL, "Mono ADC MIXR" },
2489 { "DAC L2 Mux", "Mono ADC", "Mono ADC MIXL" },
2492 { "DAC L2 Volume", NULL, "dac mono left filter" },
2495 { "DAC R2 Mux", "Mono ADC", "Mono ADC MIXR" },
2498 { "DAC R2 Volume", NULL, "dac mono right filter" },
2509 { "Mono DAC MIXL", "DAC L1 Switch", "DAC1 MIXL" },
2510 { "Mono DAC MIXL", "DAC L2 Switch", "DAC L2 Volume" },
2511 { "Mono DAC MIXL", "DAC R2 Switch", "DAC R2 Volume" },
2512 { "Mono DAC MIXL", NULL, "dac mono left filter" },
2513 { "Mono DAC MIXR", "DAC R1 Switch", "DAC1 MIXR" },
2514 { "Mono DAC MIXR", "DAC R2 Switch", "DAC R2 Volume" },
2515 { "Mono DAC MIXR", "DAC L2 Switch", "DAC L2 Volume" },
2516 { "Mono DAC MIXR", NULL, "dac mono right filter" },
2539 { "OUT MIXL", "BST1 Switch", "BST1" },
2540 { "OUT MIXL", "INL Switch", "INL VOL" },
2541 { "OUT MIXL", "DAC L2 Switch", "DAC L2" },
2542 { "OUT MIXL", "DAC L1 Switch", "DAC L1" },
2544 { "OUT MIXR", "BST2 Switch", "BST2" },
2545 { "OUT MIXR", "INR Switch", "INR VOL" },
2546 { "OUT MIXR", "DAC R2 Switch", "DAC R2" },
2547 { "OUT MIXR", "DAC R1 Switch", "DAC R1" },
2581 { "LOUT MIX", "OUTMIX L Switch", "OUT MIXL" },
2582 { "LOUT MIX", "OUTMIX R Switch", "OUT MIXR" },
2585 { "PDM1 L Mux", "Mono DAC", "Mono DAC MIXL" },
2588 { "PDM1 R Mux", "Mono DAC", "Mono DAC MIXR" },
2621 { "A DAC2 L Mux", "Mono DAC Mixer", "Mono DAC MIXL"},
2623 { "A DAC2 R Mux", "Mono DAC Mixer", "Mono DAC MIXR"},
2708 { "DAC L2", NULL, "Mono DAC MIXL" },
2709 { "DAC R2", NULL, "Mono DAC MIXR" },
2771 struct snd_soc_component *component = dai->component; in rt5645_hw_params()
2776 rt5645->lrck[dai->id] = params_rate(params); in rt5645_hw_params()
2777 pre_div = rl6231_get_clk_info(rt5645->sysclk, rt5645->lrck[dai->id]); in rt5645_hw_params()
2779 dev_err(component->dev, "Unsupported clock setting\n"); in rt5645_hw_params()
2780 return -EINVAL; in rt5645_hw_params()
2784 dev_err(component->dev, "Unsupported frame size: %d\n", frame_size); in rt5645_hw_params()
2785 return -EINVAL; in rt5645_hw_params()
2788 switch (rt5645->codec_type) { in rt5645_hw_params()
2798 rt5645->bclk[dai->id] = rt5645->lrck[dai->id] * (32 << bclk_ms); in rt5645_hw_params()
2800 dev_dbg(dai->dev, "bclk is %dHz and lrck is %dHz\n", in rt5645_hw_params()
2801 rt5645->bclk[dai->id], rt5645->lrck[dai->id]); in rt5645_hw_params()
2802 dev_dbg(dai->dev, "bclk_ms is %d and pre_div is %d for iis %d\n", in rt5645_hw_params()
2803 bclk_ms, pre_div, dai->id); in rt5645_hw_params()
2818 return -EINVAL; in rt5645_hw_params()
2821 switch (dai->id) { in rt5645_hw_params()
2838 dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); in rt5645_hw_params()
2839 return -EINVAL; in rt5645_hw_params()
2847 struct snd_soc_component *component = dai->component; in rt5645_set_dai_fmt()
2851 switch (rt5645->codec_type) { in rt5645_set_dai_fmt()
2862 rt5645->master[dai->id] = 1; in rt5645_set_dai_fmt()
2866 rt5645->master[dai->id] = 0; in rt5645_set_dai_fmt()
2869 return -EINVAL; in rt5645_set_dai_fmt()
2879 return -EINVAL; in rt5645_set_dai_fmt()
2895 return -EINVAL; in rt5645_set_dai_fmt()
2897 switch (dai->id) { in rt5645_set_dai_fmt()
2909 dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); in rt5645_set_dai_fmt()
2910 return -EINVAL; in rt5645_set_dai_fmt()
2918 struct snd_soc_component *component = dai->component; in rt5645_set_dai_sysclk()
2922 if (freq == rt5645->sysclk && clk_id == rt5645->sysclk_src) in rt5645_set_dai_sysclk()
2936 dev_err(component->dev, "Invalid clock id (%d)\n", clk_id); in rt5645_set_dai_sysclk()
2937 return -EINVAL; in rt5645_set_dai_sysclk()
2941 rt5645->sysclk = freq; in rt5645_set_dai_sysclk()
2942 rt5645->sysclk_src = clk_id; in rt5645_set_dai_sysclk()
2944 dev_dbg(dai->dev, "Sysclk is %dHz and clock id is %d\n", freq, clk_id); in rt5645_set_dai_sysclk()
2952 struct snd_soc_component *component = dai->component; in rt5645_set_dai_pll()
2957 if (source == rt5645->pll_src && freq_in == rt5645->pll_in && in rt5645_set_dai_pll()
2958 freq_out == rt5645->pll_out) in rt5645_set_dai_pll()
2962 dev_dbg(component->dev, "PLL disabled\n"); in rt5645_set_dai_pll()
2964 rt5645->pll_in = 0; in rt5645_set_dai_pll()
2965 rt5645->pll_out = 0; in rt5645_set_dai_pll()
2978 switch (dai->id) { in rt5645_set_dai_pll()
2988 dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); in rt5645_set_dai_pll()
2989 return -EINVAL; in rt5645_set_dai_pll()
2993 dev_err(component->dev, "Unknown PLL source %d\n", source); in rt5645_set_dai_pll()
2994 return -EINVAL; in rt5645_set_dai_pll()
2999 dev_err(component->dev, "Unsupport input clock %d\n", freq_in); in rt5645_set_dai_pll()
3003 dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n", in rt5645_set_dai_pll()
3013 rt5645->pll_in = freq_in; in rt5645_set_dai_pll()
3014 rt5645->pll_out = freq_out; in rt5645_set_dai_pll()
3015 rt5645->pll_src = source; in rt5645_set_dai_pll()
3023 struct snd_soc_component *component = dai->component; in rt5645_set_tdm_slot()
3028 switch (rt5645->codec_type) { in rt5645_set_tdm_slot()
3046 if (rt5645->codec_type == CODEC_TYPE_RT5645) in rt5645_set_tdm_slot()
3121 if (rt5645->en_button_func) in rt5645_set_bias_level()
3123 &rt5645->jack_detect_work, in rt5645_set_bias_level()
3130 if (!rt5645->en_button_func) in rt5645_set_bias_level()
3181 regmap_write(rt5645->regmap, RT5645_CHARGE_PUMP, 0x0e06); in rt5645_jack_detect()
3187 if (!dapm->card->instantiated) { in rt5645_jack_detect()
3190 regmap_update_bits(rt5645->regmap, RT5645_PWR_ANLG1, in rt5645_jack_detect()
3193 regmap_update_bits(rt5645->regmap, RT5645_PWR_MIXER, in rt5645_jack_detect()
3195 regmap_update_bits(rt5645->regmap, RT5645_PWR_VOL, in rt5645_jack_detect()
3199 regmap_write(rt5645->regmap, RT5645_JD_CTRL3, 0x00f0); in rt5645_jack_detect()
3200 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2, in rt5645_jack_detect()
3202 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1, in rt5645_jack_detect()
3205 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2, in rt5645_jack_detect()
3209 regmap_read(rt5645->regmap, RT5645_IN1_CTRL3, &val); in rt5645_jack_detect()
3211 dev_dbg(component->dev, "val = %d\n", val); in rt5645_jack_detect()
3214 rt5645->jack_type = SND_JACK_HEADSET; in rt5645_jack_detect()
3215 if (rt5645->en_button_func) { in rt5645_jack_detect()
3221 rt5645->jack_type = SND_JACK_HEADPHONE; in rt5645_jack_detect()
3223 if (rt5645->pdata.level_trigger_irq) in rt5645_jack_detect()
3224 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2, in rt5645_jack_detect()
3226 } else { /* jack out */ in rt5645_jack_detect()
3227 rt5645->jack_type = 0; in rt5645_jack_detect()
3229 regmap_update_bits(rt5645->regmap, RT5645_HP_VOL, in rt5645_jack_detect()
3232 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2, in rt5645_jack_detect()
3234 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1, in rt5645_jack_detect()
3237 if (rt5645->en_button_func) in rt5645_jack_detect()
3240 if (rt5645->pdata.jd_mode == 0) in rt5645_jack_detect()
3244 if (rt5645->pdata.level_trigger_irq) in rt5645_jack_detect()
3245 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2, in rt5645_jack_detect()
3249 return rt5645->jack_type; in rt5645_jack_detect()
3272 rt5645->hp_jack = hp_jack; in rt5645_set_jack_detect()
3273 rt5645->mic_jack = mic_jack; in rt5645_set_jack_detect()
3274 rt5645->btn_jack = btn_jack; in rt5645_set_jack_detect()
3275 if (rt5645->btn_jack && rt5645->codec_type == CODEC_TYPE_RT5650) { in rt5645_set_jack_detect()
3276 rt5645->en_button_func = true; in rt5645_set_jack_detect()
3277 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_set_jack_detect()
3279 regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL1, in rt5645_set_jack_detect()
3294 if (!rt5645->component) in rt5645_jack_detect_work()
3297 switch (rt5645->pdata.jd_mode) { in rt5645_jack_detect_work()
3299 if (rt5645->gpiod_hp_det) { in rt5645_jack_detect_work()
3300 gpio_state = gpiod_get_value(rt5645->gpiod_hp_det); in rt5645_jack_detect_work()
3301 dev_dbg(rt5645->component->dev, "gpio_state = %d\n", in rt5645_jack_detect_work()
3303 report = rt5645_jack_detect(rt5645->component, gpio_state); in rt5645_jack_detect_work()
3305 snd_soc_jack_report(rt5645->hp_jack, in rt5645_jack_detect_work()
3307 snd_soc_jack_report(rt5645->mic_jack, in rt5645_jack_detect_work()
3311 val = snd_soc_component_read32(rt5645->component, RT5645_A_JD_CTRL1) & 0x0020; in rt5645_jack_detect_work()
3314 val = snd_soc_component_read32(rt5645->component, RT5645_INT_IRQ_ST) & 0x1000; in rt5645_jack_detect_work()
3319 if (!val && (rt5645->jack_type == 0)) { /* jack in */ in rt5645_jack_detect_work()
3320 report = rt5645_jack_detect(rt5645->component, 1); in rt5645_jack_detect_work()
3321 } else if (!val && rt5645->jack_type != 0) { in rt5645_jack_detect_work()
3322 /* for push button and jack out */ in rt5645_jack_detect_work()
3324 if (snd_soc_component_read32(rt5645->component, RT5645_INT_IRQ_ST) & 0x4) { in rt5645_jack_detect_work()
3327 btn_type = rt5645_button_detect(rt5645->component); in rt5645_jack_detect_work()
3357 dev_err(rt5645->component->dev, in rt5645_jack_detect_work()
3364 report = rt5645->jack_type; in rt5645_jack_detect_work()
3366 mod_timer(&rt5645->btn_check_timer, in rt5645_jack_detect_work()
3370 /* jack out */ in rt5645_jack_detect_work()
3372 snd_soc_component_update_bits(rt5645->component, in rt5645_jack_detect_work()
3374 rt5645_jack_detect(rt5645->component, 0); in rt5645_jack_detect_work()
3377 snd_soc_jack_report(rt5645->hp_jack, report, SND_JACK_HEADPHONE); in rt5645_jack_detect_work()
3378 snd_soc_jack_report(rt5645->mic_jack, report, SND_JACK_MICROPHONE); in rt5645_jack_detect_work()
3379 if (rt5645->en_button_func) in rt5645_jack_detect_work()
3380 snd_soc_jack_report(rt5645->btn_jack, in rt5645_jack_detect_work()
3390 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS, in rt5645_rcclock_work()
3399 &rt5645->jack_detect_work, msecs_to_jiffies(250)); in rt5645_irq()
3409 &rt5645->jack_detect_work, msecs_to_jiffies(5)); in rt5645_btn_check_callback()
3417 rt5645->component = component; in rt5645_probe()
3419 switch (rt5645->codec_type) { in rt5645_probe()
3427 if (rt5645->v_id < 3) { in rt5645_probe()
3446 if (rt5645->pdata.jd_mode) { in rt5645_probe()
3452 if (rt5645->pdata.long_name) in rt5645_probe()
3453 component->card->long_name = rt5645->pdata.long_name; in rt5645_probe()
3455 rt5645->eq_param = devm_kcalloc(component->dev, in rt5645_probe()
3472 regcache_cache_only(rt5645->regmap, true); in rt5645_suspend()
3473 regcache_mark_dirty(rt5645->regmap); in rt5645_suspend()
3482 regcache_cache_only(rt5645->regmap, false); in rt5645_resume()
3483 regcache_sync(rt5645->regmap); in rt5645_resume()
3506 .name = "rt5645-aif1",
3525 .name = "rt5645-aif2",
3647 .long_name = "gpd-win-pocket-rt5645",
3751 .ident = "MINIX Z83-4",
3754 DMI_MATCH(DMI_PRODUCT_NAME, "Z83-4"),
3771 DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "MIIX 310-10ICR"),
3780 DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "Lenovo MIIX 320-10ICR"),
3798 if (device_property_present(dev, "realtek,in2-differential") || in rt5645_check_dp()
3799 device_property_present(dev, "realtek,dmic1-data-pin") || in rt5645_check_dp()
3800 device_property_present(dev, "realtek,dmic2-data-pin") || in rt5645_check_dp()
3801 device_property_present(dev, "realtek,jd-mode")) in rt5645_check_dp()
3809 rt5645->pdata.in2_diff = device_property_read_bool(dev, in rt5645_parse_dt()
3810 "realtek,in2-differential"); in rt5645_parse_dt()
3812 "realtek,dmic1-data-pin", &rt5645->pdata.dmic1_data_pin); in rt5645_parse_dt()
3814 "realtek,dmic2-data-pin", &rt5645->pdata.dmic2_data_pin); in rt5645_parse_dt()
3816 "realtek,jd-mode", &rt5645->pdata.jd_mode); in rt5645_parse_dt()
3824 struct rt5645_platform_data *pdata = dev_get_platdata(&i2c->dev); in rt5645_i2c_probe()
3831 rt5645 = devm_kzalloc(&i2c->dev, sizeof(struct rt5645_priv), in rt5645_i2c_probe()
3834 return -ENOMEM; in rt5645_i2c_probe()
3836 rt5645->i2c = i2c; in rt5645_i2c_probe()
3841 dev_info(&i2c->dev, "Detected %s platform\n", dmi_data->ident); in rt5645_i2c_probe()
3842 pdata = dmi_data->driver_data; in rt5645_i2c_probe()
3846 rt5645->pdata = *pdata; in rt5645_i2c_probe()
3847 else if (rt5645_check_dp(&i2c->dev)) in rt5645_i2c_probe()
3848 rt5645_parse_dt(rt5645, &i2c->dev); in rt5645_i2c_probe()
3850 rt5645->pdata = jd_mode3_platform_data; in rt5645_i2c_probe()
3852 if (quirk != -1) { in rt5645_i2c_probe()
3853 rt5645->pdata.in2_diff = QUIRK_IN2_DIFF(quirk); in rt5645_i2c_probe()
3854 rt5645->pdata.level_trigger_irq = QUIRK_LEVEL_IRQ(quirk); in rt5645_i2c_probe()
3855 rt5645->pdata.inv_jd1_1 = QUIRK_INV_JD1_1(quirk); in rt5645_i2c_probe()
3856 rt5645->pdata.jd_mode = QUIRK_JD_MODE(quirk); in rt5645_i2c_probe()
3857 rt5645->pdata.dmic1_data_pin = QUIRK_DMIC1_DATA_PIN(quirk); in rt5645_i2c_probe()
3858 rt5645->pdata.dmic2_data_pin = QUIRK_DMIC2_DATA_PIN(quirk); in rt5645_i2c_probe()
3861 rt5645->gpiod_hp_det = devm_gpiod_get_optional(&i2c->dev, "hp-detect", in rt5645_i2c_probe()
3864 if (IS_ERR(rt5645->gpiod_hp_det)) { in rt5645_i2c_probe()
3865 dev_info(&i2c->dev, "failed to initialize gpiod\n"); in rt5645_i2c_probe()
3866 ret = PTR_ERR(rt5645->gpiod_hp_det); in rt5645_i2c_probe()
3869 * errors, including -EPROBE_DEFER in rt5645_i2c_probe()
3871 if (ret != -ENOENT) in rt5645_i2c_probe()
3875 for (i = 0; i < ARRAY_SIZE(rt5645->supplies); i++) in rt5645_i2c_probe()
3876 rt5645->supplies[i].supply = rt5645_supply_names[i]; in rt5645_i2c_probe()
3878 ret = devm_regulator_bulk_get(&i2c->dev, in rt5645_i2c_probe()
3879 ARRAY_SIZE(rt5645->supplies), in rt5645_i2c_probe()
3880 rt5645->supplies); in rt5645_i2c_probe()
3882 dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret); in rt5645_i2c_probe()
3886 ret = regulator_bulk_enable(ARRAY_SIZE(rt5645->supplies), in rt5645_i2c_probe()
3887 rt5645->supplies); in rt5645_i2c_probe()
3889 dev_err(&i2c->dev, "Failed to enable supplies: %d\n", ret); in rt5645_i2c_probe()
3896 dev_err(&i2c->dev, "Failed to allocate temp register map: %d\n", in rt5645_i2c_probe()
3910 rt5645->regmap = devm_regmap_init_i2c(i2c, &rt5645_regmap); in rt5645_i2c_probe()
3911 rt5645->codec_type = CODEC_TYPE_RT5645; in rt5645_i2c_probe()
3914 rt5645->regmap = devm_regmap_init_i2c(i2c, &rt5650_regmap); in rt5645_i2c_probe()
3915 rt5645->codec_type = CODEC_TYPE_RT5650; in rt5645_i2c_probe()
3918 dev_err(&i2c->dev, in rt5645_i2c_probe()
3921 ret = -ENODEV; in rt5645_i2c_probe()
3925 if (IS_ERR(rt5645->regmap)) { in rt5645_i2c_probe()
3926 ret = PTR_ERR(rt5645->regmap); in rt5645_i2c_probe()
3927 dev_err(&i2c->dev, "Failed to allocate register map: %d\n", in rt5645_i2c_probe()
3932 regmap_write(rt5645->regmap, RT5645_RESET, 0); in rt5645_i2c_probe()
3935 rt5645->v_id = val & 0xff; in rt5645_i2c_probe()
3937 regmap_write(rt5645->regmap, RT5645_AD_DA_MIXER, 0x8080); in rt5645_i2c_probe()
3939 ret = regmap_register_patch(rt5645->regmap, init_list, in rt5645_i2c_probe()
3942 dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret); in rt5645_i2c_probe()
3944 if (rt5645->codec_type == CODEC_TYPE_RT5650) { in rt5645_i2c_probe()
3945 ret = regmap_register_patch(rt5645->regmap, rt5650_init_list, in rt5645_i2c_probe()
3948 dev_warn(&i2c->dev, "Apply rt5650 patch failed: %d\n", in rt5645_i2c_probe()
3952 regmap_update_bits(rt5645->regmap, RT5645_CLSD_OUT_CTRL, 0xc0, 0xc0); in rt5645_i2c_probe()
3954 if (rt5645->pdata.in2_diff) in rt5645_i2c_probe()
3955 regmap_update_bits(rt5645->regmap, RT5645_IN2_CTRL, in rt5645_i2c_probe()
3958 if (rt5645->pdata.dmic1_data_pin || rt5645->pdata.dmic2_data_pin) { in rt5645_i2c_probe()
3959 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
3962 switch (rt5645->pdata.dmic1_data_pin) { in rt5645_i2c_probe()
3964 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, in rt5645_i2c_probe()
3969 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
3971 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, in rt5645_i2c_probe()
3973 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
3978 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, in rt5645_i2c_probe()
3980 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
3989 switch (rt5645->pdata.dmic2_data_pin) { in rt5645_i2c_probe()
3991 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, in rt5645_i2c_probe()
3996 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, in rt5645_i2c_probe()
3998 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
4003 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, in rt5645_i2c_probe()
4005 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
4011 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1, in rt5645_i2c_probe()
4013 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
4022 if (rt5645->pdata.jd_mode) { in rt5645_i2c_probe()
4023 regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL3, in rt5645_i2c_probe()
4026 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS, in rt5645_i2c_probe()
4028 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2, in rt5645_i2c_probe()
4030 regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL3, in rt5645_i2c_probe()
4032 regmap_update_bits(rt5645->regmap, RT5645_HPO_MIXER, in rt5645_i2c_probe()
4034 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS, in rt5645_i2c_probe()
4036 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1, in rt5645_i2c_probe()
4038 switch (rt5645->pdata.jd_mode) { in rt5645_i2c_probe()
4040 regmap_update_bits(rt5645->regmap, RT5645_A_JD_CTRL1, in rt5645_i2c_probe()
4045 regmap_update_bits(rt5645->regmap, RT5645_A_JD_CTRL1, in rt5645_i2c_probe()
4051 regmap_update_bits(rt5645->regmap, RT5645_A_JD_CTRL1, in rt5645_i2c_probe()
4058 if (rt5645->pdata.inv_jd1_1) { in rt5645_i2c_probe()
4059 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2, in rt5645_i2c_probe()
4064 regmap_update_bits(rt5645->regmap, RT5645_ADDA_CLK1, in rt5645_i2c_probe()
4067 if (rt5645->pdata.level_trigger_irq) { in rt5645_i2c_probe()
4068 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2, in rt5645_i2c_probe()
4071 timer_setup(&rt5645->btn_check_timer, rt5645_btn_check_callback, 0); in rt5645_i2c_probe()
4073 INIT_DELAYED_WORK(&rt5645->jack_detect_work, rt5645_jack_detect_work); in rt5645_i2c_probe()
4074 INIT_DELAYED_WORK(&rt5645->rcclock_work, rt5645_rcclock_work); in rt5645_i2c_probe()
4076 if (rt5645->i2c->irq) { in rt5645_i2c_probe()
4077 ret = request_threaded_irq(rt5645->i2c->irq, NULL, rt5645_irq, in rt5645_i2c_probe()
4081 dev_err(&i2c->dev, "Failed to reguest IRQ: %d\n", ret); in rt5645_i2c_probe()
4086 ret = devm_snd_soc_register_component(&i2c->dev, &soc_component_dev_rt5645, in rt5645_i2c_probe()
4094 if (rt5645->i2c->irq) in rt5645_i2c_probe()
4095 free_irq(rt5645->i2c->irq, rt5645); in rt5645_i2c_probe()
4097 regulator_bulk_disable(ARRAY_SIZE(rt5645->supplies), rt5645->supplies); in rt5645_i2c_probe()
4105 if (i2c->irq) in rt5645_i2c_remove()
4106 free_irq(i2c->irq, rt5645); in rt5645_i2c_remove()
4108 cancel_delayed_work_sync(&rt5645->jack_detect_work); in rt5645_i2c_remove()
4109 cancel_delayed_work_sync(&rt5645->rcclock_work); in rt5645_i2c_remove()
4110 del_timer_sync(&rt5645->btn_check_timer); in rt5645_i2c_remove()
4112 regulator_bulk_disable(ARRAY_SIZE(rt5645->supplies), rt5645->supplies); in rt5645_i2c_remove()
4121 regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL3, in rt5645_i2c_shutdown()
4123 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2, RT5645_CBJ_MN_JD, in rt5645_i2c_shutdown()
4125 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1, RT5645_CBJ_BST1_EN, in rt5645_i2c_shutdown()
4128 regmap_write(rt5645->regmap, RT5645_RESET, 0); in rt5645_i2c_shutdown()