• Home
  • Raw
  • Download

Lines Matching +full:disable +full:- +full:report +full:- +full:mask

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()
38 /* Send an initial empty report */ in da7219_aad_jack_det()
41 /* Enable/Disable jack detection */ 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()
118 int report = 0, ret = 0; in da7219_aad_hptest_work() local
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()
161 regcache_cache_bypass(da7219->regmap, true); in da7219_aad_hptest_work()
178 /* Disable DAC filters, EQs and soft mute */ in da7219_aad_hptest_work()
240 regmap_raw_write(da7219->regmap, DA7219_TONE_GEN_FREQ1_L, in da7219_aad_hptest_work()
253 report |= SND_JACK_HEADPHONE; in da7219_aad_hptest_work()
255 report |= SND_JACK_LINEOUT; 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()
295 /* Disable HPTest block */ in da7219_aad_hptest_work()
315 /* Restore PLL to previous configuration, if re-configured */ 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()
329 * Only send report if jack hasn't been removed during process, 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()
350 int i, ret, report = 0, mask = 0; in da7219_aad_irq_thread() local
353 ret = regmap_bulk_read(da7219->regmap, DA7219_ACCDET_IRQ_EVENT_A, in da7219_aad_irq_thread()
356 dev_warn_ratelimited(component->dev, "Failed to read IRQ events: %d\n", ret); in da7219_aad_irq_thread()
367 regmap_bulk_write(da7219->regmap, DA7219_ACCDET_IRQ_EVENT_A, in da7219_aad_irq_thread()
370 dev_dbg(component->dev, "IRQ events = 0x%x|0x%x, status = 0x%x\n", in da7219_aad_irq_thread()
378 report |= SND_JACK_MECHANICAL; in da7219_aad_irq_thread()
379 mask |= SND_JACK_MECHANICAL; in da7219_aad_irq_thread()
380 da7219_aad->jack_inserted = true; in da7219_aad_irq_thread()
387 * If 4-pole, then enable button detection, else perform in da7219_aad_irq_thread()
388 * HP impedance test to determine output type to report. in da7219_aad_irq_thread()
399 report |= SND_JACK_HEADSET; in da7219_aad_irq_thread()
400 mask |= SND_JACK_HEADSET | SND_JACK_LINEOUT; in da7219_aad_irq_thread()
401 schedule_work(&da7219_aad->btn_det_work); in da7219_aad_irq_thread()
403 schedule_work(&da7219_aad->hptest_work); in da7219_aad_irq_thread()
407 /* Button support for 4-pole jack */ in da7219_aad_irq_thread()
413 report |= SND_JACK_BTN_0 >> i; in da7219_aad_irq_thread()
414 mask |= SND_JACK_BTN_0 >> i; in da7219_aad_irq_thread()
417 snd_soc_jack_report(da7219_aad->jack, report, mask); in da7219_aad_irq_thread()
423 report &= ~(SND_JACK_BTN_0 >> i); in da7219_aad_irq_thread()
424 mask |= SND_JACK_BTN_0 >> i; in da7219_aad_irq_thread()
431 report = 0; in da7219_aad_irq_thread()
432 mask |= DA7219_AAD_REPORT_ALL_MASK; in da7219_aad_irq_thread()
433 da7219_aad->jack_inserted = false; in da7219_aad_irq_thread()
435 /* Un-drive headphones/lineout */ in da7219_aad_irq_thread()
445 da7219->micbias_on_event = false; in da7219_aad_irq_thread()
447 /* Disable mic bias */ in da7219_aad_irq_thread()
452 cancel_work_sync(&da7219_aad->btn_det_work); in da7219_aad_irq_thread()
453 cancel_work_sync(&da7219_aad->hptest_work); in da7219_aad_irq_thread()
457 snd_soc_jack_report(da7219_aad->jack, report, mask); in da7219_aad_irq_thread()
614 dev_warn(dev, "Invalid ADC 1-bit repeat value"); in da7219_aad_fw_adc_1bit_rpt()
635 aad_pdata->irq = i2c->irq; in da7219_aad_fw_to_pdata()
637 if (fwnode_property_read_u32(aad_np, "dlg,micbias-pulse-lvl", in da7219_aad_fw_to_pdata()
639 aad_pdata->micbias_pulse_lvl = in da7219_aad_fw_to_pdata()
642 aad_pdata->micbias_pulse_lvl = DA7219_AAD_MICBIAS_PULSE_LVL_OFF; in da7219_aad_fw_to_pdata()
644 if (fwnode_property_read_u32(aad_np, "dlg,micbias-pulse-time", in da7219_aad_fw_to_pdata()
646 aad_pdata->micbias_pulse_time = fw_val32; in da7219_aad_fw_to_pdata()
648 if (fwnode_property_read_u32(aad_np, "dlg,btn-cfg", &fw_val32) >= 0) in da7219_aad_fw_to_pdata()
649 aad_pdata->btn_cfg = da7219_aad_fw_btn_cfg(dev, fw_val32); in da7219_aad_fw_to_pdata()
651 aad_pdata->btn_cfg = DA7219_AAD_BTN_CFG_10MS; in da7219_aad_fw_to_pdata()
653 if (fwnode_property_read_u32(aad_np, "dlg,mic-det-thr", &fw_val32) >= 0) in da7219_aad_fw_to_pdata()
654 aad_pdata->mic_det_thr = in da7219_aad_fw_to_pdata()
657 aad_pdata->mic_det_thr = DA7219_AAD_MIC_DET_THR_200_OHMS; in da7219_aad_fw_to_pdata()
659 if (fwnode_property_read_u32(aad_np, "dlg,jack-ins-deb", &fw_val32) >= 0) in da7219_aad_fw_to_pdata()
660 aad_pdata->jack_ins_deb = in da7219_aad_fw_to_pdata()
663 aad_pdata->jack_ins_deb = DA7219_AAD_JACK_INS_DEB_20MS; in da7219_aad_fw_to_pdata()
665 if (!fwnode_property_read_string(aad_np, "dlg,jack-det-rate", &fw_str)) in da7219_aad_fw_to_pdata()
666 aad_pdata->jack_det_rate = in da7219_aad_fw_to_pdata()
669 aad_pdata->jack_det_rate = DA7219_AAD_JACK_DET_RATE_256_512MS; in da7219_aad_fw_to_pdata()
671 if (fwnode_property_read_u32(aad_np, "dlg,jack-rem-deb", &fw_val32) >= 0) in da7219_aad_fw_to_pdata()
672 aad_pdata->jack_rem_deb = in da7219_aad_fw_to_pdata()
675 aad_pdata->jack_rem_deb = DA7219_AAD_JACK_REM_DEB_1MS; in da7219_aad_fw_to_pdata()
677 if (fwnode_property_read_u32(aad_np, "dlg,a-d-btn-thr", &fw_val32) >= 0) in da7219_aad_fw_to_pdata()
678 aad_pdata->a_d_btn_thr = (u8) fw_val32; in da7219_aad_fw_to_pdata()
680 aad_pdata->a_d_btn_thr = 0xA; in da7219_aad_fw_to_pdata()
682 if (fwnode_property_read_u32(aad_np, "dlg,d-b-btn-thr", &fw_val32) >= 0) in da7219_aad_fw_to_pdata()
683 aad_pdata->d_b_btn_thr = (u8) fw_val32; in da7219_aad_fw_to_pdata()
685 aad_pdata->d_b_btn_thr = 0x16; in da7219_aad_fw_to_pdata()
687 if (fwnode_property_read_u32(aad_np, "dlg,b-c-btn-thr", &fw_val32) >= 0) in da7219_aad_fw_to_pdata()
688 aad_pdata->b_c_btn_thr = (u8) fw_val32; in da7219_aad_fw_to_pdata()
690 aad_pdata->b_c_btn_thr = 0x21; in da7219_aad_fw_to_pdata()
692 if (fwnode_property_read_u32(aad_np, "dlg,c-mic-btn-thr", &fw_val32) >= 0) in da7219_aad_fw_to_pdata()
693 aad_pdata->c_mic_btn_thr = (u8) fw_val32; in da7219_aad_fw_to_pdata()
695 aad_pdata->c_mic_btn_thr = 0x3E; in da7219_aad_fw_to_pdata()
697 if (fwnode_property_read_u32(aad_np, "dlg,btn-avg", &fw_val32) >= 0) in da7219_aad_fw_to_pdata()
698 aad_pdata->btn_avg = da7219_aad_fw_btn_avg(dev, fw_val32); in da7219_aad_fw_to_pdata()
700 aad_pdata->btn_avg = DA7219_AAD_BTN_AVG_2; in da7219_aad_fw_to_pdata()
702 if (fwnode_property_read_u32(aad_np, "dlg,adc-1bit-rpt", &fw_val32) >= 0) in da7219_aad_fw_to_pdata()
703 aad_pdata->adc_1bit_rpt = in da7219_aad_fw_to_pdata()
706 aad_pdata->adc_1bit_rpt = DA7219_AAD_ADC_1BIT_RPT_1; in da7219_aad_fw_to_pdata()
714 struct da7219_aad_priv *da7219_aad = da7219->aad; in da7219_aad_handle_pdata()
715 struct da7219_pdata *pdata = da7219->pdata; in da7219_aad_handle_pdata()
717 if ((pdata) && (pdata->aad_pdata)) { in da7219_aad_handle_pdata()
718 struct da7219_aad_pdata *aad_pdata = pdata->aad_pdata; in da7219_aad_handle_pdata()
719 u8 cfg, mask; in da7219_aad_handle_pdata() local
721 da7219_aad->irq = aad_pdata->irq; in da7219_aad_handle_pdata()
723 switch (aad_pdata->micbias_pulse_lvl) { in da7219_aad_handle_pdata()
726 da7219_aad->micbias_pulse_lvl = in da7219_aad_handle_pdata()
727 (aad_pdata->micbias_pulse_lvl << in da7219_aad_handle_pdata()
734 da7219_aad->micbias_pulse_time = aad_pdata->micbias_pulse_time; in da7219_aad_handle_pdata()
736 switch (aad_pdata->btn_cfg) { in da7219_aad_handle_pdata()
744 da7219_aad->btn_cfg = (aad_pdata->btn_cfg << in da7219_aad_handle_pdata()
749 mask = 0; in da7219_aad_handle_pdata()
750 switch (aad_pdata->mic_det_thr) { in da7219_aad_handle_pdata()
755 cfg |= (aad_pdata->mic_det_thr << in da7219_aad_handle_pdata()
757 mask |= DA7219_MIC_DET_THRESH_MASK; in da7219_aad_handle_pdata()
759 snd_soc_component_update_bits(component, DA7219_ACCDET_CONFIG_1, mask, cfg); in da7219_aad_handle_pdata()
762 mask = 0; in da7219_aad_handle_pdata()
763 switch (aad_pdata->jack_ins_deb) { in da7219_aad_handle_pdata()
772 cfg |= (aad_pdata->jack_ins_deb << in da7219_aad_handle_pdata()
774 mask |= DA7219_JACKDET_DEBOUNCE_MASK; in da7219_aad_handle_pdata()
776 switch (aad_pdata->jack_det_rate) { in da7219_aad_handle_pdata()
781 cfg |= (aad_pdata->jack_det_rate << in da7219_aad_handle_pdata()
783 mask |= DA7219_JACK_DETECT_RATE_MASK; in da7219_aad_handle_pdata()
785 switch (aad_pdata->jack_rem_deb) { in da7219_aad_handle_pdata()
790 cfg |= (aad_pdata->jack_rem_deb << in da7219_aad_handle_pdata()
792 mask |= DA7219_JACKDET_REM_DEB_MASK; in da7219_aad_handle_pdata()
794 snd_soc_component_update_bits(component, DA7219_ACCDET_CONFIG_2, mask, cfg); in da7219_aad_handle_pdata()
797 aad_pdata->a_d_btn_thr); in da7219_aad_handle_pdata()
799 aad_pdata->d_b_btn_thr); in da7219_aad_handle_pdata()
801 aad_pdata->b_c_btn_thr); in da7219_aad_handle_pdata()
803 aad_pdata->c_mic_btn_thr); in da7219_aad_handle_pdata()
806 mask = 0; in da7219_aad_handle_pdata()
807 switch (aad_pdata->btn_avg) { in da7219_aad_handle_pdata()
812 cfg |= (aad_pdata->btn_avg << in da7219_aad_handle_pdata()
814 mask |= DA7219_BUTTON_AVERAGE_MASK; in da7219_aad_handle_pdata()
816 switch (aad_pdata->adc_1bit_rpt) { in da7219_aad_handle_pdata()
821 cfg |= (aad_pdata->adc_1bit_rpt << in da7219_aad_handle_pdata()
823 mask |= DA7219_ADC_1_BIT_REPEAT_MASK; in da7219_aad_handle_pdata()
825 snd_soc_component_update_bits(component, DA7219_ACCDET_CONFIG_7, mask, cfg); in da7219_aad_handle_pdata()
837 struct da7219_aad_priv *da7219_aad = da7219->aad; in da7219_aad_suspend()
841 if (da7219_aad->jack) { in da7219_aad_suspend()
842 /* Disable jack detection during suspend */ in da7219_aad_suspend()
847 * If we have a 4-pole jack inserted, then micbias will be in da7219_aad_suspend()
848 * enabled. We can disable micbias here, and keep a note to in da7219_aad_suspend()
849 * re-enable it on resume. If jack removal occurred during in da7219_aad_suspend()
852 if (da7219_aad->jack_inserted) { in da7219_aad_suspend()
857 da7219_aad->micbias_resume_enable = true; in da7219_aad_suspend()
862 synchronize_irq(da7219_aad->irq); in da7219_aad_suspend()
868 struct da7219_aad_priv *da7219_aad = da7219->aad; in da7219_aad_resume()
871 if (da7219_aad->jack) { in da7219_aad_resume()
872 /* Re-enable micbias if previously enabled for 4-pole jack */ in da7219_aad_resume()
873 if (da7219_aad->jack_inserted && in da7219_aad_resume()
874 da7219_aad->micbias_resume_enable) { in da7219_aad_resume()
877 da7219_aad->micbias_resume_enable = false; in da7219_aad_resume()
880 /* Re-enable jack detection */ in da7219_aad_resume()
895 struct da7219_aad_priv *da7219_aad = da7219->aad; in da7219_aad_init()
896 u8 mask[DA7219_AAD_IRQ_REG_MAX]; in da7219_aad_init() local
899 da7219_aad->component = component; in da7219_aad_init()
904 /* Disable button detection */ in da7219_aad_init()
908 INIT_WORK(&da7219_aad->btn_det_work, da7219_aad_btn_det_work); in da7219_aad_init()
909 INIT_WORK(&da7219_aad->hptest_work, da7219_aad_hptest_work); in da7219_aad_init()
911 ret = request_threaded_irq(da7219_aad->irq, NULL, in da7219_aad_init()
914 "da7219-aad", da7219_aad); in da7219_aad_init()
916 dev_err(component->dev, "Failed to request IRQ: %d\n", ret); in da7219_aad_init()
921 memset(mask, 0, DA7219_AAD_IRQ_REG_MAX); in da7219_aad_init()
922 regmap_bulk_write(da7219->regmap, DA7219_ACCDET_IRQ_MASK_A, in da7219_aad_init()
923 &mask, DA7219_AAD_IRQ_REG_MAX); in da7219_aad_init()
932 struct da7219_aad_priv *da7219_aad = da7219->aad; in da7219_aad_exit()
933 u8 mask[DA7219_AAD_IRQ_REG_MAX]; in da7219_aad_exit() local
935 /* Mask off AAD IRQs */ in da7219_aad_exit()
936 memset(mask, DA7219_BYTE_MASK, DA7219_AAD_IRQ_REG_MAX); in da7219_aad_exit()
937 regmap_bulk_write(da7219->regmap, DA7219_ACCDET_IRQ_MASK_A, in da7219_aad_exit()
938 mask, DA7219_AAD_IRQ_REG_MAX); in da7219_aad_exit()
940 free_irq(da7219_aad->irq, da7219_aad); in da7219_aad_exit()
942 cancel_work_sync(&da7219_aad->btn_det_work); in da7219_aad_exit()
943 cancel_work_sync(&da7219_aad->hptest_work); in da7219_aad_exit()
954 struct device *dev = &i2c->dev; in da7219_aad_probe()
959 return -ENOMEM; in da7219_aad_probe()
961 da7219->aad = da7219_aad; in da7219_aad_probe()
964 if (da7219->pdata && !da7219->pdata->aad_pdata) in da7219_aad_probe()
965 da7219->pdata->aad_pdata = da7219_aad_fw_to_pdata(dev); in da7219_aad_probe()