Lines Matching refs:nau8825

48 static int nau8825_configure_sysclk(struct nau8825 *nau8825,
256 static int nau8825_sema_acquire(struct nau8825 *nau8825, long timeout) in nau8825_sema_acquire() argument
261 ret = down_timeout(&nau8825->xtalk_sem, timeout); in nau8825_sema_acquire()
263 dev_warn(nau8825->dev, "Acquire semaphore timeout\n"); in nau8825_sema_acquire()
265 ret = down_trylock(&nau8825->xtalk_sem); in nau8825_sema_acquire()
267 dev_warn(nau8825->dev, "Acquire semaphore fail\n"); in nau8825_sema_acquire()
280 static inline void nau8825_sema_release(struct nau8825 *nau8825) in nau8825_sema_release() argument
282 up(&nau8825->xtalk_sem); in nau8825_sema_release()
292 static inline void nau8825_sema_reset(struct nau8825 *nau8825) in nau8825_sema_reset() argument
294 nau8825->xtalk_sem.count = 1; in nau8825_sema_reset()
310 static void nau8825_hpvol_ramp(struct nau8825 *nau8825, in nau8825_hpvol_ramp() argument
335 regmap_update_bits(nau8825->regmap, NAU8825_REG_HSVOL_CTRL, in nau8825_hpvol_ramp()
344 regmap_update_bits(nau8825->regmap, NAU8825_REG_HSVOL_CTRL, in nau8825_hpvol_ramp()
452 static void nau8825_xtalk_backup(struct nau8825 *nau8825) in nau8825_xtalk_backup() argument
456 if (nau8825->xtalk_baktab_initialized) in nau8825_xtalk_backup()
461 regmap_read(nau8825->regmap, nau8825_xtalk_baktab[i].reg, in nau8825_xtalk_backup()
464 nau8825->xtalk_baktab_initialized = true; in nau8825_xtalk_backup()
467 static void nau8825_xtalk_restore(struct nau8825 *nau8825, bool cause_cancel) in nau8825_xtalk_restore() argument
471 if (!nau8825->xtalk_baktab_initialized) in nau8825_xtalk_restore()
485 nau8825_hpvol_ramp(nau8825, 0, volume, 3); in nau8825_xtalk_restore()
488 regmap_write(nau8825->regmap, nau8825_xtalk_baktab[i].reg, in nau8825_xtalk_restore()
492 nau8825->xtalk_baktab_initialized = false; in nau8825_xtalk_restore()
495 static void nau8825_xtalk_prepare_dac(struct nau8825 *nau8825) in nau8825_xtalk_prepare_dac() argument
498 regmap_update_bits(nau8825->regmap, NAU8825_REG_ENA_CTRL, in nau8825_xtalk_prepare_dac()
507 regmap_update_bits(nau8825->regmap, NAU8825_REG_CHARGE_PUMP, in nau8825_xtalk_prepare_dac()
511 regmap_update_bits(nau8825->regmap, NAU8825_REG_RDAC, in nau8825_xtalk_prepare_dac()
516 regmap_update_bits(nau8825->regmap, NAU8825_REG_POWER_UP_CONTROL, in nau8825_xtalk_prepare_dac()
521 regmap_update_bits(nau8825->regmap, NAU8825_REG_POWER_UP_CONTROL, in nau8825_xtalk_prepare_dac()
525 regmap_update_bits(nau8825->regmap, NAU8825_REG_HSD_CTRL, in nau8825_xtalk_prepare_dac()
528 regmap_update_bits(nau8825->regmap, NAU8825_REG_BOOST, in nau8825_xtalk_prepare_dac()
531 regmap_update_bits(nau8825->regmap, NAU8825_REG_CLASSG_CTRL, in nau8825_xtalk_prepare_dac()
536 static void nau8825_xtalk_prepare_adc(struct nau8825 *nau8825) in nau8825_xtalk_prepare_adc() argument
539 regmap_update_bits(nau8825->regmap, NAU8825_REG_ANALOG_ADC_2, in nau8825_xtalk_prepare_adc()
544 static void nau8825_xtalk_clock(struct nau8825 *nau8825) in nau8825_xtalk_clock() argument
547 regmap_write(nau8825->regmap, NAU8825_REG_FLL1, 0x0); in nau8825_xtalk_clock()
548 regmap_write(nau8825->regmap, NAU8825_REG_FLL2, 0x3126); in nau8825_xtalk_clock()
549 regmap_write(nau8825->regmap, NAU8825_REG_FLL3, 0x0008); in nau8825_xtalk_clock()
550 regmap_write(nau8825->regmap, NAU8825_REG_FLL4, 0x0010); in nau8825_xtalk_clock()
551 regmap_write(nau8825->regmap, NAU8825_REG_FLL5, 0x0); in nau8825_xtalk_clock()
552 regmap_write(nau8825->regmap, NAU8825_REG_FLL6, 0x6000); in nau8825_xtalk_clock()
554 regmap_update_bits(nau8825->regmap, NAU8825_REG_CLK_DIVIDER, in nau8825_xtalk_clock()
556 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL6, NAU8825_DCO_EN, in nau8825_xtalk_clock()
561 regmap_update_bits(nau8825->regmap, NAU8825_REG_CLK_DIVIDER, in nau8825_xtalk_clock()
563 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL1, in nau8825_xtalk_clock()
567 static void nau8825_xtalk_prepare(struct nau8825 *nau8825) in nau8825_xtalk_prepare() argument
572 nau8825_xtalk_backup(nau8825); in nau8825_xtalk_prepare()
574 regmap_update_bits(nau8825->regmap, NAU8825_REG_I2S_PCM_CTRL2, in nau8825_xtalk_prepare()
585 nau8825_hpvol_ramp(nau8825, volume, 0, 3); in nau8825_xtalk_prepare()
587 nau8825_xtalk_clock(nau8825); in nau8825_xtalk_prepare()
588 nau8825_xtalk_prepare_dac(nau8825); in nau8825_xtalk_prepare()
589 nau8825_xtalk_prepare_adc(nau8825); in nau8825_xtalk_prepare()
591 regmap_update_bits(nau8825->regmap, NAU8825_REG_DACL_CTRL, in nau8825_xtalk_prepare()
594 regmap_update_bits(nau8825->regmap, NAU8825_REG_DACR_CTRL, in nau8825_xtalk_prepare()
600 regmap_update_bits(nau8825->regmap, NAU8825_REG_IMM_MODE_CTRL, in nau8825_xtalk_prepare()
606 regmap_update_bits(nau8825->regmap, in nau8825_xtalk_prepare()
609 regmap_update_bits(nau8825->regmap, NAU8825_REG_CHARGE_PUMP, in nau8825_xtalk_prepare()
613 static void nau8825_xtalk_clean_dac(struct nau8825 *nau8825) in nau8825_xtalk_clean_dac() argument
616 regmap_update_bits(nau8825->regmap, NAU8825_REG_BOOST, in nau8825_xtalk_clean_dac()
619 regmap_update_bits(nau8825->regmap, NAU8825_REG_HSD_CTRL, in nau8825_xtalk_clean_dac()
623 regmap_update_bits(nau8825->regmap, NAU8825_REG_CHARGE_PUMP, in nau8825_xtalk_clean_dac()
627 regmap_update_bits(nau8825->regmap, NAU8825_REG_BIAS_ADJ, in nau8825_xtalk_clean_dac()
631 regmap_update_bits(nau8825->regmap, NAU8825_REG_POWER_UP_CONTROL, in nau8825_xtalk_clean_dac()
633 regmap_update_bits(nau8825->regmap, NAU8825_REG_POWER_UP_CONTROL, in nau8825_xtalk_clean_dac()
637 regmap_update_bits(nau8825->regmap, NAU8825_REG_RDAC, in nau8825_xtalk_clean_dac()
640 regmap_update_bits(nau8825->regmap, NAU8825_REG_CHARGE_PUMP, in nau8825_xtalk_clean_dac()
643 regmap_update_bits(nau8825->regmap, NAU8825_REG_ENA_CTRL, in nau8825_xtalk_clean_dac()
646 if (!nau8825->irq) in nau8825_xtalk_clean_dac()
647 regmap_update_bits(nau8825->regmap, in nau8825_xtalk_clean_dac()
651 static void nau8825_xtalk_clean_adc(struct nau8825 *nau8825) in nau8825_xtalk_clean_adc() argument
654 regmap_update_bits(nau8825->regmap, NAU8825_REG_ANALOG_ADC_2, in nau8825_xtalk_clean_adc()
658 static void nau8825_xtalk_clean(struct nau8825 *nau8825, bool cause_cancel) in nau8825_xtalk_clean() argument
661 nau8825_configure_sysclk(nau8825, NAU8825_CLK_INTERNAL, 0); in nau8825_xtalk_clean()
662 nau8825_xtalk_clean_dac(nau8825); in nau8825_xtalk_clean()
663 nau8825_xtalk_clean_adc(nau8825); in nau8825_xtalk_clean()
665 regmap_write(nau8825->regmap, NAU8825_REG_IMM_MODE_CTRL, 0); in nau8825_xtalk_clean()
667 regmap_update_bits(nau8825->regmap, NAU8825_REG_INTERRUPT_MASK, in nau8825_xtalk_clean()
670 regmap_update_bits(nau8825->regmap, NAU8825_REG_I2S_PCM_CTRL2, in nau8825_xtalk_clean()
674 nau8825_xtalk_restore(nau8825, cause_cancel); in nau8825_xtalk_clean()
677 static void nau8825_xtalk_imm_start(struct nau8825 *nau8825, int vol) in nau8825_xtalk_imm_start() argument
680 regmap_update_bits(nau8825->regmap, NAU8825_REG_ADC_DGAIN_CTRL, in nau8825_xtalk_imm_start()
685 regmap_update_bits(nau8825->regmap, NAU8825_REG_BIAS_ADJ, in nau8825_xtalk_imm_start()
688 switch (nau8825->xtalk_state) { in nau8825_xtalk_imm_start()
691 regmap_update_bits(nau8825->regmap, NAU8825_REG_BIAS_ADJ, in nau8825_xtalk_imm_start()
697 regmap_update_bits(nau8825->regmap, NAU8825_REG_BIAS_ADJ, in nau8825_xtalk_imm_start()
706 regmap_update_bits(nau8825->regmap, NAU8825_REG_IMM_MODE_CTRL, in nau8825_xtalk_imm_start()
710 static void nau8825_xtalk_imm_stop(struct nau8825 *nau8825) in nau8825_xtalk_imm_stop() argument
713 regmap_update_bits(nau8825->regmap, in nau8825_xtalk_imm_stop()
737 static void nau8825_xtalk_measure(struct nau8825 *nau8825) in nau8825_xtalk_measure() argument
741 switch (nau8825->xtalk_state) { in nau8825_xtalk_measure()
746 nau8825_xtalk_prepare(nau8825); in nau8825_xtalk_measure()
749 nau8825->xtalk_state = NAU8825_XTALK_HPR_R2L; in nau8825_xtalk_measure()
750 nau8825_xtalk_imm_start(nau8825, 0x00d2); in nau8825_xtalk_measure()
756 regmap_read(nau8825->regmap, NAU8825_REG_IMM_RMS_L, in nau8825_xtalk_measure()
757 &nau8825->imp_rms[NAU8825_XTALK_HPR_R2L]); in nau8825_xtalk_measure()
758 dev_dbg(nau8825->dev, "HPR_R2L imm: %x\n", in nau8825_xtalk_measure()
759 nau8825->imp_rms[NAU8825_XTALK_HPR_R2L]); in nau8825_xtalk_measure()
761 nau8825_xtalk_imm_stop(nau8825); in nau8825_xtalk_measure()
763 nau8825->xtalk_state = NAU8825_XTALK_HPL_R2L; in nau8825_xtalk_measure()
764 nau8825_xtalk_imm_start(nau8825, 0x00ff); in nau8825_xtalk_measure()
773 regmap_read(nau8825->regmap, NAU8825_REG_IMM_RMS_L, in nau8825_xtalk_measure()
774 &nau8825->imp_rms[NAU8825_XTALK_HPL_R2L]); in nau8825_xtalk_measure()
775 dev_dbg(nau8825->dev, "HPL_R2L imm: %x\n", in nau8825_xtalk_measure()
776 nau8825->imp_rms[NAU8825_XTALK_HPL_R2L]); in nau8825_xtalk_measure()
777 nau8825_xtalk_imm_stop(nau8825); in nau8825_xtalk_measure()
779 nau8825->xtalk_state = NAU8825_XTALK_IMM; in nau8825_xtalk_measure()
788 nau8825->imp_rms[NAU8825_XTALK_HPR_R2L], in nau8825_xtalk_measure()
789 nau8825->imp_rms[NAU8825_XTALK_HPL_R2L]); in nau8825_xtalk_measure()
790 dev_dbg(nau8825->dev, "cross talk sidetone: %x\n", sidetone); in nau8825_xtalk_measure()
791 regmap_write(nau8825->regmap, NAU8825_REG_DAC_DGAIN_CTRL, in nau8825_xtalk_measure()
793 nau8825_xtalk_clean(nau8825, false); in nau8825_xtalk_measure()
794 nau8825->xtalk_state = NAU8825_XTALK_DONE; in nau8825_xtalk_measure()
803 struct nau8825 *nau8825 = container_of( in nau8825_xtalk_work() local
804 work, struct nau8825, xtalk_work); in nau8825_xtalk_work()
806 nau8825_xtalk_measure(nau8825); in nau8825_xtalk_work()
810 if (nau8825->xtalk_state == NAU8825_XTALK_IMM) in nau8825_xtalk_work()
811 nau8825_xtalk_measure(nau8825); in nau8825_xtalk_work()
819 if (nau8825->xtalk_state == NAU8825_XTALK_DONE) { in nau8825_xtalk_work()
820 snd_soc_jack_report(nau8825->jack, nau8825->xtalk_event, in nau8825_xtalk_work()
821 nau8825->xtalk_event_mask); in nau8825_xtalk_work()
822 nau8825_sema_release(nau8825); in nau8825_xtalk_work()
823 nau8825->xtalk_protect = false; in nau8825_xtalk_work()
827 static void nau8825_xtalk_cancel(struct nau8825 *nau8825) in nau8825_xtalk_cancel() argument
833 if (nau8825->xtalk_enable && nau8825->xtalk_state != in nau8825_xtalk_cancel()
835 cancel_work_sync(&nau8825->xtalk_work); in nau8825_xtalk_cancel()
836 nau8825_xtalk_clean(nau8825, true); in nau8825_xtalk_cancel()
839 nau8825_sema_reset(nau8825); in nau8825_xtalk_cancel()
840 nau8825->xtalk_state = NAU8825_XTALK_DONE; in nau8825_xtalk_cancel()
841 nau8825->xtalk_protect = false; in nau8825_xtalk_cancel()
916 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_adc_event() local
921 regmap_update_bits(nau8825->regmap, NAU8825_REG_ENA_CTRL, in nau8825_adc_event()
925 if (!nau8825->irq) in nau8825_adc_event()
926 regmap_update_bits(nau8825->regmap, in nau8825_adc_event()
940 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_pump_event() local
946 regmap_update_bits(nau8825->regmap, NAU8825_REG_CHARGE_PUMP, in nau8825_pump_event()
950 regmap_update_bits(nau8825->regmap, NAU8825_REG_CHARGE_PUMP, in nau8825_pump_event()
964 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_output_dac_event() local
969 regmap_update_bits(nau8825->regmap, NAU8825_REG_BIAS_ADJ, in nau8825_output_dac_event()
973 regmap_update_bits(nau8825->regmap, NAU8825_REG_BIAS_ADJ, in nau8825_output_dac_event()
1218 static int nau8825_clock_check(struct nau8825 *nau8825, in nau8825_clock_check() argument
1234 dev_err(nau8825->dev, "exceed the maximum frequency of CLK_ADC or CLK_DAC\n"); in nau8825_clock_check()
1246 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_hw_params() local
1249 nau8825_sema_acquire(nau8825, 3 * HZ); in nau8825_hw_params()
1258 regmap_read(nau8825->regmap, NAU8825_REG_DAC_CTRL1, &osr); in nau8825_hw_params()
1260 if (nau8825_clock_check(nau8825, substream->stream, in nau8825_hw_params()
1262 nau8825_sema_release(nau8825); in nau8825_hw_params()
1265 regmap_update_bits(nau8825->regmap, NAU8825_REG_CLK_DIVIDER, in nau8825_hw_params()
1269 regmap_read(nau8825->regmap, NAU8825_REG_ADC_RATE, &osr); in nau8825_hw_params()
1271 if (nau8825_clock_check(nau8825, substream->stream, in nau8825_hw_params()
1273 nau8825_sema_release(nau8825); in nau8825_hw_params()
1276 regmap_update_bits(nau8825->regmap, NAU8825_REG_CLK_DIVIDER, in nau8825_hw_params()
1282 regmap_read(nau8825->regmap, NAU8825_REG_I2S_PCM_CTRL2, &ctrl_val); in nau8825_hw_params()
1293 nau8825_sema_release(nau8825); in nau8825_hw_params()
1296 regmap_update_bits(nau8825->regmap, NAU8825_REG_I2S_PCM_CTRL2, in nau8825_hw_params()
1315 nau8825_sema_release(nau8825); in nau8825_hw_params()
1319 regmap_update_bits(nau8825->regmap, NAU8825_REG_I2S_PCM_CTRL1, in nau8825_hw_params()
1323 nau8825_sema_release(nau8825); in nau8825_hw_params()
1331 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_set_dai_fmt() local
1375 nau8825_sema_acquire(nau8825, 3 * HZ); in nau8825_set_dai_fmt()
1377 regmap_update_bits(nau8825->regmap, NAU8825_REG_I2S_PCM_CTRL1, in nau8825_set_dai_fmt()
1381 regmap_update_bits(nau8825->regmap, NAU8825_REG_I2S_PCM_CTRL2, in nau8825_set_dai_fmt()
1385 nau8825_sema_release(nau8825); in nau8825_set_dai_fmt()
1431 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_enable_jack_detect() local
1432 struct regmap *regmap = nau8825->regmap; in nau8825_enable_jack_detect()
1434 nau8825->jack = jack; in nau8825_enable_jack_detect()
1491 static void nau8825_eject_jack(struct nau8825 *nau8825) in nau8825_eject_jack() argument
1493 struct snd_soc_dapm_context *dapm = nau8825->dapm; in nau8825_eject_jack()
1494 struct regmap *regmap = nau8825->regmap; in nau8825_eject_jack()
1497 nau8825_xtalk_cancel(nau8825); in nau8825_eject_jack()
1531 nau8825_configure_sysclk(nau8825, NAU8825_CLK_DIS, 0); in nau8825_eject_jack()
1535 static void nau8825_setup_auto_irq(struct nau8825 *nau8825) in nau8825_setup_auto_irq() argument
1537 struct regmap *regmap = nau8825->regmap; in nau8825_setup_auto_irq()
1546 nau8825_configure_sysclk(nau8825, NAU8825_CLK_INTERNAL, 0); in nau8825_setup_auto_irq()
1594 static int nau8825_jack_insert(struct nau8825 *nau8825) in nau8825_jack_insert() argument
1596 struct regmap *regmap = nau8825->regmap; in nau8825_jack_insert()
1597 struct snd_soc_dapm_context *dapm = nau8825->dapm; in nau8825_jack_insert()
1605 nau8825->high_imped = true; in nau8825_jack_insert()
1607 nau8825->high_imped = false; in nau8825_jack_insert()
1615 dev_dbg(nau8825->dev, "OMTP (micgnd1) mic connected\n"); in nau8825_jack_insert()
1635 dev_dbg(nau8825->dev, "CTIA (micgnd2) mic connected\n"); in nau8825_jack_insert()
1656 dev_err(nau8825->dev, "detection error; disable mic function\n"); in nau8825_jack_insert()
1673 struct nau8825 *nau8825 = (struct nau8825 *)data; in nau8825_interrupt() local
1674 struct regmap *regmap = nau8825->regmap; in nau8825_interrupt()
1678 dev_err(nau8825->dev, "failed to read irq status\n"); in nau8825_interrupt()
1685 nau8825_eject_jack(nau8825); in nau8825_interrupt()
1697 nau8825->button_pressed = nau8825_button_decode( in nau8825_interrupt()
1700 event |= nau8825->button_pressed; in nau8825_interrupt()
1708 event |= nau8825_jack_insert(nau8825); in nau8825_interrupt()
1709 if (nau8825->xtalk_enable && !nau8825->high_imped) { in nau8825_interrupt()
1713 if (!nau8825->xtalk_protect) { in nau8825_interrupt()
1721 nau8825->xtalk_protect = true; in nau8825_interrupt()
1722 ret = nau8825_sema_acquire(nau8825, 0); in nau8825_interrupt()
1724 nau8825->xtalk_protect = false; in nau8825_interrupt()
1727 if (nau8825->xtalk_protect) { in nau8825_interrupt()
1728 nau8825->xtalk_state = in nau8825_interrupt()
1730 schedule_work(&nau8825->xtalk_work); in nau8825_interrupt()
1737 if (nau8825->xtalk_protect) { in nau8825_interrupt()
1738 nau8825_sema_release(nau8825); in nau8825_interrupt()
1739 nau8825->xtalk_protect = false; in nau8825_interrupt()
1743 dev_warn(nau8825->dev, "Headset completion IRQ fired but no headset connected\n"); in nau8825_interrupt()
1744 nau8825_eject_jack(nau8825); in nau8825_interrupt()
1753 if (nau8825->xtalk_state == NAU8825_XTALK_PREPARE) { in nau8825_interrupt()
1754 nau8825->xtalk_event = event; in nau8825_interrupt()
1755 nau8825->xtalk_event_mask = event_mask; in nau8825_interrupt()
1759 if (nau8825->xtalk_enable && nau8825->xtalk_protect) in nau8825_interrupt()
1760 schedule_work(&nau8825->xtalk_work); in nau8825_interrupt()
1780 nau8825_setup_auto_irq(nau8825); in nau8825_interrupt()
1794 if (event_mask && nau8825->xtalk_state == NAU8825_XTALK_DONE) in nau8825_interrupt()
1795 snd_soc_jack_report(nau8825->jack, event, event_mask); in nau8825_interrupt()
1800 static void nau8825_setup_buttons(struct nau8825 *nau8825) in nau8825_setup_buttons() argument
1802 struct regmap *regmap = nau8825->regmap; in nau8825_setup_buttons()
1806 nau8825->sar_voltage << NAU8825_SAR_TRACKING_GAIN_SFT); in nau8825_setup_buttons()
1809 nau8825->sar_compare_time << NAU8825_SAR_COMPARE_TIME_SFT); in nau8825_setup_buttons()
1812 nau8825->sar_sampling_time << NAU8825_SAR_SAMPLING_TIME_SFT); in nau8825_setup_buttons()
1816 (nau8825->sar_threshold_num - 1) << NAU8825_KEYDET_LEVELS_NR_SFT); in nau8825_setup_buttons()
1819 nau8825->sar_hysteresis << NAU8825_KEYDET_HYSTERESIS_SFT); in nau8825_setup_buttons()
1822 nau8825->key_debounce << NAU8825_KEYDET_SHORTKEY_DEBOUNCE_SFT); in nau8825_setup_buttons()
1825 (nau8825->sar_threshold[0] << 8) | nau8825->sar_threshold[1]); in nau8825_setup_buttons()
1827 (nau8825->sar_threshold[2] << 8) | nau8825->sar_threshold[3]); in nau8825_setup_buttons()
1829 (nau8825->sar_threshold[4] << 8) | nau8825->sar_threshold[5]); in nau8825_setup_buttons()
1831 (nau8825->sar_threshold[6] << 8) | nau8825->sar_threshold[7]); in nau8825_setup_buttons()
1839 static void nau8825_init_regs(struct nau8825 *nau8825) in nau8825_init_regs() argument
1841 struct regmap *regmap = nau8825->regmap; in nau8825_init_regs()
1846 regmap_update_bits(nau8825->regmap, NAU8825_REG_BIAS_ADJ, in nau8825_init_regs()
1848 regmap_update_bits(nau8825->regmap, NAU8825_REG_BOOST, in nau8825_init_regs()
1854 nau8825->vref_impedance << NAU8825_BIAS_VMID_SEL_SFT); in nau8825_init_regs()
1864 nau8825->jkdet_enable ? 0 : NAU8825_JKDET_OUTPUT_EN); in nau8825_init_regs()
1867 nau8825->jkdet_pull_enable ? 0 : NAU8825_JKDET_PULL_EN); in nau8825_init_regs()
1870 nau8825->jkdet_pull_up ? NAU8825_JKDET_PULL_UP : 0); in nau8825_init_regs()
1874 nau8825->jkdet_polarity ? 0 : NAU8825_JACK_POLARITY); in nau8825_init_regs()
1878 nau8825->jack_insert_debounce << NAU8825_JACK_INSERT_DEBOUNCE_SFT); in nau8825_init_regs()
1881 nau8825->jack_eject_debounce << NAU8825_JACK_EJECT_DEBOUNCE_SFT); in nau8825_init_regs()
1891 NAU8825_MICBIAS_VOLTAGE_MASK, nau8825->micbias_voltage); in nau8825_init_regs()
1893 if (nau8825->sar_threshold_num) in nau8825_init_regs()
1894 nau8825_setup_buttons(nau8825); in nau8825_init_regs()
1912 regmap_update_bits(nau8825->regmap, NAU8825_REG_BIAS_ADJ, in nau8825_init_regs()
1934 regmap_update_bits(nau8825->regmap, NAU8825_REG_DACL_CTRL, in nau8825_init_regs()
1936 regmap_update_bits(nau8825->regmap, NAU8825_REG_DACR_CTRL, in nau8825_init_regs()
1959 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_component_probe() local
1962 nau8825->dapm = dapm; in nau8825_component_probe()
1969 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_component_remove() local
1972 nau8825_xtalk_cancel(nau8825); in nau8825_component_remove()
2041 static void nau8825_fll_apply(struct nau8825 *nau8825, in nau8825_fll_apply() argument
2044 regmap_update_bits(nau8825->regmap, NAU8825_REG_CLK_DIVIDER, in nau8825_fll_apply()
2048 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL1, in nau8825_fll_apply()
2052 regmap_write(nau8825->regmap, NAU8825_REG_FLL2, fll_param->fll_frac); in nau8825_fll_apply()
2054 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL3, in nau8825_fll_apply()
2057 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL4, in nau8825_fll_apply()
2061 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL5, in nau8825_fll_apply()
2064 regmap_update_bits(nau8825->regmap, in nau8825_fll_apply()
2068 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL5, in nau8825_fll_apply()
2073 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL6, in nau8825_fll_apply()
2078 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL5, in nau8825_fll_apply()
2081 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL6, in nau8825_fll_apply()
2090 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_set_pll() local
2104 nau8825_fll_apply(nau8825, &fll_param); in nau8825_set_pll()
2106 regmap_update_bits(nau8825->regmap, NAU8825_REG_CLK_DIVIDER, in nau8825_set_pll()
2111 static int nau8825_mclk_prepare(struct nau8825 *nau8825, unsigned int freq) in nau8825_mclk_prepare() argument
2115 nau8825->mclk = devm_clk_get(nau8825->dev, "mclk"); in nau8825_mclk_prepare()
2116 if (IS_ERR(nau8825->mclk)) { in nau8825_mclk_prepare()
2117 dev_info(nau8825->dev, "No 'mclk' clock found, assume MCLK is managed externally"); in nau8825_mclk_prepare()
2121 if (!nau8825->mclk_freq) { in nau8825_mclk_prepare()
2122 ret = clk_prepare_enable(nau8825->mclk); in nau8825_mclk_prepare()
2124 dev_err(nau8825->dev, "Unable to prepare codec mclk\n"); in nau8825_mclk_prepare()
2129 if (nau8825->mclk_freq != freq) { in nau8825_mclk_prepare()
2130 freq = clk_round_rate(nau8825->mclk, freq); in nau8825_mclk_prepare()
2131 ret = clk_set_rate(nau8825->mclk, freq); in nau8825_mclk_prepare()
2133 dev_err(nau8825->dev, "Unable to set mclk rate\n"); in nau8825_mclk_prepare()
2136 nau8825->mclk_freq = freq; in nau8825_mclk_prepare()
2153 static int nau8825_configure_sysclk(struct nau8825 *nau8825, int clk_id, in nau8825_configure_sysclk() argument
2156 struct regmap *regmap = nau8825->regmap; in nau8825_configure_sysclk()
2163 if (nau8825->mclk_freq) { in nau8825_configure_sysclk()
2164 clk_disable_unprepare(nau8825->mclk); in nau8825_configure_sysclk()
2165 nau8825->mclk_freq = 0; in nau8825_configure_sysclk()
2175 nau8825_sema_acquire(nau8825, 3 * HZ); in nau8825_configure_sysclk()
2181 nau8825_sema_release(nau8825); in nau8825_configure_sysclk()
2183 ret = nau8825_mclk_prepare(nau8825, freq); in nau8825_configure_sysclk()
2189 if (nau8825_is_jack_inserted(nau8825->regmap)) { in nau8825_configure_sysclk()
2209 dev_warn(nau8825->dev, "Disable clock for power saving when no headset connected\n"); in nau8825_configure_sysclk()
2211 if (nau8825->mclk_freq) { in nau8825_configure_sysclk()
2212 clk_disable_unprepare(nau8825->mclk); in nau8825_configure_sysclk()
2213 nau8825->mclk_freq = 0; in nau8825_configure_sysclk()
2223 nau8825_sema_acquire(nau8825, 3 * HZ); in nau8825_configure_sysclk()
2232 nau8825_sema_release(nau8825); in nau8825_configure_sysclk()
2234 ret = nau8825_mclk_prepare(nau8825, freq); in nau8825_configure_sysclk()
2245 nau8825_sema_acquire(nau8825, 3 * HZ); in nau8825_configure_sysclk()
2257 nau8825_sema_release(nau8825); in nau8825_configure_sysclk()
2259 if (nau8825->mclk_freq) { in nau8825_configure_sysclk()
2260 clk_disable_unprepare(nau8825->mclk); in nau8825_configure_sysclk()
2261 nau8825->mclk_freq = 0; in nau8825_configure_sysclk()
2271 nau8825_sema_acquire(nau8825, 3 * HZ); in nau8825_configure_sysclk()
2283 nau8825_sema_release(nau8825); in nau8825_configure_sysclk()
2285 if (nau8825->mclk_freq) { in nau8825_configure_sysclk()
2286 clk_disable_unprepare(nau8825->mclk); in nau8825_configure_sysclk()
2287 nau8825->mclk_freq = 0; in nau8825_configure_sysclk()
2292 dev_err(nau8825->dev, "Invalid clock id (%d)\n", clk_id); in nau8825_configure_sysclk()
2296 dev_dbg(nau8825->dev, "Sysclk is %dHz and clock id is %d\n", freq, in nau8825_configure_sysclk()
2304 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_set_sysclk() local
2306 return nau8825_configure_sysclk(nau8825, clk_id, freq); in nau8825_set_sysclk()
2309 static int nau8825_resume_setup(struct nau8825 *nau8825) in nau8825_resume_setup() argument
2311 struct regmap *regmap = nau8825->regmap; in nau8825_resume_setup()
2314 nau8825_configure_sysclk(nau8825, NAU8825_CLK_DIS, 0); in nau8825_resume_setup()
2337 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_set_bias_level() local
2349 if (nau8825->mclk_freq) { in nau8825_set_bias_level()
2350 ret = clk_prepare_enable(nau8825->mclk); in nau8825_set_bias_level()
2352 dev_err(nau8825->dev, "Unable to prepare component mclk\n"); in nau8825_set_bias_level()
2357 nau8825_resume_setup(nau8825); in nau8825_set_bias_level()
2364 regmap_update_bits(nau8825->regmap, NAU8825_REG_MIC_BIAS, in nau8825_set_bias_level()
2367 regmap_update_bits(nau8825->regmap, in nau8825_set_bias_level()
2370 nau8825_xtalk_cancel(nau8825); in nau8825_set_bias_level()
2374 regmap_write(nau8825->regmap, in nau8825_set_bias_level()
2377 regmap_update_bits(nau8825->regmap, NAU8825_REG_ENA_CTRL, in nau8825_set_bias_level()
2379 if (nau8825->mclk_freq) in nau8825_set_bias_level()
2380 clk_disable_unprepare(nau8825->mclk); in nau8825_set_bias_level()
2388 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_suspend() local
2390 disable_irq(nau8825->irq); in nau8825_suspend()
2393 snd_soc_dapm_disable_pin(nau8825->dapm, "SAR"); in nau8825_suspend()
2394 snd_soc_dapm_disable_pin(nau8825->dapm, "MICBIAS"); in nau8825_suspend()
2395 snd_soc_dapm_sync(nau8825->dapm); in nau8825_suspend()
2396 regcache_cache_only(nau8825->regmap, true); in nau8825_suspend()
2397 regcache_mark_dirty(nau8825->regmap); in nau8825_suspend()
2404 struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); in nau8825_resume() local
2407 regcache_cache_only(nau8825->regmap, false); in nau8825_resume()
2408 regcache_sync(nau8825->regmap); in nau8825_resume()
2409 nau8825->xtalk_protect = true; in nau8825_resume()
2410 ret = nau8825_sema_acquire(nau8825, 0); in nau8825_resume()
2412 nau8825->xtalk_protect = false; in nau8825_resume()
2413 enable_irq(nau8825->irq); in nau8825_resume()
2445 static void nau8825_print_device_properties(struct nau8825 *nau8825) in nau8825_print_device_properties() argument
2448 struct device *dev = nau8825->dev; in nau8825_print_device_properties()
2450 dev_dbg(dev, "jkdet-enable: %d\n", nau8825->jkdet_enable); in nau8825_print_device_properties()
2451 dev_dbg(dev, "jkdet-pull-enable: %d\n", nau8825->jkdet_pull_enable); in nau8825_print_device_properties()
2452 dev_dbg(dev, "jkdet-pull-up: %d\n", nau8825->jkdet_pull_up); in nau8825_print_device_properties()
2453 dev_dbg(dev, "jkdet-polarity: %d\n", nau8825->jkdet_polarity); in nau8825_print_device_properties()
2454 dev_dbg(dev, "micbias-voltage: %d\n", nau8825->micbias_voltage); in nau8825_print_device_properties()
2455 dev_dbg(dev, "vref-impedance: %d\n", nau8825->vref_impedance); in nau8825_print_device_properties()
2457 dev_dbg(dev, "sar-threshold-num: %d\n", nau8825->sar_threshold_num); in nau8825_print_device_properties()
2458 for (i = 0; i < nau8825->sar_threshold_num; i++) in nau8825_print_device_properties()
2460 nau8825->sar_threshold[i]); in nau8825_print_device_properties()
2462 dev_dbg(dev, "sar-hysteresis: %d\n", nau8825->sar_hysteresis); in nau8825_print_device_properties()
2463 dev_dbg(dev, "sar-voltage: %d\n", nau8825->sar_voltage); in nau8825_print_device_properties()
2464 dev_dbg(dev, "sar-compare-time: %d\n", nau8825->sar_compare_time); in nau8825_print_device_properties()
2465 dev_dbg(dev, "sar-sampling-time: %d\n", nau8825->sar_sampling_time); in nau8825_print_device_properties()
2466 dev_dbg(dev, "short-key-debounce: %d\n", nau8825->key_debounce); in nau8825_print_device_properties()
2468 nau8825->jack_insert_debounce); in nau8825_print_device_properties()
2470 nau8825->jack_eject_debounce); in nau8825_print_device_properties()
2472 nau8825->xtalk_enable); in nau8825_print_device_properties()
2476 struct nau8825 *nau8825) { in nau8825_read_device_properties() argument
2479 nau8825->jkdet_enable = device_property_read_bool(dev, in nau8825_read_device_properties()
2481 nau8825->jkdet_pull_enable = device_property_read_bool(dev, in nau8825_read_device_properties()
2483 nau8825->jkdet_pull_up = device_property_read_bool(dev, in nau8825_read_device_properties()
2486 &nau8825->jkdet_polarity); in nau8825_read_device_properties()
2488 nau8825->jkdet_polarity = 1; in nau8825_read_device_properties()
2490 &nau8825->micbias_voltage); in nau8825_read_device_properties()
2492 nau8825->micbias_voltage = 6; in nau8825_read_device_properties()
2494 &nau8825->vref_impedance); in nau8825_read_device_properties()
2496 nau8825->vref_impedance = 2; in nau8825_read_device_properties()
2498 &nau8825->sar_threshold_num); in nau8825_read_device_properties()
2500 nau8825->sar_threshold_num = 4; in nau8825_read_device_properties()
2502 nau8825->sar_threshold, nau8825->sar_threshold_num); in nau8825_read_device_properties()
2504 nau8825->sar_threshold[0] = 0x08; in nau8825_read_device_properties()
2505 nau8825->sar_threshold[1] = 0x12; in nau8825_read_device_properties()
2506 nau8825->sar_threshold[2] = 0x26; in nau8825_read_device_properties()
2507 nau8825->sar_threshold[3] = 0x73; in nau8825_read_device_properties()
2510 &nau8825->sar_hysteresis); in nau8825_read_device_properties()
2512 nau8825->sar_hysteresis = 0; in nau8825_read_device_properties()
2514 &nau8825->sar_voltage); in nau8825_read_device_properties()
2516 nau8825->sar_voltage = 6; in nau8825_read_device_properties()
2518 &nau8825->sar_compare_time); in nau8825_read_device_properties()
2520 nau8825->sar_compare_time = 1; in nau8825_read_device_properties()
2522 &nau8825->sar_sampling_time); in nau8825_read_device_properties()
2524 nau8825->sar_sampling_time = 1; in nau8825_read_device_properties()
2526 &nau8825->key_debounce); in nau8825_read_device_properties()
2528 nau8825->key_debounce = 3; in nau8825_read_device_properties()
2530 &nau8825->jack_insert_debounce); in nau8825_read_device_properties()
2532 nau8825->jack_insert_debounce = 7; in nau8825_read_device_properties()
2534 &nau8825->jack_eject_debounce); in nau8825_read_device_properties()
2536 nau8825->jack_eject_debounce = 0; in nau8825_read_device_properties()
2537 nau8825->xtalk_enable = device_property_read_bool(dev, in nau8825_read_device_properties()
2540 nau8825->mclk = devm_clk_get(dev, "mclk"); in nau8825_read_device_properties()
2541 if (PTR_ERR(nau8825->mclk) == -EPROBE_DEFER) { in nau8825_read_device_properties()
2543 } else if (PTR_ERR(nau8825->mclk) == -ENOENT) { in nau8825_read_device_properties()
2545 nau8825->mclk = NULL; in nau8825_read_device_properties()
2547 } else if (IS_ERR(nau8825->mclk)) { in nau8825_read_device_properties()
2554 static int nau8825_setup_irq(struct nau8825 *nau8825) in nau8825_setup_irq() argument
2558 ret = devm_request_threaded_irq(nau8825->dev, nau8825->irq, NULL, in nau8825_setup_irq()
2560 "nau8825", nau8825); in nau8825_setup_irq()
2563 dev_err(nau8825->dev, "Cannot request irq %d (%d)\n", in nau8825_setup_irq()
2564 nau8825->irq, ret); in nau8825_setup_irq()
2575 struct nau8825 *nau8825 = dev_get_platdata(&i2c->dev); in nau8825_i2c_probe() local
2578 if (!nau8825) { in nau8825_i2c_probe()
2579 nau8825 = devm_kzalloc(dev, sizeof(*nau8825), GFP_KERNEL); in nau8825_i2c_probe()
2580 if (!nau8825) in nau8825_i2c_probe()
2582 ret = nau8825_read_device_properties(dev, nau8825); in nau8825_i2c_probe()
2587 i2c_set_clientdata(i2c, nau8825); in nau8825_i2c_probe()
2589 nau8825->regmap = devm_regmap_init_i2c(i2c, &nau8825_regmap_config); in nau8825_i2c_probe()
2590 if (IS_ERR(nau8825->regmap)) in nau8825_i2c_probe()
2591 return PTR_ERR(nau8825->regmap); in nau8825_i2c_probe()
2592 nau8825->dev = dev; in nau8825_i2c_probe()
2593 nau8825->irq = i2c->irq; in nau8825_i2c_probe()
2597 nau8825->xtalk_state = NAU8825_XTALK_DONE; in nau8825_i2c_probe()
2598 nau8825->xtalk_protect = false; in nau8825_i2c_probe()
2599 nau8825->xtalk_baktab_initialized = false; in nau8825_i2c_probe()
2600 sema_init(&nau8825->xtalk_sem, 1); in nau8825_i2c_probe()
2601 INIT_WORK(&nau8825->xtalk_work, nau8825_xtalk_work); in nau8825_i2c_probe()
2603 nau8825_print_device_properties(nau8825); in nau8825_i2c_probe()
2605 nau8825_reset_chip(nau8825->regmap); in nau8825_i2c_probe()
2606 ret = regmap_read(nau8825->regmap, NAU8825_REG_I2C_DEVICE_ID, &value); in nau8825_i2c_probe()
2618 nau8825_init_regs(nau8825); in nau8825_i2c_probe()
2621 nau8825_setup_irq(nau8825); in nau8825_i2c_probe()