Lines Matching defs:nau8824
29 #include "nau8824.h"
39 static int nau8824_config_sysclk(struct nau8824 *nau8824,
41 static bool nau8824_is_jack_inserted(struct nau8824 *nau8824);
206 static int nau8824_sema_acquire(struct nau8824 *nau8824, long timeout)
211 ret = down_timeout(&nau8824->jd_sem, timeout);
213 dev_warn(nau8824->dev, "Acquire semaphore timeout\n");
215 ret = down_interruptible(&nau8824->jd_sem);
217 dev_warn(nau8824->dev, "Acquire semaphore fail\n");
223 static inline void nau8824_sema_release(struct nau8824 *nau8824)
225 up(&nau8824->jd_sem);
432 struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component);
437 regmap_update_bits(nau8824->regmap, NAU8824_REG_ENABLE_LO,
441 regmap_update_bits(nau8824->regmap, NAU8824_REG_ENABLE_LO,
455 struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component);
459 regmap_update_bits(nau8824->regmap,
464 regmap_update_bits(nau8824->regmap,
479 struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component);
485 regmap_update_bits(nau8824->regmap,
490 regmap_update_bits(nau8824->regmap,
505 struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component);
506 struct regmap *regmap = nau8824->regmap;
511 dev_dbg(nau8824->dev, "system clock control : POWER OFF\n");
517 if (nau8824_is_jack_inserted(nau8824)) {
518 nau8824_config_sysclk(nau8824,
521 nau8824_config_sysclk(nau8824, NAU8824_CLK_DIS, 0);
524 dev_dbg(nau8824->dev, "system clock control : POWER ON\n");
551 nau8824_config_sysclk(nau8824,
564 struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component);
572 if ((0x1 << (8 - src)) * nau8824->fs <= DMIC_CLK)
575 dev_dbg(nau8824->dev, "dmic src %d for mclk %d\n", src, nau8824->fs * 256);
576 regmap_update_bits(nau8824->regmap, NAU8824_REG_CLK_DIVIDER,
812 static bool nau8824_is_jack_inserted(struct nau8824 *nau8824)
814 struct snd_soc_jack *jack = nau8824->jack;
817 if (nau8824->irq && jack)
839 static void nau8824_eject_jack(struct nau8824 *nau8824)
841 struct snd_soc_dapm_context *dapm = nau8824->dapm;
842 struct regmap *regmap = nau8824->regmap;
867 nau8824_config_sysclk(nau8824, NAU8824_CLK_DIS, 0);
872 struct nau8824 *nau8824 = container_of(
873 work, struct nau8824, jdet_work);
874 struct snd_soc_dapm_context *dapm = nau8824->dapm;
875 struct regmap *regmap = nau8824->regmap;
886 dev_dbg(nau8824->dev, "SAR ADC data 0x%02x\n", adc_value);
897 snd_soc_jack_report(nau8824->jack, event, event_mask);
904 if (nau8824->resume_lock) {
905 nau8824_sema_release(nau8824);
906 nau8824->resume_lock = false;
910 static void nau8824_setup_auto_irq(struct nau8824 *nau8824)
912 struct regmap *regmap = nau8824->regmap;
921 if (nau8824->dapm->bias_level < SND_SOC_BIAS_PREPARE)
922 nau8824_config_sysclk(nau8824, NAU8824_CLK_INTERNAL, 0);
955 struct nau8824 *nau8824 = (struct nau8824 *)data;
956 struct regmap *regmap = nau8824->regmap;
960 dev_err(nau8824->dev, "failed to read irq status\n");
963 dev_dbg(nau8824->dev, "IRQ %x\n", active_irq);
966 nau8824_eject_jack(nau8824);
972 if (nau8824->resume_lock) {
973 nau8824_sema_release(nau8824);
974 nau8824->resume_lock = false;
976 cancel_work_sync(&nau8824->jdet_work);
987 dev_dbg(nau8824->dev, "button %x pressed\n", event);
1003 cancel_work_sync(&nau8824->jdet_work);
1004 schedule_work(&nau8824->jdet_work);
1009 nau8824_setup_auto_irq(nau8824);
1018 snd_soc_jack_report(nau8824->jack, event, event_mask);
1024 nau8824_get_osr(struct nau8824 *nau8824, int stream)
1029 regmap_read(nau8824->regmap,
1036 regmap_read(nau8824->regmap,
1049 struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component);
1052 osr = nau8824_get_osr(nau8824, substream->stream);
1065 struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component);
1070 nau8824_sema_acquire(nau8824, HZ);
1078 nau8824->fs = params_rate(params);
1079 osr = nau8824_get_osr(nau8824, substream->stream);
1082 if (nau8824->fs * osr->osr > CLK_DA_AD_MAX)
1085 regmap_update_bits(nau8824->regmap, NAU8824_REG_CLK_DIVIDER,
1089 regmap_update_bits(nau8824->regmap, NAU8824_REG_CLK_DIVIDER,
1094 regmap_read(nau8824->regmap,
1098 bclk_fs = snd_soc_params_to_bclk(params) / nau8824->fs;
1109 regmap_update_bits(nau8824->regmap,
1132 regmap_update_bits(nau8824->regmap, NAU8824_REG_PORT0_I2S_PCM_CTRL_1,
1137 nau8824_sema_release(nau8824);
1145 struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component);
1189 nau8824_sema_acquire(nau8824, HZ);
1191 regmap_update_bits(nau8824->regmap, NAU8824_REG_PORT0_I2S_PCM_CTRL_1,
1194 regmap_update_bits(nau8824->regmap, NAU8824_REG_PORT0_I2S_PCM_CTRL_2,
1197 nau8824_sema_release(nau8824);
1222 struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component);
1243 regmap_update_bits(nau8824->regmap, NAU8824_REG_TDM_CTRL,
1247 regmap_update_bits(nau8824->regmap, NAU8824_REG_PORT0_LEFT_TIME_SLOT,
1363 struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component);
1370 dev_err(nau8824->dev, "Unsupported input clock %d\n", freq_in);
1373 dev_dbg(nau8824->dev, "mclk_src=%x ratio=%x fll_frac=%x fll_int=%x clk_ref_div=%x\n",
1377 nau8824_fll_apply(nau8824->regmap, &fll_param);
1379 regmap_update_bits(nau8824->regmap, NAU8824_REG_CLK_DIVIDER,
1385 static int nau8824_config_sysclk(struct nau8824 *nau8824,
1388 struct regmap *regmap = nau8824->regmap;
1399 nau8824_sema_acquire(nau8824, HZ);
1404 nau8824_sema_release(nau8824);
1415 nau8824_sema_acquire(nau8824, HZ);
1418 nau8824_sema_release(nau8824);
1422 nau8824_sema_acquire(nau8824, HZ);
1425 nau8824_sema_release(nau8824);
1429 nau8824_sema_acquire(nau8824, HZ);
1432 nau8824_sema_release(nau8824);
1436 dev_err(nau8824->dev, "Invalid clock id (%d)\n", clk_id);
1440 dev_dbg(nau8824->dev, "Sysclk is %dHz and clock id is %d\n", freq,
1449 struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component);
1451 return nau8824_config_sysclk(nau8824, clk_id, freq);
1454 static void nau8824_resume_setup(struct nau8824 *nau8824)
1456 nau8824_config_sysclk(nau8824, NAU8824_CLK_DIS, 0);
1457 if (nau8824->irq) {
1459 nau8824_int_status_clear_all(nau8824->regmap);
1463 regmap_update_bits(nau8824->regmap, NAU8824_REG_ENA_CTRL,
1465 regmap_update_bits(nau8824->regmap,
1469 regmap_update_bits(nau8824->regmap,
1478 struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component);
1490 nau8824_resume_setup(nau8824);
1495 regmap_update_bits(nau8824->regmap,
1497 regmap_update_bits(nau8824->regmap,
1508 struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component);
1511 nau8824->dapm = dapm;
1518 struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component);
1520 if (nau8824->irq) {
1521 disable_irq(nau8824->irq);
1524 regcache_cache_only(nau8824->regmap, true);
1525 regcache_mark_dirty(nau8824->regmap);
1532 struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component);
1535 regcache_cache_only(nau8824->regmap, false);
1536 regcache_sync(nau8824->regmap);
1537 if (nau8824->irq) {
1541 nau8824->resume_lock = true;
1542 ret = nau8824_sema_acquire(nau8824, 0);
1544 nau8824->resume_lock = false;
1545 enable_irq(nau8824->irq);
1627 struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component);
1630 nau8824->jack = jack;
1632 INIT_WORK(&nau8824->jdet_work, nau8824_jdet_work);
1633 ret = devm_request_threaded_irq(nau8824->dev, nau8824->irq, NULL,
1635 "nau8824", nau8824);
1637 dev_err(nau8824->dev, "Cannot request irq %d (%d)\n",
1638 nau8824->irq, ret);
1651 static void nau8824_setup_buttons(struct nau8824 *nau8824)
1653 struct regmap *regmap = nau8824->regmap;
1657 nau8824->sar_voltage << NAU8824_SAR_TRACKING_GAIN_SFT);
1660 nau8824->sar_compare_time << NAU8824_SAR_COMPARE_TIME_SFT);
1663 nau8824->sar_sampling_time << NAU8824_SAR_SAMPLING_TIME_SFT);
1667 (nau8824->sar_threshold_num - 1) << NAU8824_LEVELS_NR_SFT);
1670 nau8824->sar_hysteresis << NAU8824_HYSTERESIS_SFT);
1673 nau8824->key_debounce << NAU8824_SHORTKEY_DEBOUNCE_SFT);
1676 (nau8824->sar_threshold[0] << 8) | nau8824->sar_threshold[1]);
1678 (nau8824->sar_threshold[2] << 8) | nau8824->sar_threshold[3]);
1680 (nau8824->sar_threshold[4] << 8) | nau8824->sar_threshold[5]);
1682 (nau8824->sar_threshold[6] << 8) | nau8824->sar_threshold[7]);
1685 static void nau8824_init_regs(struct nau8824 *nau8824)
1687 struct regmap *regmap = nau8824->regmap;
1692 (nau8824->vref_impedance << NAU8824_VMID_SEL_SFT));
1697 NAU8824_MICBIAS_VOLTAGE_MASK, nau8824->micbias_voltage);
1777 nau8824->jkdet_polarity ? 0 : NAU8824_JACK_LOGIC);
1780 (nau8824->jack_eject_debounce << NAU8824_JACK_EJECT_DT_SFT));
1781 if (nau8824->sar_threshold_num)
1782 nau8824_setup_buttons(nau8824);
1785 static int nau8824_setup_irq(struct nau8824 *nau8824)
1788 regmap_update_bits(nau8824->regmap, NAU8824_REG_ENA_CTRL,
1790 regmap_update_bits(nau8824->regmap,
1792 regmap_update_bits(nau8824->regmap, NAU8824_REG_INTERRUPT_SETTING_1,
1798 static void nau8824_print_device_properties(struct nau8824 *nau8824)
1800 struct device *dev = nau8824->dev;
1803 dev_dbg(dev, "jkdet-polarity: %d\n", nau8824->jkdet_polarity);
1804 dev_dbg(dev, "micbias-voltage: %d\n", nau8824->micbias_voltage);
1805 dev_dbg(dev, "vref-impedance: %d\n", nau8824->vref_impedance);
1807 dev_dbg(dev, "sar-threshold-num: %d\n", nau8824->sar_threshold_num);
1808 for (i = 0; i < nau8824->sar_threshold_num; i++)
1810 nau8824->sar_threshold[i]);
1812 dev_dbg(dev, "sar-hysteresis: %d\n", nau8824->sar_hysteresis);
1813 dev_dbg(dev, "sar-voltage: %d\n", nau8824->sar_voltage);
1814 dev_dbg(dev, "sar-compare-time: %d\n", nau8824->sar_compare_time);
1815 dev_dbg(dev, "sar-sampling-time: %d\n", nau8824->sar_sampling_time);
1816 dev_dbg(dev, "short-key-debounce: %d\n", nau8824->key_debounce);
1818 nau8824->jack_eject_debounce);
1822 struct nau8824 *nau8824) {
1826 &nau8824->jkdet_polarity);
1828 nau8824->jkdet_polarity = 1;
1830 &nau8824->micbias_voltage);
1832 nau8824->micbias_voltage = 6;
1834 &nau8824->vref_impedance);
1836 nau8824->vref_impedance = 2;
1838 &nau8824->sar_threshold_num);
1840 nau8824->sar_threshold_num = 4;
1842 nau8824->sar_threshold, nau8824->sar_threshold_num);
1844 nau8824->sar_threshold[0] = 0x0a;
1845 nau8824->sar_threshold[1] = 0x14;
1846 nau8824->sar_threshold[2] = 0x26;
1847 nau8824->sar_threshold[3] = 0x73;
1850 &nau8824->sar_hysteresis);
1852 nau8824->sar_hysteresis = 0;
1854 &nau8824->sar_voltage);
1856 nau8824->sar_voltage = 6;
1858 &nau8824->sar_compare_time);
1860 nau8824->sar_compare_time = 1;
1862 &nau8824->sar_sampling_time);
1864 nau8824->sar_sampling_time = 1;
1866 &nau8824->key_debounce);
1868 nau8824->key_debounce = 0;
1870 &nau8824->jack_eject_debounce);
1872 nau8824->jack_eject_debounce = 1;
1961 struct nau8824 *nau8824 = dev_get_platdata(dev);
1964 if (!nau8824) {
1965 nau8824 = devm_kzalloc(dev, sizeof(*nau8824), GFP_KERNEL);
1966 if (!nau8824)
1968 ret = nau8824_read_device_properties(dev, nau8824);
1972 i2c_set_clientdata(i2c, nau8824);
1974 nau8824->regmap = devm_regmap_init_i2c(i2c, &nau8824_regmap_config);
1975 if (IS_ERR(nau8824->regmap))
1976 return PTR_ERR(nau8824->regmap);
1977 nau8824->resume_lock = false;
1978 nau8824->dev = dev;
1979 nau8824->irq = i2c->irq;
1980 sema_init(&nau8824->jd_sem, 1);
1985 nau8824->jkdet_polarity = 0;
1987 nau8824_print_device_properties(nau8824);
1989 ret = regmap_read(nau8824->regmap, NAU8824_REG_I2C_DEVICE_ID, &value);
1995 nau8824_reset_chip(nau8824->regmap);
1996 nau8824_init_regs(nau8824);
1999 nau8824_setup_irq(nau8824);
2006 { "nau8824", 0 },
2013 { .compatible = "nuvoton,nau8824", },
2029 .name = "nau8824",