Lines Matching full:nau8821

3 // nau8821.c -- Nuvoton NAU88L21 audio codec driver
27 #include "nau8821.h"
45 static int nau8821_configure_sysclk(struct nau8821 *nau8821,
471 struct nau8821 *nau8821 = snd_soc_component_get_drvdata(component); in dmic_clock_control() local
477 * less than nau8821->dmic_clk_threshold. in dmic_clock_control()
479 regmap_read(nau8821->regmap, NAU8821_R03_CLK_DIVIDER, in dmic_clock_control()
483 clk_adc = (nau8821->fs * 256) >> clk_adc_src; in dmic_clock_control()
487 nau8821->dmic_clk_threshold) { in dmic_clock_control()
494 dev_dbg(nau8821->dev, in dmic_clock_control()
496 clk_adc, nau8821->dmic_clk_threshold, in dmic_clock_control()
498 regmap_update_bits(nau8821->regmap, NAU8821_R13_DMIC_CTRL, in dmic_clock_control()
510 struct nau8821 *nau8821 = snd_soc_component_get_drvdata(component); in nau8821_left_adc_event() local
514 msleep(nau8821->adc_delay); in nau8821_left_adc_event()
530 struct nau8821 *nau8821 = snd_soc_component_get_drvdata(component); in nau8821_right_adc_event() local
534 msleep(nau8821->adc_delay); in nau8821_right_adc_event()
550 struct nau8821 *nau8821 = in nau8821_pump_event() local
557 regmap_update_bits(nau8821->regmap, NAU8821_R80_CHARGE_PUMP, in nau8821_pump_event()
561 regmap_update_bits(nau8821->regmap, NAU8821_R80_CHARGE_PUMP, in nau8821_pump_event()
576 struct nau8821 *nau8821 = snd_soc_component_get_drvdata(component); in nau8821_output_dac_event() local
581 regmap_update_bits(nau8821->regmap, NAU8821_R66_BIAS_ADJ, in nau8821_output_dac_event()
585 regmap_update_bits(nau8821->regmap, NAU8821_R66_BIAS_ADJ, in nau8821_output_dac_event()
600 struct nau8821 *nau8821 = snd_soc_component_get_drvdata(component); in system_clock_control() local
603 dev_dbg(nau8821->dev, "system clock control : POWER OFF\n"); in system_clock_control()
609 if (nau8821_is_jack_inserted(nau8821->regmap)) { in system_clock_control()
610 nau8821_configure_sysclk(nau8821, in system_clock_control()
613 nau8821_configure_sysclk(nau8821, NAU8821_CLK_DIS, 0); in system_clock_control()
623 struct nau8821 *nau8821 = snd_soc_component_get_drvdata(component); in nau8821_left_fepga_event() local
625 if (!nau8821->left_input_single_end) in nau8821_left_fepga_event()
630 regmap_update_bits(nau8821->regmap, NAU8821_R77_FEPGA, in nau8821_left_fepga_event()
633 regmap_update_bits(nau8821->regmap, NAU8821_R76_BOOST, in nau8821_left_fepga_event()
637 regmap_update_bits(nau8821->regmap, NAU8821_R77_FEPGA, in nau8821_left_fepga_event()
639 regmap_update_bits(nau8821->regmap, NAU8821_R76_BOOST, in nau8821_left_fepga_event()
802 nau8821_get_osr(struct nau8821 *nau8821, int stream) in nau8821_get_osr() argument
807 regmap_read(nau8821->regmap, NAU8821_R2C_DAC_CTRL1, &osr); in nau8821_get_osr()
813 regmap_read(nau8821->regmap, NAU8821_R2B_ADC_RATE, &osr); in nau8821_get_osr()
825 struct nau8821 *nau8821 = snd_soc_component_get_drvdata(component); in nau8821_dai_startup() local
828 osr = nau8821_get_osr(nau8821, substream->stream); in nau8821_dai_startup()
841 struct nau8821 *nau8821 = snd_soc_component_get_drvdata(component); in nau8821_hw_params() local
845 nau8821->fs = params_rate(params); in nau8821_hw_params()
852 osr = nau8821_get_osr(nau8821, substream->stream); in nau8821_hw_params()
855 if (nau8821->fs * osr->osr > CLK_DA_AD_MAX) in nau8821_hw_params()
858 regmap_update_bits(nau8821->regmap, NAU8821_R03_CLK_DIVIDER, in nau8821_hw_params()
862 regmap_update_bits(nau8821->regmap, NAU8821_R03_CLK_DIVIDER, in nau8821_hw_params()
867 regmap_read(nau8821->regmap, NAU8821_R1D_I2S_PCM_CTRL2, &ctrl_val); in nau8821_hw_params()
870 bclk_fs = snd_soc_params_to_bclk(params) / nau8821->fs; in nau8821_hw_params()
880 regmap_update_bits(nau8821->regmap, NAU8821_R1D_I2S_PCM_CTRL2, in nau8821_hw_params()
902 regmap_update_bits(nau8821->regmap, NAU8821_R1C_I2S_PCM_CTRL1, in nau8821_hw_params()
911 struct nau8821 *nau8821 = snd_soc_component_get_drvdata(component); in nau8821_set_dai_fmt() local
955 regmap_update_bits(nau8821->regmap, NAU8821_R1C_I2S_PCM_CTRL1, in nau8821_set_dai_fmt()
958 regmap_update_bits(nau8821->regmap, NAU8821_R1D_I2S_PCM_CTRL2, in nau8821_set_dai_fmt()
968 struct nau8821 *nau8821 = snd_soc_component_get_drvdata(component); in nau8821_digital_mute() local
974 return regmap_update_bits(nau8821->regmap, in nau8821_digital_mute()
1041 static void nau8821_eject_jack(struct nau8821 *nau8821) in nau8821_eject_jack() argument
1043 struct snd_soc_dapm_context *dapm = nau8821->dapm; in nau8821_eject_jack()
1044 struct regmap *regmap = nau8821->regmap; in nau8821_eject_jack()
1075 nau8821_configure_sysclk(nau8821, NAU8821_CLK_DIS, 0); in nau8821_eject_jack()
1080 if (nau8821->key_enable) { in nau8821_eject_jack()
1098 struct nau8821 *nau8821 = in nau8821_jdet_work() local
1099 container_of(work, struct nau8821, jdet_work); in nau8821_jdet_work()
1100 struct snd_soc_dapm_context *dapm = nau8821->dapm; in nau8821_jdet_work()
1102 struct regmap *regmap = nau8821->regmap; in nau8821_jdet_work()
1112 dev_dbg(nau8821->dev, "Headset connected\n"); in nau8821_jdet_work()
1123 if (nau8821->key_enable) { in nau8821_jdet_work()
1133 snd_soc_dapm_sync(nau8821->dapm); in nau8821_jdet_work()
1136 dev_dbg(nau8821->dev, "Headphone connected\n"); in nau8821_jdet_work()
1142 snd_soc_jack_report(nau8821->jack, event, event_mask); in nau8821_jdet_work()
1146 static void nau8821_setup_inserted_irq(struct nau8821 *nau8821) in nau8821_setup_inserted_irq() argument
1148 struct regmap *regmap = nau8821->regmap; in nau8821_setup_inserted_irq()
1151 if (nau8821->dapm->bias_level < SND_SOC_BIAS_PREPARE) in nau8821_setup_inserted_irq()
1152 nau8821_configure_sysclk(nau8821, NAU8821_CLK_INTERNAL, 0); in nau8821_setup_inserted_irq()
1176 struct nau8821 *nau8821 = (struct nau8821 *)data; in nau8821_interrupt() local
1177 struct regmap *regmap = nau8821->regmap; in nau8821_interrupt()
1181 dev_err(nau8821->dev, "failed to read irq status\n"); in nau8821_interrupt()
1185 dev_dbg(nau8821->dev, "IRQ %d\n", active_irq); in nau8821_interrupt()
1191 nau8821_eject_jack(nau8821); in nau8821_interrupt()
1207 cancel_work_sync(&nau8821->jdet_work); in nau8821_interrupt()
1208 schedule_work(&nau8821->jdet_work); in nau8821_interrupt()
1218 nau8821_setup_inserted_irq(nau8821); in nau8821_interrupt()
1220 dev_warn(nau8821->dev, in nau8821_interrupt()
1222 nau8821_eject_jack(nau8821); in nau8821_interrupt()
1232 snd_soc_jack_report(nau8821->jack, event, event_mask); in nau8821_interrupt()
1253 struct nau8821 *nau8821 = snd_soc_component_get_drvdata(component); in nau8821_component_probe() local
1257 nau8821->dapm = dapm; in nau8821_component_probe()
1329 static void nau8821_fll_apply(struct nau8821 *nau8821, in nau8821_fll_apply() argument
1332 struct regmap *regmap = nau8821->regmap; in nau8821_fll_apply()
1380 * nau8821_set_fll - FLL configuration of nau8821
1395 struct nau8821 *nau8821 = snd_soc_component_get_drvdata(component); in nau8821_set_fll() local
1402 dev_err(nau8821->dev, in nau8821_set_fll()
1407 dev_dbg(nau8821->dev, in nau8821_set_fll()
1412 nau8821_fll_apply(nau8821, fll_param); in nau8821_set_fll()
1414 regmap_update_bits(nau8821->regmap, NAU8821_R03_CLK_DIVIDER, in nau8821_set_fll()
1431 static int nau8821_configure_sysclk(struct nau8821 *nau8821, in nau8821_configure_sysclk() argument
1434 struct regmap *regmap = nau8821->regmap; in nau8821_configure_sysclk()
1499 dev_err(nau8821->dev, "Invalid clock id (%d)\n", clk_id); in nau8821_configure_sysclk()
1502 nau8821->clk_id = clk_id; in nau8821_configure_sysclk()
1503 dev_dbg(nau8821->dev, "Sysclk is %dHz and clock id is %d\n", freq, in nau8821_configure_sysclk()
1504 nau8821->clk_id); in nau8821_configure_sysclk()
1512 struct nau8821 *nau8821 = snd_soc_component_get_drvdata(component); in nau8821_set_sysclk() local
1514 return nau8821_configure_sysclk(nau8821, clk_id, freq); in nau8821_set_sysclk()
1517 static int nau8821_resume_setup(struct nau8821 *nau8821) in nau8821_resume_setup() argument
1519 struct regmap *regmap = nau8821->regmap; in nau8821_resume_setup()
1522 nau8821_configure_sysclk(nau8821, NAU8821_CLK_DIS, 0); in nau8821_resume_setup()
1523 if (nau8821->irq) { in nau8821_resume_setup()
1545 struct nau8821 *nau8821 = snd_soc_component_get_drvdata(component); in nau8821_set_bias_level() local
1546 struct regmap *regmap = nau8821->regmap; in nau8821_set_bias_level()
1559 nau8821_resume_setup(nau8821); in nau8821_set_bias_level()
1566 if (nau8821->irq) { in nau8821_set_bias_level()
1592 struct nau8821 *nau8821 = snd_soc_component_get_drvdata(component); in nau8821_suspend() local
1594 if (nau8821->irq) in nau8821_suspend()
1595 disable_irq(nau8821->irq); in nau8821_suspend()
1599 snd_soc_dapm_sync(nau8821->dapm); in nau8821_suspend()
1600 regcache_cache_only(nau8821->regmap, true); in nau8821_suspend()
1601 regcache_mark_dirty(nau8821->regmap); in nau8821_suspend()
1608 struct nau8821 *nau8821 = snd_soc_component_get_drvdata(component); in nau8821_resume() local
1610 regcache_cache_only(nau8821->regmap, false); in nau8821_resume()
1611 regcache_sync(nau8821->regmap); in nau8821_resume()
1612 if (nau8821->irq) in nau8821_resume()
1613 enable_irq(nau8821->irq); in nau8821_resume()
1650 struct nau8821 *nau8821 = snd_soc_component_get_drvdata(component); in nau8821_enable_jack_detect() local
1653 nau8821->jack = jack; in nau8821_enable_jack_detect()
1655 INIT_WORK(&nau8821->jdet_work, nau8821_jdet_work); in nau8821_enable_jack_detect()
1656 ret = devm_request_threaded_irq(nau8821->dev, nau8821->irq, NULL, in nau8821_enable_jack_detect()
1658 "nau8821", nau8821); in nau8821_enable_jack_detect()
1660 dev_err(nau8821->dev, "Cannot request irq %d (%d)\n", in nau8821_enable_jack_detect()
1661 nau8821->irq, ret); in nau8821_enable_jack_detect()
1675 static void nau8821_print_device_properties(struct nau8821 *nau8821) in nau8821_print_device_properties() argument
1677 struct device *dev = nau8821->dev; in nau8821_print_device_properties()
1679 dev_dbg(dev, "jkdet-enable: %d\n", nau8821->jkdet_enable); in nau8821_print_device_properties()
1680 dev_dbg(dev, "jkdet-pull-enable: %d\n", nau8821->jkdet_pull_enable); in nau8821_print_device_properties()
1681 dev_dbg(dev, "jkdet-pull-up: %d\n", nau8821->jkdet_pull_up); in nau8821_print_device_properties()
1682 dev_dbg(dev, "jkdet-polarity: %d\n", nau8821->jkdet_polarity); in nau8821_print_device_properties()
1683 dev_dbg(dev, "micbias-voltage: %d\n", nau8821->micbias_voltage); in nau8821_print_device_properties()
1684 dev_dbg(dev, "vref-impedance: %d\n", nau8821->vref_impedance); in nau8821_print_device_properties()
1686 nau8821->jack_insert_debounce); in nau8821_print_device_properties()
1688 nau8821->jack_eject_debounce); in nau8821_print_device_properties()
1690 nau8821->dmic_clk_threshold); in nau8821_print_device_properties()
1691 dev_dbg(dev, "key_enable: %d\n", nau8821->key_enable); in nau8821_print_device_properties()
1692 dev_dbg(dev, "adc-delay-ms: %d\n", nau8821->adc_delay); in nau8821_print_device_properties()
1696 struct nau8821 *nau8821) in nau8821_read_device_properties() argument
1700 nau8821->jkdet_enable = device_property_read_bool(dev, in nau8821_read_device_properties()
1702 nau8821->jkdet_pull_enable = device_property_read_bool(dev, in nau8821_read_device_properties()
1704 nau8821->jkdet_pull_up = device_property_read_bool(dev, in nau8821_read_device_properties()
1706 nau8821->key_enable = device_property_read_bool(dev, in nau8821_read_device_properties()
1708 nau8821->left_input_single_end = device_property_read_bool(dev, in nau8821_read_device_properties()
1711 &nau8821->jkdet_polarity); in nau8821_read_device_properties()
1713 nau8821->jkdet_polarity = 1; in nau8821_read_device_properties()
1715 &nau8821->micbias_voltage); in nau8821_read_device_properties()
1717 nau8821->micbias_voltage = 6; in nau8821_read_device_properties()
1719 &nau8821->vref_impedance); in nau8821_read_device_properties()
1721 nau8821->vref_impedance = 2; in nau8821_read_device_properties()
1723 &nau8821->jack_insert_debounce); in nau8821_read_device_properties()
1725 nau8821->jack_insert_debounce = 7; in nau8821_read_device_properties()
1727 &nau8821->jack_eject_debounce); in nau8821_read_device_properties()
1729 nau8821->jack_eject_debounce = 0; in nau8821_read_device_properties()
1731 &nau8821->dmic_clk_threshold); in nau8821_read_device_properties()
1733 nau8821->dmic_clk_threshold = 3072000; in nau8821_read_device_properties()
1735 &nau8821->dmic_slew_rate); in nau8821_read_device_properties()
1737 nau8821->dmic_slew_rate = 0; in nau8821_read_device_properties()
1739 &nau8821->adc_delay); in nau8821_read_device_properties()
1741 nau8821->adc_delay = 125; in nau8821_read_device_properties()
1742 if (nau8821->adc_delay < 125 || nau8821->adc_delay > 500) in nau8821_read_device_properties()
1748 static void nau8821_init_regs(struct nau8821 *nau8821) in nau8821_init_regs() argument
1750 struct regmap *regmap = nau8821->regmap; in nau8821_init_regs()
1764 (nau8821->vref_impedance << NAU8821_BIAS_VMID_SEL_SFT) | in nau8821_init_regs()
1795 NAU8821_MICBIAS_VOLTAGE_MASK, nau8821->micbias_voltage); in nau8821_init_regs()
1804 NAU8821_DMIC_SLEW_MASK, nau8821->dmic_slew_rate << in nau8821_init_regs()
1806 if (nau8821->left_input_single_end) { in nau8821_init_regs()
1814 static int nau8821_setup_irq(struct nau8821 *nau8821) in nau8821_setup_irq() argument
1816 struct regmap *regmap = nau8821->regmap; in nau8821_setup_irq()
1821 nau8821->jkdet_enable ? 0 : NAU8821_JKDET_OUTPUT_EN); in nau8821_setup_irq()
1824 nau8821->jkdet_pull_enable ? 0 : NAU8821_JKDET_PULL_EN); in nau8821_setup_irq()
1827 nau8821->jkdet_pull_up ? NAU8821_JKDET_PULL_UP : 0); in nau8821_setup_irq()
1831 nau8821->jkdet_polarity ? 0 : NAU8821_JACK_POLARITY); in nau8821_setup_irq()
1834 nau8821->jack_insert_debounce << in nau8821_setup_irq()
1838 nau8821->jack_eject_debounce << in nau8821_setup_irq()
1882 struct nau8821 *nau8821 = dev_get_platdata(&i2c->dev); in nau8821_i2c_probe() local
1885 if (!nau8821) { in nau8821_i2c_probe()
1886 nau8821 = devm_kzalloc(dev, sizeof(*nau8821), GFP_KERNEL); in nau8821_i2c_probe()
1887 if (!nau8821) in nau8821_i2c_probe()
1889 nau8821_read_device_properties(dev, nau8821); in nau8821_i2c_probe()
1891 i2c_set_clientdata(i2c, nau8821); in nau8821_i2c_probe()
1893 nau8821->regmap = devm_regmap_init_i2c(i2c, &nau8821_regmap_config); in nau8821_i2c_probe()
1894 if (IS_ERR(nau8821->regmap)) in nau8821_i2c_probe()
1895 return PTR_ERR(nau8821->regmap); in nau8821_i2c_probe()
1897 nau8821->dev = dev; in nau8821_i2c_probe()
1898 nau8821->irq = i2c->irq; in nau8821_i2c_probe()
1903 nau8821->jkdet_polarity = 0; in nau8821_i2c_probe()
1905 nau8821_print_device_properties(nau8821); in nau8821_i2c_probe()
1907 nau8821_reset_chip(nau8821->regmap); in nau8821_i2c_probe()
1908 ret = regmap_read(nau8821->regmap, NAU8821_R58_I2C_DEVICE_ID, &value); in nau8821_i2c_probe()
1913 nau8821_init_regs(nau8821); in nau8821_i2c_probe()
1916 nau8821_setup_irq(nau8821); in nau8821_i2c_probe()
1925 { "nau8821" },
1932 { .compatible = "nuvoton,nau8821", },
1948 .name = "nau8821",
1957 MODULE_DESCRIPTION("ASoC nau8821 driver");