• Home
  • Raw
  • Download

Lines Matching +full:keep +full:- +full:pll +full:- +full:enabled

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * da7219-aad.c - Dialog DA7219 ALSA SoC AAD Driver
24 #include "da7219-aad.h"
35 da7219->aad->jack = jack; in da7219_aad_jack_det()
36 da7219->aad->jack_inserted = false; in da7219_aad_jack_det()
56 struct snd_soc_component *component = da7219_aad->component; in da7219_aad_btn_det_work()
84 dev_warn(component->dev, "Mic bias status check timed out"); in da7219_aad_btn_det_work()
86 da7219->micbias_on_event = true; in da7219_aad_btn_det_work()
92 if (da7219_aad->micbias_pulse_lvl && da7219_aad->micbias_pulse_time) { in da7219_aad_btn_det_work()
97 da7219_aad->micbias_pulse_lvl); in da7219_aad_btn_det_work()
98 msleep(da7219_aad->micbias_pulse_time); in da7219_aad_btn_det_work()
105 da7219_aad->btn_cfg); in da7219_aad_btn_det_work()
112 struct snd_soc_component *component = da7219_aad->component; in da7219_aad_hptest_work()
120 /* Lock DAPM, Kcontrols affected by this test and the PLL */ in da7219_aad_hptest_work()
122 mutex_lock(&da7219->ctrl_lock); in da7219_aad_hptest_work()
123 mutex_lock(&da7219->pll_lock); in da7219_aad_hptest_work()
126 if (da7219->mclk) { in da7219_aad_hptest_work()
127 ret = clk_prepare_enable(da7219->mclk); in da7219_aad_hptest_work()
129 dev_err(component->dev, "Failed to enable mclk - %d\n", ret); in da7219_aad_hptest_work()
130 mutex_unlock(&da7219->pll_lock); in da7219_aad_hptest_work()
131 mutex_unlock(&da7219->ctrl_lock); in da7219_aad_hptest_work()
141 * If MCLK is present, but PLL is not enabled then we enable it here to in da7219_aad_hptest_work()
161 regcache_cache_bypass(da7219->regmap, true); in da7219_aad_hptest_work()
240 regmap_raw_write(da7219->regmap, DA7219_TONE_GEN_FREQ1_L, in da7219_aad_hptest_work()
263 regcache_mark_dirty(da7219->regmap); in da7219_aad_hptest_work()
264 regcache_sync_region(da7219->regmap, DA7219_HP_L_CTRL, in da7219_aad_hptest_work()
267 regcache_sync_region(da7219->regmap, DA7219_MIXOUT_L_CTRL, in da7219_aad_hptest_work()
269 regcache_sync_region(da7219->regmap, DA7219_DROUTING_ST_OUTFILT_1L, in da7219_aad_hptest_work()
271 regcache_sync_region(da7219->regmap, DA7219_MIXOUT_L_SELECT, in da7219_aad_hptest_work()
273 regcache_sync_region(da7219->regmap, DA7219_DAC_L_CTRL, in da7219_aad_hptest_work()
275 regcache_sync_region(da7219->regmap, DA7219_DIG_ROUTING_DAC, in da7219_aad_hptest_work()
277 regcache_sync_region(da7219->regmap, DA7219_CP_CTRL, DA7219_CP_CTRL); in da7219_aad_hptest_work()
278 regcache_sync_region(da7219->regmap, DA7219_DAC_FILTERS5, in da7219_aad_hptest_work()
280 regcache_sync_region(da7219->regmap, DA7219_DAC_FILTERS4, in da7219_aad_hptest_work()
282 regcache_sync_region(da7219->regmap, DA7219_HP_L_GAIN, in da7219_aad_hptest_work()
284 regcache_sync_region(da7219->regmap, DA7219_DAC_L_GAIN, in da7219_aad_hptest_work()
286 regcache_sync_region(da7219->regmap, DA7219_TONE_GEN_ON_PER, in da7219_aad_hptest_work()
288 regcache_sync_region(da7219->regmap, DA7219_TONE_GEN_FREQ1_L, in da7219_aad_hptest_work()
290 regcache_sync_region(da7219->regmap, DA7219_TONE_GEN_CFG1, in da7219_aad_hptest_work()
293 regcache_cache_bypass(da7219->regmap, false); in da7219_aad_hptest_work()
315 /* Restore PLL to previous configuration, if re-configured */ in da7219_aad_hptest_work()
320 /* Remove MCLK, if previously enabled */ in da7219_aad_hptest_work()
321 if (da7219->mclk) in da7219_aad_hptest_work()
322 clk_disable_unprepare(da7219->mclk); in da7219_aad_hptest_work()
324 mutex_unlock(&da7219->pll_lock); in da7219_aad_hptest_work()
325 mutex_unlock(&da7219->ctrl_lock); in da7219_aad_hptest_work()
332 if (da7219_aad->jack_inserted) in da7219_aad_hptest_work()
333 snd_soc_jack_report(da7219_aad->jack, report, in da7219_aad_hptest_work()
345 struct snd_soc_component *component = da7219_aad->component; in da7219_aad_irq_thread()
353 regmap_bulk_read(da7219->regmap, DA7219_ACCDET_IRQ_EVENT_A, in da7219_aad_irq_thread()
363 regmap_bulk_write(da7219->regmap, DA7219_ACCDET_IRQ_EVENT_A, in da7219_aad_irq_thread()
366 dev_dbg(component->dev, "IRQ events = 0x%x|0x%x, status = 0x%x\n", in da7219_aad_irq_thread()
376 da7219_aad->jack_inserted = true; in da7219_aad_irq_thread()
383 * If 4-pole, then enable button detection, else perform in da7219_aad_irq_thread()
397 schedule_work(&da7219_aad->btn_det_work); in da7219_aad_irq_thread()
399 schedule_work(&da7219_aad->hptest_work); in da7219_aad_irq_thread()
403 /* Button support for 4-pole jack */ in da7219_aad_irq_thread()
413 snd_soc_jack_report(da7219_aad->jack, report, mask); in da7219_aad_irq_thread()
429 da7219_aad->jack_inserted = false; in da7219_aad_irq_thread()
431 /* Un-drive headphones/lineout */ in da7219_aad_irq_thread()
441 da7219->micbias_on_event = false; in da7219_aad_irq_thread()
448 cancel_work_sync(&da7219_aad->btn_det_work); in da7219_aad_irq_thread()
449 cancel_work_sync(&da7219_aad->hptest_work); in da7219_aad_irq_thread()
453 snd_soc_jack_report(da7219_aad->jack, report, mask); in da7219_aad_irq_thread()
610 dev_warn(dev, "Invalid ADC 1-bit repeat value"); in da7219_aad_fw_adc_1bit_rpt()
631 aad_pdata->irq = i2c->irq; in da7219_aad_fw_to_pdata()
633 if (fwnode_property_read_u32(aad_np, "dlg,micbias-pulse-lvl", in da7219_aad_fw_to_pdata()
635 aad_pdata->micbias_pulse_lvl = in da7219_aad_fw_to_pdata()
638 aad_pdata->micbias_pulse_lvl = DA7219_AAD_MICBIAS_PULSE_LVL_OFF; in da7219_aad_fw_to_pdata()
640 if (fwnode_property_read_u32(aad_np, "dlg,micbias-pulse-time", in da7219_aad_fw_to_pdata()
642 aad_pdata->micbias_pulse_time = fw_val32; in da7219_aad_fw_to_pdata()
644 if (fwnode_property_read_u32(aad_np, "dlg,btn-cfg", &fw_val32) >= 0) in da7219_aad_fw_to_pdata()
645 aad_pdata->btn_cfg = da7219_aad_fw_btn_cfg(dev, fw_val32); in da7219_aad_fw_to_pdata()
647 aad_pdata->btn_cfg = DA7219_AAD_BTN_CFG_10MS; in da7219_aad_fw_to_pdata()
649 if (fwnode_property_read_u32(aad_np, "dlg,mic-det-thr", &fw_val32) >= 0) in da7219_aad_fw_to_pdata()
650 aad_pdata->mic_det_thr = in da7219_aad_fw_to_pdata()
653 aad_pdata->mic_det_thr = DA7219_AAD_MIC_DET_THR_500_OHMS; in da7219_aad_fw_to_pdata()
655 if (fwnode_property_read_u32(aad_np, "dlg,jack-ins-deb", &fw_val32) >= 0) in da7219_aad_fw_to_pdata()
656 aad_pdata->jack_ins_deb = in da7219_aad_fw_to_pdata()
659 aad_pdata->jack_ins_deb = DA7219_AAD_JACK_INS_DEB_20MS; in da7219_aad_fw_to_pdata()
661 if (!fwnode_property_read_string(aad_np, "dlg,jack-det-rate", &fw_str)) in da7219_aad_fw_to_pdata()
662 aad_pdata->jack_det_rate = in da7219_aad_fw_to_pdata()
665 aad_pdata->jack_det_rate = DA7219_AAD_JACK_DET_RATE_256_512MS; in da7219_aad_fw_to_pdata()
667 if (fwnode_property_read_u32(aad_np, "dlg,jack-rem-deb", &fw_val32) >= 0) in da7219_aad_fw_to_pdata()
668 aad_pdata->jack_rem_deb = in da7219_aad_fw_to_pdata()
671 aad_pdata->jack_rem_deb = DA7219_AAD_JACK_REM_DEB_1MS; in da7219_aad_fw_to_pdata()
673 if (fwnode_property_read_u32(aad_np, "dlg,a-d-btn-thr", &fw_val32) >= 0) in da7219_aad_fw_to_pdata()
674 aad_pdata->a_d_btn_thr = (u8) fw_val32; in da7219_aad_fw_to_pdata()
676 aad_pdata->a_d_btn_thr = 0xA; in da7219_aad_fw_to_pdata()
678 if (fwnode_property_read_u32(aad_np, "dlg,d-b-btn-thr", &fw_val32) >= 0) in da7219_aad_fw_to_pdata()
679 aad_pdata->d_b_btn_thr = (u8) fw_val32; in da7219_aad_fw_to_pdata()
681 aad_pdata->d_b_btn_thr = 0x16; in da7219_aad_fw_to_pdata()
683 if (fwnode_property_read_u32(aad_np, "dlg,b-c-btn-thr", &fw_val32) >= 0) in da7219_aad_fw_to_pdata()
684 aad_pdata->b_c_btn_thr = (u8) fw_val32; in da7219_aad_fw_to_pdata()
686 aad_pdata->b_c_btn_thr = 0x21; in da7219_aad_fw_to_pdata()
688 if (fwnode_property_read_u32(aad_np, "dlg,c-mic-btn-thr", &fw_val32) >= 0) in da7219_aad_fw_to_pdata()
689 aad_pdata->c_mic_btn_thr = (u8) fw_val32; in da7219_aad_fw_to_pdata()
691 aad_pdata->c_mic_btn_thr = 0x3E; in da7219_aad_fw_to_pdata()
693 if (fwnode_property_read_u32(aad_np, "dlg,btn-avg", &fw_val32) >= 0) in da7219_aad_fw_to_pdata()
694 aad_pdata->btn_avg = da7219_aad_fw_btn_avg(dev, fw_val32); in da7219_aad_fw_to_pdata()
696 aad_pdata->btn_avg = DA7219_AAD_BTN_AVG_2; in da7219_aad_fw_to_pdata()
698 if (fwnode_property_read_u32(aad_np, "dlg,adc-1bit-rpt", &fw_val32) >= 0) in da7219_aad_fw_to_pdata()
699 aad_pdata->adc_1bit_rpt = in da7219_aad_fw_to_pdata()
702 aad_pdata->adc_1bit_rpt = DA7219_AAD_ADC_1BIT_RPT_1; in da7219_aad_fw_to_pdata()
710 struct da7219_aad_priv *da7219_aad = da7219->aad; in da7219_aad_handle_pdata()
711 struct da7219_pdata *pdata = da7219->pdata; in da7219_aad_handle_pdata()
713 if ((pdata) && (pdata->aad_pdata)) { in da7219_aad_handle_pdata()
714 struct da7219_aad_pdata *aad_pdata = pdata->aad_pdata; in da7219_aad_handle_pdata()
717 da7219_aad->irq = aad_pdata->irq; in da7219_aad_handle_pdata()
719 switch (aad_pdata->micbias_pulse_lvl) { in da7219_aad_handle_pdata()
722 da7219_aad->micbias_pulse_lvl = in da7219_aad_handle_pdata()
723 (aad_pdata->micbias_pulse_lvl << in da7219_aad_handle_pdata()
730 da7219_aad->micbias_pulse_time = aad_pdata->micbias_pulse_time; in da7219_aad_handle_pdata()
732 switch (aad_pdata->btn_cfg) { in da7219_aad_handle_pdata()
740 da7219_aad->btn_cfg = (aad_pdata->btn_cfg << in da7219_aad_handle_pdata()
746 switch (aad_pdata->mic_det_thr) { in da7219_aad_handle_pdata()
751 cfg |= (aad_pdata->mic_det_thr << in da7219_aad_handle_pdata()
759 switch (aad_pdata->jack_ins_deb) { in da7219_aad_handle_pdata()
768 cfg |= (aad_pdata->jack_ins_deb << in da7219_aad_handle_pdata()
772 switch (aad_pdata->jack_det_rate) { in da7219_aad_handle_pdata()
777 cfg |= (aad_pdata->jack_det_rate << in da7219_aad_handle_pdata()
781 switch (aad_pdata->jack_rem_deb) { in da7219_aad_handle_pdata()
786 cfg |= (aad_pdata->jack_rem_deb << in da7219_aad_handle_pdata()
793 aad_pdata->a_d_btn_thr); in da7219_aad_handle_pdata()
795 aad_pdata->d_b_btn_thr); in da7219_aad_handle_pdata()
797 aad_pdata->b_c_btn_thr); in da7219_aad_handle_pdata()
799 aad_pdata->c_mic_btn_thr); in da7219_aad_handle_pdata()
803 switch (aad_pdata->btn_avg) { in da7219_aad_handle_pdata()
808 cfg |= (aad_pdata->btn_avg << in da7219_aad_handle_pdata()
812 switch (aad_pdata->adc_1bit_rpt) { in da7219_aad_handle_pdata()
817 cfg |= (aad_pdata->adc_1bit_rpt << in da7219_aad_handle_pdata()
833 struct da7219_aad_priv *da7219_aad = da7219->aad; in da7219_aad_suspend()
837 if (da7219_aad->jack) { in da7219_aad_suspend()
843 * If we have a 4-pole jack inserted, then micbias will be in da7219_aad_suspend()
844 * enabled. We can disable micbias here, and keep a note to in da7219_aad_suspend()
845 * re-enable it on resume. If jack removal occurred during in da7219_aad_suspend()
848 if (da7219_aad->jack_inserted) { in da7219_aad_suspend()
853 da7219_aad->micbias_resume_enable = true; in da7219_aad_suspend()
862 struct da7219_aad_priv *da7219_aad = da7219->aad; in da7219_aad_resume()
865 if (da7219_aad->jack) { in da7219_aad_resume()
866 /* Re-enable micbias if previously enabled for 4-pole jack */ in da7219_aad_resume()
867 if (da7219_aad->jack_inserted && in da7219_aad_resume()
868 da7219_aad->micbias_resume_enable) { in da7219_aad_resume()
871 da7219_aad->micbias_resume_enable = false; in da7219_aad_resume()
874 /* Re-enable jack detection */ in da7219_aad_resume()
889 struct da7219_aad_priv *da7219_aad = da7219->aad; in da7219_aad_init()
893 da7219_aad->component = component; in da7219_aad_init()
902 INIT_WORK(&da7219_aad->btn_det_work, da7219_aad_btn_det_work); in da7219_aad_init()
903 INIT_WORK(&da7219_aad->hptest_work, da7219_aad_hptest_work); in da7219_aad_init()
905 ret = request_threaded_irq(da7219_aad->irq, NULL, in da7219_aad_init()
908 "da7219-aad", da7219_aad); in da7219_aad_init()
910 dev_err(component->dev, "Failed to request IRQ: %d\n", ret); in da7219_aad_init()
916 regmap_bulk_write(da7219->regmap, DA7219_ACCDET_IRQ_MASK_A, in da7219_aad_init()
926 struct da7219_aad_priv *da7219_aad = da7219->aad; in da7219_aad_exit()
931 regmap_bulk_write(da7219->regmap, DA7219_ACCDET_IRQ_MASK_A, in da7219_aad_exit()
934 free_irq(da7219_aad->irq, da7219_aad); in da7219_aad_exit()
936 cancel_work_sync(&da7219_aad->btn_det_work); in da7219_aad_exit()
937 cancel_work_sync(&da7219_aad->hptest_work); in da7219_aad_exit()
948 struct device *dev = &i2c->dev; in da7219_aad_probe()
953 return -ENOMEM; in da7219_aad_probe()
955 da7219->aad = da7219_aad; in da7219_aad_probe()
958 if (da7219->pdata && !da7219->pdata->aad_pdata) in da7219_aad_probe()
959 da7219->pdata->aad_pdata = da7219_aad_fw_to_pdata(dev); in da7219_aad_probe()