Lines Matching +full:syncclk +full:- +full:active
1 // SPDX-License-Identifier: GPL-2.0-only
5 // Copyright (C) 2015-2019 Cirrus Logic, Inc. and
19 #include <linux/irqchip/irq-madera.h>
23 #include <sound/madera-pdata.h>
25 #include <dt-bindings/sound/madera.h>
144 dev_err(_fll->madera->dev, "FLL%d: " fmt, _fll->id, ##__VA_ARGS__)
146 dev_warn(_fll->madera->dev, "FLL%d: " fmt, _fll->id, ##__VA_ARGS__)
148 dev_dbg(_fll->madera->dev, "FLL%d: " fmt, _fll->id, ##__VA_ARGS__)
151 dev_err(_dai->dev, "AIF%d: " fmt, _dai->id, ##__VA_ARGS__)
153 dev_warn(_dai->dev, "AIF%d: " fmt, _dai->id, ##__VA_ARGS__)
155 dev_dbg(_dai->dev, "AIF%d: " fmt, _dai->id, ##__VA_ARGS__)
170 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in madera_clk_ev()
172 struct madera *madera = priv->madera; in madera_clk_ev()
177 ret = regmap_read(madera->regmap, w->reg, &val); in madera_clk_ev()
179 dev_err(madera->dev, "Failed to check clock source: %d\n", ret); in madera_clk_ev()
199 return clk_prepare_enable(madera->mclk[clk_idx].clk); in madera_clk_ev()
201 clk_disable_unprepare(madera->mclk[clk_idx].clk); in madera_clk_ev()
211 struct madera *madera = priv->madera; in madera_spin_sysclk()
216 if (pm_runtime_suspended(madera->dev)) in madera_spin_sysclk()
224 ret = regmap_read(madera->regmap, MADERA_SOFTWARE_RESET, &val); in madera_spin_sysclk()
226 dev_err(madera->dev, in madera_spin_sysclk()
236 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in madera_sysclk_ev()
258 ret = regmap_read(madera->regmap, MADERA_IRQ1_RAW_STATUS_15, &val); in madera_check_speaker_overheat()
260 dev_err(madera->dev, "Failed to read thermal status: %d\n", in madera_check_speaker_overheat()
274 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in madera_spk_ev()
276 struct madera *madera = priv->madera; in madera_spk_ev()
287 dev_crit(madera->dev, in madera_spk_ev()
289 return -EBUSY; in madera_spk_ev()
292 regmap_update_bits(madera->regmap, MADERA_OUTPUT_ENABLES_1, in madera_spk_ev()
293 1 << w->shift, 1 << w->shift); in madera_spk_ev()
296 regmap_update_bits(madera->regmap, MADERA_OUTPUT_ENABLES_1, in madera_spk_ev()
297 1 << w->shift, 0); in madera_spk_ev()
315 dev_crit(madera->dev, "Thermal shutdown\n"); in madera_thermal_warn()
316 ret = regmap_update_bits(madera->regmap, in madera_thermal_warn()
321 dev_crit(madera->dev, in madera_thermal_warn()
325 dev_alert(madera->dev, "Thermal warning\n"); in madera_thermal_warn()
327 dev_info(madera->dev, "Spurious thermal warning\n"); in madera_thermal_warn()
336 struct madera *madera = priv->madera; in madera_init_overheat()
337 struct device *dev = madera->dev; in madera_init_overheat()
358 struct madera *madera = priv->madera; in madera_free_overheat()
376 if (n == -EINVAL) in madera_get_variable_u32_array()
386 return -EINVAL; in madera_get_variable_u32_array()
401 struct madera *madera = priv->madera; in madera_prop_get_inmode()
402 struct madera_codec_pdata *pdata = &madera->pdata.codec; in madera_prop_get_inmode()
406 BUILD_BUG_ON(ARRAY_SIZE(pdata->inmode) != MADERA_MAX_INPUT); in madera_prop_get_inmode()
407 BUILD_BUG_ON(ARRAY_SIZE(pdata->inmode[0]) != MADERA_MAX_MUXED_CHANNELS); in madera_prop_get_inmode()
409 n = madera_get_variable_u32_array(madera->dev, "cirrus,inmode", in madera_prop_get_inmode()
418 pdata->inmode[in_idx][ch_idx] = tmp[i]; in madera_prop_get_inmode()
429 struct madera *madera = priv->madera; in madera_prop_get_pdata()
430 struct madera_codec_pdata *pdata = &madera->pdata.codec; in madera_prop_get_pdata()
431 u32 out_mono[ARRAY_SIZE(pdata->out_mono)]; in madera_prop_get_pdata()
436 n = madera_get_variable_u32_array(madera->dev, "cirrus,out-mono", in madera_prop_get_pdata()
440 pdata->out_mono[i] = !!out_mono[i]; in madera_prop_get_pdata()
442 madera_get_variable_u32_array(madera->dev, in madera_prop_get_pdata()
443 "cirrus,max-channels-clocked", in madera_prop_get_pdata()
444 pdata->max_channels_clocked, in madera_prop_get_pdata()
445 ARRAY_SIZE(pdata->max_channels_clocked), in madera_prop_get_pdata()
448 madera_get_variable_u32_array(madera->dev, "cirrus,pdm-fmt", in madera_prop_get_pdata()
449 pdata->pdm_fmt, in madera_prop_get_pdata()
450 ARRAY_SIZE(pdata->pdm_fmt), 1); in madera_prop_get_pdata()
452 madera_get_variable_u32_array(madera->dev, "cirrus,pdm-mute", in madera_prop_get_pdata()
453 pdata->pdm_mute, in madera_prop_get_pdata()
454 ARRAY_SIZE(pdata->pdm_mute), 1); in madera_prop_get_pdata()
456 madera_get_variable_u32_array(madera->dev, "cirrus,dmic-ref", in madera_prop_get_pdata()
457 pdata->dmic_ref, in madera_prop_get_pdata()
458 ARRAY_SIZE(pdata->dmic_ref), 1); in madera_prop_get_pdata()
466 BUILD_BUG_ON(!madera_mixer_texts[MADERA_NUM_MIXER_INPUTS - 1]); in madera_core_init()
467 BUILD_BUG_ON(!madera_mixer_values[MADERA_NUM_MIXER_INPUTS - 1]); in madera_core_init()
469 if (!dev_get_platdata(priv->madera->dev)) in madera_core_init()
472 mutex_init(&priv->rate_lock); in madera_core_init()
475 priv->madera->out_clamp[i] = true; in madera_core_init()
483 mutex_destroy(&priv->rate_lock); in madera_core_free()
491 struct madera *madera = priv->madera; in madera_debug_dump_domain_groups()
494 for (i = 0; i < ARRAY_SIZE(priv->domain_group_ref); ++i) in madera_debug_dump_domain_groups()
495 dev_dbg(madera->dev, "domain_grp_ref[%d]=%d\n", i, in madera_debug_dump_domain_groups()
496 priv->domain_group_ref[i]); in madera_debug_dump_domain_groups()
503 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in madera_domain_clk_ev()
505 int dom_grp = w->shift; in madera_domain_clk_ev()
507 if (dom_grp >= ARRAY_SIZE(priv->domain_group_ref)) { in madera_domain_clk_ev()
509 return -EINVAL; in madera_domain_clk_ev()
516 mutex_lock(&priv->rate_lock); in madera_domain_clk_ev()
520 dev_dbg(priv->madera->dev, "Inc ref on domain group %d\n", in madera_domain_clk_ev()
522 ++priv->domain_group_ref[dom_grp]; in madera_domain_clk_ev()
525 dev_dbg(priv->madera->dev, "Dec ref on domain group %d\n", in madera_domain_clk_ev()
527 --priv->domain_group_ref[dom_grp]; in madera_domain_clk_ev()
535 mutex_unlock(&priv->rate_lock); in madera_domain_clk_ev()
549 struct madera *madera = priv->madera; in madera_out1_demux_put()
550 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; in madera_out1_demux_put()
555 if (ucontrol->value.enumerated.item[0] > e->items - 1) in madera_out1_demux_put()
556 return -EINVAL; in madera_out1_demux_put()
558 mux = ucontrol->value.enumerated.item[0]; in madera_out1_demux_put()
571 ret = regmap_update_bits(madera->regmap, MADERA_OUTPUT_ENABLES_1, in madera_out1_demux_put()
574 dev_warn(madera->dev, "Failed to disable outputs: %d\n", ret); in madera_out1_demux_put()
580 if (madera->out_clamp[0]) in madera_out1_demux_put()
581 ret = regmap_update_bits(madera->regmap, in madera_out1_demux_put()
585 dev_err(madera->dev, "Failed to set OUT1 demux: %d\n", ret); in madera_out1_demux_put()
588 if (!ep_sel && !madera->pdata.codec.out_mono[0]) in madera_out1_demux_put()
595 dev_warn(madera->dev, in madera_out1_demux_put()
604 (madera->out_clamp[0] && !madera->out_shorted[0])) { in madera_out1_demux_put()
605 ret = regmap_update_bits(madera->regmap, in madera_out1_demux_put()
608 madera->hp_ena); in madera_out1_demux_put()
610 dev_warn(madera->dev, in madera_out1_demux_put()
613 else if (madera->hp_ena) in madera_out1_demux_put()
624 dev_err(madera->dev, "Failed to update demux power state: %d\n", ret); in madera_out1_demux_put()
642 ucontrol->value.enumerated.item[0] = val; in madera_out1_demux_get()
656 struct madera *madera = priv->madera; in madera_inmux_put()
657 struct regmap *regmap = madera->regmap; in madera_inmux_put()
658 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; in madera_inmux_put()
664 mux = ucontrol->value.enumerated.item[0]; in madera_inmux_put()
666 return -EINVAL; in madera_inmux_put()
668 val = mux << e->shift_l; in madera_inmux_put()
669 mask = (e->mask << e->shift_l) | MADERA_IN1L_SRC_SE_MASK; in madera_inmux_put()
671 switch (e->reg) { in madera_inmux_put()
673 inmode = madera->pdata.codec.inmode[0][2 * mux]; in madera_inmux_put()
676 inmode = madera->pdata.codec.inmode[0][1 + (2 * mux)]; in madera_inmux_put()
679 inmode = madera->pdata.codec.inmode[1][2 * mux]; in madera_inmux_put()
682 inmode = madera->pdata.codec.inmode[1][1 + (2 * mux)]; in madera_inmux_put()
685 return -EINVAL; in madera_inmux_put()
691 dev_dbg(madera->dev, "mux=%u reg=0x%x inmode=0x%x mask=0x%x val=0x%x\n", in madera_inmux_put()
692 mux, e->reg, inmode, mask, val); in madera_inmux_put()
694 ret = regmap_update_bits_check(regmap, e->reg, mask, val, &changed); in madera_inmux_put()
776 count = priv->domain_group_ref[MADERA_DOM_GRP_FX]; in madera_can_change_grp_rate()
780 count = priv->domain_group_ref[MADERA_DOM_GRP_ASRC1]; in madera_can_change_grp_rate()
784 count = priv->domain_group_ref[MADERA_DOM_GRP_ASRC2]; in madera_can_change_grp_rate()
788 count = priv->domain_group_ref[MADERA_DOM_GRP_ISRC1]; in madera_can_change_grp_rate()
792 count = priv->domain_group_ref[MADERA_DOM_GRP_ISRC2]; in madera_can_change_grp_rate()
796 count = priv->domain_group_ref[MADERA_DOM_GRP_ISRC3]; in madera_can_change_grp_rate()
800 count = priv->domain_group_ref[MADERA_DOM_GRP_ISRC4]; in madera_can_change_grp_rate()
803 count = priv->domain_group_ref[MADERA_DOM_GRP_OUT]; in madera_can_change_grp_rate()
806 count = priv->domain_group_ref[MADERA_DOM_GRP_SPD]; in madera_can_change_grp_rate()
810 count = priv->domain_group_ref[MADERA_DOM_GRP_DSP1]; in madera_can_change_grp_rate()
814 count = priv->domain_group_ref[MADERA_DOM_GRP_DSP2]; in madera_can_change_grp_rate()
818 count = priv->domain_group_ref[MADERA_DOM_GRP_DSP3]; in madera_can_change_grp_rate()
822 count = priv->domain_group_ref[MADERA_DOM_GRP_DSP4]; in madera_can_change_grp_rate()
826 count = priv->domain_group_ref[MADERA_DOM_GRP_DSP5]; in madera_can_change_grp_rate()
830 count = priv->domain_group_ref[MADERA_DOM_GRP_DSP6]; in madera_can_change_grp_rate()
834 count = priv->domain_group_ref[MADERA_DOM_GRP_DSP7]; in madera_can_change_grp_rate()
837 count = priv->domain_group_ref[MADERA_DOM_GRP_AIF1]; in madera_can_change_grp_rate()
840 count = priv->domain_group_ref[MADERA_DOM_GRP_AIF2]; in madera_can_change_grp_rate()
843 count = priv->domain_group_ref[MADERA_DOM_GRP_AIF3]; in madera_can_change_grp_rate()
846 count = priv->domain_group_ref[MADERA_DOM_GRP_AIF4]; in madera_can_change_grp_rate()
856 count = priv->domain_group_ref[MADERA_DOM_GRP_SLIMBUS]; in madera_can_change_grp_rate()
859 count = priv->domain_group_ref[MADERA_DOM_GRP_PWM]; in madera_can_change_grp_rate()
865 dev_dbg(priv->madera->dev, "Rate reg 0x%x group ref %d\n", reg, count); in madera_can_change_grp_rate()
879 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; in madera_adsp_rate_get()
881 const int adsp_num = e->shift_l; in madera_adsp_rate_get()
884 mutex_lock(&priv->rate_lock); in madera_adsp_rate_get()
885 cached_rate = priv->adsp_rate_cache[adsp_num]; in madera_adsp_rate_get()
886 mutex_unlock(&priv->rate_lock); in madera_adsp_rate_get()
889 ucontrol->value.enumerated.item[0] = item; in madera_adsp_rate_get()
900 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; in madera_adsp_rate_put()
901 const int adsp_num = e->shift_l; in madera_adsp_rate_put()
902 const unsigned int item = ucontrol->value.enumerated.item[0]; in madera_adsp_rate_put()
905 if (item >= e->items) in madera_adsp_rate_put()
906 return -EINVAL; in madera_adsp_rate_put()
913 mutex_lock(&priv->rate_lock); in madera_adsp_rate_put()
915 if (!madera_can_change_grp_rate(priv, priv->adsp[adsp_num].cs_dsp.base)) { in madera_adsp_rate_put()
916 dev_warn(priv->madera->dev, in madera_adsp_rate_put()
917 "Cannot change '%s' while in use by active audio paths\n", in madera_adsp_rate_put()
918 kcontrol->id.name); in madera_adsp_rate_put()
919 ret = -EBUSY; in madera_adsp_rate_put()
920 } else if (priv->adsp_rate_cache[adsp_num] != e->values[item]) { in madera_adsp_rate_put()
922 priv->adsp_rate_cache[adsp_num] = e->values[item]; in madera_adsp_rate_put()
926 mutex_unlock(&priv->rate_lock); in madera_adsp_rate_put()
974 val = priv->adsp_rate_cache[dsp->cs_dsp.num - 1] << MADERA_DSP_RATE_SHIFT; in madera_write_adsp_clk_setting()
976 switch (priv->madera->type) { in madera_write_adsp_clk_setting()
986 dev_dbg(priv->madera->dev, "Set DSP frequency to 0x%x\n", freq); in madera_write_adsp_clk_setting()
988 ret = regmap_write(dsp->cs_dsp.regmap, in madera_write_adsp_clk_setting()
989 dsp->cs_dsp.base + MADERA_DSP_CONFIG_2_OFFS, freq); in madera_write_adsp_clk_setting()
995 ret = regmap_update_bits(dsp->cs_dsp.regmap, in madera_write_adsp_clk_setting()
996 dsp->cs_dsp.base + MADERA_DSP_CONFIG_1_OFFS, in madera_write_adsp_clk_setting()
1001 dev_dbg(priv->madera->dev, "Set DSP clocking to 0x%x\n", val); in madera_write_adsp_clk_setting()
1006 dev_err(dsp->cs_dsp.dev, "Failed to set DSP%d clock: %d\n", dsp->cs_dsp.num, ret); in madera_write_adsp_clk_setting()
1014 struct wm_adsp *dsp = &priv->adsp[dsp_num]; in madera_set_adsp_clk()
1015 struct madera *madera = priv->madera; in madera_set_adsp_clk()
1028 ret = regmap_read(dsp->cs_dsp.regmap, dsp->cs_dsp.base, &cur); in madera_set_adsp_clk()
1030 dev_err(madera->dev, in madera_set_adsp_clk()
1037 new = priv->adsp_rate_cache[dsp->cs_dsp.num - 1] << MADERA_DSP_RATE_SHIFT; in madera_set_adsp_clk()
1040 dev_dbg(madera->dev, "DSP rate not changed\n"); in madera_set_adsp_clk()
1043 dev_dbg(madera->dev, "DSP rate changed\n"); in madera_set_adsp_clk()
1060 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; in madera_rate_put()
1061 unsigned int item = ucontrol->value.enumerated.item[0]; in madera_rate_put()
1065 if (item >= e->items) in madera_rate_put()
1066 return -EINVAL; in madera_rate_put()
1072 mutex_lock(&priv->rate_lock); in madera_rate_put()
1074 val = snd_soc_component_read(component, e->reg); in madera_rate_put()
1075 val >>= e->shift_l; in madera_rate_put()
1076 val &= e->mask; in madera_rate_put()
1082 if (!madera_can_change_grp_rate(priv, e->reg)) { in madera_rate_put()
1083 dev_warn(priv->madera->dev, in madera_rate_put()
1084 "Cannot change '%s' while in use by active audio paths\n", in madera_rate_put()
1085 kcontrol->id.name); in madera_rate_put()
1086 ret = -EBUSY; in madera_rate_put()
1094 mutex_unlock(&priv->rate_lock); in madera_rate_put()
1105 switch (madera->type) { in madera_configure_input_mode()
1135 dev_dbg(madera->dev, "IN%d mode %u:%u:%u:%u\n", i + 1, in madera_configure_input_mode()
1136 madera->pdata.codec.inmode[i][0], in madera_configure_input_mode()
1137 madera->pdata.codec.inmode[i][1], in madera_configure_input_mode()
1138 madera->pdata.codec.inmode[i][2], in madera_configure_input_mode()
1139 madera->pdata.codec.inmode[i][3]); in madera_configure_input_mode()
1141 dig_mode = madera->pdata.codec.dmic_ref[i] << in madera_configure_input_mode()
1144 switch (madera->pdata.codec.inmode[i][0]) { in madera_configure_input_mode()
1152 dev_warn(madera->dev, in madera_configure_input_mode()
1154 i + 1, madera->pdata.codec.inmode[i][0]); in madera_configure_input_mode()
1158 switch (madera->pdata.codec.inmode[i][1]) { in madera_configure_input_mode()
1166 dev_warn(madera->dev, in madera_configure_input_mode()
1168 i + 1, madera->pdata.codec.inmode[i][1]); in madera_configure_input_mode()
1172 dev_dbg(madera->dev, in madera_configure_input_mode()
1176 regmap_update_bits(madera->regmap, in madera_configure_input_mode()
1183 regmap_update_bits(madera->regmap, in madera_configure_input_mode()
1187 regmap_update_bits(madera->regmap, in madera_configure_input_mode()
1196 struct madera *madera = priv->madera; in madera_init_inputs()
1220 struct madera *madera = priv->madera; in madera_init_outputs()
1221 const struct madera_codec_pdata *pdata = &madera->pdata.codec; in madera_init_outputs()
1226 dev_warn(madera->dev, in madera_init_outputs()
1237 if (pdata->out_mono[i]) { in madera_init_outputs()
1247 regmap_update_bits(madera->regmap, in madera_init_outputs()
1251 dev_dbg(madera->dev, "OUT%d mono=0x%x\n", i + 1, val); in madera_init_outputs()
1255 dev_dbg(madera->dev, "PDM%d fmt=0x%x mute=0x%x\n", i + 1, in madera_init_outputs()
1256 pdata->pdm_fmt[i], pdata->pdm_mute[i]); in madera_init_outputs()
1258 if (pdata->pdm_mute[i]) in madera_init_outputs()
1259 regmap_update_bits(madera->regmap, in madera_init_outputs()
1263 pdata->pdm_mute[i]); in madera_init_outputs()
1265 if (pdata->pdm_fmt[i]) in madera_init_outputs()
1266 regmap_update_bits(madera->regmap, in madera_init_outputs()
1269 pdata->pdm_fmt[i]); in madera_init_outputs()
1279 struct madera *madera = priv->madera; in madera_init_bus_error_irq()
1286 &priv->adsp[dsp_num]); in madera_init_bus_error_irq()
1288 dev_err(madera->dev, in madera_init_bus_error_irq()
1297 struct madera *madera = priv->madera; in madera_free_bus_error_irq()
1301 &priv->adsp[dsp_num]); in madera_free_bus_error_irq()
1612 const DECLARE_TLV_DB_SCALE(madera_eq_tlv, -1200, 100, 0);
1615 const DECLARE_TLV_DB_SCALE(madera_digital_tlv, -6400, 50, 0);
1618 const DECLARE_TLV_DB_SCALE(madera_noise_tlv, -13200, 600, 0);
1621 const DECLARE_TLV_DB_SCALE(madera_ng_tlv, -12000, 600, 0);
1624 const DECLARE_TLV_DB_SCALE(madera_mixer_tlv, -3200, 100, 0);
1628 "SYNCCLK rate 1", "SYNCCLK rate 2", "SYNCCLK rate 3",
1995 "Low-pass", "High-pass"
2170 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; in madera_dfc_put()
2171 unsigned int reg = e->reg; in madera_dfc_put()
2175 reg = ((reg / 6) * 6) - 2; in madera_dfc_put()
2181 ret = -EBUSY; in madera_dfc_put()
2182 dev_err(component->dev, "Can't change mode on an active DFC\n"); in madera_dfc_put()
2198 (struct soc_mixer_control *)kcontrol->private_value; in madera_lp_mode_put()
2208 /* Cannot change lp mode on an active input */ in madera_lp_mode_put()
2210 mask = (mc->reg - MADERA_ADC_DIGITAL_VOLUME_1L) / 4; in madera_lp_mode_put()
2214 ret = -EBUSY; in madera_lp_mode_put()
2215 dev_err(component->dev, in madera_lp_mode_put()
2216 "Can't change lp mode on an active input\n"); in madera_lp_mode_put()
2256 for (i = 0; i < priv->num_inputs; i++) { in madera_in_set_vu()
2257 ret = regmap_update_bits(priv->madera->regmap, in madera_in_set_vu()
2261 dev_warn(priv->madera->dev, in madera_in_set_vu()
2269 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in madera_in_ev()
2273 if (w->shift % 2) in madera_in_ev()
2274 reg = MADERA_ADC_DIGITAL_VOLUME_1L + ((w->shift / 2) * 8); in madera_in_ev()
2276 reg = MADERA_ADC_DIGITAL_VOLUME_1R + ((w->shift / 2) * 8); in madera_in_ev()
2280 priv->in_pending++; in madera_in_ev()
2283 priv->in_pending--; in madera_in_ev()
2288 if (priv->in_pending == 0) { in madera_in_ev()
2315 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in madera_out_ev()
2317 struct madera *madera = priv->madera; in madera_out_ev()
2320 switch (madera->type) { in madera_out_ev()
2335 switch (w->shift) { in madera_out_ev()
2342 priv->out_up_pending++; in madera_out_ev()
2343 priv->out_up_delay += out_up_delay; in madera_out_ev()
2351 switch (w->shift) { in madera_out_ev()
2358 priv->out_up_pending--; in madera_out_ev()
2359 if (!priv->out_up_pending) { in madera_out_ev()
2360 fsleep(priv->out_up_delay); in madera_out_ev()
2361 priv->out_up_delay = 0; in madera_out_ev()
2371 switch (w->shift) { in madera_out_ev()
2378 priv->out_down_pending++; in madera_out_ev()
2379 priv->out_down_delay += 1000; in madera_out_ev()
2387 switch (w->shift) { in madera_out_ev()
2394 priv->out_down_pending--; in madera_out_ev()
2395 if (!priv->out_down_pending) { in madera_out_ev()
2396 fsleep(priv->out_down_delay); in madera_out_ev()
2397 priv->out_down_delay = 0; in madera_out_ev()
2415 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in madera_hp_ev()
2417 struct madera *madera = priv->madera; in madera_hp_ev()
2418 unsigned int mask = 1 << w->shift; in madera_hp_ev()
2419 unsigned int out_num = w->shift / 2; in madera_hp_ev()
2438 madera->hp_ena &= ~mask; in madera_hp_ev()
2439 madera->hp_ena |= val; in madera_hp_ev()
2441 switch (madera->type) { in madera_hp_ev()
2448 regmap_read(madera->regmap, MADERA_OUTPUT_ENABLES_1, &ep_sel); in madera_hp_ev()
2455 (!madera->out_clamp[out_num] || madera->out_shorted[out_num])) in madera_hp_ev()
2458 regmap_update_bits(madera->regmap, MADERA_OUTPUT_ENABLES_1, mask, val); in madera_hp_ev()
2467 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in madera_anc_ev()
2472 val = 1 << w->shift; in madera_anc_ev()
2475 val = 1 << (w->shift + 1); in madera_anc_ev()
2516 refclk = priv->sysclk; in madera_set_opclk()
2520 refclk = priv->asyncclk; in madera_set_opclk()
2523 return -EINVAL; in madera_set_opclk()
2538 dev_dbg(component->dev, "Configured %dHz OPCLK\n", in madera_set_opclk()
2551 dev_err(component->dev, "Unable to generate %dHz OPCLK\n", freq); in madera_set_opclk()
2553 return -EINVAL; in madera_set_opclk()
2576 return -EINVAL; in madera_get_sysclk_setting()
2588 switch (madera->type) { in madera_get_legacy_dspclk_setting()
2591 if (madera->rev < 3) in madera_get_legacy_dspclk_setting()
2592 return -EINVAL; in madera_get_legacy_dspclk_setting()
2597 return -EINVAL; in madera_get_legacy_dspclk_setting()
2603 return -EINVAL; in madera_get_legacy_dspclk_setting()
2611 switch (madera->type) { in madera_get_dspclk_setting()
2619 return -EINVAL; in madera_get_dspclk_setting()
2634 dev_dbg(component->dev, "Configured OUTCLK to SYSCLK\n"); in madera_set_outclk()
2639 dev_dbg(component->dev, "Configured OUTCLK to ASYNCCLK\n"); in madera_set_outclk()
2648 return -EINVAL; in madera_set_outclk()
2660 dev_dbg(component->dev, "Configured %dHz OUTCLK\n", rate); in madera_set_outclk()
2673 dev_err(component->dev, in madera_set_outclk()
2676 return -EINVAL; in madera_set_outclk()
2683 struct madera *madera = priv->madera; in madera_set_sysclk()
2695 clk = &priv->sysclk; in madera_set_sysclk()
2702 clk = &priv->asyncclk; in madera_set_sysclk()
2708 clk = &priv->dspclk; in madera_set_sysclk()
2718 return -EINVAL; in madera_set_sysclk()
2722 dev_err(madera->dev, in madera_set_sysclk()
2730 dev_dbg(madera->dev, "%s cleared\n", name); in madera_set_sysclk()
2737 ret = regmap_write(madera->regmap, MADERA_DSP_CLOCK_2, in madera_set_sysclk()
2740 dev_err(madera->dev, in madera_set_sysclk()
2755 dev_dbg(madera->dev, "%s set to %uHz\n", name, freq); in madera_set_sysclk()
2757 return regmap_update_bits(madera->regmap, reg, mask, val); in madera_set_sysclk()
2763 struct snd_soc_component *component = dai->component; in madera_set_fmt()
2765 struct madera *madera = priv->madera; in madera_set_fmt()
2768 base = dai->driver->base; in madera_set_fmt()
2781 return -EINVAL; in madera_set_fmt()
2792 return -EINVAL; in madera_set_fmt()
2799 return -EINVAL; in madera_set_fmt()
2818 return -EINVAL; in madera_set_fmt()
2837 return -EINVAL; in madera_set_fmt()
2840 regmap_update_bits(madera->regmap, base + MADERA_AIF_BCLK_CTRL, in madera_set_fmt()
2843 regmap_update_bits(madera->regmap, base + MADERA_AIF_TX_PIN_CTRL, in madera_set_fmt()
2846 regmap_update_bits(madera->regmap, base + MADERA_AIF_RX_PIN_CTRL, in madera_set_fmt()
2849 regmap_update_bits(madera->regmap, base + MADERA_AIF_FORMAT, in madera_set_fmt()
2856 -1,
2878 -1,
2943 struct snd_soc_component *component = dai->component; in madera_startup()
2945 struct madera_dai_priv *dai_priv = &priv->dai[dai->id - 1]; in madera_startup()
2946 struct madera *madera = priv->madera; in madera_startup()
2949 if (!substream->runtime) in madera_startup()
2952 switch (dai_priv->clk) { in madera_startup()
2956 base_rate = priv->sysclk; in madera_startup()
2960 base_rate = priv->asyncclk; in madera_startup()
2966 switch (madera->type) { in madera_startup()
2971 dai_priv->constraint.mask = MADERA_384K_RATE_MASK; in madera_startup()
2973 dai_priv->constraint.mask = MADERA_384K_44K1_RATE_MASK; in madera_startup()
2975 dai_priv->constraint.mask = MADERA_384K_48K_RATE_MASK; in madera_startup()
2979 dai_priv->constraint.mask = MADERA_192K_RATE_MASK; in madera_startup()
2981 dai_priv->constraint.mask = MADERA_192K_44K1_RATE_MASK; in madera_startup()
2983 dai_priv->constraint.mask = MADERA_192K_48K_RATE_MASK; in madera_startup()
2987 return snd_pcm_hw_constraint_list(substream->runtime, 0, in madera_startup()
2989 &dai_priv->constraint); in madera_startup()
2996 struct snd_soc_component *component = dai->component; in madera_hw_params_rate()
2998 struct madera_dai_priv *dai_priv = &priv->dai[dai->id - 1]; in madera_hw_params_rate()
2999 int base = dai->driver->base; in madera_hw_params_rate()
3011 return -EINVAL; in madera_hw_params_rate()
3015 switch (dai_priv->clk) { in madera_hw_params_rate()
3037 madera_aif_err(dai, "Invalid clock %d\n", dai_priv->clk); in madera_hw_params_rate()
3038 return -EINVAL; in madera_hw_params_rate()
3047 ret = regmap_read(priv->madera->regmap, in madera_hw_params_rate()
3057 mutex_lock(&priv->rate_lock); in madera_hw_params_rate()
3060 madera_aif_warn(dai, "Cannot change rate while active\n"); in madera_hw_params_rate()
3061 ret = -EBUSY; in madera_hw_params_rate()
3072 mutex_unlock(&priv->rate_lock); in madera_hw_params_rate()
3102 struct snd_soc_component *component = dai->component; in madera_hw_params()
3104 struct madera *madera = priv->madera; in madera_hw_params()
3105 int base = dai->driver->base; in madera_hw_params()
3112 madera->pdata.codec.max_channels_clocked[dai->id - 1]; in madera_hw_params()
3113 int tdm_width = priv->tdm_width[dai->id - 1]; in madera_hw_params()
3114 int tdm_slots = priv->tdm_slots[dai->id - 1]; in madera_hw_params()
3163 return -EINVAL; in madera_hw_params()
3179 regmap_read(madera->regmap, base + MADERA_AIF_TX_ENABLES, in madera_hw_params()
3181 regmap_read(madera->regmap, base + MADERA_AIF_RX_ENABLES, in madera_hw_params()
3184 regmap_update_bits(madera->regmap, in madera_hw_params()
3186 regmap_update_bits(madera->regmap, in madera_hw_params()
3195 regmap_update_bits(madera->regmap, in madera_hw_params()
3198 regmap_update_bits(madera->regmap, in madera_hw_params()
3201 regmap_update_bits(madera->regmap, in madera_hw_params()
3205 regmap_update_bits(madera->regmap, in madera_hw_params()
3214 regmap_update_bits(madera->regmap, in madera_hw_params()
3217 regmap_update_bits(madera->regmap, in madera_hw_params()
3236 return -EINVAL; in madera_is_syncclk()
3243 struct snd_soc_component *component = dai->component; in madera_dai_set_sysclk()
3247 struct madera_dai_priv *dai_priv = &priv->dai[dai->id - 1]; in madera_dai_set_sysclk()
3253 dev_err(component->dev, "Illegal DAI clock id %d\n", clk_id); in madera_dai_set_sysclk()
3257 if (is_sync == madera_is_syncclk(dai_priv->clk)) in madera_dai_set_sysclk()
3261 dev_err(component->dev, "Can't change clock on active DAI %d\n", in madera_dai_set_sysclk()
3262 dai->id); in madera_dai_set_sysclk()
3263 return -EBUSY; in madera_dai_set_sysclk()
3266 dev_dbg(component->dev, "Setting AIF%d to %s\n", dai->id, in madera_dai_set_sysclk()
3274 routes[0].sink = dai->driver->capture.stream_name; in madera_dai_set_sysclk()
3275 routes[1].sink = dai->driver->playback.stream_name; in madera_dai_set_sysclk()
3284 dai_priv->clk = clk_id; in madera_dai_set_sysclk()
3291 struct snd_soc_component *component = dai->component; in madera_set_tristate()
3292 int base = dai->driver->base; in madera_set_tristate()
3314 struct snd_soc_component *component = dai->component; in madera_set_channels_to_mask()
3316 struct madera *madera = priv->madera; in madera_set_channels_to_mask()
3320 slot = ffs(mask) - 1; in madera_set_channels_to_mask()
3324 regmap_write(madera->regmap, base + i, slot); in madera_set_channels_to_mask()
3336 struct snd_soc_component *component = dai->component; in madera_set_tdm_slot()
3338 int base = dai->driver->base; in madera_set_tdm_slot()
3339 int rx_max_chan = dai->driver->playback.channels_max; in madera_set_tdm_slot()
3340 int tx_max_chan = dai->driver->capture.channels_max; in madera_set_tdm_slot()
3343 if (dai->id > MADERA_MAX_AIF) in madera_set_tdm_slot()
3344 return -ENOTSUPP; in madera_set_tdm_slot()
3347 tx_mask = (1 << tx_max_chan) - 1; in madera_set_tdm_slot()
3348 rx_mask = (1 << rx_max_chan) - 1; in madera_set_tdm_slot()
3356 priv->tdm_width[dai->id - 1] = slot_width; in madera_set_tdm_slot()
3357 priv->tdm_slots[dai->id - 1] = slots; in madera_set_tdm_slot()
3381 struct madera_dai_priv *dai_priv = &priv->dai[id]; in madera_init_dai()
3383 dai_priv->clk = MADERA_CLK_SYSCLK_1; in madera_init_dai()
3384 dai_priv->constraint = madera_constraint; in madera_init_dai()
3430 { 0, 256000, 0, -1 },
3431 { 256000, 1000000, 2, -1 },
3432 { 1000000, 13500000, 4, -1 },
3458 return -EINVAL; in madera_find_sync_fratio()
3470 *fratio = ratio - 1; in madera_find_main_fratio()
3478 switch (fll->madera->type) { in madera_find_fratio()
3480 switch (fll->madera->rev) { in madera_find_fratio()
3489 fll->fout, in madera_find_fratio()
3501 return madera_find_main_fratio(fref, fll->fout, fratio); in madera_find_fratio()
3514 cfg->refdiv = 0; in madera_calc_fratio()
3518 cfg->refdiv++; in madera_calc_fratio()
3521 return -EINVAL; in madera_calc_fratio()
3525 init_ratio = madera_find_fratio(fll, fref, sync, &cfg->fratio); in madera_calc_fratio()
3533 cfg->fratio = init_ratio - 1; in madera_calc_fratio()
3535 switch (fll->madera->type) { in madera_calc_fratio()
3537 switch (fll->madera->rev) { in madera_calc_fratio()
3559 refdiv = cfg->refdiv; in madera_calc_fratio()
3566 for (ratio = init_ratio; ratio > 0; ratio--) { in madera_calc_fratio()
3567 if (fll->fout % (ratio * fref)) { in madera_calc_fratio()
3568 cfg->refdiv = refdiv; in madera_calc_fratio()
3569 cfg->fratio = ratio - 1; in madera_calc_fratio()
3580 if (fref > pseudo_fref_max[ratio - 1]) in madera_calc_fratio()
3583 if (fll->fout % (ratio * fref)) { in madera_calc_fratio()
3584 cfg->refdiv = refdiv; in madera_calc_fratio()
3585 cfg->fratio = ratio - 1; in madera_calc_fratio()
3598 return cfg->fratio + 1; in madera_calc_fratio()
3611 cfg->gain = gains[i].gain; in madera_find_fll_gain()
3612 cfg->alt_gain = gains[i].alt_gain; in madera_find_fll_gain()
3619 return -EINVAL; in madera_find_fll_gain()
3632 fref, fll->fout, fll->fout * MADERA_FLL_VCO_MULT); in madera_calc_fll()
3640 fref = fref / (1 << cfg->refdiv); in madera_calc_fll()
3642 cfg->n = fll->fout / (ratio * fref); in madera_calc_fll()
3644 if (fll->fout % (ratio * fref)) { in madera_calc_fll()
3645 gcd_fll = gcd(fll->fout, ratio * fref); in madera_calc_fll()
3648 cfg->theta = (fll->fout - (cfg->n * ratio * fref)) in madera_calc_fll()
3650 cfg->lambda = (ratio * fref) / gcd_fll; in madera_calc_fll()
3652 cfg->theta = 0; in madera_calc_fll()
3653 cfg->lambda = 0; in madera_calc_fll()
3661 while (cfg->lambda >= (1 << 16)) { in madera_calc_fll()
3662 cfg->theta >>= 1; in madera_calc_fll()
3663 cfg->lambda >>= 1; in madera_calc_fll()
3666 switch (fll->madera->type) { in madera_calc_fll()
3668 switch (fll->madera->rev) { in madera_calc_fll()
3707 cfg->n, cfg->theta, cfg->lambda); in madera_calc_fll()
3709 cfg->fratio, ratio, cfg->refdiv, 1 << cfg->refdiv); in madera_calc_fll()
3710 madera_fll_dbg(fll, "GAIN=0x%x(%d)\n", cfg->gain, 1 << cfg->gain); in madera_calc_fll()
3722 regmap_update_bits_check(madera->regmap, in madera_write_fll()
3725 cfg->theta, &change); in madera_write_fll()
3727 regmap_update_bits_check(madera->regmap, in madera_write_fll()
3730 cfg->lambda, &change); in madera_write_fll()
3732 regmap_update_bits_check(madera->regmap, in madera_write_fll()
3735 cfg->fratio << MADERA_FLL1_FRATIO_SHIFT, in madera_write_fll()
3738 regmap_update_bits_check(madera->regmap, in madera_write_fll()
3742 cfg->refdiv << MADERA_FLL1_REFCLK_DIV_SHIFT | in madera_write_fll()
3748 regmap_update_bits_check(madera->regmap, in madera_write_fll()
3755 regmap_update_bits_check(madera->regmap, in madera_write_fll()
3763 regmap_update_bits_check(madera->regmap, in madera_write_fll()
3766 MADERA_FLL1_CTRL_UPD | cfg->n, &change); in madera_write_fll()
3774 struct madera *madera = fll->madera; in madera_is_enabled_fll()
3778 ret = regmap_read(madera->regmap, in madera_is_enabled_fll()
3790 struct madera *madera = fll->madera; in madera_wait_for_fll()
3798 regmap_read(madera->regmap, MADERA_IRQ1_RAW_STATUS_2, &val); in madera_wait_for_fll()
3799 status = val & (MADERA_FLL1_LOCK_STS1 << (fll->id - 1)); in madera_wait_for_fll()
3818 return -ETIMEDOUT; in madera_wait_for_fll()
3828 if (!sync && ref_cfg->theta == 0) in madera_set_fll_phase_integrator()
3834 regmap_update_bits_check(fll->madera->regmap, in madera_set_fll_phase_integrator()
3835 fll->base + MADERA_FLL_EFS_2_OFFS, in madera_set_fll_phase_integrator()
3847 struct madera *madera = fll->madera; in madera_set_fll_clks_reg()
3852 ret = regmap_read(madera->regmap, reg, &src); in madera_set_fll_clks_reg()
3863 clk = madera->mclk[MADERA_MCLK1].clk; in madera_set_fll_clks_reg()
3866 clk = madera->mclk[MADERA_MCLK2].clk; in madera_set_fll_clks_reg()
3869 clk = madera->mclk[MADERA_MCLK3].clk; in madera_set_fll_clks_reg()
3909 struct madera *madera = fll->madera; in madera_disable_fll()
3913 switch (madera->type) { in madera_disable_fll()
3915 sync_base = fll->base + CS47L35_FLL_SYNCHRONISER_OFFS; in madera_disable_fll()
3918 sync_base = fll->base + MADERA_FLL_SYNCHRONISER_OFFS; in madera_disable_fll()
3924 regmap_update_bits(madera->regmap, in madera_disable_fll()
3925 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_disable_fll()
3927 regmap_update_bits_check(madera->regmap, in madera_disable_fll()
3928 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_disable_fll()
3930 regmap_update_bits_check(madera->regmap, in madera_disable_fll()
3933 regmap_update_bits(madera->regmap, in madera_disable_fll()
3934 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_disable_fll()
3943 madera_set_fll_clks(fll, fll->base, false); in madera_disable_fll()
3944 pm_runtime_put_autosuspend(madera->dev); in madera_disable_fll()
3950 struct madera *madera = fll->madera; in madera_enable_fll()
3952 int already_enabled = madera_is_enabled_fll(fll, fll->base); in madera_enable_fll()
3962 if (fll->ref_src < 0 || fll->ref_freq == 0) { in madera_enable_fll()
3964 ret = -EINVAL; in madera_enable_fll()
3971 if (fll->fout < MADERA_FLL_MIN_FOUT || in madera_enable_fll()
3972 fll->fout > MADERA_FLL_MAX_FOUT) { in madera_enable_fll()
3973 madera_fll_err(fll, "invalid fout %uHz\n", fll->fout); in madera_enable_fll()
3974 ret = -EINVAL; in madera_enable_fll()
3978 switch (madera->type) { in madera_enable_fll()
3980 sync_base = fll->base + CS47L35_FLL_SYNCHRONISER_OFFS; in madera_enable_fll()
3983 sync_base = fll->base + MADERA_FLL_SYNCHRONISER_OFFS; in madera_enable_fll()
3993 regmap_update_bits(fll->madera->regmap, in madera_enable_fll()
3994 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_enable_fll()
3998 regmap_update_bits(fll->madera->regmap, in madera_enable_fll()
3999 fll->base + MADERA_FLL_CONTROL_7_OFFS, in madera_enable_fll()
4004 madera_set_fll_clks(fll, fll->base, false); in madera_enable_fll()
4007 /* Apply SYNCCLK setting */ in madera_enable_fll()
4008 if (fll->sync_src >= 0) { in madera_enable_fll()
4009 ret = madera_calc_fll(fll, &cfg, fll->sync_freq, true); in madera_enable_fll()
4014 &cfg, fll->sync_src, in madera_enable_fll()
4020 madera_fll_warn(fll, "Synchroniser changed on active FLL\n"); in madera_enable_fll()
4023 ret = madera_calc_fll(fll, &cfg, fll->ref_freq, false); in madera_enable_fll()
4031 switch (fll->madera->type) { in madera_enable_fll()
4033 switch (fll->madera->rev) { in madera_enable_fll()
4062 fll_change |= madera_write_fll(madera, fll->base, in madera_enable_fll()
4063 &cfg, fll->ref_src, in madera_enable_fll()
4070 if (have_sync && fll->sync_freq > 100000) in madera_enable_fll()
4071 regmap_update_bits(madera->regmap, in madera_enable_fll()
4075 regmap_update_bits(madera->regmap, in madera_enable_fll()
4081 pm_runtime_get_sync(madera->dev); in madera_enable_fll()
4085 regmap_update_bits(madera->regmap, in madera_enable_fll()
4091 madera_set_fll_clks(fll, fll->base, true); in madera_enable_fll()
4092 regmap_update_bits(madera->regmap, in madera_enable_fll()
4093 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_enable_fll()
4097 regmap_update_bits(madera->regmap, in madera_enable_fll()
4098 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_enable_fll()
4115 if (fll->fout) { in madera_apply_fll()
4132 if (fll->sync_src == source && fll->sync_freq == fref) in madera_set_fll_syncclk()
4135 fll->sync_src = source; in madera_set_fll_syncclk()
4136 fll->sync_freq = fref; in madera_set_fll_syncclk()
4147 if (fll->ref_src == source && in madera_set_fll_refclk()
4148 fll->ref_freq == fref && fll->fout == fout) in madera_set_fll_refclk()
4155 if (fout && fout != fll->fout) { in madera_set_fll_refclk()
4156 ret = madera_is_enabled_fll(fll, fll->base); in madera_set_fll_refclk()
4161 madera_fll_err(fll, "Can't change Fout on active FLL\n"); in madera_set_fll_refclk()
4162 return -EBUSY; in madera_set_fll_refclk()
4166 fll->ref_src = source; in madera_set_fll_refclk()
4167 fll->ref_freq = fref; in madera_set_fll_refclk()
4168 fll->fout = fout; in madera_set_fll_refclk()
4177 fll->id = id; in madera_init_fll()
4178 fll->base = base; in madera_init_fll()
4179 fll->madera = madera; in madera_init_fll()
4180 fll->ref_src = MADERA_FLL_SRC_NONE; in madera_init_fll()
4181 fll->sync_src = MADERA_FLL_SRC_NONE; in madera_init_fll()
4183 regmap_update_bits(madera->regmap, in madera_init_fll()
4184 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_init_fll()
4244 struct madera *madera = fll->madera; in madera_enable_fll_ao()
4245 int already_enabled = madera_is_enabled_fll(fll, fll->base); in madera_enable_fll_ao()
4253 pm_runtime_get_sync(madera->dev); in madera_enable_fll_ao()
4259 regmap_update_bits(fll->madera->regmap, in madera_enable_fll_ao()
4260 fll->base + MADERA_FLLAO_CONTROL_1_OFFS, in madera_enable_fll_ao()
4264 madera_set_fllao_clks(fll, fll->base, false); in madera_enable_fll_ao()
4269 /* modify the patch to apply fll->ref_src as input clock */ in madera_enable_fll_ao()
4272 val |= (fll->ref_src << MADERA_FLL_AO_REFCLK_SRC_SHIFT) in madera_enable_fll_ao()
4276 regmap_write(madera->regmap, patch[i].reg, val); in madera_enable_fll_ao()
4279 madera_set_fllao_clks(fll, fll->base, true); in madera_enable_fll_ao()
4281 regmap_update_bits(madera->regmap, in madera_enable_fll_ao()
4282 fll->base + MADERA_FLLAO_CONTROL_1_OFFS, in madera_enable_fll_ao()
4286 regmap_update_bits(madera->regmap, in madera_enable_fll_ao()
4287 fll->base + MADERA_FLLAO_CONTROL_1_OFFS, in madera_enable_fll_ao()
4298 struct madera *madera = fll->madera; in madera_disable_fll_ao()
4303 regmap_update_bits(madera->regmap, in madera_disable_fll_ao()
4304 fll->base + MADERA_FLLAO_CONTROL_1_OFFS, in madera_disable_fll_ao()
4306 regmap_update_bits_check(madera->regmap, in madera_disable_fll_ao()
4307 fll->base + MADERA_FLLAO_CONTROL_1_OFFS, in madera_disable_fll_ao()
4320 regmap_update_bits(madera->regmap, in madera_disable_fll_ao()
4321 fll->base + MADERA_FLLAO_CONTROL_2_OFFS, in madera_disable_fll_ao()
4325 madera_set_fllao_clks(fll, fll->base, false); in madera_disable_fll_ao()
4326 pm_runtime_put_autosuspend(madera->dev); in madera_disable_fll_ao()
4340 if (fll->ref_src == source && in madera_set_fll_ao_refclk()
4341 fll->ref_freq == fin && fll->fout == fout) in madera_set_fll_ao_refclk()
4347 if (fout && (fll->ref_freq != fin || fll->fout != fout)) { in madera_set_fll_ao_refclk()
4357 return -EINVAL; in madera_set_fll_ao_refclk()
4364 fll->ref_src = source; in madera_set_fll_ao_refclk()
4365 fll->ref_freq = fin; in madera_set_fll_ao_refclk()
4366 fll->fout = fout; in madera_set_fll_ao_refclk()
4379 struct madera *madera = fll->madera; in madera_fllhj_disable()
4386 * again due to a control clock being required, the lock won't re-assert in madera_fllhj_disable()
4390 regmap_update_bits(madera->regmap, in madera_fllhj_disable()
4391 fll->base + MADERA_FLL_CONTROL_11_OFFS, in madera_fllhj_disable()
4393 regmap_update_bits(madera->regmap, in madera_fllhj_disable()
4394 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_fllhj_disable()
4396 regmap_update_bits_check(madera->regmap, in madera_fllhj_disable()
4397 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_fllhj_disable()
4409 regmap_update_bits(madera->regmap, in madera_fllhj_disable()
4410 fll->base + MADERA_FLL_CONTROL_2_OFFS, in madera_fllhj_disable()
4414 madera_set_fllhj_clks(fll, fll->base, false); in madera_fllhj_disable()
4415 pm_runtime_put_autosuspend(madera->dev); in madera_fllhj_disable()
4423 struct madera *madera = fll->madera; in madera_fllhj_apply()
4429 madera_fll_dbg(fll, "fin=%d, fout=%d\n", fin, fll->fout); in madera_fllhj_apply()
4441 fout = fll->fout; in madera_fllhj_apply()
4464 fout = fll->fout * 6; in madera_fllhj_apply()
4487 return -EINVAL; in madera_fllhj_apply()
4494 return -EINVAL; in madera_fllhj_apply()
4513 madera_fll_err(fll, "N not in valid %s mode range %d-%d: %d\n", in madera_fllhj_apply()
4516 return -EINVAL; in madera_fllhj_apply()
4521 return -EINVAL; in madera_fllhj_apply()
4525 regmap_write(madera->regmap, in madera_fllhj_apply()
4526 fll->base + MADERA_FLL_CONTROL_2_OFFS, in madera_fllhj_apply()
4528 regmap_update_bits(madera->regmap, in madera_fllhj_apply()
4529 fll->base + MADERA_FLL_CONTROL_3_OFFS, in madera_fllhj_apply()
4532 regmap_update_bits(madera->regmap, in madera_fllhj_apply()
4533 fll->base + MADERA_FLL_CONTROL_4_OFFS, in madera_fllhj_apply()
4536 regmap_update_bits(madera->regmap, in madera_fllhj_apply()
4537 fll->base + MADERA_FLL_CONTROL_5_OFFS, in madera_fllhj_apply()
4540 regmap_update_bits(madera->regmap, in madera_fllhj_apply()
4541 fll->base + MADERA_FLL_CONTROL_6_OFFS, in madera_fllhj_apply()
4544 regmap_update_bits(madera->regmap, in madera_fllhj_apply()
4545 fll->base + MADERA_FLL_GAIN_OFFS, in madera_fllhj_apply()
4550 regmap_update_bits(madera->regmap, in madera_fllhj_apply()
4551 fll->base + MADERA_FLL_CONTROL_10_OFFS, in madera_fllhj_apply()
4554 regmap_update_bits(madera->regmap, in madera_fllhj_apply()
4555 fll->base + MADERA_FLL_CONTROL_11_OFFS, in madera_fllhj_apply()
4558 regmap_update_bits(madera->regmap, in madera_fllhj_apply()
4559 fll->base + MADERA_FLL1_DIGITAL_TEST_1_OFFS, in madera_fllhj_apply()
4569 struct madera *madera = fll->madera; in madera_fllhj_enable()
4570 int already_enabled = madera_is_enabled_fll(fll, fll->base); in madera_fllhj_enable()
4577 pm_runtime_get_sync(madera->dev); in madera_fllhj_enable()
4583 regmap_update_bits(fll->madera->regmap, in madera_fllhj_enable()
4584 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_fllhj_enable()
4589 madera_set_fllhj_clks(fll, fll->base, false); in madera_fllhj_enable()
4592 ret = madera_fllhj_apply(fll, fll->ref_freq); in madera_fllhj_enable()
4597 regmap_update_bits(madera->regmap, in madera_fllhj_enable()
4598 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_fllhj_enable()
4600 fll->ref_src << CS47L92_FLL1_REFCLK_SRC_SHIFT); in madera_fllhj_enable()
4602 madera_set_fllhj_clks(fll, fll->base, true); in madera_fllhj_enable()
4604 regmap_update_bits(madera->regmap, in madera_fllhj_enable()
4605 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_fllhj_enable()
4610 regmap_update_bits(madera->regmap, in madera_fllhj_enable()
4611 fll->base + MADERA_FLL_CONTROL_11_OFFS, in madera_fllhj_enable()
4615 regmap_update_bits(madera->regmap, in madera_fllhj_enable()
4616 fll->base + MADERA_FLL_CONTROL_2_OFFS, in madera_fllhj_enable()
4621 regmap_update_bits(madera->regmap, in madera_fllhj_enable()
4622 fll->base + MADERA_FLL_CONTROL_1_OFFS, in madera_fllhj_enable()
4638 return -EINVAL; in madera_fllhj_validate()
4641 if (fll->fout && fout != fll->fout) { in madera_fllhj_validate()
4642 madera_fll_err(fll, "Can't change output on active FLL\n"); in madera_fllhj_validate()
4643 return -EINVAL; in madera_fllhj_validate()
4648 return -EINVAL; in madera_fllhj_validate()
4666 if (fll->ref_src == source && fll->ref_freq == fin && in madera_fllhj_set_refclk()
4667 fll->fout == fout) in madera_fllhj_set_refclk()
4671 return -EINVAL; in madera_fllhj_set_refclk()
4673 fll->ref_src = source; in madera_fllhj_set_refclk()
4674 fll->ref_freq = fin; in madera_fllhj_set_refclk()
4675 fll->fout = fout; in madera_fllhj_set_refclk()
4687 * madera_set_output_mode - Set the mode of the specified output
4709 return -EINVAL; in madera_set_output_mode()
4711 reg = MADERA_OUTPUT_PATH_CONFIG_1L + (output - 1) * 8; in madera_set_output_mode()
4738 return (abs((a << 16) / (4096 - b)) >= 4096 << 4); in madera_eq_filter_unstable()
4748 struct madera *madera = priv->madera; in madera_eq_coeff_put()
4749 struct soc_bytes *params = (void *)kcontrol->private_value; in madera_eq_coeff_put()
4755 len = params->num_regs * regmap_get_val_bytes(madera->regmap); in madera_eq_coeff_put()
4757 data = kmemdup(ucontrol->value.bytes.data, len, GFP_KERNEL | GFP_DMA); in madera_eq_coeff_put()
4759 return -ENOMEM; in madera_eq_coeff_put()
4768 dev_err(madera->dev, "Rejecting unstable EQ coefficients\n"); in madera_eq_coeff_put()
4769 ret = -EINVAL; in madera_eq_coeff_put()
4773 ret = regmap_read(madera->regmap, params->base, &val); in madera_eq_coeff_put()
4780 ret = regmap_raw_write(madera->regmap, params->base, data, len); in madera_eq_coeff_put()
4795 struct madera *madera = priv->madera; in madera_lhpf_coeff_put()
4796 __be16 *data = (__be16 *)ucontrol->value.bytes.data; in madera_lhpf_coeff_put()
4800 dev_err(madera->dev, "Rejecting unstable LHPF coefficients\n"); in madera_lhpf_coeff_put()
4801 return -EINVAL; in madera_lhpf_coeff_put()