Lines Matching +full:adc +full:- +full:channel +full:- +full:clk +full:- +full:src
1 // SPDX-License-Identifier: GPL-2.0-only
3 * cs42l42.c -- CS42L42 ALSA SoC audio driver
30 #include <sound/soc-dapm.h>
33 #include <dt-bindings/sound/cs42l42.h>
401 static DECLARE_TLV_DB_SCALE(adc_tlv, -9700, 100, true);
402 static DECLARE_TLV_DB_SCALE(mixer_tlv, -6300, 100, true);
411 switch (ucontrol->value.integer.value[0]) { in cs42l42_slow_start_put()
419 return -EINVAL; in cs42l42_slow_start_put()
444 /* ADC Volume and Filter Controls */
445 SOC_SINGLE("ADC Notch Switch", CS42L42_ADC_CTL,
447 SOC_SINGLE("ADC Weak Force Switch", CS42L42_ADC_CTL,
449 SOC_SINGLE("ADC Invert Switch", CS42L42_ADC_CTL,
451 SOC_SINGLE("ADC Boost Switch", CS42L42_ADC_CTL,
453 SOC_SINGLE_S8_TLV("ADC Volume", CS42L42_ADC_VOLUME, -97, 12, adc_tlv),
454 SOC_SINGLE("ADC WNF Switch", CS42L42_ADC_WNF_HPF_CTL,
456 SOC_SINGLE("ADC HPF Switch", CS42L42_ADC_WNF_HPF_CTL,
480 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in cs42l42_hp_adc_ev()
485 cs42l42->hp_adc_up_pending = true; in cs42l42_hp_adc_ev()
488 /* Only need one delay if HP and ADC are both powering-up */ in cs42l42_hp_adc_ev()
489 if (cs42l42->hp_adc_up_pending) { in cs42l42_hp_adc_ev()
492 cs42l42->hp_adc_up_pending = false; in cs42l42_hp_adc_ev()
516 SND_SOC_DAPM_ADC_E("ADC", NULL, CS42L42_PWR_CTL1, CS42L42_ADC_PDN_SHIFT, 1,
528 /* Soundwire SRC power control */
549 {"ADC", NULL, "HS"},
550 { "SDOUT1", NULL, "ADC" },
551 { "SDOUT2", NULL, "ADC" },
569 mutex_lock(&cs42l42->irq_lock); in cs42l42_set_jack()
570 cs42l42->jack = jk; in cs42l42_set_jack()
573 switch (cs42l42->hs_type) { in cs42l42_set_jack()
585 mutex_unlock(&cs42l42->irq_lock); in cs42l42_set_jack()
635 * Table 4-5 from the Datasheet
665 int cs42l42_pll_config(struct snd_soc_component *component, unsigned int clk, in cs42l42_pll_config() argument
672 if (cs42l42->stream_use) { in cs42l42_pll_config()
673 if (pll_ratio_table[cs42l42->pll_config].sclk == clk) in cs42l42_pll_config()
676 return -EBUSY; in cs42l42_pll_config()
684 if (pll_ratio_table[i].sclk == clk) { in cs42l42_pll_config()
685 cs42l42->pll_config = i; in cs42l42_pll_config()
701 /* Configure PLL per table 4-5 */ in cs42l42_pll_config()
750 return -EINVAL; in cs42l42_pll_config()
760 if (cs42l42->stream_use) in cs42l42_src_config()
763 /* SRC MCLK must be as close as possible to 125 * sample rate */ in cs42l42_src_config()
795 dev_err(component->dev, in cs42l42_asp_config()
799 return -EINVAL; in cs42l42_asp_config()
805 CS42L42_FRAC0_VAL(fsync - 1) << in cs42l42_asp_config()
810 CS42L42_FRAC1_VAL(fsync - 1) << in cs42l42_asp_config()
817 CS42L42_FRAC0_VAL(fsync - 1) << in cs42l42_asp_config()
822 CS42L42_FRAC1_VAL(fsync - 1) << in cs42l42_asp_config()
830 struct snd_soc_component *component = codec_dai->component; in cs42l42_set_dai_fmt()
843 return -EINVAL; in cs42l42_set_dai_fmt()
863 return -EINVAL; in cs42l42_set_dai_fmt()
892 struct snd_soc_component *component = dai->component; in cs42l42_dai_startup()
896 * Sample rates < 44.1 kHz would produce an out-of-range SCLK with in cs42l42_dai_startup()
900 if (cs42l42->sclk) in cs42l42_dai_startup()
904 return snd_pcm_hw_constraint_minmax(substream->runtime, in cs42l42_dai_startup()
913 struct snd_soc_component *component = dai->component; in cs42l42_pcm_hw_params()
916 unsigned int width = (params_width(params) / 8) - 1; in cs42l42_pcm_hw_params()
923 if (cs42l42->bclk_ratio) { in cs42l42_pcm_hw_params()
924 /* machine driver has set the BCLK/samp-rate ratio */ in cs42l42_pcm_hw_params()
925 bclk = cs42l42->bclk_ratio * params_rate(params); in cs42l42_pcm_hw_params()
926 } else if (cs42l42->sclk) { in cs42l42_pcm_hw_params()
928 bclk = cs42l42->sclk; in cs42l42_pcm_hw_params()
931 * Assume 24-bit samples are in 32-bit slots, to prevent SCLK being in cs42l42_pcm_hw_params()
941 switch (substream->stream) { in cs42l42_pcm_hw_params()
943 /* channel 2 on high LRCLK */ in cs42l42_pcm_hw_params()
954 /* channel 1 on low LRCLK */ in cs42l42_pcm_hw_params()
958 /* Channel 2 on high LRCLK */ in cs42l42_pcm_hw_params()
964 /* Channel B comes from the last active channel */ in cs42l42_pcm_hw_params()
967 (channels - 1) << CS42L42_SP_RX_CHB_SEL_SHIFT); in cs42l42_pcm_hw_params()
995 struct snd_soc_component *component = dai->component; in cs42l42_set_sysclk()
1000 cs42l42->sclk = 0; in cs42l42_set_sysclk()
1006 cs42l42->sclk = freq; in cs42l42_set_sysclk()
1011 dev_err(component->dev, "SCLK %u not supported\n", freq); in cs42l42_set_sysclk()
1013 return -EINVAL; in cs42l42_set_sysclk()
1019 struct snd_soc_component *component = dai->component; in cs42l42_set_bclk_ratio()
1022 cs42l42->bclk_ratio = bclk_ratio; in cs42l42_set_bclk_ratio()
1029 struct snd_soc_component *component = dai->component; in cs42l42_mute_stream()
1043 cs42l42->stream_use &= ~(1 << stream); in cs42l42_mute_stream()
1044 if (!cs42l42->stream_use) { in cs42l42_mute_stream()
1050 regmap_multi_reg_write(cs42l42->regmap, cs42l42_to_osc_seq, in cs42l42_mute_stream()
1064 if (!cs42l42->stream_use) { in cs42l42_mute_stream()
1067 * PLL must not be started with ADC and HP both off in cs42l42_mute_stream()
1069 * DAPM widgets power-up before stream unmute so at least in cs42l42_mute_stream()
1070 * one of the "DAC" or "ADC" widgets will already have in cs42l42_mute_stream()
1071 * powered-up. in cs42l42_mute_stream()
1073 if (pll_ratio_table[cs42l42->pll_config].mclk_src_sel) { in cs42l42_mute_stream()
1077 if (pll_ratio_table[cs42l42->pll_config].n > 1) { in cs42l42_mute_stream()
1080 regval = pll_ratio_table[cs42l42->pll_config].pll_divout; in cs42l42_mute_stream()
1087 ret = regmap_read_poll_timeout(cs42l42->regmap, in cs42l42_mute_stream()
1094 dev_warn(component->dev, "PLL failed to lock: %d\n", ret); in cs42l42_mute_stream()
1104 regmap_multi_reg_write(cs42l42->regmap, cs42l42_to_sclk_seq, in cs42l42_mute_stream()
1107 cs42l42->stream_use |= 1 << stream; in cs42l42_mute_stream()
1110 /* Un-mute the headphone */ in cs42l42_mute_stream()
1165 regmap_update_bits(cs42l42->regmap, in cs42l42_manual_hs_type_detect()
1177 regmap_update_bits(cs42l42->regmap, in cs42l42_manual_hs_type_detect()
1185 regmap_write(cs42l42->regmap, CS42L42_HS_SWITCH_CTL, CS42L42_HSDET_SW_COMP1); in cs42l42_manual_hs_type_detect()
1189 regmap_read(cs42l42->regmap, CS42L42_HS_DET_STATUS, &hs_det_status); in cs42l42_manual_hs_type_detect()
1197 regmap_write(cs42l42->regmap, CS42L42_HS_SWITCH_CTL, CS42L42_HSDET_SW_COMP2); in cs42l42_manual_hs_type_detect()
1201 regmap_read(cs42l42->regmap, CS42L42_HS_DET_STATUS, &hs_det_status); in cs42l42_manual_hs_type_detect()
1211 cs42l42->hs_type = CS42L42_PLUG_CTIA; in cs42l42_manual_hs_type_detect()
1215 cs42l42->hs_type = CS42L42_PLUG_OMTP; in cs42l42_manual_hs_type_detect()
1222 cs42l42->hs_type = CS42L42_PLUG_CTIA; in cs42l42_manual_hs_type_detect()
1226 cs42l42->hs_type = CS42L42_PLUG_OMTP; in cs42l42_manual_hs_type_detect()
1231 cs42l42->hs_type = CS42L42_PLUG_HEADPHONE; in cs42l42_manual_hs_type_detect()
1238 regmap_write(cs42l42->regmap, CS42L42_HS_SWITCH_CTL, hs_det_sw); in cs42l42_manual_hs_type_detect()
1241 regmap_update_bits(cs42l42->regmap, in cs42l42_manual_hs_type_detect()
1253 regmap_update_bits(cs42l42->regmap, in cs42l42_manual_hs_type_detect()
1267 regmap_read(cs42l42->regmap, CS42L42_HS_DET_STATUS, &hs_det_status); in cs42l42_process_hs_type_detect()
1270 regmap_update_bits(cs42l42->regmap, in cs42l42_process_hs_type_detect()
1278 cs42l42->hs_type = (hs_det_status & CS42L42_HSDET_TYPE_MASK) >> in cs42l42_process_hs_type_detect()
1282 regmap_update_bits(cs42l42->regmap, in cs42l42_process_hs_type_detect()
1294 * We Re-Run with Manual Detection if the original detection was invalid or headphones, in cs42l42_process_hs_type_detect()
1297 if (cs42l42->hs_type == CS42L42_PLUG_INVALID || in cs42l42_process_hs_type_detect()
1298 cs42l42->hs_type == CS42L42_PLUG_HEADPHONE) { in cs42l42_process_hs_type_detect()
1299 dev_dbg(cs42l42->dev, "Running Manual Detection Fallback\n"); in cs42l42_process_hs_type_detect()
1304 if ((cs42l42->hs_type == CS42L42_PLUG_CTIA) || in cs42l42_process_hs_type_detect()
1305 (cs42l42->hs_type == CS42L42_PLUG_OMTP)) { in cs42l42_process_hs_type_detect()
1307 regmap_update_bits(cs42l42->regmap, in cs42l42_process_hs_type_detect()
1319 regmap_update_bits(cs42l42->regmap, in cs42l42_process_hs_type_detect()
1326 (cs42l42->bias_thresholds[0] << in cs42l42_process_hs_type_detect()
1330 regmap_update_bits(cs42l42->regmap, in cs42l42_process_hs_type_detect()
1336 (cs42l42->hs_bias_sense_en << CS42L42_HSBIAS_SENSE_EN_SHIFT) | in cs42l42_process_hs_type_detect()
1342 regmap_update_bits(cs42l42->regmap, in cs42l42_process_hs_type_detect()
1349 msleep(cs42l42->btn_det_init_dbnce); in cs42l42_process_hs_type_detect()
1352 regmap_read(cs42l42->regmap, CS42L42_DET_INT_STATUS2, in cs42l42_process_hs_type_detect()
1356 regmap_update_bits(cs42l42->regmap, in cs42l42_process_hs_type_detect()
1370 regmap_update_bits(cs42l42->regmap, in cs42l42_process_hs_type_detect()
1378 regmap_update_bits(cs42l42->regmap, in cs42l42_process_hs_type_detect()
1392 regmap_update_bits(cs42l42->regmap, in cs42l42_process_hs_type_detect()
1403 regmap_update_bits(cs42l42->regmap, in cs42l42_init_hs_type_detect()
1411 regmap_update_bits(cs42l42->regmap, in cs42l42_init_hs_type_detect()
1419 regmap_update_bits(cs42l42->regmap, in cs42l42_init_hs_type_detect()
1431 regmap_update_bits(cs42l42->regmap, in cs42l42_init_hs_type_detect()
1442 regmap_update_bits(cs42l42->regmap, in cs42l42_init_hs_type_detect()
1456 regmap_update_bits(cs42l42->regmap, in cs42l42_init_hs_type_detect()
1464 msleep(cs42l42->hs_bias_ramp_time); in cs42l42_init_hs_type_detect()
1467 regmap_update_bits(cs42l42->regmap, in cs42l42_init_hs_type_detect()
1475 regmap_update_bits(cs42l42->regmap, in cs42l42_init_hs_type_detect()
1490 regmap_update_bits(cs42l42->regmap, in cs42l42_cancel_hs_type_detect()
1504 regmap_update_bits(cs42l42->regmap, in cs42l42_cancel_hs_type_detect()
1512 regmap_update_bits(cs42l42->regmap, in cs42l42_cancel_hs_type_detect()
1524 regmap_update_bits(cs42l42->regmap, in cs42l42_cancel_hs_type_detect()
1542 regmap_update_bits(cs42l42->regmap, in cs42l42_handle_button_press()
1555 usleep_range(cs42l42->btn_det_event_dbnce * 1000, in cs42l42_handle_button_press()
1556 cs42l42->btn_det_event_dbnce * 2000); in cs42l42_handle_button_press()
1562 regmap_update_bits(cs42l42->regmap, in cs42l42_handle_button_press()
1569 (cs42l42->bias_thresholds[bias_level] << in cs42l42_handle_button_press()
1572 regmap_read(cs42l42->regmap, CS42L42_DET_STATUS2, in cs42l42_handle_button_press()
1580 dev_dbg(cs42l42->dev, "Function C button press\n"); in cs42l42_handle_button_press()
1584 dev_dbg(cs42l42->dev, "Function B button press\n"); in cs42l42_handle_button_press()
1588 dev_dbg(cs42l42->dev, "Function D button press\n"); in cs42l42_handle_button_press()
1592 dev_dbg(cs42l42->dev, "Function A button press\n"); in cs42l42_handle_button_press()
1600 regmap_update_bits(cs42l42->regmap, in cs42l42_handle_button_press()
1607 (cs42l42->bias_thresholds[0] << CS42L42_HS_DET_LEVEL_SHIFT)); in cs42l42_handle_button_press()
1610 regmap_read(cs42l42->regmap, CS42L42_DET_INT_STATUS2, in cs42l42_handle_button_press()
1614 regmap_update_bits(cs42l42->regmap, in cs42l42_handle_button_press()
1672 pm_runtime_get_sync(cs42l42->dev); in cs42l42_irq_thread()
1673 mutex_lock(&cs42l42->irq_lock); in cs42l42_irq_thread()
1674 if (cs42l42->suspended || !cs42l42->init_done) { in cs42l42_irq_thread()
1675 mutex_unlock(&cs42l42->irq_lock); in cs42l42_irq_thread()
1676 pm_runtime_put_autosuspend(cs42l42->dev); in cs42l42_irq_thread()
1682 regmap_read(cs42l42->regmap, irq_params_table[i].status_addr, in cs42l42_irq_thread()
1684 regmap_read(cs42l42->regmap, irq_params_table[i].mask_addr, in cs42l42_irq_thread()
1702 * Check auto-detect status. Don't assume a previous unplug event has in cs42l42_irq_thread()
1709 switch (cs42l42->hs_type) { in cs42l42_irq_thread()
1712 snd_soc_jack_report(cs42l42->jack, SND_JACK_HEADSET, in cs42l42_irq_thread()
1718 snd_soc_jack_report(cs42l42->jack, SND_JACK_HEADPHONE, in cs42l42_irq_thread()
1726 dev_dbg(cs42l42->dev, "Auto detect done (%d)\n", cs42l42->hs_type); in cs42l42_irq_thread()
1734 if (cs42l42->plug_state != CS42L42_TS_PLUG) { in cs42l42_irq_thread()
1735 cs42l42->plug_state = CS42L42_TS_PLUG; in cs42l42_irq_thread()
1741 if (cs42l42->plug_state != CS42L42_TS_UNPLUG) { in cs42l42_irq_thread()
1742 cs42l42->plug_state = CS42L42_TS_UNPLUG; in cs42l42_irq_thread()
1745 snd_soc_jack_report(cs42l42->jack, 0, in cs42l42_irq_thread()
1750 dev_dbg(cs42l42->dev, "Unplug event\n"); in cs42l42_irq_thread()
1755 cs42l42->plug_state = CS42L42_TS_TRANS; in cs42l42_irq_thread()
1760 if (cs42l42->plug_state == CS42L42_TS_PLUG && ((~masks[7]) & irq_params_table[7].mask)) { in cs42l42_irq_thread()
1765 dev_dbg(cs42l42->dev, "Button released\n"); in cs42l42_irq_thread()
1766 snd_soc_jack_report(cs42l42->jack, 0, in cs42l42_irq_thread()
1770 snd_soc_jack_report(cs42l42->jack, in cs42l42_irq_thread()
1778 mutex_unlock(&cs42l42->irq_lock); in cs42l42_irq_thread()
1779 pm_runtime_mark_last_busy(cs42l42->dev); in cs42l42_irq_thread()
1780 pm_runtime_put_autosuspend(cs42l42->dev); in cs42l42_irq_thread()
1788 regmap_update_bits(cs42l42->regmap, CS42L42_ADC_OVFL_INT_MASK, in cs42l42_set_interrupt_masks()
1792 regmap_update_bits(cs42l42->regmap, CS42L42_MIXER_INT_MASK, in cs42l42_set_interrupt_masks()
1802 regmap_update_bits(cs42l42->regmap, CS42L42_SRC_INT_MASK, in cs42l42_set_interrupt_masks()
1812 regmap_update_bits(cs42l42->regmap, CS42L42_ASP_RX_INT_MASK, in cs42l42_set_interrupt_masks()
1824 regmap_update_bits(cs42l42->regmap, CS42L42_ASP_TX_INT_MASK, in cs42l42_set_interrupt_masks()
1834 regmap_update_bits(cs42l42->regmap, CS42L42_CODEC_INT_MASK, in cs42l42_set_interrupt_masks()
1840 regmap_update_bits(cs42l42->regmap, CS42L42_SRCPL_INT_MASK, in cs42l42_set_interrupt_masks()
1850 regmap_update_bits(cs42l42->regmap, CS42L42_DET_INT1_MASK, in cs42l42_set_interrupt_masks()
1858 regmap_update_bits(cs42l42->regmap, CS42L42_DET_INT2_MASK, in cs42l42_set_interrupt_masks()
1870 regmap_update_bits(cs42l42->regmap, CS42L42_VPMON_INT_MASK, in cs42l42_set_interrupt_masks()
1874 regmap_update_bits(cs42l42->regmap, CS42L42_PLL_LOCK_INT_MASK, in cs42l42_set_interrupt_masks()
1878 regmap_update_bits(cs42l42->regmap, CS42L42_TSRS_PLUG_INT_MASK, in cs42l42_set_interrupt_masks()
1893 cs42l42->hs_type = CS42L42_PLUG_INVALID; in cs42l42_setup_hs_type_detect()
1896 * DETECT_MODE must always be 0 with ADC and HP both off otherwise the in cs42l42_setup_hs_type_detect()
1899 regmap_update_bits(cs42l42->regmap, CS42L42_MISC_DET_CTL, in cs42l42_setup_hs_type_detect()
1903 regmap_update_bits(cs42l42->regmap, CS42L42_MIC_DET_CTL1, in cs42l42_setup_hs_type_detect()
1909 (cs42l42->bias_thresholds[0] << in cs42l42_setup_hs_type_detect()
1912 /* Remove ground noise-suppression clamps */ in cs42l42_setup_hs_type_detect()
1913 regmap_update_bits(cs42l42->regmap, in cs42l42_setup_hs_type_detect()
1919 regmap_update_bits(cs42l42->regmap, CS42L42_TSENSE_CTL, in cs42l42_setup_hs_type_detect()
1922 regmap_update_bits(cs42l42->regmap, CS42L42_TIPSENSE_CTL, in cs42l42_setup_hs_type_detect()
1927 (!cs42l42->ts_inv << CS42L42_TIP_SENSE_INV_SHIFT) | in cs42l42_setup_hs_type_detect()
1931 regmap_read(cs42l42->regmap, in cs42l42_setup_hs_type_detect()
1934 cs42l42->plug_state = (((char) reg) & in cs42l42_setup_hs_type_detect()
1954 ret = device_property_read_u32(dev, "cirrus,ts-inv", &val); in cs42l42_handle_device_data()
1959 cs42l42->ts_inv = val; in cs42l42_handle_device_data()
1963 "Wrong cirrus,ts-inv DT value %d\n", in cs42l42_handle_device_data()
1965 cs42l42->ts_inv = CS42L42_TS_INV_DIS; in cs42l42_handle_device_data()
1968 cs42l42->ts_inv = CS42L42_TS_INV_DIS; in cs42l42_handle_device_data()
1971 ret = device_property_read_u32(dev, "cirrus,ts-dbnc-rise", &val); in cs42l42_handle_device_data()
1982 cs42l42->ts_dbnc_rise = val; in cs42l42_handle_device_data()
1986 "Wrong cirrus,ts-dbnc-rise DT value %d\n", in cs42l42_handle_device_data()
1988 cs42l42->ts_dbnc_rise = CS42L42_TS_DBNCE_1000; in cs42l42_handle_device_data()
1991 cs42l42->ts_dbnc_rise = CS42L42_TS_DBNCE_1000; in cs42l42_handle_device_data()
1994 regmap_update_bits(cs42l42->regmap, CS42L42_TSENSE_CTL, in cs42l42_handle_device_data()
1996 (cs42l42->ts_dbnc_rise << in cs42l42_handle_device_data()
1999 ret = device_property_read_u32(dev, "cirrus,ts-dbnc-fall", &val); in cs42l42_handle_device_data()
2010 cs42l42->ts_dbnc_fall = val; in cs42l42_handle_device_data()
2014 "Wrong cirrus,ts-dbnc-fall DT value %d\n", in cs42l42_handle_device_data()
2016 cs42l42->ts_dbnc_fall = CS42L42_TS_DBNCE_0; in cs42l42_handle_device_data()
2019 cs42l42->ts_dbnc_fall = CS42L42_TS_DBNCE_0; in cs42l42_handle_device_data()
2022 regmap_update_bits(cs42l42->regmap, CS42L42_TSENSE_CTL, in cs42l42_handle_device_data()
2024 (cs42l42->ts_dbnc_fall << in cs42l42_handle_device_data()
2027 ret = device_property_read_u32(dev, "cirrus,btn-det-init-dbnce", &val); in cs42l42_handle_device_data()
2030 cs42l42->btn_det_init_dbnce = val; in cs42l42_handle_device_data()
2033 "Wrong cirrus,btn-det-init-dbnce DT value %d\n", in cs42l42_handle_device_data()
2035 cs42l42->btn_det_init_dbnce = in cs42l42_handle_device_data()
2039 cs42l42->btn_det_init_dbnce = in cs42l42_handle_device_data()
2043 ret = device_property_read_u32(dev, "cirrus,btn-det-event-dbnce", &val); in cs42l42_handle_device_data()
2046 cs42l42->btn_det_event_dbnce = val; in cs42l42_handle_device_data()
2049 "Wrong cirrus,btn-det-event-dbnce DT value %d\n", val); in cs42l42_handle_device_data()
2050 cs42l42->btn_det_event_dbnce = in cs42l42_handle_device_data()
2054 cs42l42->btn_det_event_dbnce = in cs42l42_handle_device_data()
2058 ret = device_property_read_u32_array(dev, "cirrus,bias-lvls", in cs42l42_handle_device_data()
2063 cs42l42->bias_thresholds[i] = thresholds[i]; in cs42l42_handle_device_data()
2066 "Wrong cirrus,bias-lvls[%d] DT value %d\n", i, in cs42l42_handle_device_data()
2068 cs42l42->bias_thresholds[i] = threshold_defaults[i]; in cs42l42_handle_device_data()
2073 cs42l42->bias_thresholds[i] = threshold_defaults[i]; in cs42l42_handle_device_data()
2076 ret = device_property_read_u32(dev, "cirrus,hs-bias-ramp-rate", &val); in cs42l42_handle_device_data()
2080 cs42l42->hs_bias_ramp_rate = val; in cs42l42_handle_device_data()
2081 cs42l42->hs_bias_ramp_time = CS42L42_HSBIAS_RAMP_TIME0; in cs42l42_handle_device_data()
2084 cs42l42->hs_bias_ramp_rate = val; in cs42l42_handle_device_data()
2085 cs42l42->hs_bias_ramp_time = CS42L42_HSBIAS_RAMP_TIME1; in cs42l42_handle_device_data()
2088 cs42l42->hs_bias_ramp_rate = val; in cs42l42_handle_device_data()
2089 cs42l42->hs_bias_ramp_time = CS42L42_HSBIAS_RAMP_TIME2; in cs42l42_handle_device_data()
2092 cs42l42->hs_bias_ramp_rate = val; in cs42l42_handle_device_data()
2093 cs42l42->hs_bias_ramp_time = CS42L42_HSBIAS_RAMP_TIME3; in cs42l42_handle_device_data()
2097 "Wrong cirrus,hs-bias-ramp-rate DT value %d\n", in cs42l42_handle_device_data()
2099 cs42l42->hs_bias_ramp_rate = CS42L42_HSBIAS_RAMP_SLOW; in cs42l42_handle_device_data()
2100 cs42l42->hs_bias_ramp_time = CS42L42_HSBIAS_RAMP_TIME2; in cs42l42_handle_device_data()
2103 cs42l42->hs_bias_ramp_rate = CS42L42_HSBIAS_RAMP_SLOW; in cs42l42_handle_device_data()
2104 cs42l42->hs_bias_ramp_time = CS42L42_HSBIAS_RAMP_TIME2; in cs42l42_handle_device_data()
2107 regmap_update_bits(cs42l42->regmap, CS42L42_HS_BIAS_CTL, in cs42l42_handle_device_data()
2109 (cs42l42->hs_bias_ramp_rate << in cs42l42_handle_device_data()
2112 if (device_property_read_bool(dev, "cirrus,hs-bias-sense-disable")) in cs42l42_handle_device_data()
2113 cs42l42->hs_bias_sense_en = 0; in cs42l42_handle_device_data()
2115 cs42l42->hs_bias_sense_en = 1; in cs42l42_handle_device_data()
2160 if (!cs42l42->init_done) in cs42l42_suspend()
2168 mutex_lock(&cs42l42->irq_lock); in cs42l42_suspend()
2169 cs42l42->suspended = true; in cs42l42_suspend()
2173 regmap_read(cs42l42->regmap, cs42l42_shutdown_seq[i].reg, ®); in cs42l42_suspend()
2178 regmap_multi_reg_write(cs42l42->regmap, in cs42l42_suspend()
2183 mutex_unlock(&cs42l42->irq_lock); in cs42l42_suspend()
2185 /* Wait for power-down complete */ in cs42l42_suspend()
2187 ret = regmap_read_poll_timeout(cs42l42->regmap, in cs42l42_suspend()
2196 regmap_update_bits(cs42l42->regmap, CS42L42_PWR_CTL2, in cs42l42_suspend()
2200 regcache_cache_only(cs42l42->regmap, true); in cs42l42_suspend()
2201 gpiod_set_value_cansleep(cs42l42->reset_gpio, 0); in cs42l42_suspend()
2202 regulator_bulk_disable(ARRAY_SIZE(cs42l42->supplies), cs42l42->supplies); in cs42l42_suspend()
2206 regmap_write(cs42l42->regmap, cs42l42_shutdown_seq[i].reg, save_regs[i]); in cs42l42_suspend()
2209 regcache_drop_region(cs42l42->regmap, CS42L42_PAGE_REGISTER, CS42L42_PAGE_REGISTER); in cs42l42_suspend()
2223 if (!cs42l42->init_done) in cs42l42_resume()
2227 * If jack was unplugged and re-plugged during suspend it could in cs42l42_resume()
2228 * have changed type but the tip-sense state hasn't changed. in cs42l42_resume()
2229 * Force a plugged state to be re-evaluated. in cs42l42_resume()
2231 if (cs42l42->plug_state != CS42L42_TS_UNPLUG) in cs42l42_resume()
2232 cs42l42->plug_state = CS42L42_TS_TRANS; in cs42l42_resume()
2234 ret = regulator_bulk_enable(ARRAY_SIZE(cs42l42->supplies), cs42l42->supplies); in cs42l42_resume()
2240 gpiod_set_value_cansleep(cs42l42->reset_gpio, 1); in cs42l42_resume()
2253 regcache_cache_only(cs42l42->regmap, false); in cs42l42_resume_restore()
2254 regcache_mark_dirty(cs42l42->regmap); in cs42l42_resume_restore()
2256 mutex_lock(&cs42l42->irq_lock); in cs42l42_resume_restore()
2258 regcache_sync_region(cs42l42->regmap, CS42L42_MIC_DET_CTL1, CS42L42_MIC_DET_CTL1); in cs42l42_resume_restore()
2259 regcache_sync(cs42l42->regmap); in cs42l42_resume_restore()
2261 cs42l42->suspended = false; in cs42l42_resume_restore()
2262 mutex_unlock(&cs42l42->irq_lock); in cs42l42_resume_restore()
2287 dev_set_drvdata(cs42l42->dev, cs42l42); in cs42l42_common_probe()
2288 mutex_init(&cs42l42->irq_lock); in cs42l42_common_probe()
2290 BUILD_BUG_ON(ARRAY_SIZE(cs42l42_supply_names) != ARRAY_SIZE(cs42l42->supplies)); in cs42l42_common_probe()
2291 for (i = 0; i < ARRAY_SIZE(cs42l42->supplies); i++) in cs42l42_common_probe()
2292 cs42l42->supplies[i].supply = cs42l42_supply_names[i]; in cs42l42_common_probe()
2294 ret = devm_regulator_bulk_get(cs42l42->dev, in cs42l42_common_probe()
2295 ARRAY_SIZE(cs42l42->supplies), in cs42l42_common_probe()
2296 cs42l42->supplies); in cs42l42_common_probe()
2298 dev_err(cs42l42->dev, in cs42l42_common_probe()
2303 ret = regulator_bulk_enable(ARRAY_SIZE(cs42l42->supplies), in cs42l42_common_probe()
2304 cs42l42->supplies); in cs42l42_common_probe()
2306 dev_err(cs42l42->dev, in cs42l42_common_probe()
2312 cs42l42->reset_gpio = devm_gpiod_get_optional(cs42l42->dev, in cs42l42_common_probe()
2314 if (IS_ERR(cs42l42->reset_gpio)) { in cs42l42_common_probe()
2315 ret = PTR_ERR(cs42l42->reset_gpio); in cs42l42_common_probe()
2319 if (cs42l42->reset_gpio) { in cs42l42_common_probe()
2320 dev_dbg(cs42l42->dev, "Found reset GPIO\n"); in cs42l42_common_probe()
2326 gpiod_set_value_cansleep(cs42l42->reset_gpio, 0); in cs42l42_common_probe()
2337 if (cs42l42->sdw_peripheral) in cs42l42_common_probe()
2338 cs42l42->sdw_waiting_first_unattach = true; in cs42l42_common_probe()
2340 gpiod_set_value_cansleep(cs42l42->reset_gpio, 1); in cs42l42_common_probe()
2345 if (cs42l42->irq) { in cs42l42_common_probe()
2346 ret = request_threaded_irq(cs42l42->irq, in cs42l42_common_probe()
2351 dev_err_probe(cs42l42->dev, ret, in cs42l42_common_probe()
2358 ret = devm_snd_soc_register_component(cs42l42->dev, component_drv, dai, 1); in cs42l42_common_probe()
2365 if (cs42l42->irq) in cs42l42_common_probe()
2366 free_irq(cs42l42->irq, cs42l42); in cs42l42_common_probe()
2369 gpiod_set_value_cansleep(cs42l42->reset_gpio, 0); in cs42l42_common_probe()
2371 regulator_bulk_disable(ARRAY_SIZE(cs42l42->supplies), cs42l42->supplies); in cs42l42_common_probe()
2383 devid = cirrus_read_device_id(cs42l42->regmap, CS42L42_DEVID_AB); in cs42l42_init()
2386 dev_err(cs42l42->dev, "Failed to read device ID: %d\n", ret); in cs42l42_init()
2390 if (devid != cs42l42->devid) { in cs42l42_init()
2391 ret = -ENODEV; in cs42l42_init()
2392 dev_err(cs42l42->dev, in cs42l42_init()
2394 cs42l42->devid & 0xff, devid, cs42l42->devid); in cs42l42_init()
2398 ret = regmap_read(cs42l42->regmap, CS42L42_REVID, ®); in cs42l42_init()
2400 dev_err(cs42l42->dev, "Get Revision ID failed\n"); in cs42l42_init()
2404 dev_info(cs42l42->dev, in cs42l42_init()
2406 cs42l42->devid & 0xff, reg & 0xFF); in cs42l42_init()
2409 regmap_update_bits(cs42l42->regmap, CS42L42_PWR_CTL1, in cs42l42_init()
2425 ret = cs42l42_handle_device_data(cs42l42->dev, cs42l42); in cs42l42_init()
2430 * SRC power is linked to ASP power so doesn't work in Soundwire mode. in cs42l42_init()
2431 * Override it and use DAPM to control SRC power for Soundwire. in cs42l42_init()
2433 if (cs42l42->sdw_peripheral) { in cs42l42_init()
2434 regmap_update_bits(cs42l42->regmap, CS42L42_PWR_CTL2, in cs42l42_init()
2448 cs42l42->init_done = true; in cs42l42_init()
2456 regmap_write(cs42l42->regmap, CS42L42_CODEC_INT_MASK, 0xff); in cs42l42_init()
2457 regmap_write(cs42l42->regmap, CS42L42_TSRS_PLUG_INT_MASK, 0xff); in cs42l42_init()
2458 regmap_write(cs42l42->regmap, CS42L42_PWR_CTL1, 0xff); in cs42l42_init()
2461 if (cs42l42->irq) in cs42l42_init()
2462 free_irq(cs42l42->irq, cs42l42); in cs42l42_init()
2464 gpiod_set_value_cansleep(cs42l42->reset_gpio, 0); in cs42l42_init()
2465 regulator_bulk_disable(ARRAY_SIZE(cs42l42->supplies), in cs42l42_init()
2466 cs42l42->supplies); in cs42l42_init()
2473 if (cs42l42->irq) in cs42l42_common_remove()
2474 free_irq(cs42l42->irq, cs42l42); in cs42l42_common_remove()
2480 if (cs42l42->init_done) { in cs42l42_common_remove()
2481 regmap_write(cs42l42->regmap, CS42L42_CODEC_INT_MASK, 0xff); in cs42l42_common_remove()
2482 regmap_write(cs42l42->regmap, CS42L42_TSRS_PLUG_INT_MASK, 0xff); in cs42l42_common_remove()
2483 regmap_write(cs42l42->regmap, CS42L42_PWR_CTL1, 0xff); in cs42l42_common_remove()
2486 gpiod_set_value_cansleep(cs42l42->reset_gpio, 0); in cs42l42_common_remove()
2487 regulator_bulk_disable(ARRAY_SIZE(cs42l42->supplies), cs42l42->supplies); in cs42l42_common_remove()