Lines Matching refs:nau8825
48 static int nau8825_configure_sysclk(struct nau8825 *nau8825,
257 static int nau8825_sema_acquire(struct nau8825 *nau8825, long timeout) in nau8825_sema_acquire() argument
262 ret = down_timeout(&nau8825->xtalk_sem, timeout); in nau8825_sema_acquire()
264 dev_warn(nau8825->dev, "Acquire semaphore timeout\n"); in nau8825_sema_acquire()
266 ret = down_trylock(&nau8825->xtalk_sem); in nau8825_sema_acquire()
268 dev_warn(nau8825->dev, "Acquire semaphore fail\n"); in nau8825_sema_acquire()
281 static inline void nau8825_sema_release(struct nau8825 *nau8825) in nau8825_sema_release() argument
283 up(&nau8825->xtalk_sem); in nau8825_sema_release()
293 static inline void nau8825_sema_reset(struct nau8825 *nau8825) in nau8825_sema_reset() argument
295 nau8825->xtalk_sem.count = 1; in nau8825_sema_reset()
311 static void nau8825_hpvol_ramp(struct nau8825 *nau8825, in nau8825_hpvol_ramp() argument
336 regmap_update_bits(nau8825->regmap, NAU8825_REG_HSVOL_CTRL, in nau8825_hpvol_ramp()
345 regmap_update_bits(nau8825->regmap, NAU8825_REG_HSVOL_CTRL, in nau8825_hpvol_ramp()
454 static void nau8825_xtalk_backup(struct nau8825 *nau8825) in nau8825_xtalk_backup() argument
458 if (nau8825->xtalk_baktab_initialized) in nau8825_xtalk_backup()
463 regmap_read(nau8825->regmap, nau8825_xtalk_baktab[i].reg, in nau8825_xtalk_backup()
466 nau8825->xtalk_baktab_initialized = true; in nau8825_xtalk_backup()
469 static void nau8825_xtalk_restore(struct nau8825 *nau8825, bool cause_cancel) in nau8825_xtalk_restore() argument
473 if (!nau8825->xtalk_baktab_initialized) in nau8825_xtalk_restore()
487 nau8825_hpvol_ramp(nau8825, 0, volume, 3); in nau8825_xtalk_restore()
490 regmap_write(nau8825->regmap, nau8825_xtalk_baktab[i].reg, in nau8825_xtalk_restore()
494 nau8825->xtalk_baktab_initialized = false; in nau8825_xtalk_restore()
497 static void nau8825_xtalk_prepare_dac(struct nau8825 *nau8825) in nau8825_xtalk_prepare_dac() argument
500 regmap_update_bits(nau8825->regmap, NAU8825_REG_ENA_CTRL, in nau8825_xtalk_prepare_dac()
509 regmap_update_bits(nau8825->regmap, NAU8825_REG_CHARGE_PUMP, in nau8825_xtalk_prepare_dac()
513 regmap_update_bits(nau8825->regmap, NAU8825_REG_RDAC, in nau8825_xtalk_prepare_dac()
518 regmap_update_bits(nau8825->regmap, NAU8825_REG_POWER_UP_CONTROL, in nau8825_xtalk_prepare_dac()
523 regmap_update_bits(nau8825->regmap, NAU8825_REG_POWER_UP_CONTROL, in nau8825_xtalk_prepare_dac()
527 regmap_update_bits(nau8825->regmap, NAU8825_REG_HSD_CTRL, in nau8825_xtalk_prepare_dac()
530 regmap_update_bits(nau8825->regmap, NAU8825_REG_BOOST, in nau8825_xtalk_prepare_dac()
533 regmap_update_bits(nau8825->regmap, NAU8825_REG_CLASSG_CTRL, in nau8825_xtalk_prepare_dac()
538 static void nau8825_xtalk_prepare_adc(struct nau8825 *nau8825) in nau8825_xtalk_prepare_adc() argument
541 regmap_update_bits(nau8825->regmap, NAU8825_REG_ANALOG_ADC_2, in nau8825_xtalk_prepare_adc()
546 static void nau8825_xtalk_clock(struct nau8825 *nau8825) in nau8825_xtalk_clock() argument
549 regmap_write(nau8825->regmap, NAU8825_REG_FLL1, 0x0); in nau8825_xtalk_clock()
550 regmap_write(nau8825->regmap, NAU8825_REG_FLL2, 0x3126); in nau8825_xtalk_clock()
551 regmap_write(nau8825->regmap, NAU8825_REG_FLL3, 0x0008); in nau8825_xtalk_clock()
552 regmap_write(nau8825->regmap, NAU8825_REG_FLL4, 0x0010); in nau8825_xtalk_clock()
553 regmap_write(nau8825->regmap, NAU8825_REG_FLL5, 0x0); in nau8825_xtalk_clock()
554 regmap_write(nau8825->regmap, NAU8825_REG_FLL6, 0x6000); in nau8825_xtalk_clock()
556 regmap_update_bits(nau8825->regmap, NAU8825_REG_CLK_DIVIDER, in nau8825_xtalk_clock()
558 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL6, NAU8825_DCO_EN, in nau8825_xtalk_clock()
563 regmap_update_bits(nau8825->regmap, NAU8825_REG_CLK_DIVIDER, in nau8825_xtalk_clock()
565 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL1, in nau8825_xtalk_clock()
569 static void nau8825_xtalk_prepare(struct nau8825 *nau8825) in nau8825_xtalk_prepare() argument
574 nau8825_xtalk_backup(nau8825); in nau8825_xtalk_prepare()
576 regmap_update_bits(nau8825->regmap, NAU8825_REG_I2S_PCM_CTRL2, in nau8825_xtalk_prepare()
587 nau8825_hpvol_ramp(nau8825, volume, 0, 3); in nau8825_xtalk_prepare()
589 nau8825_xtalk_clock(nau8825); in nau8825_xtalk_prepare()
590 nau8825_xtalk_prepare_dac(nau8825); in nau8825_xtalk_prepare()
591 nau8825_xtalk_prepare_adc(nau8825); in nau8825_xtalk_prepare()
593 regmap_update_bits(nau8825->regmap, NAU8825_REG_DACL_CTRL, in nau8825_xtalk_prepare()
596 regmap_update_bits(nau8825->regmap, NAU8825_REG_DACR_CTRL, in nau8825_xtalk_prepare()
602 regmap_update_bits(nau8825->regmap, NAU8825_REG_IMM_MODE_CTRL, in nau8825_xtalk_prepare()
608 regmap_update_bits(nau8825->regmap, in nau8825_xtalk_prepare()
611 regmap_update_bits(nau8825->regmap, NAU8825_REG_CHARGE_PUMP, in nau8825_xtalk_prepare()
615 static void nau8825_xtalk_clean_dac(struct nau8825 *nau8825) in nau8825_xtalk_clean_dac() argument
618 regmap_update_bits(nau8825->regmap, NAU8825_REG_BOOST, in nau8825_xtalk_clean_dac()
621 regmap_update_bits(nau8825->regmap, NAU8825_REG_HSD_CTRL, in nau8825_xtalk_clean_dac()
625 regmap_update_bits(nau8825->regmap, NAU8825_REG_CHARGE_PUMP, in nau8825_xtalk_clean_dac()
629 regmap_update_bits(nau8825->regmap, NAU8825_REG_BIAS_ADJ, in nau8825_xtalk_clean_dac()
633 regmap_update_bits(nau8825->regmap, NAU8825_REG_POWER_UP_CONTROL, in nau8825_xtalk_clean_dac()
635 regmap_update_bits(nau8825->regmap, NAU8825_REG_POWER_UP_CONTROL, in nau8825_xtalk_clean_dac()
639 regmap_update_bits(nau8825->regmap, NAU8825_REG_RDAC, in nau8825_xtalk_clean_dac()
642 regmap_update_bits(nau8825->regmap, NAU8825_REG_CHARGE_PUMP, in nau8825_xtalk_clean_dac()
645 regmap_update_bits(nau8825->regmap, NAU8825_REG_ENA_CTRL, in nau8825_xtalk_clean_dac()
648 if (!nau8825->irq) in nau8825_xtalk_clean_dac()
649 regmap_update_bits(nau8825->regmap, in nau8825_xtalk_clean_dac()
653 static void nau8825_xtalk_clean_adc(struct nau8825 *nau8825) in nau8825_xtalk_clean_adc() argument
656 regmap_update_bits(nau8825->regmap, NAU8825_REG_ANALOG_ADC_2, in nau8825_xtalk_clean_adc()
660 static void nau8825_xtalk_clean(struct nau8825 *nau8825, bool cause_cancel) in nau8825_xtalk_clean() argument
663 nau8825_configure_sysclk(nau8825, NAU8825_CLK_INTERNAL, 0); in nau8825_xtalk_clean()
664 nau8825_xtalk_clean_dac(nau8825); in nau8825_xtalk_clean()
665 nau8825_xtalk_clean_adc(nau8825); in nau8825_xtalk_clean()
667 regmap_write(nau8825->regmap, NAU8825_REG_IMM_MODE_CTRL, 0); in nau8825_xtalk_clean()
669 regmap_update_bits(nau8825->regmap, NAU8825_REG_INTERRUPT_MASK, in nau8825_xtalk_clean()
672 regmap_update_bits(nau8825->regmap, NAU8825_REG_I2S_PCM_CTRL2, in nau8825_xtalk_clean()
676 nau8825_xtalk_restore(nau8825, cause_cancel); in nau8825_xtalk_clean()
679 static void nau8825_xtalk_imm_start(struct nau8825 *nau8825, int vol) in nau8825_xtalk_imm_start() argument
682 regmap_update_bits(nau8825->regmap, NAU8825_REG_ADC_DGAIN_CTRL, in nau8825_xtalk_imm_start()
687 regmap_update_bits(nau8825->regmap, NAU8825_REG_BIAS_ADJ, in nau8825_xtalk_imm_start()
690 switch (nau8825->xtalk_state) { in nau8825_xtalk_imm_start()
693 regmap_update_bits(nau8825->regmap, NAU8825_REG_BIAS_ADJ, in nau8825_xtalk_imm_start()
699 regmap_update_bits(nau8825->regmap, NAU8825_REG_BIAS_ADJ, in nau8825_xtalk_imm_start()
708 regmap_update_bits(nau8825->regmap, NAU8825_REG_IMM_MODE_CTRL, in nau8825_xtalk_imm_start()
712 static void nau8825_xtalk_imm_stop(struct nau8825 *nau8825) in nau8825_xtalk_imm_stop() argument
715 regmap_update_bits(nau8825->regmap, in nau8825_xtalk_imm_stop()
739 static void nau8825_xtalk_measure(struct nau8825 *nau8825) in nau8825_xtalk_measure() argument
743 switch (nau8825->xtalk_state) { in nau8825_xtalk_measure()
748 nau8825_xtalk_prepare(nau8825); in nau8825_xtalk_measure()
751 nau8825->xtalk_state = NAU8825_XTALK_HPR_R2L; in nau8825_xtalk_measure()
752 nau8825_xtalk_imm_start(nau8825, 0x00d2); in nau8825_xtalk_measure()
758 regmap_read(nau8825->regmap, NAU8825_REG_IMM_RMS_L, in nau8825_xtalk_measure()
759 &nau8825->imp_rms[NAU8825_XTALK_HPR_R2L]); in nau8825_xtalk_measure()
760 dev_dbg(nau8825->dev, "HPR_R2L imm: %x\n", in nau8825_xtalk_measure()
761 nau8825->imp_rms[NAU8825_XTALK_HPR_R2L]); in nau8825_xtalk_measure()
763 nau8825_xtalk_imm_stop(nau8825); in nau8825_xtalk_measure()
765 nau8825->xtalk_state = NAU8825_XTALK_HPL_R2L; in nau8825_xtalk_measure()
766 nau8825_xtalk_imm_start(nau8825, 0x00ff); in nau8825_xtalk_measure()
775 regmap_read(nau8825->regmap, NAU8825_REG_IMM_RMS_L, in nau8825_xtalk_measure()
776 &nau8825->imp_rms[NAU8825_XTALK_HPL_R2L]); in nau8825_xtalk_measure()
777 dev_dbg(nau8825->dev, "HPL_R2L imm: %x\n", in nau8825_xtalk_measure()
778 nau8825->imp_rms[NAU8825_XTALK_HPL_R2L]); in nau8825_xtalk_measure()
779 nau8825_xtalk_imm_stop(nau8825); in nau8825_xtalk_measure()
781 nau8825->xtalk_state = NAU8825_XTALK_IMM; in nau8825_xtalk_measure()
790 nau8825->imp_rms[NAU8825_XTALK_HPR_R2L], in nau8825_xtalk_measure()
791 nau8825->imp_rms[NAU8825_XTALK_HPL_R2L]); in nau8825_xtalk_measure()
792 dev_dbg(nau8825->dev, "cross talk sidetone: %x\n", sidetone); in nau8825_xtalk_measure()
793 regmap_write(nau8825->regmap, NAU8825_REG_DAC_DGAIN_CTRL, in nau8825_xtalk_measure()
795 nau8825_xtalk_clean(nau8825, false); in nau8825_xtalk_measure()
796 nau8825->xtalk_state = NAU8825_XTALK_DONE; in nau8825_xtalk_measure()
805 struct nau8825 *nau8825 = container_of( in nau8825_xtalk_work() local
806 work, struct nau8825, xtalk_work); in nau8825_xtalk_work()
808 nau8825_xtalk_measure(nau8825); in nau8825_xtalk_work()
812 if (nau8825->xtalk_state == NAU8825_XTALK_IMM) in nau8825_xtalk_work()
813 nau8825_xtalk_measure(nau8825); in nau8825_xtalk_work()
821 if (nau8825->xtalk_state == NAU8825_XTALK_DONE) { in nau8825_xtalk_work()
822 snd_soc_jack_report(nau8825->jack, nau8825->xtalk_event, in nau8825_xtalk_work()
823 nau8825->xtalk_event_mask); in nau8825_xtalk_work()
824 nau8825_sema_release(nau8825); in nau8825_xtalk_work()
825 nau8825->xtalk_protect = false; in nau8825_xtalk_work()
829 static void nau8825_xtalk_cancel(struct nau8825 *nau8825) in nau8825_xtalk_cancel() argument
835 if (nau8825->xtalk_enable && nau8825->xtalk_state != in nau8825_xtalk_cancel()
837 cancel_work_sync(&nau8825->xtalk_work); in nau8825_xtalk_cancel()
838 nau8825_xtalk_clean(nau8825, true); in nau8825_xtalk_cancel()
841 nau8825_sema_reset(nau8825); in nau8825_xtalk_cancel()
842 nau8825->xtalk_state = NAU8825_XTALK_DONE; in nau8825_xtalk_cancel()
843 nau8825->xtalk_protect = false; in nau8825_xtalk_cancel()
918 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_adc_event() local
923 regmap_update_bits(nau8825->regmap, NAU8825_REG_ENA_CTRL, in nau8825_adc_event()
927 if (!nau8825->irq) in nau8825_adc_event()
928 regmap_update_bits(nau8825->regmap, in nau8825_adc_event()
942 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_pump_event() local
948 regmap_update_bits(nau8825->regmap, NAU8825_REG_CHARGE_PUMP, in nau8825_pump_event()
952 regmap_update_bits(nau8825->regmap, NAU8825_REG_CHARGE_PUMP, in nau8825_pump_event()
966 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_output_dac_event() local
971 regmap_update_bits(nau8825->regmap, NAU8825_REG_BIAS_ADJ, in nau8825_output_dac_event()
975 regmap_update_bits(nau8825->regmap, NAU8825_REG_BIAS_ADJ, in nau8825_output_dac_event()
989 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in system_clock_control() local
990 struct regmap *regmap = nau8825->regmap; in system_clock_control()
993 dev_dbg(nau8825->dev, "system clock control : POWER OFF\n"); in system_clock_control()
1000 nau8825_configure_sysclk(nau8825, in system_clock_control()
1003 nau8825_configure_sysclk(nau8825, NAU8825_CLK_DIS, 0); in system_clock_control()
1251 nau8825_get_osr(struct nau8825 *nau8825, int stream) in nau8825_get_osr() argument
1256 regmap_read(nau8825->regmap, in nau8825_get_osr()
1263 regmap_read(nau8825->regmap, in nau8825_get_osr()
1276 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_dai_startup() local
1279 osr = nau8825_get_osr(nau8825, substream->stream); in nau8825_dai_startup()
1293 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_hw_params() local
1298 nau8825_sema_acquire(nau8825, 3 * HZ); in nau8825_hw_params()
1306 osr = nau8825_get_osr(nau8825, substream->stream); in nau8825_hw_params()
1312 regmap_update_bits(nau8825->regmap, NAU8825_REG_CLK_DIVIDER, in nau8825_hw_params()
1316 regmap_update_bits(nau8825->regmap, NAU8825_REG_CLK_DIVIDER, in nau8825_hw_params()
1321 regmap_read(nau8825->regmap, NAU8825_REG_I2S_PCM_CTRL2, &ctrl_val); in nau8825_hw_params()
1333 regmap_update_bits(nau8825->regmap, NAU8825_REG_I2S_PCM_CTRL2, in nau8825_hw_params()
1355 regmap_update_bits(nau8825->regmap, NAU8825_REG_I2S_PCM_CTRL1, in nau8825_hw_params()
1361 nau8825_sema_release(nau8825); in nau8825_hw_params()
1369 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_set_dai_fmt() local
1413 nau8825_sema_acquire(nau8825, 3 * HZ); in nau8825_set_dai_fmt()
1415 regmap_update_bits(nau8825->regmap, NAU8825_REG_I2S_PCM_CTRL1, in nau8825_set_dai_fmt()
1419 regmap_update_bits(nau8825->regmap, NAU8825_REG_I2S_PCM_CTRL2, in nau8825_set_dai_fmt()
1423 nau8825_sema_release(nau8825); in nau8825_set_dai_fmt()
1443 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_set_tdm_slot() local
1447 dev_err(nau8825->dev, "Only support 4 or 8 slots!\n"); in nau8825_set_tdm_slot()
1454 dev_err(nau8825->dev, in nau8825_set_tdm_slot()
1463 dev_err(nau8825->dev, in nau8825_set_tdm_slot()
1470 regmap_update_bits(nau8825->regmap, NAU8825_REG_I2S_PCM_CTRL2, in nau8825_set_tdm_slot()
1472 regmap_read(nau8825->regmap, NAU8825_REG_I2S_PCM_CTRL1, &value); in nau8825_set_tdm_slot()
1514 regmap_update_bits(nau8825->regmap, NAU8825_REG_TDM_CTRL, in nau8825_set_tdm_slot()
1518 regmap_update_bits(nau8825->regmap, NAU8825_REG_LEFT_TIME_SLOT, in nau8825_set_tdm_slot()
1567 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_enable_jack_detect() local
1568 struct regmap *regmap = nau8825->regmap; in nau8825_enable_jack_detect()
1570 nau8825->jack = jack; in nau8825_enable_jack_detect()
1572 if (!nau8825->jack) { in nau8825_enable_jack_detect()
1633 static void nau8825_eject_jack(struct nau8825 *nau8825) in nau8825_eject_jack() argument
1635 struct snd_soc_dapm_context *dapm = nau8825->dapm; in nau8825_eject_jack()
1636 struct regmap *regmap = nau8825->regmap; in nau8825_eject_jack()
1639 nau8825_xtalk_cancel(nau8825); in nau8825_eject_jack()
1673 nau8825_configure_sysclk(nau8825, NAU8825_CLK_DIS, 0); in nau8825_eject_jack()
1677 static void nau8825_setup_auto_irq(struct nau8825 *nau8825) in nau8825_setup_auto_irq() argument
1679 struct regmap *regmap = nau8825->regmap; in nau8825_setup_auto_irq()
1688 nau8825_configure_sysclk(nau8825, NAU8825_CLK_INTERNAL, 0); in nau8825_setup_auto_irq()
1736 static int nau8825_jack_insert(struct nau8825 *nau8825) in nau8825_jack_insert() argument
1738 struct regmap *regmap = nau8825->regmap; in nau8825_jack_insert()
1739 struct snd_soc_dapm_context *dapm = nau8825->dapm; in nau8825_jack_insert()
1747 nau8825->high_imped = true; in nau8825_jack_insert()
1749 nau8825->high_imped = false; in nau8825_jack_insert()
1757 dev_dbg(nau8825->dev, "OMTP (micgnd1) mic connected\n"); in nau8825_jack_insert()
1777 dev_dbg(nau8825->dev, "CTIA (micgnd2) mic connected\n"); in nau8825_jack_insert()
1798 dev_err(nau8825->dev, "detection error; disable mic function\n"); in nau8825_jack_insert()
1815 struct nau8825 *nau8825 = (struct nau8825 *)data; in nau8825_interrupt() local
1816 struct regmap *regmap = nau8825->regmap; in nau8825_interrupt()
1820 dev_err(nau8825->dev, "failed to read irq status\n"); in nau8825_interrupt()
1827 nau8825_eject_jack(nau8825); in nau8825_interrupt()
1839 nau8825->button_pressed = nau8825_button_decode( in nau8825_interrupt()
1842 event |= nau8825->button_pressed; in nau8825_interrupt()
1850 event |= nau8825_jack_insert(nau8825); in nau8825_interrupt()
1851 if (nau8825->xtalk_enable && !nau8825->high_imped) { in nau8825_interrupt()
1855 if (!nau8825->xtalk_protect) { in nau8825_interrupt()
1863 nau8825->xtalk_protect = true; in nau8825_interrupt()
1864 ret = nau8825_sema_acquire(nau8825, 0); in nau8825_interrupt()
1866 nau8825->xtalk_protect = false; in nau8825_interrupt()
1869 if (nau8825->xtalk_protect) { in nau8825_interrupt()
1870 nau8825->xtalk_state = in nau8825_interrupt()
1872 schedule_work(&nau8825->xtalk_work); in nau8825_interrupt()
1879 if (nau8825->xtalk_protect) { in nau8825_interrupt()
1880 nau8825_sema_release(nau8825); in nau8825_interrupt()
1881 nau8825->xtalk_protect = false; in nau8825_interrupt()
1885 dev_warn(nau8825->dev, "Headset completion IRQ fired but no headset connected\n"); in nau8825_interrupt()
1886 nau8825_eject_jack(nau8825); in nau8825_interrupt()
1895 if (nau8825->xtalk_state == NAU8825_XTALK_PREPARE) { in nau8825_interrupt()
1896 nau8825->xtalk_event = event; in nau8825_interrupt()
1897 nau8825->xtalk_event_mask = event_mask; in nau8825_interrupt()
1901 if (nau8825->xtalk_enable && nau8825->xtalk_protect) in nau8825_interrupt()
1902 schedule_work(&nau8825->xtalk_work); in nau8825_interrupt()
1922 nau8825_setup_auto_irq(nau8825); in nau8825_interrupt()
1936 if (event_mask && nau8825->xtalk_state == NAU8825_XTALK_DONE) in nau8825_interrupt()
1937 snd_soc_jack_report(nau8825->jack, event, event_mask); in nau8825_interrupt()
1942 static void nau8825_setup_buttons(struct nau8825 *nau8825) in nau8825_setup_buttons() argument
1944 struct regmap *regmap = nau8825->regmap; in nau8825_setup_buttons()
1948 nau8825->sar_voltage << NAU8825_SAR_TRACKING_GAIN_SFT); in nau8825_setup_buttons()
1951 nau8825->sar_compare_time << NAU8825_SAR_COMPARE_TIME_SFT); in nau8825_setup_buttons()
1954 nau8825->sar_sampling_time << NAU8825_SAR_SAMPLING_TIME_SFT); in nau8825_setup_buttons()
1958 (nau8825->sar_threshold_num - 1) << NAU8825_KEYDET_LEVELS_NR_SFT); in nau8825_setup_buttons()
1961 nau8825->sar_hysteresis << NAU8825_KEYDET_HYSTERESIS_SFT); in nau8825_setup_buttons()
1964 nau8825->key_debounce << NAU8825_KEYDET_SHORTKEY_DEBOUNCE_SFT); in nau8825_setup_buttons()
1967 (nau8825->sar_threshold[0] << 8) | nau8825->sar_threshold[1]); in nau8825_setup_buttons()
1969 (nau8825->sar_threshold[2] << 8) | nau8825->sar_threshold[3]); in nau8825_setup_buttons()
1971 (nau8825->sar_threshold[4] << 8) | nau8825->sar_threshold[5]); in nau8825_setup_buttons()
1973 (nau8825->sar_threshold[6] << 8) | nau8825->sar_threshold[7]); in nau8825_setup_buttons()
1981 static void nau8825_init_regs(struct nau8825 *nau8825) in nau8825_init_regs() argument
1983 struct regmap *regmap = nau8825->regmap; in nau8825_init_regs()
1988 regmap_update_bits(nau8825->regmap, NAU8825_REG_BIAS_ADJ, in nau8825_init_regs()
1990 regmap_update_bits(nau8825->regmap, NAU8825_REG_BOOST, in nau8825_init_regs()
1996 nau8825->vref_impedance << NAU8825_BIAS_VMID_SEL_SFT); in nau8825_init_regs()
2006 nau8825->jkdet_enable ? 0 : NAU8825_JKDET_OUTPUT_EN); in nau8825_init_regs()
2009 nau8825->jkdet_pull_enable ? 0 : NAU8825_JKDET_PULL_EN); in nau8825_init_regs()
2012 nau8825->jkdet_pull_up ? NAU8825_JKDET_PULL_UP : 0); in nau8825_init_regs()
2016 nau8825->jkdet_polarity ? 0 : NAU8825_JACK_POLARITY); in nau8825_init_regs()
2020 nau8825->jack_insert_debounce << NAU8825_JACK_INSERT_DEBOUNCE_SFT); in nau8825_init_regs()
2023 nau8825->jack_eject_debounce << NAU8825_JACK_EJECT_DEBOUNCE_SFT); in nau8825_init_regs()
2033 NAU8825_MICBIAS_VOLTAGE_MASK, nau8825->micbias_voltage); in nau8825_init_regs()
2035 if (nau8825->sar_threshold_num) in nau8825_init_regs()
2036 nau8825_setup_buttons(nau8825); in nau8825_init_regs()
2054 regmap_update_bits(nau8825->regmap, NAU8825_REG_BIAS_ADJ, in nau8825_init_regs()
2076 regmap_update_bits(nau8825->regmap, NAU8825_REG_DACL_CTRL, in nau8825_init_regs()
2078 regmap_update_bits(nau8825->regmap, NAU8825_REG_DACR_CTRL, in nau8825_init_regs()
2086 nau8825->adcout_ds << NAU8825_ADCOUT_DS_SFT); in nau8825_init_regs()
2105 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_component_probe() local
2108 nau8825->dapm = dapm; in nau8825_component_probe()
2115 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_component_remove() local
2118 nau8825_xtalk_cancel(nau8825); in nau8825_component_remove()
2187 static void nau8825_fll_apply(struct nau8825 *nau8825, in nau8825_fll_apply() argument
2190 regmap_update_bits(nau8825->regmap, NAU8825_REG_CLK_DIVIDER, in nau8825_fll_apply()
2194 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL1, in nau8825_fll_apply()
2198 regmap_write(nau8825->regmap, NAU8825_REG_FLL2, fll_param->fll_frac); in nau8825_fll_apply()
2200 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL3, in nau8825_fll_apply()
2203 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL4, in nau8825_fll_apply()
2207 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL5, in nau8825_fll_apply()
2210 regmap_update_bits(nau8825->regmap, in nau8825_fll_apply()
2214 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL5, in nau8825_fll_apply()
2219 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL6, in nau8825_fll_apply()
2224 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL5, in nau8825_fll_apply()
2227 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL6, in nau8825_fll_apply()
2236 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_set_pll() local
2250 nau8825_fll_apply(nau8825, &fll_param); in nau8825_set_pll()
2252 regmap_update_bits(nau8825->regmap, NAU8825_REG_CLK_DIVIDER, in nau8825_set_pll()
2257 static int nau8825_mclk_prepare(struct nau8825 *nau8825, unsigned int freq) in nau8825_mclk_prepare() argument
2261 nau8825->mclk = devm_clk_get(nau8825->dev, "mclk"); in nau8825_mclk_prepare()
2262 if (IS_ERR(nau8825->mclk)) { in nau8825_mclk_prepare()
2263 dev_info(nau8825->dev, "No 'mclk' clock found, assume MCLK is managed externally"); in nau8825_mclk_prepare()
2267 if (!nau8825->mclk_freq) { in nau8825_mclk_prepare()
2268 ret = clk_prepare_enable(nau8825->mclk); in nau8825_mclk_prepare()
2270 dev_err(nau8825->dev, "Unable to prepare codec mclk\n"); in nau8825_mclk_prepare()
2275 if (nau8825->mclk_freq != freq) { in nau8825_mclk_prepare()
2276 freq = clk_round_rate(nau8825->mclk, freq); in nau8825_mclk_prepare()
2277 ret = clk_set_rate(nau8825->mclk, freq); in nau8825_mclk_prepare()
2279 dev_err(nau8825->dev, "Unable to set mclk rate\n"); in nau8825_mclk_prepare()
2282 nau8825->mclk_freq = freq; in nau8825_mclk_prepare()
2299 static int nau8825_configure_sysclk(struct nau8825 *nau8825, int clk_id, in nau8825_configure_sysclk() argument
2302 struct regmap *regmap = nau8825->regmap; in nau8825_configure_sysclk()
2309 if (nau8825->mclk_freq) { in nau8825_configure_sysclk()
2310 clk_disable_unprepare(nau8825->mclk); in nau8825_configure_sysclk()
2311 nau8825->mclk_freq = 0; in nau8825_configure_sysclk()
2321 nau8825_sema_acquire(nau8825, 3 * HZ); in nau8825_configure_sysclk()
2327 nau8825_sema_release(nau8825); in nau8825_configure_sysclk()
2329 ret = nau8825_mclk_prepare(nau8825, freq); in nau8825_configure_sysclk()
2335 if (nau8825_is_jack_inserted(nau8825->regmap)) { in nau8825_configure_sysclk()
2355 dev_warn(nau8825->dev, "Disable clock for power saving when no headset connected\n"); in nau8825_configure_sysclk()
2357 if (nau8825->mclk_freq) { in nau8825_configure_sysclk()
2358 clk_disable_unprepare(nau8825->mclk); in nau8825_configure_sysclk()
2359 nau8825->mclk_freq = 0; in nau8825_configure_sysclk()
2369 nau8825_sema_acquire(nau8825, 3 * HZ); in nau8825_configure_sysclk()
2378 nau8825_sema_release(nau8825); in nau8825_configure_sysclk()
2380 ret = nau8825_mclk_prepare(nau8825, freq); in nau8825_configure_sysclk()
2391 nau8825_sema_acquire(nau8825, 3 * HZ); in nau8825_configure_sysclk()
2403 nau8825_sema_release(nau8825); in nau8825_configure_sysclk()
2405 if (nau8825->mclk_freq) { in nau8825_configure_sysclk()
2406 clk_disable_unprepare(nau8825->mclk); in nau8825_configure_sysclk()
2407 nau8825->mclk_freq = 0; in nau8825_configure_sysclk()
2417 nau8825_sema_acquire(nau8825, 3 * HZ); in nau8825_configure_sysclk()
2429 nau8825_sema_release(nau8825); in nau8825_configure_sysclk()
2431 if (nau8825->mclk_freq) { in nau8825_configure_sysclk()
2432 clk_disable_unprepare(nau8825->mclk); in nau8825_configure_sysclk()
2433 nau8825->mclk_freq = 0; in nau8825_configure_sysclk()
2438 dev_err(nau8825->dev, "Invalid clock id (%d)\n", clk_id); in nau8825_configure_sysclk()
2442 dev_dbg(nau8825->dev, "Sysclk is %dHz and clock id is %d\n", freq, in nau8825_configure_sysclk()
2450 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_set_sysclk() local
2452 return nau8825_configure_sysclk(nau8825, clk_id, freq); in nau8825_set_sysclk()
2455 static int nau8825_resume_setup(struct nau8825 *nau8825) in nau8825_resume_setup() argument
2457 struct regmap *regmap = nau8825->regmap; in nau8825_resume_setup()
2460 nau8825_configure_sysclk(nau8825, NAU8825_CLK_DIS, 0); in nau8825_resume_setup()
2483 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_set_bias_level() local
2495 if (nau8825->mclk_freq) { in nau8825_set_bias_level()
2496 ret = clk_prepare_enable(nau8825->mclk); in nau8825_set_bias_level()
2498 dev_err(nau8825->dev, "Unable to prepare component mclk\n"); in nau8825_set_bias_level()
2503 nau8825_resume_setup(nau8825); in nau8825_set_bias_level()
2510 regmap_update_bits(nau8825->regmap, NAU8825_REG_MIC_BIAS, in nau8825_set_bias_level()
2513 regmap_update_bits(nau8825->regmap, in nau8825_set_bias_level()
2516 nau8825_xtalk_cancel(nau8825); in nau8825_set_bias_level()
2520 regmap_write(nau8825->regmap, in nau8825_set_bias_level()
2523 regmap_update_bits(nau8825->regmap, NAU8825_REG_ENA_CTRL, in nau8825_set_bias_level()
2525 if (nau8825->mclk_freq) in nau8825_set_bias_level()
2526 clk_disable_unprepare(nau8825->mclk); in nau8825_set_bias_level()
2534 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_suspend() local
2536 disable_irq(nau8825->irq); in nau8825_suspend()
2539 snd_soc_dapm_disable_pin(nau8825->dapm, "SAR"); in nau8825_suspend()
2540 snd_soc_dapm_disable_pin(nau8825->dapm, "MICBIAS"); in nau8825_suspend()
2541 snd_soc_dapm_sync(nau8825->dapm); in nau8825_suspend()
2542 regcache_cache_only(nau8825->regmap, true); in nau8825_suspend()
2543 regcache_mark_dirty(nau8825->regmap); in nau8825_suspend()
2550 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_resume() local
2553 regcache_cache_only(nau8825->regmap, false); in nau8825_resume()
2554 regcache_sync(nau8825->regmap); in nau8825_resume()
2555 nau8825->xtalk_protect = true; in nau8825_resume()
2556 ret = nau8825_sema_acquire(nau8825, 0); in nau8825_resume()
2558 nau8825->xtalk_protect = false; in nau8825_resume()
2559 enable_irq(nau8825->irq); in nau8825_resume()
2597 static void nau8825_print_device_properties(struct nau8825 *nau8825) in nau8825_print_device_properties() argument
2600 struct device *dev = nau8825->dev; in nau8825_print_device_properties()
2602 dev_dbg(dev, "jkdet-enable: %d\n", nau8825->jkdet_enable); in nau8825_print_device_properties()
2603 dev_dbg(dev, "jkdet-pull-enable: %d\n", nau8825->jkdet_pull_enable); in nau8825_print_device_properties()
2604 dev_dbg(dev, "jkdet-pull-up: %d\n", nau8825->jkdet_pull_up); in nau8825_print_device_properties()
2605 dev_dbg(dev, "jkdet-polarity: %d\n", nau8825->jkdet_polarity); in nau8825_print_device_properties()
2606 dev_dbg(dev, "micbias-voltage: %d\n", nau8825->micbias_voltage); in nau8825_print_device_properties()
2607 dev_dbg(dev, "vref-impedance: %d\n", nau8825->vref_impedance); in nau8825_print_device_properties()
2609 dev_dbg(dev, "sar-threshold-num: %d\n", nau8825->sar_threshold_num); in nau8825_print_device_properties()
2610 for (i = 0; i < nau8825->sar_threshold_num; i++) in nau8825_print_device_properties()
2612 nau8825->sar_threshold[i]); in nau8825_print_device_properties()
2614 dev_dbg(dev, "sar-hysteresis: %d\n", nau8825->sar_hysteresis); in nau8825_print_device_properties()
2615 dev_dbg(dev, "sar-voltage: %d\n", nau8825->sar_voltage); in nau8825_print_device_properties()
2616 dev_dbg(dev, "sar-compare-time: %d\n", nau8825->sar_compare_time); in nau8825_print_device_properties()
2617 dev_dbg(dev, "sar-sampling-time: %d\n", nau8825->sar_sampling_time); in nau8825_print_device_properties()
2618 dev_dbg(dev, "short-key-debounce: %d\n", nau8825->key_debounce); in nau8825_print_device_properties()
2620 nau8825->jack_insert_debounce); in nau8825_print_device_properties()
2622 nau8825->jack_eject_debounce); in nau8825_print_device_properties()
2624 nau8825->xtalk_enable); in nau8825_print_device_properties()
2625 dev_dbg(dev, "adcout-drive-strong: %d\n", nau8825->adcout_ds); in nau8825_print_device_properties()
2629 struct nau8825 *nau8825) { in nau8825_read_device_properties() argument
2632 nau8825->jkdet_enable = device_property_read_bool(dev, in nau8825_read_device_properties()
2634 nau8825->jkdet_pull_enable = device_property_read_bool(dev, in nau8825_read_device_properties()
2636 nau8825->jkdet_pull_up = device_property_read_bool(dev, in nau8825_read_device_properties()
2639 &nau8825->jkdet_polarity); in nau8825_read_device_properties()
2641 nau8825->jkdet_polarity = 1; in nau8825_read_device_properties()
2643 &nau8825->micbias_voltage); in nau8825_read_device_properties()
2645 nau8825->micbias_voltage = 6; in nau8825_read_device_properties()
2647 &nau8825->vref_impedance); in nau8825_read_device_properties()
2649 nau8825->vref_impedance = 2; in nau8825_read_device_properties()
2651 &nau8825->sar_threshold_num); in nau8825_read_device_properties()
2653 nau8825->sar_threshold_num = 4; in nau8825_read_device_properties()
2655 nau8825->sar_threshold, nau8825->sar_threshold_num); in nau8825_read_device_properties()
2657 nau8825->sar_threshold[0] = 0x08; in nau8825_read_device_properties()
2658 nau8825->sar_threshold[1] = 0x12; in nau8825_read_device_properties()
2659 nau8825->sar_threshold[2] = 0x26; in nau8825_read_device_properties()
2660 nau8825->sar_threshold[3] = 0x73; in nau8825_read_device_properties()
2663 &nau8825->sar_hysteresis); in nau8825_read_device_properties()
2665 nau8825->sar_hysteresis = 0; in nau8825_read_device_properties()
2667 &nau8825->sar_voltage); in nau8825_read_device_properties()
2669 nau8825->sar_voltage = 6; in nau8825_read_device_properties()
2671 &nau8825->sar_compare_time); in nau8825_read_device_properties()
2673 nau8825->sar_compare_time = 1; in nau8825_read_device_properties()
2675 &nau8825->sar_sampling_time); in nau8825_read_device_properties()
2677 nau8825->sar_sampling_time = 1; in nau8825_read_device_properties()
2679 &nau8825->key_debounce); in nau8825_read_device_properties()
2681 nau8825->key_debounce = 3; in nau8825_read_device_properties()
2683 &nau8825->jack_insert_debounce); in nau8825_read_device_properties()
2685 nau8825->jack_insert_debounce = 7; in nau8825_read_device_properties()
2687 &nau8825->jack_eject_debounce); in nau8825_read_device_properties()
2689 nau8825->jack_eject_debounce = 0; in nau8825_read_device_properties()
2690 nau8825->xtalk_enable = device_property_read_bool(dev, in nau8825_read_device_properties()
2692 nau8825->adcout_ds = device_property_read_bool(dev, "nuvoton,adcout-drive-strong"); in nau8825_read_device_properties()
2694 nau8825->mclk = devm_clk_get(dev, "mclk"); in nau8825_read_device_properties()
2695 if (PTR_ERR(nau8825->mclk) == -EPROBE_DEFER) { in nau8825_read_device_properties()
2697 } else if (PTR_ERR(nau8825->mclk) == -ENOENT) { in nau8825_read_device_properties()
2699 nau8825->mclk = NULL; in nau8825_read_device_properties()
2701 } else if (IS_ERR(nau8825->mclk)) { in nau8825_read_device_properties()
2708 static int nau8825_setup_irq(struct nau8825 *nau8825) in nau8825_setup_irq() argument
2712 ret = devm_request_threaded_irq(nau8825->dev, nau8825->irq, NULL, in nau8825_setup_irq()
2714 "nau8825", nau8825); in nau8825_setup_irq()
2717 dev_err(nau8825->dev, "Cannot request irq %d (%d)\n", in nau8825_setup_irq()
2718 nau8825->irq, ret); in nau8825_setup_irq()
2728 struct nau8825 *nau8825 = dev_get_platdata(&i2c->dev); in nau8825_i2c_probe() local
2731 if (!nau8825) { in nau8825_i2c_probe()
2732 nau8825 = devm_kzalloc(dev, sizeof(*nau8825), GFP_KERNEL); in nau8825_i2c_probe()
2733 if (!nau8825) in nau8825_i2c_probe()
2735 ret = nau8825_read_device_properties(dev, nau8825); in nau8825_i2c_probe()
2740 i2c_set_clientdata(i2c, nau8825); in nau8825_i2c_probe()
2742 nau8825->regmap = devm_regmap_init_i2c(i2c, &nau8825_regmap_config); in nau8825_i2c_probe()
2743 if (IS_ERR(nau8825->regmap)) in nau8825_i2c_probe()
2744 return PTR_ERR(nau8825->regmap); in nau8825_i2c_probe()
2745 nau8825->dev = dev; in nau8825_i2c_probe()
2746 nau8825->irq = i2c->irq; in nau8825_i2c_probe()
2750 nau8825->xtalk_state = NAU8825_XTALK_DONE; in nau8825_i2c_probe()
2751 nau8825->xtalk_protect = false; in nau8825_i2c_probe()
2752 nau8825->xtalk_baktab_initialized = false; in nau8825_i2c_probe()
2753 sema_init(&nau8825->xtalk_sem, 1); in nau8825_i2c_probe()
2754 INIT_WORK(&nau8825->xtalk_work, nau8825_xtalk_work); in nau8825_i2c_probe()
2756 nau8825_print_device_properties(nau8825); in nau8825_i2c_probe()
2758 nau8825_reset_chip(nau8825->regmap); in nau8825_i2c_probe()
2759 ret = regmap_read(nau8825->regmap, NAU8825_REG_I2C_DEVICE_ID, &value); in nau8825_i2c_probe()
2771 nau8825_init_regs(nau8825); in nau8825_i2c_probe()
2774 nau8825_setup_irq(nau8825); in nau8825_i2c_probe()