Lines Matching +full:dmic +full:- +full:ref
1 // SPDX-License-Identifier: GPL-2.0-only
3 * arizona.c - Wolfson Arizona class device shared support
67 dev_err(_fll->arizona->dev, "FLL%d: " fmt, _fll->id, ##__VA_ARGS__)
69 dev_warn(_fll->arizona->dev, "FLL%d: " fmt, _fll->id, ##__VA_ARGS__)
71 dev_dbg(_fll->arizona->dev, "FLL%d: " fmt, _fll->id, ##__VA_ARGS__)
74 dev_err(_dai->dev, "AIF%d: " fmt, _dai->id, ##__VA_ARGS__)
76 dev_warn(_dai->dev, "AIF%d: " fmt, _dai->id, ##__VA_ARGS__)
78 dev_dbg(_dai->dev, "AIF%d: " fmt, _dai->id, ##__VA_ARGS__)
84 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in arizona_spk_ev()
85 struct arizona *arizona = dev_get_drvdata(component->dev->parent); in arizona_spk_ev()
93 dev_crit(arizona->dev, in arizona_spk_ev()
95 return -EBUSY; in arizona_spk_ev()
98 regmap_update_bits_async(arizona->regmap, in arizona_spk_ev()
100 1 << w->shift, 1 << w->shift); in arizona_spk_ev()
103 regmap_update_bits_async(arizona->regmap, in arizona_spk_ev()
105 1 << w->shift, 0); in arizona_spk_ev()
120 ret = regmap_read(arizona->regmap, ARIZONA_INTERRUPT_RAW_STATUS_3, in arizona_thermal_warn()
123 dev_err(arizona->dev, "Failed to read thermal status: %d\n", in arizona_thermal_warn()
126 dev_crit(arizona->dev, "Thermal warning\n"); in arizona_thermal_warn()
138 ret = regmap_read(arizona->regmap, ARIZONA_INTERRUPT_RAW_STATUS_3, in arizona_thermal_shutdown()
141 dev_err(arizona->dev, "Failed to read thermal status: %d\n", in arizona_thermal_shutdown()
144 dev_crit(arizona->dev, "Thermal shutdown\n"); in arizona_thermal_shutdown()
145 ret = regmap_update_bits(arizona->regmap, in arizona_thermal_shutdown()
150 dev_crit(arizona->dev, in arizona_thermal_shutdown()
174 struct arizona *arizona = priv->arizona; in arizona_init_spk()
181 switch (arizona->type) { in arizona_init_spk()
205 dev_err(arizona->dev, in arizona_init_spk_irqs()
213 dev_err(arizona->dev, in arizona_init_spk_irqs()
243 struct arizona *arizona = priv->arizona; in arizona_init_mono()
247 if (arizona->pdata.out_mono[i]) in arizona_init_mono()
259 struct arizona *arizona = priv->arizona; in arizona_init_gpio()
262 switch (arizona->type) { in arizona_init_gpio()
274 for (i = 0; i < ARRAY_SIZE(arizona->pdata.gpio_defaults); i++) { in arizona_init_gpio()
275 switch (arizona->pdata.gpio_defaults[i] & ARIZONA_GPN_FN_MASK) { in arizona_init_gpio()
295 struct arizona_pdata *pdata = &arizona->pdata; in arizona_init_common()
299 BLOCKING_INIT_NOTIFIER_HEAD(&arizona->notifier); in arizona_init_common()
303 if (pdata->out_mono[i]) in arizona_init_common()
308 regmap_update_bits(arizona->regmap, in arizona_init_common()
314 if (pdata->spk_mute[i]) in arizona_init_common()
315 regmap_update_bits(arizona->regmap, in arizona_init_common()
319 pdata->spk_mute[i]); in arizona_init_common()
321 if (pdata->spk_fmt[i]) in arizona_init_common()
322 regmap_update_bits(arizona->regmap, in arizona_init_common()
325 pdata->spk_fmt[i]); in arizona_init_common()
330 val = pdata->dmic_ref[i] << ARIZONA_IN1_DMIC_SUP_SHIFT; in arizona_init_common()
331 if (pdata->inmode[i] & ARIZONA_INMODE_DMIC) in arizona_init_common()
334 switch (arizona->type) { in arizona_init_common()
337 regmap_update_bits(arizona->regmap, in arizona_init_common()
340 (pdata->inmode[i] & ARIZONA_INMODE_SE) in arizona_init_common()
343 regmap_update_bits(arizona->regmap, in arizona_init_common()
346 (pdata->inmode[i] & ARIZONA_INMODE_SE) in arizona_init_common()
353 if (pdata->inmode[i] & ARIZONA_INMODE_SE) in arizona_init_common()
362 regmap_update_bits(arizona->regmap, in arizona_init_common()
375 for (i = 0; i < ARRAY_SIZE(arizona->pdata.out_vol_limit); ++i) { in arizona_init_vol_limit()
376 if (arizona->pdata.out_vol_limit[i]) in arizona_init_vol_limit()
377 regmap_update_bits(arizona->regmap, in arizona_init_vol_limit()
380 arizona->pdata.out_vol_limit[i]); in arizona_init_vol_limit()
603 const DECLARE_TLV_DB_SCALE(arizona_mixer_tlv, -3200, 100, 0);
677 ARIZONA_RATE_ENUM_SIZE - 1,
711 "Low-pass", "High-pass"
891 for (i = 0; i < priv->num_inputs; i++) in arizona_in_set_vu()
909 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in arizona_in_ev()
913 if (w->shift % 2) in arizona_in_ev()
914 reg = ARIZONA_ADC_DIGITAL_VOLUME_1L + ((w->shift / 2) * 8); in arizona_in_ev()
916 reg = ARIZONA_ADC_DIGITAL_VOLUME_1R + ((w->shift / 2) * 8); in arizona_in_ev()
920 priv->in_pending++; in arizona_in_ev()
927 priv->in_pending--; in arizona_in_ev()
928 if (priv->in_pending == 0) { in arizona_in_ev()
956 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in arizona_out_ev()
958 struct arizona *arizona = priv->arizona; in arizona_out_ev()
962 switch (w->shift) { in arizona_out_ev()
969 priv->out_up_pending++; in arizona_out_ev()
970 priv->out_up_delay += 17; in arizona_out_ev()
974 priv->out_up_pending++; in arizona_out_ev()
975 switch (arizona->type) { in arizona_out_ev()
980 priv->out_up_delay += 10; in arizona_out_ev()
989 switch (w->shift) { in arizona_out_ev()
998 priv->out_up_pending--; in arizona_out_ev()
999 if (!priv->out_up_pending && priv->out_up_delay) { in arizona_out_ev()
1000 dev_dbg(component->dev, "Power up delay: %d\n", in arizona_out_ev()
1001 priv->out_up_delay); in arizona_out_ev()
1002 msleep(priv->out_up_delay); in arizona_out_ev()
1003 priv->out_up_delay = 0; in arizona_out_ev()
1012 switch (w->shift) { in arizona_out_ev()
1019 priv->out_down_pending++; in arizona_out_ev()
1020 priv->out_down_delay++; in arizona_out_ev()
1024 priv->out_down_pending++; in arizona_out_ev()
1025 switch (arizona->type) { in arizona_out_ev()
1031 priv->out_down_delay += 5; in arizona_out_ev()
1034 priv->out_down_delay++; in arizona_out_ev()
1042 switch (w->shift) { in arizona_out_ev()
1051 priv->out_down_pending--; in arizona_out_ev()
1052 if (!priv->out_down_pending && priv->out_down_delay) { in arizona_out_ev()
1053 dev_dbg(component->dev, "Power down delay: %d\n", in arizona_out_ev()
1054 priv->out_down_delay); in arizona_out_ev()
1055 msleep(priv->out_down_delay); in arizona_out_ev()
1056 priv->out_down_delay = 0; in arizona_out_ev()
1074 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in arizona_hp_ev()
1076 struct arizona *arizona = priv->arizona; in arizona_hp_ev()
1077 unsigned int mask = 1 << w->shift; in arizona_hp_ev()
1091 return -EINVAL; in arizona_hp_ev()
1095 priv->arizona->hp_ena &= ~mask; in arizona_hp_ev()
1096 priv->arizona->hp_ena |= val; in arizona_hp_ev()
1099 if (priv->arizona->hpdet_clamp) in arizona_hp_ev()
1102 regmap_update_bits_async(arizona->regmap, ARIZONA_OUTPUT_ENABLES_1, in arizona_hp_ev()
1112 struct arizona *arizona = priv->arizona; in arizona_dvfs_enable()
1115 ret = regulator_set_voltage(arizona->dcvdd, 1800000, 1800000); in arizona_dvfs_enable()
1117 dev_err(component->dev, "Failed to boost DCVDD: %d\n", ret); in arizona_dvfs_enable()
1121 ret = regmap_update_bits(arizona->regmap, in arizona_dvfs_enable()
1126 dev_err(component->dev, "Failed to enable subsys max: %d\n", ret); in arizona_dvfs_enable()
1127 regulator_set_voltage(arizona->dcvdd, 1200000, 1800000); in arizona_dvfs_enable()
1137 struct arizona *arizona = priv->arizona; in arizona_dvfs_disable()
1140 ret = regmap_update_bits(arizona->regmap, in arizona_dvfs_disable()
1144 dev_err(component->dev, "Failed to disable subsys max: %d\n", ret); in arizona_dvfs_disable()
1148 ret = regulator_set_voltage(arizona->dcvdd, 1200000, 1800000); in arizona_dvfs_disable()
1150 dev_err(component->dev, "Failed to unboost DCVDD: %d\n", ret); in arizona_dvfs_disable()
1162 mutex_lock(&priv->dvfs_lock); in arizona_dvfs_up()
1164 if (!priv->dvfs_cached && !priv->dvfs_reqs) { in arizona_dvfs_up()
1170 priv->dvfs_reqs |= flags; in arizona_dvfs_up()
1172 mutex_unlock(&priv->dvfs_lock); in arizona_dvfs_up()
1183 mutex_lock(&priv->dvfs_lock); in arizona_dvfs_down()
1185 old_reqs = priv->dvfs_reqs; in arizona_dvfs_down()
1186 priv->dvfs_reqs &= ~flags; in arizona_dvfs_down()
1188 if (!priv->dvfs_cached && old_reqs && !priv->dvfs_reqs) in arizona_dvfs_down()
1191 mutex_unlock(&priv->dvfs_lock); in arizona_dvfs_down()
1199 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in arizona_dvfs_sysclk_ev()
1203 mutex_lock(&priv->dvfs_lock); in arizona_dvfs_sysclk_ev()
1207 if (priv->dvfs_reqs) in arizona_dvfs_sysclk_ev()
1210 priv->dvfs_cached = false; in arizona_dvfs_sysclk_ev()
1217 priv->dvfs_cached = true; in arizona_dvfs_sysclk_ev()
1219 if (priv->dvfs_reqs) in arizona_dvfs_sysclk_ev()
1226 mutex_unlock(&priv->dvfs_lock); in arizona_dvfs_sysclk_ev()
1233 mutex_init(&priv->dvfs_lock); in arizona_init_dvfs()
1241 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in arizona_anc_ev()
1246 val = 1 << w->shift; in arizona_anc_ev()
1249 val = 1 << (w->shift + 1); in arizona_anc_ev()
1281 int ref, div, refclk; in arizona_set_opclk() local
1286 refclk = priv->sysclk; in arizona_set_opclk()
1290 refclk = priv->asyncclk; in arizona_set_opclk()
1293 return -EINVAL; in arizona_set_opclk()
1301 for (ref = 0; ref < ARRAY_SIZE(arizona_opclk_ref_48k_rates) && in arizona_set_opclk()
1302 rates[ref] <= refclk; ref++) { in arizona_set_opclk()
1304 while (rates[ref] / div >= freq && div < 32) { in arizona_set_opclk()
1305 if (rates[ref] / div == freq) { in arizona_set_opclk()
1306 dev_dbg(component->dev, "Configured %dHz OPCLK\n", in arizona_set_opclk()
1313 ref); in arizona_set_opclk()
1320 dev_err(component->dev, "Unable to generate %dHz OPCLK\n", freq); in arizona_set_opclk()
1321 return -EINVAL; in arizona_set_opclk()
1327 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in arizona_clk_ev()
1328 struct arizona *arizona = dev_get_drvdata(component->dev->parent); in arizona_clk_ev()
1333 ret = regmap_read(arizona->regmap, w->reg, &val); in arizona_clk_ev()
1335 dev_err(component->dev, "Failed to check clock source: %d\n", ret); in arizona_clk_ev()
1354 return clk_prepare_enable(arizona->mclk[clk_idx]); in arizona_clk_ev()
1356 clk_disable_unprepare(arizona->mclk[clk_idx]); in arizona_clk_ev()
1368 struct arizona *arizona = priv->arizona; in arizona_set_sysclk()
1379 clk = &priv->sysclk; in arizona_set_sysclk()
1385 clk = &priv->asyncclk; in arizona_set_sysclk()
1391 return -EINVAL; in arizona_set_sysclk()
1423 dev_dbg(arizona->dev, "%s cleared\n", name); in arizona_set_sysclk()
1427 return -EINVAL; in arizona_set_sysclk()
1435 dev_dbg(arizona->dev, "%s set to %uHz", name, freq); in arizona_set_sysclk()
1437 return regmap_update_bits(arizona->regmap, reg, mask, val); in arizona_set_sysclk()
1443 struct snd_soc_component *component = dai->component; in arizona_set_fmt()
1445 struct arizona *arizona = priv->arizona; in arizona_set_fmt()
1448 base = dai->driver->base; in arizona_set_fmt()
1461 return -EINVAL; in arizona_set_fmt()
1472 return -EINVAL; in arizona_set_fmt()
1479 return -EINVAL; in arizona_set_fmt()
1498 return -EINVAL; in arizona_set_fmt()
1515 return -EINVAL; in arizona_set_fmt()
1518 regmap_update_bits_async(arizona->regmap, base + ARIZONA_AIF_BCLK_CTRL, in arizona_set_fmt()
1522 regmap_update_bits_async(arizona->regmap, base + ARIZONA_AIF_TX_PIN_CTRL, in arizona_set_fmt()
1525 regmap_update_bits_async(arizona->regmap, in arizona_set_fmt()
1529 regmap_update_bits(arizona->regmap, base + ARIZONA_AIF_FORMAT, in arizona_set_fmt()
1536 -1,
1558 -1,
1618 struct snd_soc_component *component = dai->component; in arizona_startup()
1620 struct arizona_dai_priv *dai_priv = &priv->dai[dai->id - 1]; in arizona_startup()
1623 if (!substream->runtime) in arizona_startup()
1626 switch (dai_priv->clk) { in arizona_startup()
1628 base_rate = priv->sysclk; in arizona_startup()
1631 base_rate = priv->asyncclk; in arizona_startup()
1638 dai_priv->constraint.mask = ARIZONA_RATE_MASK; in arizona_startup()
1640 dai_priv->constraint.mask = ARIZONA_44K1_RATE_MASK; in arizona_startup()
1642 dai_priv->constraint.mask = ARIZONA_48K_RATE_MASK; in arizona_startup()
1644 return snd_pcm_hw_constraint_list(substream->runtime, 0, in arizona_startup()
1646 &dai_priv->constraint); in arizona_startup()
1653 struct arizona *arizona = priv->arizona; in arizona_wm5102_set_dac_comp()
1661 mutex_lock(&arizona->dac_comp_lock); in arizona_wm5102_set_dac_comp()
1663 dac_comp[1].def = arizona->dac_comp_coeff; in arizona_wm5102_set_dac_comp()
1665 dac_comp[2].def = arizona->dac_comp_enabled; in arizona_wm5102_set_dac_comp()
1667 mutex_unlock(&arizona->dac_comp_lock); in arizona_wm5102_set_dac_comp()
1669 regmap_multi_reg_write(arizona->regmap, in arizona_wm5102_set_dac_comp()
1678 struct snd_soc_component *component = dai->component; in arizona_hw_params_rate()
1680 struct arizona_dai_priv *dai_priv = &priv->dai[dai->id - 1]; in arizona_hw_params_rate()
1681 int base = dai->driver->base; in arizona_hw_params_rate()
1694 return -EINVAL; in arizona_hw_params_rate()
1698 switch (priv->arizona->type) { in arizona_hw_params_rate()
1715 switch (dai_priv->clk) { in arizona_hw_params_rate()
1717 switch (priv->arizona->type) { in arizona_hw_params_rate()
1746 arizona_aif_err(dai, "Invalid clock %d\n", dai_priv->clk); in arizona_hw_params_rate()
1747 return -EINVAL; in arizona_hw_params_rate()
1778 struct snd_soc_component *component = dai->component; in arizona_hw_params()
1780 struct arizona *arizona = priv->arizona; in arizona_hw_params()
1781 int base = dai->driver->base; in arizona_hw_params()
1785 int chan_limit = arizona->pdata.max_channels_clocked[dai->id - 1]; in arizona_hw_params()
1786 int tdm_width = arizona->tdm_width[dai->id - 1]; in arizona_hw_params()
1787 int tdm_slots = arizona->tdm_slots[dai->id - 1]; in arizona_hw_params()
1834 return -EINVAL; in arizona_hw_params()
1853 regmap_update_bits_async(arizona->regmap, in arizona_hw_params()
1856 regmap_update_bits(arizona->regmap, in arizona_hw_params()
1865 regmap_update_bits_async(arizona->regmap, in arizona_hw_params()
1868 regmap_update_bits_async(arizona->regmap, in arizona_hw_params()
1871 regmap_update_bits_async(arizona->regmap, in arizona_hw_params()
1874 regmap_update_bits_async(arizona->regmap, in arizona_hw_params()
1878 regmap_update_bits(arizona->regmap, in arizona_hw_params()
1887 regmap_update_bits_async(arizona->regmap, in arizona_hw_params()
1890 regmap_update_bits(arizona->regmap, in arizona_hw_params()
1912 struct snd_soc_component *component = dai->component; in arizona_dai_set_sysclk()
1915 struct arizona_dai_priv *dai_priv = &priv->dai[dai->id - 1]; in arizona_dai_set_sysclk()
1923 return -EINVAL; in arizona_dai_set_sysclk()
1926 if (clk_id == dai_priv->clk) in arizona_dai_set_sysclk()
1930 dev_err(component->dev, "Can't change clock on active DAI %d\n", in arizona_dai_set_sysclk()
1931 dai->id); in arizona_dai_set_sysclk()
1932 return -EBUSY; in arizona_dai_set_sysclk()
1935 dev_dbg(component->dev, "Setting AIF%d to %s\n", dai->id + 1, in arizona_dai_set_sysclk()
1939 routes[0].sink = dai->driver->capture.stream_name; in arizona_dai_set_sysclk()
1940 routes[1].sink = dai->driver->playback.stream_name; in arizona_dai_set_sysclk()
1942 routes[0].source = arizona_dai_clk_str(dai_priv->clk); in arizona_dai_set_sysclk()
1943 routes[1].source = arizona_dai_clk_str(dai_priv->clk); in arizona_dai_set_sysclk()
1950 dai_priv->clk = clk_id; in arizona_dai_set_sysclk()
1957 struct snd_soc_component *component = dai->component; in arizona_set_tristate()
1958 int base = dai->driver->base; in arizona_set_tristate()
1975 struct snd_soc_component *component = dai->component; in arizona_set_channels_to_mask()
1977 struct arizona *arizona = priv->arizona; in arizona_set_channels_to_mask()
1981 slot = ffs(mask) - 1; in arizona_set_channels_to_mask()
1985 regmap_write(arizona->regmap, base + i, slot); in arizona_set_channels_to_mask()
1997 struct snd_soc_component *component = dai->component; in arizona_set_tdm_slot()
1999 struct arizona *arizona = priv->arizona; in arizona_set_tdm_slot()
2000 int base = dai->driver->base; in arizona_set_tdm_slot()
2001 int rx_max_chan = dai->driver->playback.channels_max; in arizona_set_tdm_slot()
2002 int tx_max_chan = dai->driver->capture.channels_max; in arizona_set_tdm_slot()
2005 if (dai->id > ARIZONA_MAX_AIF) in arizona_set_tdm_slot()
2006 return -ENOTSUPP; in arizona_set_tdm_slot()
2009 tx_mask = (1 << tx_max_chan) - 1; in arizona_set_tdm_slot()
2010 rx_mask = (1 << rx_max_chan) - 1; in arizona_set_tdm_slot()
2018 arizona->tdm_width[dai->id - 1] = slot_width; in arizona_set_tdm_slot()
2019 arizona->tdm_slots[dai->id - 1] = slots; in arizona_set_tdm_slot()
2043 struct arizona_dai_priv *dai_priv = &priv->dai[id]; in arizona_init_dai()
2045 dai_priv->clk = ARIZONA_CLK_SYSCLK; in arizona_init_dai()
2046 dai_priv->constraint = arizona_constraint; in arizona_init_dai()
2110 if (fll->fout && Fout != fll->fout) { in arizona_validate_fll()
2113 return -EINVAL; in arizona_validate_fll()
2120 return -EINVAL; in arizona_validate_fll()
2123 Fvco_min = ARIZONA_FLL_MIN_FVCO * fll->vco_mult; in arizona_validate_fll()
2127 return -EINVAL; in arizona_validate_fll()
2146 return -EINVAL; in arizona_find_fratio()
2159 cfg->refdiv = 0; in arizona_calc_fratio()
2163 cfg->refdiv++; in arizona_calc_fratio()
2166 return -EINVAL; in arizona_calc_fratio()
2170 init_ratio = arizona_find_fratio(Fref, &cfg->fratio); in arizona_calc_fratio()
2177 switch (fll->arizona->type) { in arizona_calc_fratio()
2183 if (fll->arizona->rev < 3 || sync) in arizona_calc_fratio()
2192 cfg->fratio = init_ratio - 1; in arizona_calc_fratio()
2195 refdiv = cfg->refdiv; in arizona_calc_fratio()
2204 for (ratio = init_ratio; ratio > 0; ratio--) { in arizona_calc_fratio()
2206 cfg->refdiv = refdiv; in arizona_calc_fratio()
2207 cfg->fratio = ratio - 1; in arizona_calc_fratio()
2218 (fll->vco_mult * ratio) < Fref) { in arizona_calc_fratio()
2223 if (Fref > pseudo_fref_max[ratio - 1]) { in arizona_calc_fratio()
2226 pseudo_fref_max[ratio - 1], in arizona_calc_fratio()
2232 cfg->refdiv = refdiv; in arizona_calc_fratio()
2233 cfg->fratio = ratio - 1; in arizona_calc_fratio()
2251 return cfg->fratio + 1; in arizona_calc_fratio()
2261 arizona_fll_dbg(fll, "Fref=%u Fout=%u\n", Fref, fll->fout); in arizona_calc_fll()
2265 while (fll->fout * div < ARIZONA_FLL_MIN_FVCO * fll->vco_mult) { in arizona_calc_fll()
2268 return -EINVAL; in arizona_calc_fll()
2270 target = fll->fout * div / fll->vco_mult; in arizona_calc_fll()
2271 cfg->outdiv = div; in arizona_calc_fll()
2281 Fref = Fref / (1 << cfg->refdiv); in arizona_calc_fll()
2283 cfg->n = target / (ratio * Fref); in arizona_calc_fll()
2289 cfg->theta = (target - (cfg->n * ratio * Fref)) in arizona_calc_fll()
2291 cfg->lambda = (ratio * Fref) / gcd_fll; in arizona_calc_fll()
2293 cfg->theta = 0; in arizona_calc_fll()
2294 cfg->lambda = 0; in arizona_calc_fll()
2301 while (cfg->lambda >= (1 << 16)) { in arizona_calc_fll()
2302 cfg->theta >>= 1; in arizona_calc_fll()
2303 cfg->lambda >>= 1; in arizona_calc_fll()
2308 cfg->gain = fll_gains[i].gain; in arizona_calc_fll()
2315 return -EINVAL; in arizona_calc_fll()
2319 cfg->n, cfg->theta, cfg->lambda); in arizona_calc_fll()
2321 cfg->fratio, ratio, cfg->outdiv, in arizona_calc_fll()
2322 cfg->refdiv, 1 << cfg->refdiv); in arizona_calc_fll()
2323 arizona_fll_dbg(fll, "GAIN=0x%x(%d)\n", cfg->gain, 1 << cfg->gain); in arizona_calc_fll()
2332 regmap_update_bits_async(arizona->regmap, base + 3, in arizona_apply_fll()
2333 ARIZONA_FLL1_THETA_MASK, cfg->theta); in arizona_apply_fll()
2334 regmap_update_bits_async(arizona->regmap, base + 4, in arizona_apply_fll()
2335 ARIZONA_FLL1_LAMBDA_MASK, cfg->lambda); in arizona_apply_fll()
2336 regmap_update_bits_async(arizona->regmap, base + 5, in arizona_apply_fll()
2338 cfg->fratio << ARIZONA_FLL1_FRATIO_SHIFT); in arizona_apply_fll()
2339 regmap_update_bits_async(arizona->regmap, base + 6, in arizona_apply_fll()
2342 cfg->refdiv << ARIZONA_FLL1_CLK_REF_DIV_SHIFT | in arizona_apply_fll()
2346 regmap_update_bits(arizona->regmap, base + 0x7, in arizona_apply_fll()
2348 cfg->gain << ARIZONA_FLL1_GAIN_SHIFT); in arizona_apply_fll()
2350 regmap_update_bits(arizona->regmap, base + 0x5, in arizona_apply_fll()
2352 cfg->outdiv << ARIZONA_FLL1_OUTDIV_SHIFT); in arizona_apply_fll()
2353 regmap_update_bits(arizona->regmap, base + 0x9, in arizona_apply_fll()
2355 cfg->gain << ARIZONA_FLL1_GAIN_SHIFT); in arizona_apply_fll()
2358 regmap_update_bits_async(arizona->regmap, base + 2, in arizona_apply_fll()
2360 ARIZONA_FLL1_CTRL_UPD | cfg->n); in arizona_apply_fll()
2365 struct arizona *arizona = fll->arizona; in arizona_is_enabled_fll()
2369 ret = regmap_read(arizona->regmap, base + 1, ®); in arizona_is_enabled_fll()
2381 struct arizona *arizona = fll->arizona; in arizona_set_fll_clks()
2386 ret = regmap_read(arizona->regmap, base + 6, &val); in arizona_set_fll_clks()
2398 clk = arizona->mclk[ARIZONA_MCLK1]; in arizona_set_fll_clks()
2401 clk = arizona->mclk[ARIZONA_MCLK2]; in arizona_set_fll_clks()
2417 struct arizona *arizona = fll->arizona; in arizona_enable_fll()
2419 int already_enabled = arizona_is_enabled_fll(fll, fll->base); in arizona_enable_fll()
2420 int sync_enabled = arizona_is_enabled_fll(fll, fll->base + 0x10); in arizona_enable_fll()
2432 regmap_update_bits(fll->arizona->regmap, fll->base + 1, in arizona_enable_fll()
2435 regmap_update_bits_async(fll->arizona->regmap, fll->base + 0x9, in arizona_enable_fll()
2438 if (arizona_is_enabled_fll(fll, fll->base + 0x10) > 0) in arizona_enable_fll()
2439 arizona_set_fll_clks(fll, fll->base + 0x10, false); in arizona_enable_fll()
2440 arizona_set_fll_clks(fll, fll->base, false); in arizona_enable_fll()
2447 if (fll->ref_src >= 0 && fll->ref_freq && in arizona_enable_fll()
2448 fll->ref_src != fll->sync_src) { in arizona_enable_fll()
2449 arizona_calc_fll(fll, &cfg, fll->ref_freq, false); in arizona_enable_fll()
2451 /* Ref path hardcodes lambda to 65536 when sync is on */ in arizona_enable_fll()
2452 if (fll->sync_src >= 0 && cfg.lambda) in arizona_enable_fll()
2455 arizona_apply_fll(arizona, fll->base, &cfg, fll->ref_src, in arizona_enable_fll()
2457 if (fll->sync_src >= 0) { in arizona_enable_fll()
2458 arizona_calc_fll(fll, &cfg, fll->sync_freq, true); in arizona_enable_fll()
2460 arizona_apply_fll(arizona, fll->base + 0x10, &cfg, in arizona_enable_fll()
2461 fll->sync_src, true); in arizona_enable_fll()
2464 } else if (fll->sync_src >= 0) { in arizona_enable_fll()
2465 arizona_calc_fll(fll, &cfg, fll->sync_freq, false); in arizona_enable_fll()
2467 arizona_apply_fll(arizona, fll->base, &cfg, in arizona_enable_fll()
2468 fll->sync_src, false); in arizona_enable_fll()
2470 regmap_update_bits_async(arizona->regmap, fll->base + 0x11, in arizona_enable_fll()
2474 return -EINVAL; in arizona_enable_fll()
2484 if (use_sync && fll->sync_freq > 100000) in arizona_enable_fll()
2485 regmap_update_bits_async(arizona->regmap, fll->base + 0x17, in arizona_enable_fll()
2488 regmap_update_bits_async(arizona->regmap, fll->base + 0x17, in arizona_enable_fll()
2493 pm_runtime_get_sync(arizona->dev); in arizona_enable_fll()
2496 arizona_set_fll_clks(fll, fll->base + 0x10, true); in arizona_enable_fll()
2497 regmap_update_bits_async(arizona->regmap, fll->base + 0x11, in arizona_enable_fll()
2501 arizona_set_fll_clks(fll, fll->base, true); in arizona_enable_fll()
2502 regmap_update_bits_async(arizona->regmap, fll->base + 1, in arizona_enable_fll()
2506 regmap_update_bits_async(arizona->regmap, fll->base + 1, in arizona_enable_fll()
2517 regmap_read(arizona->regmap, in arizona_enable_fll()
2520 if (val & (ARIZONA_FLL1_CLOCK_OK_STS << (fll->id - 1))) in arizona_enable_fll()
2533 struct arizona *arizona = fll->arizona; in arizona_disable_fll()
2536 regmap_update_bits_async(arizona->regmap, fll->base + 1, in arizona_disable_fll()
2538 regmap_update_bits_check(arizona->regmap, fll->base + 1, in arizona_disable_fll()
2540 regmap_update_bits_check(arizona->regmap, fll->base + 0x11, in arizona_disable_fll()
2542 regmap_update_bits_async(arizona->regmap, fll->base + 1, in arizona_disable_fll()
2546 arizona_set_fll_clks(fll, fll->base + 0x10, false); in arizona_disable_fll()
2549 arizona_set_fll_clks(fll, fll->base, false); in arizona_disable_fll()
2550 pm_runtime_put_autosuspend(arizona->dev); in arizona_disable_fll()
2559 if (fll->ref_src == source && fll->ref_freq == Fref) in arizona_set_fll_refclk()
2562 if (fll->fout && Fref > 0) { in arizona_set_fll_refclk()
2563 ret = arizona_validate_fll(fll, Fref, fll->fout); in arizona_set_fll_refclk()
2568 fll->ref_src = source; in arizona_set_fll_refclk()
2569 fll->ref_freq = Fref; in arizona_set_fll_refclk()
2571 if (fll->fout && Fref > 0) in arizona_set_fll_refclk()
2583 if (fll->sync_src == source && in arizona_set_fll()
2584 fll->sync_freq == Fref && fll->fout == Fout) in arizona_set_fll()
2588 if (fll->ref_src >= 0) { in arizona_set_fll()
2589 ret = arizona_validate_fll(fll, fll->ref_freq, Fout); in arizona_set_fll()
2599 fll->sync_src = source; in arizona_set_fll()
2600 fll->sync_freq = Fref; in arizona_set_fll()
2601 fll->fout = Fout; in arizona_set_fll()
2617 fll->id = id; in arizona_init_fll()
2618 fll->base = base; in arizona_init_fll()
2619 fll->arizona = arizona; in arizona_init_fll()
2620 fll->sync_src = ARIZONA_FLL_SRC_NONE; in arizona_init_fll()
2623 regmap_read(arizona->regmap, ARIZONA_CLOCK_32K_1, &val); in arizona_init_fll()
2627 fll->ref_src = val & ARIZONA_CLK_32K_SRC_MASK; in arizona_init_fll()
2630 fll->ref_src = ARIZONA_FLL_SRC_NONE; in arizona_init_fll()
2632 fll->ref_freq = 32768; in arizona_init_fll()
2634 snprintf(fll->lock_name, sizeof(fll->lock_name), "FLL%d lock", id); in arizona_init_fll()
2635 snprintf(fll->clock_ok_name, sizeof(fll->clock_ok_name), in arizona_init_fll()
2638 regmap_update_bits(arizona->regmap, fll->base + 1, in arizona_init_fll()
2646 * arizona_set_output_mode - Set the mode of the specified output
2667 return -EINVAL; in arizona_set_output_mode()
2669 reg = ARIZONA_OUTPUT_PATH_CONFIG_1L + (output - 1) * 8; in arizona_set_output_mode()
2719 return (abs((a << 16) / (4096 - b)) >= 4096 << 4); in arizona_eq_filter_unstable()
2727 struct arizona *arizona = dev_get_drvdata(component->dev->parent); in arizona_eq_coeff_put()
2728 struct soc_bytes *params = (void *)kcontrol->private_value; in arizona_eq_coeff_put()
2734 len = params->num_regs * regmap_get_val_bytes(arizona->regmap); in arizona_eq_coeff_put()
2736 data = kmemdup(ucontrol->value.bytes.data, len, GFP_KERNEL | GFP_DMA); in arizona_eq_coeff_put()
2738 return -ENOMEM; in arizona_eq_coeff_put()
2747 dev_err(arizona->dev, "Rejecting unstable EQ coefficients\n"); in arizona_eq_coeff_put()
2748 ret = -EINVAL; in arizona_eq_coeff_put()
2752 ret = regmap_read(arizona->regmap, params->base, &val); in arizona_eq_coeff_put()
2759 ret = regmap_raw_write(arizona->regmap, params->base, data, len); in arizona_eq_coeff_put()
2771 struct arizona *arizona = dev_get_drvdata(component->dev->parent); in arizona_lhpf_coeff_put()
2772 __be16 *data = (__be16 *)ucontrol->value.bytes.data; in arizona_lhpf_coeff_put()
2776 dev_err(arizona->dev, "Rejecting unstable LHPF coefficients\n"); in arizona_lhpf_coeff_put()
2777 return -EINVAL; in arizona_lhpf_coeff_put()
2786 struct arizona_pdata *pdata = &arizona->pdata; in arizona_of_get_audio_pdata()
2787 struct device_node *np = arizona->dev->of_node; in arizona_of_get_audio_pdata()
2797 if (count == ARRAY_SIZE(pdata->inmode)) in arizona_of_get_audio_pdata()
2800 pdata->inmode[count] = val; in arizona_of_get_audio_pdata()
2805 of_property_for_each_u32(np, "wlf,dmic-ref", prop, cur, val) { in arizona_of_get_audio_pdata()
2806 if (count == ARRAY_SIZE(pdata->dmic_ref)) in arizona_of_get_audio_pdata()
2809 pdata->dmic_ref[count] = val; in arizona_of_get_audio_pdata()
2814 of_property_for_each_u32(np, "wlf,out-mono", prop, cur, val) { in arizona_of_get_audio_pdata()
2815 if (count == ARRAY_SIZE(pdata->out_mono)) in arizona_of_get_audio_pdata()
2818 pdata->out_mono[count] = !!val; in arizona_of_get_audio_pdata()
2823 of_property_for_each_u32(np, "wlf,max-channels-clocked", prop, cur, val) { in arizona_of_get_audio_pdata()
2824 if (count == ARRAY_SIZE(pdata->max_channels_clocked)) in arizona_of_get_audio_pdata()
2827 pdata->max_channels_clocked[count] = val; in arizona_of_get_audio_pdata()
2832 of_property_for_each_u32(np, "wlf,out-volume-limit", prop, cur, val) { in arizona_of_get_audio_pdata()
2833 if (count == ARRAY_SIZE(pdata->out_vol_limit)) in arizona_of_get_audio_pdata()
2836 pdata->out_vol_limit[count] = val; in arizona_of_get_audio_pdata()
2840 ret = of_property_read_u32_array(np, "wlf,spk-fmt", in arizona_of_get_audio_pdata()
2844 for (count = 0; count < ARRAY_SIZE(pdata->spk_fmt); ++count) in arizona_of_get_audio_pdata()
2845 pdata->spk_fmt[count] = pdm_val[count]; in arizona_of_get_audio_pdata()
2847 ret = of_property_read_u32_array(np, "wlf,spk-mute", in arizona_of_get_audio_pdata()
2851 for (count = 0; count < ARRAY_SIZE(pdata->spk_mute); ++count) in arizona_of_get_audio_pdata()
2852 pdata->spk_mute[count] = pdm_val[count]; in arizona_of_get_audio_pdata()