Lines Matching +full:max +full:- +full:channels +full:- +full:clocked
2 * arizona.c - Wolfson Arizona class device shared support
70 dev_err(_fll->arizona->dev, "FLL%d: " fmt, _fll->id, ##__VA_ARGS__)
72 dev_warn(_fll->arizona->dev, "FLL%d: " fmt, _fll->id, ##__VA_ARGS__)
74 dev_dbg(_fll->arizona->dev, "FLL%d: " fmt, _fll->id, ##__VA_ARGS__)
77 dev_err(_dai->dev, "AIF%d: " fmt, _dai->id, ##__VA_ARGS__)
79 dev_warn(_dai->dev, "AIF%d: " fmt, _dai->id, ##__VA_ARGS__)
81 dev_dbg(_dai->dev, "AIF%d: " fmt, _dai->id, ##__VA_ARGS__)
87 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in arizona_spk_ev()
88 struct arizona *arizona = dev_get_drvdata(component->dev->parent); in arizona_spk_ev()
96 dev_crit(arizona->dev, in arizona_spk_ev()
98 return -EBUSY; in arizona_spk_ev()
101 regmap_update_bits_async(arizona->regmap, in arizona_spk_ev()
103 1 << w->shift, 1 << w->shift); in arizona_spk_ev()
106 regmap_update_bits_async(arizona->regmap, in arizona_spk_ev()
108 1 << w->shift, 0); in arizona_spk_ev()
123 ret = regmap_read(arizona->regmap, ARIZONA_INTERRUPT_RAW_STATUS_3, in arizona_thermal_warn()
126 dev_err(arizona->dev, "Failed to read thermal status: %d\n", in arizona_thermal_warn()
129 dev_crit(arizona->dev, "Thermal warning\n"); in arizona_thermal_warn()
141 ret = regmap_read(arizona->regmap, ARIZONA_INTERRUPT_RAW_STATUS_3, in arizona_thermal_shutdown()
144 dev_err(arizona->dev, "Failed to read thermal status: %d\n", in arizona_thermal_shutdown()
147 dev_crit(arizona->dev, "Thermal shutdown\n"); in arizona_thermal_shutdown()
148 ret = regmap_update_bits(arizona->regmap, in arizona_thermal_shutdown()
153 dev_crit(arizona->dev, in arizona_thermal_shutdown()
177 struct arizona *arizona = priv->arizona; in arizona_init_spk()
184 switch (arizona->type) { in arizona_init_spk()
208 dev_err(arizona->dev, in arizona_init_spk_irqs()
216 dev_err(arizona->dev, in arizona_init_spk_irqs()
246 struct arizona *arizona = priv->arizona; in arizona_init_mono()
250 if (arizona->pdata.out_mono[i]) in arizona_init_mono()
262 struct arizona *arizona = priv->arizona; in arizona_init_gpio()
265 switch (arizona->type) { in arizona_init_gpio()
277 for (i = 0; i < ARRAY_SIZE(arizona->pdata.gpio_defaults); i++) { in arizona_init_gpio()
278 switch (arizona->pdata.gpio_defaults[i] & ARIZONA_GPN_FN_MASK) { in arizona_init_gpio()
298 struct arizona_pdata *pdata = &arizona->pdata; in arizona_init_common()
302 BLOCKING_INIT_NOTIFIER_HEAD(&arizona->notifier); in arizona_init_common()
306 if (pdata->out_mono[i]) in arizona_init_common()
311 regmap_update_bits(arizona->regmap, in arizona_init_common()
317 if (pdata->spk_mute[i]) in arizona_init_common()
318 regmap_update_bits(arizona->regmap, in arizona_init_common()
322 pdata->spk_mute[i]); in arizona_init_common()
324 if (pdata->spk_fmt[i]) in arizona_init_common()
325 regmap_update_bits(arizona->regmap, in arizona_init_common()
328 pdata->spk_fmt[i]); in arizona_init_common()
333 val = pdata->dmic_ref[i] << ARIZONA_IN1_DMIC_SUP_SHIFT; in arizona_init_common()
334 if (pdata->inmode[i] & ARIZONA_INMODE_DMIC) in arizona_init_common()
337 switch (arizona->type) { in arizona_init_common()
340 regmap_update_bits(arizona->regmap, in arizona_init_common()
343 (pdata->inmode[i] & ARIZONA_INMODE_SE) in arizona_init_common()
346 regmap_update_bits(arizona->regmap, in arizona_init_common()
349 (pdata->inmode[i] & ARIZONA_INMODE_SE) in arizona_init_common()
356 if (pdata->inmode[i] & ARIZONA_INMODE_SE) in arizona_init_common()
365 regmap_update_bits(arizona->regmap, in arizona_init_common()
378 for (i = 0; i < ARRAY_SIZE(arizona->pdata.out_vol_limit); ++i) { in arizona_init_vol_limit()
379 if (arizona->pdata.out_vol_limit[i]) in arizona_init_vol_limit()
380 regmap_update_bits(arizona->regmap, in arizona_init_vol_limit()
383 arizona->pdata.out_vol_limit[i]); in arizona_init_vol_limit()
606 const DECLARE_TLV_DB_SCALE(arizona_mixer_tlv, -3200, 100, 0);
680 ARIZONA_RATE_ENUM_SIZE - 1,
714 "Low-pass", "High-pass"
894 for (i = 0; i < priv->num_inputs; i++) in arizona_in_set_vu()
912 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in arizona_in_ev()
916 if (w->shift % 2) in arizona_in_ev()
917 reg = ARIZONA_ADC_DIGITAL_VOLUME_1L + ((w->shift / 2) * 8); in arizona_in_ev()
919 reg = ARIZONA_ADC_DIGITAL_VOLUME_1R + ((w->shift / 2) * 8); in arizona_in_ev()
923 priv->in_pending++; in arizona_in_ev()
930 priv->in_pending--; in arizona_in_ev()
931 if (priv->in_pending == 0) { in arizona_in_ev()
959 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in arizona_out_ev()
961 struct arizona *arizona = priv->arizona; in arizona_out_ev()
965 switch (w->shift) { in arizona_out_ev()
972 priv->out_up_pending++; in arizona_out_ev()
973 priv->out_up_delay += 17; in arizona_out_ev()
977 priv->out_up_pending++; in arizona_out_ev()
978 switch (arizona->type) { in arizona_out_ev()
983 priv->out_up_delay += 10; in arizona_out_ev()
992 switch (w->shift) { in arizona_out_ev()
1001 priv->out_up_pending--; in arizona_out_ev()
1002 if (!priv->out_up_pending && priv->out_up_delay) { in arizona_out_ev()
1003 dev_dbg(component->dev, "Power up delay: %d\n", in arizona_out_ev()
1004 priv->out_up_delay); in arizona_out_ev()
1005 msleep(priv->out_up_delay); in arizona_out_ev()
1006 priv->out_up_delay = 0; in arizona_out_ev()
1015 switch (w->shift) { in arizona_out_ev()
1022 priv->out_down_pending++; in arizona_out_ev()
1023 priv->out_down_delay++; in arizona_out_ev()
1027 priv->out_down_pending++; in arizona_out_ev()
1028 switch (arizona->type) { in arizona_out_ev()
1034 priv->out_down_delay += 5; in arizona_out_ev()
1037 priv->out_down_delay++; in arizona_out_ev()
1045 switch (w->shift) { in arizona_out_ev()
1054 priv->out_down_pending--; in arizona_out_ev()
1055 if (!priv->out_down_pending && priv->out_down_delay) { in arizona_out_ev()
1056 dev_dbg(component->dev, "Power down delay: %d\n", in arizona_out_ev()
1057 priv->out_down_delay); in arizona_out_ev()
1058 msleep(priv->out_down_delay); in arizona_out_ev()
1059 priv->out_down_delay = 0; in arizona_out_ev()
1077 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in arizona_hp_ev()
1079 struct arizona *arizona = priv->arizona; in arizona_hp_ev()
1080 unsigned int mask = 1 << w->shift; in arizona_hp_ev()
1094 return -EINVAL; in arizona_hp_ev()
1098 priv->arizona->hp_ena &= ~mask; in arizona_hp_ev()
1099 priv->arizona->hp_ena |= val; in arizona_hp_ev()
1102 if (priv->arizona->hpdet_clamp) in arizona_hp_ev()
1105 regmap_update_bits_async(arizona->regmap, ARIZONA_OUTPUT_ENABLES_1, in arizona_hp_ev()
1115 struct arizona *arizona = priv->arizona; in arizona_dvfs_enable()
1118 ret = regulator_set_voltage(arizona->dcvdd, 1800000, 1800000); in arizona_dvfs_enable()
1120 dev_err(component->dev, "Failed to boost DCVDD: %d\n", ret); in arizona_dvfs_enable()
1124 ret = regmap_update_bits(arizona->regmap, in arizona_dvfs_enable()
1129 dev_err(component->dev, "Failed to enable subsys max: %d\n", ret); in arizona_dvfs_enable()
1130 regulator_set_voltage(arizona->dcvdd, 1200000, 1800000); in arizona_dvfs_enable()
1140 struct arizona *arizona = priv->arizona; in arizona_dvfs_disable()
1143 ret = regmap_update_bits(arizona->regmap, in arizona_dvfs_disable()
1147 dev_err(component->dev, "Failed to disable subsys max: %d\n", ret); in arizona_dvfs_disable()
1151 ret = regulator_set_voltage(arizona->dcvdd, 1200000, 1800000); in arizona_dvfs_disable()
1153 dev_err(component->dev, "Failed to unboost DCVDD: %d\n", ret); in arizona_dvfs_disable()
1165 mutex_lock(&priv->dvfs_lock); in arizona_dvfs_up()
1167 if (!priv->dvfs_cached && !priv->dvfs_reqs) { in arizona_dvfs_up()
1173 priv->dvfs_reqs |= flags; in arizona_dvfs_up()
1175 mutex_unlock(&priv->dvfs_lock); in arizona_dvfs_up()
1186 mutex_lock(&priv->dvfs_lock); in arizona_dvfs_down()
1188 old_reqs = priv->dvfs_reqs; in arizona_dvfs_down()
1189 priv->dvfs_reqs &= ~flags; in arizona_dvfs_down()
1191 if (!priv->dvfs_cached && old_reqs && !priv->dvfs_reqs) in arizona_dvfs_down()
1194 mutex_unlock(&priv->dvfs_lock); in arizona_dvfs_down()
1202 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in arizona_dvfs_sysclk_ev()
1206 mutex_lock(&priv->dvfs_lock); in arizona_dvfs_sysclk_ev()
1210 if (priv->dvfs_reqs) in arizona_dvfs_sysclk_ev()
1213 priv->dvfs_cached = false; in arizona_dvfs_sysclk_ev()
1220 priv->dvfs_cached = true; in arizona_dvfs_sysclk_ev()
1222 if (priv->dvfs_reqs) in arizona_dvfs_sysclk_ev()
1229 mutex_unlock(&priv->dvfs_lock); in arizona_dvfs_sysclk_ev()
1236 mutex_init(&priv->dvfs_lock); in arizona_init_dvfs()
1244 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in arizona_anc_ev()
1249 val = 1 << w->shift; in arizona_anc_ev()
1252 val = 1 << (w->shift + 1); in arizona_anc_ev()
1289 refclk = priv->sysclk; in arizona_set_opclk()
1293 refclk = priv->asyncclk; in arizona_set_opclk()
1296 return -EINVAL; in arizona_set_opclk()
1309 dev_dbg(component->dev, "Configured %dHz OPCLK\n", in arizona_set_opclk()
1323 dev_err(component->dev, "Unable to generate %dHz OPCLK\n", freq); in arizona_set_opclk()
1324 return -EINVAL; in arizona_set_opclk()
1330 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in arizona_clk_ev()
1331 struct arizona *arizona = dev_get_drvdata(component->dev->parent); in arizona_clk_ev()
1336 ret = regmap_read(arizona->regmap, w->reg, &val); in arizona_clk_ev()
1338 dev_err(component->dev, "Failed to check clock source: %d\n", ret); in arizona_clk_ev()
1357 return clk_prepare_enable(arizona->mclk[clk_idx]); in arizona_clk_ev()
1359 clk_disable_unprepare(arizona->mclk[clk_idx]); in arizona_clk_ev()
1371 struct arizona *arizona = priv->arizona; in arizona_set_sysclk()
1382 clk = &priv->sysclk; in arizona_set_sysclk()
1388 clk = &priv->asyncclk; in arizona_set_sysclk()
1394 return -EINVAL; in arizona_set_sysclk()
1426 dev_dbg(arizona->dev, "%s cleared\n", name); in arizona_set_sysclk()
1430 return -EINVAL; in arizona_set_sysclk()
1438 dev_dbg(arizona->dev, "%s set to %uHz", name, freq); in arizona_set_sysclk()
1440 return regmap_update_bits(arizona->regmap, reg, mask, val); in arizona_set_sysclk()
1446 struct snd_soc_component *component = dai->component; in arizona_set_fmt()
1448 struct arizona *arizona = priv->arizona; in arizona_set_fmt()
1451 base = dai->driver->base; in arizona_set_fmt()
1464 return -EINVAL; in arizona_set_fmt()
1475 return -EINVAL; in arizona_set_fmt()
1482 return -EINVAL; in arizona_set_fmt()
1501 return -EINVAL; in arizona_set_fmt()
1518 return -EINVAL; in arizona_set_fmt()
1521 regmap_update_bits_async(arizona->regmap, base + ARIZONA_AIF_BCLK_CTRL, in arizona_set_fmt()
1525 regmap_update_bits_async(arizona->regmap, base + ARIZONA_AIF_TX_PIN_CTRL, in arizona_set_fmt()
1528 regmap_update_bits_async(arizona->regmap, in arizona_set_fmt()
1532 regmap_update_bits(arizona->regmap, base + ARIZONA_AIF_FORMAT, in arizona_set_fmt()
1539 -1,
1561 -1,
1621 struct snd_soc_component *component = dai->component; in arizona_startup()
1623 struct arizona_dai_priv *dai_priv = &priv->dai[dai->id - 1]; in arizona_startup()
1626 if (!substream->runtime) in arizona_startup()
1629 switch (dai_priv->clk) { in arizona_startup()
1631 base_rate = priv->sysclk; in arizona_startup()
1634 base_rate = priv->asyncclk; in arizona_startup()
1641 dai_priv->constraint.mask = ARIZONA_RATE_MASK; in arizona_startup()
1643 dai_priv->constraint.mask = ARIZONA_44K1_RATE_MASK; in arizona_startup()
1645 dai_priv->constraint.mask = ARIZONA_48K_RATE_MASK; in arizona_startup()
1647 return snd_pcm_hw_constraint_list(substream->runtime, 0, in arizona_startup()
1649 &dai_priv->constraint); in arizona_startup()
1656 struct arizona *arizona = priv->arizona; in arizona_wm5102_set_dac_comp()
1664 mutex_lock(&arizona->dac_comp_lock); in arizona_wm5102_set_dac_comp()
1666 dac_comp[1].def = arizona->dac_comp_coeff; in arizona_wm5102_set_dac_comp()
1668 dac_comp[2].def = arizona->dac_comp_enabled; in arizona_wm5102_set_dac_comp()
1670 mutex_unlock(&arizona->dac_comp_lock); in arizona_wm5102_set_dac_comp()
1672 regmap_multi_reg_write(arizona->regmap, in arizona_wm5102_set_dac_comp()
1681 struct snd_soc_component *component = dai->component; in arizona_hw_params_rate()
1683 struct arizona_dai_priv *dai_priv = &priv->dai[dai->id - 1]; in arizona_hw_params_rate()
1684 int base = dai->driver->base; in arizona_hw_params_rate()
1697 return -EINVAL; in arizona_hw_params_rate()
1701 switch (priv->arizona->type) { in arizona_hw_params_rate()
1718 switch (dai_priv->clk) { in arizona_hw_params_rate()
1720 switch (priv->arizona->type) { in arizona_hw_params_rate()
1749 arizona_aif_err(dai, "Invalid clock %d\n", dai_priv->clk); in arizona_hw_params_rate()
1750 return -EINVAL; in arizona_hw_params_rate()
1781 struct snd_soc_component *component = dai->component; in arizona_hw_params()
1783 struct arizona *arizona = priv->arizona; in arizona_hw_params()
1784 int base = dai->driver->base; in arizona_hw_params()
1787 int channels = params_channels(params); in arizona_hw_params() local
1788 int chan_limit = arizona->pdata.max_channels_clocked[dai->id - 1]; in arizona_hw_params()
1789 int tdm_width = arizona->tdm_width[dai->id - 1]; in arizona_hw_params()
1790 int tdm_slots = arizona->tdm_slots[dai->id - 1]; in arizona_hw_params()
1806 channels = tdm_slots; in arizona_hw_params()
1812 if (chan_limit && chan_limit < channels) { in arizona_hw_params()
1813 arizona_aif_dbg(dai, "Limiting to %d channels\n", chan_limit); in arizona_hw_params()
1814 bclk_target /= channels; in arizona_hw_params()
1818 /* Force multiple of 2 channels for I2S mode */ in arizona_hw_params()
1821 if ((channels & 1) && (val == ARIZONA_FMT_I2S_MODE)) { in arizona_hw_params()
1823 bclk_target /= channels; in arizona_hw_params()
1824 bclk_target *= channels + 1; in arizona_hw_params()
1837 return -EINVAL; in arizona_hw_params()
1856 regmap_update_bits_async(arizona->regmap, in arizona_hw_params()
1859 regmap_update_bits(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()
1877 regmap_update_bits_async(arizona->regmap, in arizona_hw_params()
1881 regmap_update_bits(arizona->regmap, in arizona_hw_params()
1890 regmap_update_bits_async(arizona->regmap, in arizona_hw_params()
1893 regmap_update_bits(arizona->regmap, in arizona_hw_params()
1915 struct snd_soc_component *component = dai->component; in arizona_dai_set_sysclk()
1918 struct arizona_dai_priv *dai_priv = &priv->dai[dai->id - 1]; in arizona_dai_set_sysclk()
1926 return -EINVAL; in arizona_dai_set_sysclk()
1929 if (clk_id == dai_priv->clk) in arizona_dai_set_sysclk()
1932 if (dai->active) { in arizona_dai_set_sysclk()
1933 dev_err(component->dev, "Can't change clock on active DAI %d\n", in arizona_dai_set_sysclk()
1934 dai->id); in arizona_dai_set_sysclk()
1935 return -EBUSY; in arizona_dai_set_sysclk()
1938 dev_dbg(component->dev, "Setting AIF%d to %s\n", dai->id + 1, in arizona_dai_set_sysclk()
1942 routes[0].sink = dai->driver->capture.stream_name; in arizona_dai_set_sysclk()
1943 routes[1].sink = dai->driver->playback.stream_name; in arizona_dai_set_sysclk()
1945 routes[0].source = arizona_dai_clk_str(dai_priv->clk); in arizona_dai_set_sysclk()
1946 routes[1].source = arizona_dai_clk_str(dai_priv->clk); in arizona_dai_set_sysclk()
1953 dai_priv->clk = clk_id; in arizona_dai_set_sysclk()
1960 struct snd_soc_component *component = dai->component; in arizona_set_tristate()
1961 int base = dai->driver->base; in arizona_set_tristate()
1976 int channels, unsigned int mask) in arizona_set_channels_to_mask() argument
1978 struct snd_soc_component *component = dai->component; in arizona_set_channels_to_mask()
1980 struct arizona *arizona = priv->arizona; in arizona_set_channels_to_mask()
1983 for (i = 0; i < channels; ++i) { in arizona_set_channels_to_mask()
1984 slot = ffs(mask) - 1; in arizona_set_channels_to_mask()
1988 regmap_write(arizona->regmap, base + i, slot); in arizona_set_channels_to_mask()
1994 arizona_aif_warn(dai, "Too many channels in TDM mask\n"); in arizona_set_channels_to_mask()
2000 struct snd_soc_component *component = dai->component; in arizona_set_tdm_slot()
2002 struct arizona *arizona = priv->arizona; in arizona_set_tdm_slot()
2003 int base = dai->driver->base; in arizona_set_tdm_slot()
2004 int rx_max_chan = dai->driver->playback.channels_max; in arizona_set_tdm_slot()
2005 int tx_max_chan = dai->driver->capture.channels_max; in arizona_set_tdm_slot()
2008 if (dai->id > ARIZONA_MAX_AIF) in arizona_set_tdm_slot()
2009 return -ENOTSUPP; in arizona_set_tdm_slot()
2012 tx_mask = (1 << tx_max_chan) - 1; in arizona_set_tdm_slot()
2013 rx_mask = (1 << rx_max_chan) - 1; in arizona_set_tdm_slot()
2021 arizona->tdm_width[dai->id - 1] = slot_width; in arizona_set_tdm_slot()
2022 arizona->tdm_slots[dai->id - 1] = slots; in arizona_set_tdm_slot()
2046 struct arizona_dai_priv *dai_priv = &priv->dai[id]; in arizona_init_dai()
2048 dai_priv->clk = ARIZONA_CLK_SYSCLK; in arizona_init_dai()
2049 dai_priv->constraint = arizona_constraint; in arizona_init_dai()
2057 unsigned int max; member
2089 unsigned int max; member
2113 if (fll->fout && Fout != fll->fout) { in arizona_validate_fll()
2116 return -EINVAL; in arizona_validate_fll()
2123 return -EINVAL; in arizona_validate_fll()
2126 Fvco_min = ARIZONA_FLL_MIN_FVCO * fll->vco_mult; in arizona_validate_fll()
2130 return -EINVAL; in arizona_validate_fll()
2142 if (fll_fratios[i].min <= Fref && Fref <= fll_fratios[i].max) { in arizona_find_fratio()
2149 return -EINVAL; in arizona_find_fratio()
2162 cfg->refdiv = 0; in arizona_calc_fratio()
2166 cfg->refdiv++; in arizona_calc_fratio()
2169 return -EINVAL; in arizona_calc_fratio()
2173 init_ratio = arizona_find_fratio(Fref, &cfg->fratio); in arizona_calc_fratio()
2180 switch (fll->arizona->type) { in arizona_calc_fratio()
2186 if (fll->arizona->rev < 3 || sync) in arizona_calc_fratio()
2195 cfg->fratio = init_ratio - 1; in arizona_calc_fratio()
2198 refdiv = cfg->refdiv; in arizona_calc_fratio()
2207 for (ratio = init_ratio; ratio > 0; ratio--) { in arizona_calc_fratio()
2209 cfg->refdiv = refdiv; in arizona_calc_fratio()
2210 cfg->fratio = ratio - 1; in arizona_calc_fratio()
2221 (fll->vco_mult * ratio) < Fref) { in arizona_calc_fratio()
2226 if (Fref > pseudo_fref_max[ratio - 1]) { in arizona_calc_fratio()
2228 "pseudo: exceeded max fref(%u) for ratio=%u\n", in arizona_calc_fratio()
2229 pseudo_fref_max[ratio - 1], in arizona_calc_fratio()
2235 cfg->refdiv = refdiv; in arizona_calc_fratio()
2236 cfg->fratio = ratio - 1; in arizona_calc_fratio()
2254 return cfg->fratio + 1; in arizona_calc_fratio()
2264 arizona_fll_dbg(fll, "Fref=%u Fout=%u\n", Fref, fll->fout); in arizona_calc_fll()
2268 while (fll->fout * div < ARIZONA_FLL_MIN_FVCO * fll->vco_mult) { in arizona_calc_fll()
2271 return -EINVAL; in arizona_calc_fll()
2273 target = fll->fout * div / fll->vco_mult; in arizona_calc_fll()
2274 cfg->outdiv = div; in arizona_calc_fll()
2284 Fref = Fref / (1 << cfg->refdiv); in arizona_calc_fll()
2286 cfg->n = target / (ratio * Fref); in arizona_calc_fll()
2292 cfg->theta = (target - (cfg->n * ratio * Fref)) in arizona_calc_fll()
2294 cfg->lambda = (ratio * Fref) / gcd_fll; in arizona_calc_fll()
2296 cfg->theta = 0; in arizona_calc_fll()
2297 cfg->lambda = 0; in arizona_calc_fll()
2304 while (cfg->lambda >= (1 << 16)) { in arizona_calc_fll()
2305 cfg->theta >>= 1; in arizona_calc_fll()
2306 cfg->lambda >>= 1; in arizona_calc_fll()
2310 if (fll_gains[i].min <= Fref && Fref <= fll_gains[i].max) { in arizona_calc_fll()
2311 cfg->gain = fll_gains[i].gain; in arizona_calc_fll()
2318 return -EINVAL; in arizona_calc_fll()
2322 cfg->n, cfg->theta, cfg->lambda); in arizona_calc_fll()
2324 cfg->fratio, ratio, cfg->outdiv, in arizona_calc_fll()
2325 cfg->refdiv, 1 << cfg->refdiv); in arizona_calc_fll()
2326 arizona_fll_dbg(fll, "GAIN=0x%x(%d)\n", cfg->gain, 1 << cfg->gain); in arizona_calc_fll()
2335 regmap_update_bits_async(arizona->regmap, base + 3, in arizona_apply_fll()
2336 ARIZONA_FLL1_THETA_MASK, cfg->theta); in arizona_apply_fll()
2337 regmap_update_bits_async(arizona->regmap, base + 4, in arizona_apply_fll()
2338 ARIZONA_FLL1_LAMBDA_MASK, cfg->lambda); in arizona_apply_fll()
2339 regmap_update_bits_async(arizona->regmap, base + 5, in arizona_apply_fll()
2341 cfg->fratio << ARIZONA_FLL1_FRATIO_SHIFT); in arizona_apply_fll()
2342 regmap_update_bits_async(arizona->regmap, base + 6, in arizona_apply_fll()
2345 cfg->refdiv << ARIZONA_FLL1_CLK_REF_DIV_SHIFT | in arizona_apply_fll()
2349 regmap_update_bits(arizona->regmap, base + 0x7, in arizona_apply_fll()
2351 cfg->gain << ARIZONA_FLL1_GAIN_SHIFT); in arizona_apply_fll()
2353 regmap_update_bits(arizona->regmap, base + 0x5, in arizona_apply_fll()
2355 cfg->outdiv << ARIZONA_FLL1_OUTDIV_SHIFT); in arizona_apply_fll()
2356 regmap_update_bits(arizona->regmap, base + 0x9, in arizona_apply_fll()
2358 cfg->gain << ARIZONA_FLL1_GAIN_SHIFT); in arizona_apply_fll()
2361 regmap_update_bits_async(arizona->regmap, base + 2, in arizona_apply_fll()
2363 ARIZONA_FLL1_CTRL_UPD | cfg->n); in arizona_apply_fll()
2368 struct arizona *arizona = fll->arizona; in arizona_is_enabled_fll()
2372 ret = regmap_read(arizona->regmap, base + 1, ®); in arizona_is_enabled_fll()
2384 struct arizona *arizona = fll->arizona; in arizona_set_fll_clks()
2389 ret = regmap_read(arizona->regmap, base + 6, &val); in arizona_set_fll_clks()
2401 clk = arizona->mclk[ARIZONA_MCLK1]; in arizona_set_fll_clks()
2404 clk = arizona->mclk[ARIZONA_MCLK2]; in arizona_set_fll_clks()
2420 struct arizona *arizona = fll->arizona; in arizona_enable_fll()
2422 int already_enabled = arizona_is_enabled_fll(fll, fll->base); in arizona_enable_fll()
2423 int sync_enabled = arizona_is_enabled_fll(fll, fll->base + 0x10); in arizona_enable_fll()
2435 regmap_update_bits(fll->arizona->regmap, fll->base + 1, in arizona_enable_fll()
2438 regmap_update_bits_async(fll->arizona->regmap, fll->base + 0x9, in arizona_enable_fll()
2441 if (arizona_is_enabled_fll(fll, fll->base + 0x10) > 0) in arizona_enable_fll()
2442 arizona_set_fll_clks(fll, fll->base + 0x10, false); in arizona_enable_fll()
2443 arizona_set_fll_clks(fll, fll->base, false); in arizona_enable_fll()
2450 if (fll->ref_src >= 0 && fll->ref_freq && in arizona_enable_fll()
2451 fll->ref_src != fll->sync_src) { in arizona_enable_fll()
2452 arizona_calc_fll(fll, &cfg, fll->ref_freq, false); in arizona_enable_fll()
2455 if (fll->sync_src >= 0 && cfg.lambda) in arizona_enable_fll()
2458 arizona_apply_fll(arizona, fll->base, &cfg, fll->ref_src, in arizona_enable_fll()
2460 if (fll->sync_src >= 0) { in arizona_enable_fll()
2461 arizona_calc_fll(fll, &cfg, fll->sync_freq, true); in arizona_enable_fll()
2463 arizona_apply_fll(arizona, fll->base + 0x10, &cfg, in arizona_enable_fll()
2464 fll->sync_src, true); in arizona_enable_fll()
2467 } else if (fll->sync_src >= 0) { in arizona_enable_fll()
2468 arizona_calc_fll(fll, &cfg, fll->sync_freq, false); in arizona_enable_fll()
2470 arizona_apply_fll(arizona, fll->base, &cfg, in arizona_enable_fll()
2471 fll->sync_src, false); in arizona_enable_fll()
2473 regmap_update_bits_async(arizona->regmap, fll->base + 0x11, in arizona_enable_fll()
2477 return -EINVAL; in arizona_enable_fll()
2487 if (use_sync && fll->sync_freq > 100000) in arizona_enable_fll()
2488 regmap_update_bits_async(arizona->regmap, fll->base + 0x17, in arizona_enable_fll()
2491 regmap_update_bits_async(arizona->regmap, fll->base + 0x17, in arizona_enable_fll()
2496 pm_runtime_get_sync(arizona->dev); in arizona_enable_fll()
2499 arizona_set_fll_clks(fll, fll->base + 0x10, true); in arizona_enable_fll()
2500 regmap_update_bits_async(arizona->regmap, fll->base + 0x11, in arizona_enable_fll()
2504 arizona_set_fll_clks(fll, fll->base, true); in arizona_enable_fll()
2505 regmap_update_bits_async(arizona->regmap, fll->base + 1, in arizona_enable_fll()
2509 regmap_update_bits_async(arizona->regmap, fll->base + 1, in arizona_enable_fll()
2520 regmap_read(arizona->regmap, in arizona_enable_fll()
2523 if (val & (ARIZONA_FLL1_CLOCK_OK_STS << (fll->id - 1))) in arizona_enable_fll()
2536 struct arizona *arizona = fll->arizona; in arizona_disable_fll()
2539 regmap_update_bits_async(arizona->regmap, fll->base + 1, in arizona_disable_fll()
2541 regmap_update_bits_check(arizona->regmap, fll->base + 1, in arizona_disable_fll()
2543 regmap_update_bits_check(arizona->regmap, fll->base + 0x11, in arizona_disable_fll()
2545 regmap_update_bits_async(arizona->regmap, fll->base + 1, in arizona_disable_fll()
2549 arizona_set_fll_clks(fll, fll->base + 0x10, false); in arizona_disable_fll()
2552 arizona_set_fll_clks(fll, fll->base, false); in arizona_disable_fll()
2553 pm_runtime_put_autosuspend(arizona->dev); in arizona_disable_fll()
2562 if (fll->ref_src == source && fll->ref_freq == Fref) in arizona_set_fll_refclk()
2565 if (fll->fout && Fref > 0) { in arizona_set_fll_refclk()
2566 ret = arizona_validate_fll(fll, Fref, fll->fout); in arizona_set_fll_refclk()
2571 fll->ref_src = source; in arizona_set_fll_refclk()
2572 fll->ref_freq = Fref; in arizona_set_fll_refclk()
2574 if (fll->fout && Fref > 0) in arizona_set_fll_refclk()
2586 if (fll->sync_src == source && in arizona_set_fll()
2587 fll->sync_freq == Fref && fll->fout == Fout) in arizona_set_fll()
2591 if (fll->ref_src >= 0) { in arizona_set_fll()
2592 ret = arizona_validate_fll(fll, fll->ref_freq, Fout); in arizona_set_fll()
2602 fll->sync_src = source; in arizona_set_fll()
2603 fll->sync_freq = Fref; in arizona_set_fll()
2604 fll->fout = Fout; in arizona_set_fll()
2620 fll->id = id; in arizona_init_fll()
2621 fll->base = base; in arizona_init_fll()
2622 fll->arizona = arizona; in arizona_init_fll()
2623 fll->sync_src = ARIZONA_FLL_SRC_NONE; in arizona_init_fll()
2626 regmap_read(arizona->regmap, ARIZONA_CLOCK_32K_1, &val); in arizona_init_fll()
2630 fll->ref_src = val & ARIZONA_CLK_32K_SRC_MASK; in arizona_init_fll()
2633 fll->ref_src = ARIZONA_FLL_SRC_NONE; in arizona_init_fll()
2635 fll->ref_freq = 32768; in arizona_init_fll()
2637 snprintf(fll->lock_name, sizeof(fll->lock_name), "FLL%d lock", id); in arizona_init_fll()
2638 snprintf(fll->clock_ok_name, sizeof(fll->clock_ok_name), in arizona_init_fll()
2641 regmap_update_bits(arizona->regmap, fll->base + 1, in arizona_init_fll()
2649 * arizona_set_output_mode - Set the mode of the specified output
2670 return -EINVAL; in arizona_set_output_mode()
2672 reg = ARIZONA_OUTPUT_PATH_CONFIG_1L + (output - 1) * 8; in arizona_set_output_mode()
2722 return (abs((a << 16) / (4096 - b)) >= 4096 << 4); in arizona_eq_filter_unstable()
2730 struct arizona *arizona = dev_get_drvdata(component->dev->parent); in arizona_eq_coeff_put()
2731 struct soc_bytes *params = (void *)kcontrol->private_value; in arizona_eq_coeff_put()
2737 len = params->num_regs * regmap_get_val_bytes(arizona->regmap); in arizona_eq_coeff_put()
2739 data = kmemdup(ucontrol->value.bytes.data, len, GFP_KERNEL | GFP_DMA); in arizona_eq_coeff_put()
2741 return -ENOMEM; in arizona_eq_coeff_put()
2750 dev_err(arizona->dev, "Rejecting unstable EQ coefficients\n"); in arizona_eq_coeff_put()
2751 ret = -EINVAL; in arizona_eq_coeff_put()
2755 ret = regmap_read(arizona->regmap, params->base, &val); in arizona_eq_coeff_put()
2762 ret = regmap_raw_write(arizona->regmap, params->base, data, len); in arizona_eq_coeff_put()
2774 struct arizona *arizona = dev_get_drvdata(component->dev->parent); in arizona_lhpf_coeff_put()
2775 __be16 *data = (__be16 *)ucontrol->value.bytes.data; in arizona_lhpf_coeff_put()
2779 dev_err(arizona->dev, "Rejecting unstable LHPF coefficients\n"); in arizona_lhpf_coeff_put()
2780 return -EINVAL; in arizona_lhpf_coeff_put()
2789 struct arizona_pdata *pdata = &arizona->pdata; in arizona_of_get_audio_pdata()
2790 struct device_node *np = arizona->dev->of_node; in arizona_of_get_audio_pdata()
2800 if (count == ARRAY_SIZE(pdata->inmode)) in arizona_of_get_audio_pdata()
2803 pdata->inmode[count] = val; in arizona_of_get_audio_pdata()
2808 of_property_for_each_u32(np, "wlf,dmic-ref", prop, cur, val) { in arizona_of_get_audio_pdata()
2809 if (count == ARRAY_SIZE(pdata->dmic_ref)) in arizona_of_get_audio_pdata()
2812 pdata->dmic_ref[count] = val; in arizona_of_get_audio_pdata()
2817 of_property_for_each_u32(np, "wlf,out-mono", prop, cur, val) { in arizona_of_get_audio_pdata()
2818 if (count == ARRAY_SIZE(pdata->out_mono)) in arizona_of_get_audio_pdata()
2821 pdata->out_mono[count] = !!val; in arizona_of_get_audio_pdata()
2826 of_property_for_each_u32(np, "wlf,max-channels-clocked", prop, cur, val) { in arizona_of_get_audio_pdata()
2827 if (count == ARRAY_SIZE(pdata->max_channels_clocked)) in arizona_of_get_audio_pdata()
2830 pdata->max_channels_clocked[count] = val; in arizona_of_get_audio_pdata()
2835 of_property_for_each_u32(np, "wlf,out-volume-limit", prop, cur, val) { in arizona_of_get_audio_pdata()
2836 if (count == ARRAY_SIZE(pdata->out_vol_limit)) in arizona_of_get_audio_pdata()
2839 pdata->out_vol_limit[count] = val; in arizona_of_get_audio_pdata()
2843 ret = of_property_read_u32_array(np, "wlf,spk-fmt", in arizona_of_get_audio_pdata()
2847 for (count = 0; count < ARRAY_SIZE(pdata->spk_fmt); ++count) in arizona_of_get_audio_pdata()
2848 pdata->spk_fmt[count] = pdm_val[count]; in arizona_of_get_audio_pdata()
2850 ret = of_property_read_u32_array(np, "wlf,spk-mute", in arizona_of_get_audio_pdata()
2854 for (count = 0; count < ARRAY_SIZE(pdata->spk_mute); ++count) in arizona_of_get_audio_pdata()
2855 pdata->spk_mute[count] = pdm_val[count]; in arizona_of_get_audio_pdata()