Lines Matching +full:adc +full:- +full:mux
1 // SPDX-License-Identifier: GPL-2.0-only
3 * rt5640.c -- RT5640/RT5639 ALSA SoC audio codec driver
28 #include <sound/soc-dapm.h>
341 static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0);
342 static const DECLARE_TLV_DB_MINMAX(dac_vol_tlv, -6562, 0);
343 static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0);
344 static const DECLARE_TLV_DB_MINMAX(adc_vol_tlv, -1762, 3000);
421 /* ADC Digital Volume Control */
422 SOC_DOUBLE("ADC Capture Switch", RT5640_ADC_DIG_VOL,
424 SOC_DOUBLE_TLV("ADC Capture Volume", RT5640_ADC_DIG_VOL,
427 SOC_DOUBLE("Mono ADC Capture Switch", RT5640_DUMMY1,
429 SOC_DOUBLE_TLV("Mono ADC Capture Volume", RT5640_ADC_DATA,
432 /* ADC Boost Volume Control */
433 SOC_DOUBLE_TLV("ADC Boost Gain", RT5640_ADC_BST_VOL,
439 SOC_ENUM("ADC IF1 Data Switch", rt5640_if1_adc_enum),
441 SOC_ENUM("ADC IF2 Data Switch", rt5640_if2_adc_enum),
452 * set_dmic_clk - Set parameter of dmic.
462 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in set_dmic_clk()
466 rate = rt5640->sysclk / rl6231_get_pre_div(rt5640->regmap, in set_dmic_clk()
470 dev_err(component->dev, "Failed to set DMIC clock\n"); in set_dmic_clk()
480 struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); in is_using_asrc()
483 if (!rt5640->asrc_en) in is_using_asrc()
519 SOC_DAPM_SINGLE("Stereo ADC Switch", RT5640_AD_DA_MIXER,
526 SOC_DAPM_SINGLE("Stereo ADC Switch", RT5640_AD_DA_MIXER,
792 /* Stereo ADC source */
794 "DIG MIX", "ADC"
801 SOC_DAPM_ENUM("Stereo ADC1 Mux", rt5640_stereo_adc1_enum);
811 SOC_DAPM_ENUM("Stereo ADC2 Mux", rt5640_stereo_adc2_enum);
813 /* Mono ADC source */
922 regmap_update_bits(rt5640->regmap, RT5640_PR_BASE + in hp_amp_power_on()
924 regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M2, in hp_amp_power_on()
926 regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M1, in hp_amp_power_on()
929 regmap_write(rt5640->regmap, RT5640_PR_BASE + RT5640_HP_DCC_INT1, in hp_amp_power_on()
932 regmap_update_bits(rt5640->regmap, RT5640_PWR_ANLG1, in hp_amp_power_on()
934 regmap_update_bits(rt5640->regmap, RT5640_PWR_ANLG1, in hp_amp_power_on()
938 regmap_update_bits(rt5640->regmap, RT5640_PWR_ANLG1, in hp_amp_power_on()
947 regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M2, in rt5640_pmu_depop()
950 regmap_update_bits(rt5640->regmap, RT5640_CHARGE_PUMP, in rt5640_pmu_depop()
953 regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M3, in rt5640_pmu_depop()
959 regmap_write(rt5640->regmap, RT5640_PR_BASE + in rt5640_pmu_depop()
961 regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M1, in rt5640_pmu_depop()
964 regmap_update_bits(rt5640->regmap, RT5640_PR_BASE + in rt5640_pmu_depop()
971 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5640_hp_event()
977 rt5640->hp_mute = false; in rt5640_hp_event()
981 rt5640->hp_mute = true; in rt5640_hp_event()
995 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5640_lout_event()
1024 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5640_hp_power_event()
1040 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5640_hp_post_event()
1045 if (!rt5640->hp_mute) in rt5640_hp_post_event()
1115 SND_SOC_DAPM_ADC("ADC L", NULL, RT5640_PWR_DIG1,
1117 SND_SOC_DAPM_ADC("ADC R", NULL, RT5640_PWR_DIG1,
1119 /* ADC Mux */
1120 SND_SOC_DAPM_MUX("Stereo ADC L2 Mux", SND_SOC_NOPM, 0, 0,
1122 SND_SOC_DAPM_MUX("Stereo ADC R2 Mux", SND_SOC_NOPM, 0, 0,
1124 SND_SOC_DAPM_MUX("Stereo ADC L1 Mux", SND_SOC_NOPM, 0, 0,
1126 SND_SOC_DAPM_MUX("Stereo ADC R1 Mux", SND_SOC_NOPM, 0, 0,
1128 SND_SOC_DAPM_MUX("Mono ADC L2 Mux", SND_SOC_NOPM, 0, 0,
1130 SND_SOC_DAPM_MUX("Mono ADC L1 Mux", SND_SOC_NOPM, 0, 0,
1132 SND_SOC_DAPM_MUX("Mono ADC R1 Mux", SND_SOC_NOPM, 0, 0,
1134 SND_SOC_DAPM_MUX("Mono ADC R2 Mux", SND_SOC_NOPM, 0, 0,
1136 /* ADC Mixer */
1139 SND_SOC_DAPM_MIXER("Stereo ADC MIXL", SND_SOC_NOPM, 0, 0,
1141 SND_SOC_DAPM_MIXER("Stereo ADC MIXR", SND_SOC_NOPM, 0, 0,
1145 SND_SOC_DAPM_MIXER("Mono ADC MIXL", SND_SOC_NOPM, 0, 0,
1149 SND_SOC_DAPM_MIXER("Mono ADC MIXR", SND_SOC_NOPM, 0, 0,
1158 SND_SOC_DAPM_PGA("IF1 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
1159 SND_SOC_DAPM_PGA("IF1 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0),
1160 SND_SOC_DAPM_PGA("IF1 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0),
1166 SND_SOC_DAPM_PGA("IF2 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
1167 SND_SOC_DAPM_PGA("IF2 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0),
1168 SND_SOC_DAPM_PGA("IF2 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0),
1170 SND_SOC_DAPM_MUX("DAI1 RX Mux", SND_SOC_NOPM, 0, 0, &rt5640_dai_mux),
1171 SND_SOC_DAPM_MUX("DAI1 TX Mux", SND_SOC_NOPM, 0, 0, &rt5640_dai_mux),
1172 SND_SOC_DAPM_MUX("DAI1 IF1 Mux", SND_SOC_NOPM, 0, 0, &rt5640_dai_mux),
1173 SND_SOC_DAPM_MUX("DAI1 IF2 Mux", SND_SOC_NOPM, 0, 0, &rt5640_dai_mux),
1174 SND_SOC_DAPM_MUX("SDI1 TX Mux", SND_SOC_NOPM, 0, 0, &rt5640_sdi_mux),
1175 SND_SOC_DAPM_MUX("DAI2 RX Mux", SND_SOC_NOPM, 0, 0, &rt5640_dai_mux),
1176 SND_SOC_DAPM_MUX("DAI2 TX Mux", SND_SOC_NOPM, 0, 0, &rt5640_dai_mux),
1177 SND_SOC_DAPM_MUX("DAI2 IF1 Mux", SND_SOC_NOPM, 0, 0, &rt5640_dai_mux),
1178 SND_SOC_DAPM_MUX("DAI2 IF2 Mux", SND_SOC_NOPM, 0, 0, &rt5640_dai_mux),
1179 SND_SOC_DAPM_MUX("SDI2 TX Mux", SND_SOC_NOPM, 0, 0, &rt5640_sdi_mux),
1282 /* DAC2 channel Mux */
1283 SND_SOC_DAPM_MUX("DAC L2 Mux", SND_SOC_NOPM, 0, 0, &rt5640_dac_l2_mux),
1284 SND_SOC_DAPM_MUX("DAC R2 Mux", SND_SOC_NOPM, 0, 0, &rt5640_dac_r2_mux),
1372 {"ADC L", NULL, "RECMIXL"},
1373 {"ADC R", NULL, "RECMIXR"},
1384 {"Stereo ADC L2 Mux", "DMIC1", "DMIC L1"},
1385 {"Stereo ADC L2 Mux", "DMIC2", "DMIC L2"},
1386 {"Stereo ADC L2 Mux", "DIG MIX", "DIG MIXL"},
1387 {"Stereo ADC L1 Mux", "ADC", "ADC L"},
1388 {"Stereo ADC L1 Mux", "DIG MIX", "DIG MIXL"},
1390 {"Stereo ADC R1 Mux", "ADC", "ADC R"},
1391 {"Stereo ADC R1 Mux", "DIG MIX", "DIG MIXR"},
1392 {"Stereo ADC R2 Mux", "DMIC1", "DMIC R1"},
1393 {"Stereo ADC R2 Mux", "DMIC2", "DMIC R2"},
1394 {"Stereo ADC R2 Mux", "DIG MIX", "DIG MIXR"},
1396 {"Mono ADC L2 Mux", "DMIC L1", "DMIC L1"},
1397 {"Mono ADC L2 Mux", "DMIC L2", "DMIC L2"},
1398 {"Mono ADC L2 Mux", "Mono DAC MIXL", "Mono DAC MIXL"},
1399 {"Mono ADC L1 Mux", "Mono DAC MIXL", "Mono DAC MIXL"},
1400 {"Mono ADC L1 Mux", "ADCL", "ADC L"},
1402 {"Mono ADC R1 Mux", "Mono DAC MIXR", "Mono DAC MIXR"},
1403 {"Mono ADC R1 Mux", "ADCR", "ADC R"},
1404 {"Mono ADC R2 Mux", "DMIC R1", "DMIC R1"},
1405 {"Mono ADC R2 Mux", "DMIC R2", "DMIC R2"},
1406 {"Mono ADC R2 Mux", "Mono DAC MIXR", "Mono DAC MIXR"},
1408 {"Stereo ADC MIXL", "ADC1 Switch", "Stereo ADC L1 Mux"},
1409 {"Stereo ADC MIXL", "ADC2 Switch", "Stereo ADC L2 Mux"},
1410 {"Stereo ADC MIXL", NULL, "Stereo Filter"},
1412 {"Stereo ADC MIXR", "ADC1 Switch", "Stereo ADC R1 Mux"},
1413 {"Stereo ADC MIXR", "ADC2 Switch", "Stereo ADC R2 Mux"},
1414 {"Stereo ADC MIXR", NULL, "Stereo Filter"},
1416 {"Mono ADC MIXL", "ADC1 Switch", "Mono ADC L1 Mux"},
1417 {"Mono ADC MIXL", "ADC2 Switch", "Mono ADC L2 Mux"},
1418 {"Mono ADC MIXL", NULL, "Mono Left Filter"},
1420 {"Mono ADC MIXR", "ADC1 Switch", "Mono ADC R1 Mux"},
1421 {"Mono ADC MIXR", "ADC2 Switch", "Mono ADC R2 Mux"},
1422 {"Mono ADC MIXR", NULL, "Mono Right Filter"},
1424 {"IF2 ADC L", NULL, "Mono ADC MIXL"},
1425 {"IF2 ADC R", NULL, "Mono ADC MIXR"},
1426 {"IF1 ADC L", NULL, "Stereo ADC MIXL"},
1427 {"IF1 ADC R", NULL, "Stereo ADC MIXR"},
1429 {"IF1 ADC", NULL, "I2S1"},
1430 {"IF1 ADC", NULL, "IF1 ADC L"},
1431 {"IF1 ADC", NULL, "IF1 ADC R"},
1432 {"IF2 ADC", NULL, "I2S2"},
1433 {"IF2 ADC", NULL, "IF2 ADC L"},
1434 {"IF2 ADC", NULL, "IF2 ADC R"},
1436 {"DAI1 TX Mux", "1:1|2:2", "IF1 ADC"},
1437 {"DAI1 TX Mux", "1:2|2:1", "IF2 ADC"},
1438 {"DAI1 IF1 Mux", "1:1|2:1", "IF1 ADC"},
1439 {"DAI1 IF2 Mux", "1:1|2:1", "IF2 ADC"},
1440 {"SDI1 TX Mux", "IF1", "DAI1 IF1 Mux"},
1441 {"SDI1 TX Mux", "IF2", "DAI1 IF2 Mux"},
1443 {"DAI2 TX Mux", "1:2|2:1", "IF1 ADC"},
1444 {"DAI2 TX Mux", "1:1|2:2", "IF2 ADC"},
1445 {"DAI2 IF1 Mux", "1:2|2:2", "IF1 ADC"},
1446 {"DAI2 IF2 Mux", "1:2|2:2", "IF2 ADC"},
1447 {"SDI2 TX Mux", "IF1", "DAI2 IF1 Mux"},
1448 {"SDI2 TX Mux", "IF2", "DAI2 IF2 Mux"},
1450 {"AIF1TX", NULL, "DAI1 TX Mux"},
1451 {"AIF1TX", NULL, "SDI1 TX Mux"},
1452 {"AIF2TX", NULL, "DAI2 TX Mux"},
1453 {"AIF2TX", NULL, "SDI2 TX Mux"},
1455 {"DAI1 RX Mux", "1:1|2:2", "AIF1RX"},
1456 {"DAI1 RX Mux", "1:1|2:1", "AIF1RX"},
1457 {"DAI1 RX Mux", "1:2|2:1", "AIF2RX"},
1458 {"DAI1 RX Mux", "1:2|2:2", "AIF2RX"},
1460 {"DAI2 RX Mux", "1:2|2:1", "AIF1RX"},
1461 {"DAI2 RX Mux", "1:1|2:1", "AIF1RX"},
1462 {"DAI2 RX Mux", "1:1|2:2", "AIF2RX"},
1463 {"DAI2 RX Mux", "1:2|2:2", "AIF2RX"},
1466 {"IF1 DAC", NULL, "DAI1 RX Mux"},
1468 {"IF2 DAC", NULL, "DAI2 RX Mux"},
1475 {"DAC MIXL", "Stereo ADC Switch", "Stereo ADC MIXL"},
1478 {"DAC MIXR", "Stereo ADC Switch", "Stereo ADC MIXR"},
1573 {"ANC", NULL, "Stereo ADC MIXL"},
1574 {"ANC", NULL, "Stereo ADC MIXR"},
1579 {"DAC L2 Mux", "IF2", "IF2 DAC L"},
1580 {"DAC L2 Mux", "Base L/R", "Audio DSP"},
1581 {"DAC L2 Mux", NULL, "DAC L2 Power"},
1582 {"DAC R2 Mux", "IF2", "IF2 DAC R"},
1583 {"DAC R2 Mux", NULL, "DAC R2 Power"},
1585 {"Stereo DAC MIXL", "DAC L2 Switch", "DAC L2 Mux"},
1587 {"Stereo DAC MIXR", "DAC R2 Switch", "DAC R2 Mux"},
1590 {"Mono DAC MIXL", "DAC L2 Switch", "DAC L2 Mux"},
1591 {"Mono DAC MIXL", "DAC R2 Switch", "DAC R2 Mux"},
1593 {"Mono DAC MIXR", "DAC R2 Switch", "DAC R2 Mux"},
1594 {"Mono DAC MIXR", "DAC L2 Switch", "DAC L2 Mux"},
1596 {"DIG MIXR", "DAC R2 Switch", "DAC R2 Mux"},
1597 {"DIG MIXL", "DAC L2 Switch", "DAC L2 Mux"},
1652 return -EINVAL; in get_sdp_info()
1690 ret = -EINVAL; in get_sdp_info()
1700 struct snd_soc_component *component = dai->component; in rt5640_hw_params()
1705 rt5640->lrck[dai->id] = params_rate(params); in rt5640_hw_params()
1706 pre_div = rl6231_get_clk_info(rt5640->sysclk, rt5640->lrck[dai->id]); in rt5640_hw_params()
1708 dev_err(component->dev, "Unsupported clock setting %d for DAI %d\n", in rt5640_hw_params()
1709 rt5640->lrck[dai->id], dai->id); in rt5640_hw_params()
1710 return -EINVAL; in rt5640_hw_params()
1714 dev_err(component->dev, "Unsupported frame size: %d\n", frame_size); in rt5640_hw_params()
1721 rt5640->bclk[dai->id] = rt5640->lrck[dai->id] * (32 << bclk_ms); in rt5640_hw_params()
1723 dev_dbg(dai->dev, "bclk is %dHz and lrck is %dHz\n", in rt5640_hw_params()
1724 rt5640->bclk[dai->id], rt5640->lrck[dai->id]); in rt5640_hw_params()
1725 dev_dbg(dai->dev, "bclk_ms is %d and pre_div is %d for iis %d\n", in rt5640_hw_params()
1726 bclk_ms, pre_div, dai->id); in rt5640_hw_params()
1741 return -EINVAL; in rt5640_hw_params()
1744 dai_sel = get_sdp_info(component, dai->id); in rt5640_hw_params()
1746 dev_err(component->dev, "Failed to get sdp info: %d\n", dai_sel); in rt5640_hw_params()
1747 return -EINVAL; in rt5640_hw_params()
1771 struct snd_soc_component *component = dai->component; in rt5640_set_dai_fmt()
1778 rt5640->master[dai->id] = 1; in rt5640_set_dai_fmt()
1782 rt5640->master[dai->id] = 0; in rt5640_set_dai_fmt()
1785 return -EINVAL; in rt5640_set_dai_fmt()
1795 return -EINVAL; in rt5640_set_dai_fmt()
1811 return -EINVAL; in rt5640_set_dai_fmt()
1814 dai_sel = get_sdp_info(component, dai->id); in rt5640_set_dai_fmt()
1816 dev_err(component->dev, "Failed to get sdp info: %d\n", dai_sel); in rt5640_set_dai_fmt()
1817 return -EINVAL; in rt5640_set_dai_fmt()
1836 struct snd_soc_component *component = dai->component; in rt5640_set_dai_sysclk()
1841 if (freq == rt5640->sysclk && clk_id == rt5640->sysclk_src) in rt5640_set_dai_sysclk()
1856 dev_err(component->dev, "Invalid clock id (%d)\n", clk_id); in rt5640_set_dai_sysclk()
1857 return -EINVAL; in rt5640_set_dai_sysclk()
1863 rt5640->sysclk = freq; in rt5640_set_dai_sysclk()
1864 rt5640->sysclk_src = clk_id; in rt5640_set_dai_sysclk()
1866 dev_dbg(dai->dev, "Sysclk is %dHz and clock id is %d\n", freq, clk_id); in rt5640_set_dai_sysclk()
1873 struct snd_soc_component *component = dai->component; in rt5640_set_dai_pll()
1878 if (source == rt5640->pll_src && freq_in == rt5640->pll_in && in rt5640_set_dai_pll()
1879 freq_out == rt5640->pll_out) in rt5640_set_dai_pll()
1883 dev_dbg(component->dev, "PLL disabled\n"); in rt5640_set_dai_pll()
1885 rt5640->pll_in = 0; in rt5640_set_dai_pll()
1886 rt5640->pll_out = 0; in rt5640_set_dai_pll()
1906 dev_err(component->dev, "Unknown PLL source %d\n", source); in rt5640_set_dai_pll()
1907 return -EINVAL; in rt5640_set_dai_pll()
1912 dev_err(component->dev, "Unsupport input clock %d\n", freq_in); in rt5640_set_dai_pll()
1916 dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n", in rt5640_set_dai_pll()
1926 rt5640->pll_in = freq_in; in rt5640_set_dai_pll()
1927 rt5640->pll_out = freq_out; in rt5640_set_dai_pll()
1928 rt5640->pll_src = source; in rt5640_set_dai_pll()
1951 if (IS_ERR(rt5640->mclk)) in rt5640_set_bias_level()
1955 clk_disable_unprepare(rt5640->mclk); in rt5640_set_bias_level()
1957 ret = clk_prepare_enable(rt5640->mclk); in rt5640_set_bias_level()
2005 regmap_update_bits(rt5640->regmap, RT5640_GPIO_CTRL1, in rt5640_dmic_enable()
2009 regmap_update_bits(rt5640->regmap, RT5640_DMIC, in rt5640_dmic_enable()
2011 regmap_update_bits(rt5640->regmap, RT5640_GPIO_CTRL1, in rt5640_dmic_enable()
2016 regmap_update_bits(rt5640->regmap, RT5640_DMIC, in rt5640_dmic_enable()
2018 regmap_update_bits(rt5640->regmap, RT5640_GPIO_CTRL1, in rt5640_dmic_enable()
2039 return -EINVAL; in rt5640_sel_asrc_clk_src()
2043 return -EINVAL; in rt5640_sel_asrc_clk_src()
2085 rt5640->asrc_en = true; in rt5640_sel_asrc_clk_src()
2088 rt5640->asrc_en = false; in rt5640_sel_asrc_clk_src()
2103 /* OVCD is unreliable when used with RCCLK as sysclk-source */ in rt5640_enable_micbias1_for_ovcd()
2129 rt5640->ovcd_irq_enabled = true; in rt5640_enable_micbias1_ovcd_irq()
2138 rt5640->ovcd_irq_enabled = false; in rt5640_disable_micbias1_ovcd_irq()
2152 dev_dbg(component->dev, "irq ctrl2 %#04x\n", val); in rt5640_micbias1_ovcd()
2163 dev_dbg(component->dev, "irq status %#04x\n", val); in rt5640_jack_inserted()
2165 if (rt5640->jd_inverted) in rt5640_jack_inserted()
2171 /* Jack detect and button-press timings */
2184 rt5640->poll_count = 0; in rt5640_start_button_press_work()
2185 rt5640->press_count = 0; in rt5640_start_button_press_work()
2186 rt5640->release_count = 0; in rt5640_start_button_press_work()
2187 rt5640->pressed = false; in rt5640_start_button_press_work()
2188 rt5640->press_reported = false; in rt5640_start_button_press_work()
2190 schedule_delayed_work(&rt5640->bp_work, msecs_to_jiffies(BP_POLL_TIME)); in rt5640_start_button_press_work()
2197 struct snd_soc_component *component = rt5640->component; in rt5640_button_press_work()
2204 rt5640->release_count = 0; in rt5640_button_press_work()
2205 rt5640->press_count++; in rt5640_button_press_work()
2207 if (rt5640->press_count >= BP_THRESHOLD) in rt5640_button_press_work()
2208 rt5640->pressed = true; in rt5640_button_press_work()
2211 rt5640->press_count = 0; in rt5640_button_press_work()
2212 rt5640->release_count++; in rt5640_button_press_work()
2217 * at least JACK_UNPLUG_TIME milli-seconds before reporting a press. in rt5640_button_press_work()
2219 rt5640->poll_count++; in rt5640_button_press_work()
2220 if (rt5640->poll_count < (JACK_UNPLUG_TIME / BP_POLL_TIME)) { in rt5640_button_press_work()
2221 schedule_delayed_work(&rt5640->bp_work, in rt5640_button_press_work()
2226 if (rt5640->pressed && !rt5640->press_reported) { in rt5640_button_press_work()
2227 dev_dbg(component->dev, "headset button press\n"); in rt5640_button_press_work()
2228 snd_soc_jack_report(rt5640->jack, SND_JACK_BTN_0, in rt5640_button_press_work()
2230 rt5640->press_reported = true; in rt5640_button_press_work()
2233 if (rt5640->release_count >= BP_THRESHOLD) { in rt5640_button_press_work()
2234 if (rt5640->press_reported) { in rt5640_button_press_work()
2235 dev_dbg(component->dev, "headset button release\n"); in rt5640_button_press_work()
2236 snd_soc_jack_report(rt5640->jack, 0, SND_JACK_BTN_0); in rt5640_button_press_work()
2238 /* Re-enable OVCD IRQ to detect next press */ in rt5640_button_press_work()
2243 schedule_delayed_work(&rt5640->bp_work, msecs_to_jiffies(BP_POLL_TIME)); in rt5640_button_press_work()
2258 /* Clear any previous over-current status flag */ in rt5640_detect_headset()
2278 dev_dbg(component->dev, "jack mic-gnd shorted\n"); in rt5640_detect_headset()
2284 dev_dbg(component->dev, "jack mic-gnd open\n"); in rt5640_detect_headset()
2292 …dev_err(component->dev, "Error detecting headset vs headphones, bad contact?, assuming headphones\… in rt5640_detect_headset()
2301 struct snd_soc_component *component = rt5640->component; in rt5640_jack_work()
2306 if (rt5640->jack->status & SND_JACK_HEADPHONE) { in rt5640_jack_work()
2307 if (rt5640->jack->status & SND_JACK_MICROPHONE) { in rt5640_jack_work()
2308 cancel_delayed_work_sync(&rt5640->bp_work); in rt5640_jack_work()
2312 snd_soc_jack_report(rt5640->jack, 0, in rt5640_jack_work()
2314 dev_dbg(component->dev, "jack unplugged\n"); in rt5640_jack_work()
2316 } else if (!(rt5640->jack->status & SND_JACK_HEADPHONE)) { in rt5640_jack_work()
2318 WARN_ON(rt5640->ovcd_irq_enabled); in rt5640_jack_work()
2328 dev_dbg(component->dev, "detect status %#02x\n", status); in rt5640_jack_work()
2329 snd_soc_jack_report(rt5640->jack, status, SND_JACK_HEADSET); in rt5640_jack_work()
2330 } else if (rt5640->ovcd_irq_enabled && rt5640_micbias1_ovcd(component)) { in rt5640_jack_work()
2331 dev_dbg(component->dev, "OVCD IRQ\n"); in rt5640_jack_work()
2346 * If the jack-detect IRQ flag goes high (unplug) after our in rt5640_jack_work()
2349 * we react to edges, we miss the unplug event -> recheck. in rt5640_jack_work()
2351 queue_work(system_long_wq, &rt5640->jack_work); in rt5640_jack_work()
2359 if (rt5640->jack) in rt5640_irq()
2360 queue_work(system_long_wq, &rt5640->jack_work); in rt5640_irq()
2369 cancel_work_sync(&rt5640->jack_work); in rt5640_cancel_work()
2370 cancel_delayed_work_sync(&rt5640->bp_work); in rt5640_cancel_work()
2378 0xa800 | rt5640->ovcd_sf); in rt5640_set_ovcd_params()
2382 rt5640->ovcd_th | RT5640_MIC1_OVCD_EN); in rt5640_set_ovcd_params()
2385 * The over-current-detect is only reliable in detecting the absence in rt5640_set_ovcd_params()
2386 * of over-current, when the mic-contact in the jack is short-circuited, in rt5640_set_ovcd_params()
2387 * the hardware periodically retries if it can apply the bias-current in rt5640_set_ovcd_params()
2388 * leading to the ovcd status flip-flopping 1-0-1 with it being 0 about in rt5640_set_ovcd_params()
2403 * soc_remove_component() force-disables jack and thus rt5640->jack in rt5640_disable_jack_detect()
2406 if (!rt5640->jack) in rt5640_disable_jack_detect()
2409 free_irq(rt5640->irq, rt5640); in rt5640_disable_jack_detect()
2412 if (rt5640->jack->status & SND_JACK_MICROPHONE) { in rt5640_disable_jack_detect()
2415 snd_soc_jack_report(rt5640->jack, 0, SND_JACK_BTN_0); in rt5640_disable_jack_detect()
2418 rt5640->jack = NULL; in rt5640_disable_jack_detect()
2427 /* Select JD-source */ in rt5640_enable_jack_detect()
2429 RT5640_JD_MASK, rt5640->jd_src); in rt5640_enable_jack_detect()
2448 * All IRQs get or-ed together, so we need the jack IRQ to report 0 in rt5640_enable_jack_detect()
2453 if (rt5640->jd_inverted) in rt5640_enable_jack_detect()
2460 rt5640->jack = jack; in rt5640_enable_jack_detect()
2461 if (rt5640->jack->status & SND_JACK_MICROPHONE) { in rt5640_enable_jack_detect()
2466 ret = request_irq(rt5640->irq, rt5640_irq, in rt5640_enable_jack_detect()
2470 dev_warn(component->dev, "Failed to reguest IRQ %d: %d\n", rt5640->irq, ret); in rt5640_enable_jack_detect()
2471 rt5640->irq = -ENXIO; in rt5640_enable_jack_detect()
2478 queue_work(system_long_wq, &rt5640->jack_work); in rt5640_enable_jack_detect()
2502 rt5640->mclk = devm_clk_get(component->dev, "mclk"); in rt5640_probe()
2503 if (PTR_ERR(rt5640->mclk) == -EPROBE_DEFER) in rt5640_probe()
2504 return -EPROBE_DEFER; in rt5640_probe()
2506 rt5640->component = component; in rt5640_probe()
2536 dev_err(component->dev, in rt5640_probe()
2538 return -ENODEV; in rt5640_probe()
2542 * Note on some platforms the platform code may need to add device-props in rt5640_probe()
2545 * rt5640_i2c_probe(), so that the platform-code can attach extra in rt5640_probe()
2548 if (device_property_read_bool(component->dev, "realtek,in1-differential")) in rt5640_probe()
2552 if (device_property_read_bool(component->dev, "realtek,in2-differential")) in rt5640_probe()
2556 if (device_property_read_bool(component->dev, "realtek,in3-differential")) in rt5640_probe()
2560 if (device_property_read_u32(component->dev, "realtek,dmic1-data-pin", in rt5640_probe()
2562 dmic1_data_pin = val - 1; in rt5640_probe()
2566 if (device_property_read_u32(component->dev, "realtek,dmic2-data-pin", in rt5640_probe()
2568 dmic2_data_pin = val - 1; in rt5640_probe()
2575 if (device_property_read_u32(component->dev, in rt5640_probe()
2576 "realtek,jack-detect-source", &val) == 0) { in rt5640_probe()
2578 rt5640->jd_src = val << RT5640_JD_SFT; in rt5640_probe()
2580 …dev_warn(component->dev, "Warning: Invalid jack-detect-source value: %d, leaving jack-detect disab… in rt5640_probe()
2584 if (!device_property_read_bool(component->dev, "realtek,jack-detect-not-inverted")) in rt5640_probe()
2585 rt5640->jd_inverted = true; in rt5640_probe()
2589 * threshold and scale-factor are 2000µA and 0.75. For an effective in rt5640_probe()
2592 rt5640->ovcd_th = RT5640_MIC1_OVTH_2000UA; in rt5640_probe()
2593 rt5640->ovcd_sf = RT5640_MIC_OVCD_SF_0P75; in rt5640_probe()
2595 if (device_property_read_u32(component->dev, in rt5640_probe()
2596 "realtek,over-current-threshold-microamp", &val) == 0) { in rt5640_probe()
2599 rt5640->ovcd_th = RT5640_MIC1_OVTH_600UA; in rt5640_probe()
2602 rt5640->ovcd_th = RT5640_MIC1_OVTH_1500UA; in rt5640_probe()
2605 rt5640->ovcd_th = RT5640_MIC1_OVTH_2000UA; in rt5640_probe()
2608 …dev_warn(component->dev, "Warning: Invalid over-current-threshold-microamp value: %d, defaulting t… in rt5640_probe()
2613 if (device_property_read_u32(component->dev, in rt5640_probe()
2614 "realtek,over-current-scale-factor", &val) == 0) { in rt5640_probe()
2616 rt5640->ovcd_sf = val << RT5640_MIC_OVCD_SF_SFT; in rt5640_probe()
2618 …dev_warn(component->dev, "Warning: Invalid over-current-scale-factor value: %d, defaulting to 0.75… in rt5640_probe()
2637 regcache_cache_only(rt5640->regmap, true); in rt5640_suspend()
2638 regcache_mark_dirty(rt5640->regmap); in rt5640_suspend()
2639 if (gpio_is_valid(rt5640->ldo1_en)) in rt5640_suspend()
2640 gpio_set_value_cansleep(rt5640->ldo1_en, 0); in rt5640_suspend()
2649 if (gpio_is_valid(rt5640->ldo1_en)) { in rt5640_resume()
2650 gpio_set_value_cansleep(rt5640->ldo1_en, 1); in rt5640_resume()
2654 regcache_cache_only(rt5640->regmap, false); in rt5640_resume()
2655 regcache_sync(rt5640->regmap); in rt5640_resume()
2677 .name = "rt5640-aif1",
2696 .name = "rt5640-aif2",
2784 rt5640->ldo1_en = of_get_named_gpio(np, "realtek,ldo1-en-gpios", 0); in rt5640_parse_dt()
2787 * -ENOENT means that the property doesn't exist, i.e. there is no in rt5640_parse_dt()
2791 if (!gpio_is_valid(rt5640->ldo1_en) && in rt5640_parse_dt()
2792 (rt5640->ldo1_en != -ENOENT)) in rt5640_parse_dt()
2793 return rt5640->ldo1_en; in rt5640_parse_dt()
2805 rt5640 = devm_kzalloc(&i2c->dev, in rt5640_i2c_probe()
2809 return -ENOMEM; in rt5640_i2c_probe()
2812 if (i2c->dev.of_node) { in rt5640_i2c_probe()
2813 ret = rt5640_parse_dt(rt5640, i2c->dev.of_node); in rt5640_i2c_probe()
2817 rt5640->ldo1_en = -EINVAL; in rt5640_i2c_probe()
2819 rt5640->regmap = devm_regmap_init_i2c(i2c, &rt5640_regmap); in rt5640_i2c_probe()
2820 if (IS_ERR(rt5640->regmap)) { in rt5640_i2c_probe()
2821 ret = PTR_ERR(rt5640->regmap); in rt5640_i2c_probe()
2822 dev_err(&i2c->dev, "Failed to allocate register map: %d\n", in rt5640_i2c_probe()
2827 if (gpio_is_valid(rt5640->ldo1_en)) { in rt5640_i2c_probe()
2828 ret = devm_gpio_request_one(&i2c->dev, rt5640->ldo1_en, in rt5640_i2c_probe()
2832 dev_err(&i2c->dev, "Failed to request LDO1_EN %d: %d\n", in rt5640_i2c_probe()
2833 rt5640->ldo1_en, ret); in rt5640_i2c_probe()
2839 regmap_read(rt5640->regmap, RT5640_VENDOR_ID2, &val); in rt5640_i2c_probe()
2841 dev_err(&i2c->dev, in rt5640_i2c_probe()
2843 return -ENODEV; in rt5640_i2c_probe()
2846 regmap_write(rt5640->regmap, RT5640_RESET, 0); in rt5640_i2c_probe()
2848 ret = regmap_register_patch(rt5640->regmap, init_list, in rt5640_i2c_probe()
2851 dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret); in rt5640_i2c_probe()
2853 regmap_update_bits(rt5640->regmap, RT5640_DUMMY1, in rt5640_i2c_probe()
2856 rt5640->hp_mute = true; in rt5640_i2c_probe()
2857 rt5640->irq = i2c->irq; in rt5640_i2c_probe()
2858 INIT_DELAYED_WORK(&rt5640->bp_work, rt5640_button_press_work); in rt5640_i2c_probe()
2859 INIT_WORK(&rt5640->jack_work, rt5640_jack_work); in rt5640_i2c_probe()
2861 /* Make sure work is stopped on probe-error / remove */ in rt5640_i2c_probe()
2862 ret = devm_add_action_or_reset(&i2c->dev, rt5640_cancel_work, rt5640); in rt5640_i2c_probe()
2866 return devm_snd_soc_register_component(&i2c->dev, in rt5640_i2c_probe()