Lines Matching full:madera

3 // Cirrus Logic Madera class codecs common support
19 #include <linux/irqchip/irq-madera.h>
20 #include <linux/mfd/madera/core.h>
21 #include <linux/mfd/madera/registers.h>
22 #include <linux/mfd/madera/pdata.h>
23 #include <sound/madera-pdata.h>
25 #include <dt-bindings/sound/madera.h>
27 #include "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__)
172 struct madera *madera = priv->madera; in madera_clk_ev() local
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() local
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()
252 static int madera_check_speaker_overheat(struct madera *madera, in madera_check_speaker_overheat() argument
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()
276 struct madera *madera = priv->madera; in madera_spk_ev() local
282 ret = madera_check_speaker_overheat(madera, &warn, &shutdown); in madera_spk_ev()
287 dev_crit(madera->dev, in madera_spk_ev()
292 regmap_update_bits(madera->regmap, MADERA_OUTPUT_ENABLES_1, in madera_spk_ev()
296 regmap_update_bits(madera->regmap, MADERA_OUTPUT_ENABLES_1, in madera_spk_ev()
309 struct madera *madera = data; in madera_thermal_warn() local
313 ret = madera_check_speaker_overheat(madera, &warn, &shutdown); in madera_thermal_warn()
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() local
337 struct device *dev = madera->dev; in madera_init_overheat()
340 ret = madera_request_irq(madera, MADERA_IRQ_SPK_OVERHEAT_WARN, in madera_init_overheat()
342 madera); in madera_init_overheat()
346 ret = madera_request_irq(madera, MADERA_IRQ_SPK_OVERHEAT, in madera_init_overheat()
348 madera); in madera_init_overheat()
358 struct madera *madera = priv->madera; in madera_free_overheat() local
360 madera_free_irq(madera, MADERA_IRQ_SPK_OVERHEAT_WARN, madera); in madera_free_overheat()
361 madera_free_irq(madera, MADERA_IRQ_SPK_OVERHEAT, madera); in madera_free_overheat()
401 struct madera *madera = priv->madera; in madera_prop_get_inmode() local
402 struct madera_codec_pdata *pdata = &madera->pdata.codec; in madera_prop_get_inmode()
409 n = madera_get_variable_u32_array(madera->dev, "cirrus,inmode", in madera_prop_get_inmode()
429 struct madera *madera = priv->madera; in madera_prop_get_pdata() local
430 struct madera_codec_pdata *pdata = &madera->pdata.codec; in madera_prop_get_pdata()
436 n = madera_get_variable_u32_array(madera->dev, "cirrus,out-mono", in madera_prop_get_pdata()
442 madera_get_variable_u32_array(madera->dev, in madera_prop_get_pdata()
448 madera_get_variable_u32_array(madera->dev, "cirrus,pdm-fmt", in madera_prop_get_pdata()
452 madera_get_variable_u32_array(madera->dev, "cirrus,pdm-mute", in madera_prop_get_pdata()
456 madera_get_variable_u32_array(madera->dev, "cirrus,dmic-ref", in madera_prop_get_pdata()
469 if (!dev_get_platdata(priv->madera->dev)) in madera_core_init()
475 priv->madera->out_clamp[i] = true; in madera_core_init()
491 struct madera *madera = priv->madera; in madera_debug_dump_domain_groups() local
495 dev_dbg(madera->dev, "domain_grp_ref[%d]=%d\n", i, in madera_debug_dump_domain_groups()
520 dev_dbg(priv->madera->dev, "Inc ref on domain group %d\n", in madera_domain_clk_ev()
525 dev_dbg(priv->madera->dev, "Dec ref on domain group %d\n", in madera_domain_clk_ev()
549 struct madera *madera = priv->madera; in madera_out1_demux_put() local
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()
656 struct madera *madera = priv->madera; in madera_inmux_put() local
657 struct regmap *regmap = madera->regmap; 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()
691 dev_dbg(madera->dev, "mux=%u reg=0x%x inmode=0x%x mask=0x%x val=0x%x\n", in madera_inmux_put()
865 dev_dbg(priv->madera->dev, "Rate reg 0x%x group ref %d\n", reg, count); in madera_can_change_grp_rate()
916 dev_warn(priv->madera->dev, in madera_adsp_rate_put()
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()
1001 dev_dbg(priv->madera->dev, "Set DSP clocking to 0x%x\n", val); in madera_write_adsp_clk_setting()
1015 struct madera *madera = priv->madera; in madera_set_adsp_clk() local
1030 dev_err(madera->dev, 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()
1083 dev_warn(priv->madera->dev, in madera_rate_put()
1100 static void madera_configure_input_mode(struct madera *madera) in madera_configure_input_mode() argument
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() local
1198 madera_configure_input_mode(madera); in madera_init_inputs()
1220 struct madera *madera = priv->madera; in madera_init_outputs() local
1221 const struct madera_codec_pdata *pdata = &madera->pdata.codec; in madera_init_outputs()
1226 dev_warn(madera->dev, 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()
1259 regmap_update_bits(madera->regmap, in madera_init_outputs()
1266 regmap_update_bits(madera->regmap, in madera_init_outputs()
1279 struct madera *madera = priv->madera; in madera_init_bus_error_irq() local
1282 ret = madera_request_irq(madera, 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() local
1299 madera_free_irq(madera, in madera_free_bus_error_irq()
2257 ret = regmap_update_bits(priv->madera->regmap, in madera_in_set_vu()
2261 dev_warn(priv->madera->dev, in madera_in_set_vu()
2317 struct madera *madera = priv->madera; in madera_out_ev() local
2320 switch (madera->type) { in madera_out_ev()
2417 struct madera *madera = priv->madera; in madera_hp_ev() local
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()
2580 static int madera_get_legacy_dspclk_setting(struct madera *madera, in madera_get_legacy_dspclk_setting() argument
2588 switch (madera->type) { in madera_get_legacy_dspclk_setting()
2591 if (madera->rev < 3) in madera_get_legacy_dspclk_setting()
2607 static int madera_get_dspclk_setting(struct madera *madera, in madera_get_dspclk_setting() argument
2611 switch (madera->type) { in madera_get_dspclk_setting()
2616 return madera_get_legacy_dspclk_setting(madera, freq); in madera_get_dspclk_setting()
2683 struct madera *madera = priv->madera; in madera_set_sysclk() local
2709 clk_freq_sel = madera_get_dspclk_setting(madera, freq, 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()
2765 struct madera *madera = priv->madera; in madera_set_fmt() local
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()
2946 struct madera *madera = priv->madera; in madera_startup() local
2966 switch (madera->type) { in madera_startup()
3047 ret = regmap_read(priv->madera->regmap, in madera_hw_params_rate()
3104 struct madera *madera = priv->madera; in madera_hw_params() local
3112 madera->pdata.codec.max_channels_clocked[dai->id - 1]; 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()
3316 struct madera *madera = priv->madera; in madera_set_channels_to_mask() local
3324 regmap_write(madera->regmap, base + i, slot); in madera_set_channels_to_mask()
3478 switch (fll->madera->type) { in madera_find_fratio()
3480 switch (fll->madera->rev) { in madera_find_fratio()
3535 switch (fll->madera->type) { in madera_calc_fratio()
3537 switch (fll->madera->rev) { in madera_calc_fratio()
3666 switch (fll->madera->type) { in madera_calc_fll()
3668 switch (fll->madera->rev) { in madera_calc_fll()
3715 static bool madera_write_fll(struct madera *madera, unsigned int base, in madera_write_fll() argument
3722 regmap_update_bits_check(madera->regmap, in madera_write_fll()
3727 regmap_update_bits_check(madera->regmap, in madera_write_fll()
3732 regmap_update_bits_check(madera->regmap, in madera_write_fll()
3738 regmap_update_bits_check(madera->regmap, 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()
3774 struct madera *madera = fll->madera; in madera_is_enabled_fll() local
3778 ret = regmap_read(madera->regmap, in madera_is_enabled_fll()
3790 struct madera *madera = fll->madera; in madera_wait_for_fll() local
3798 regmap_read(madera->regmap, MADERA_IRQ1_RAW_STATUS_2, &val); in madera_wait_for_fll()
3834 regmap_update_bits_check(fll->madera->regmap, in madera_set_fll_phase_integrator()
3847 struct madera *madera = fll->madera; in madera_set_fll_clks_reg() local
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() local
3913 switch (madera->type) { in madera_disable_fll()
3924 regmap_update_bits(madera->regmap, in madera_disable_fll()
3927 regmap_update_bits_check(madera->regmap, 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()
3944 pm_runtime_put_autosuspend(madera->dev); in madera_disable_fll()
3950 struct madera *madera = fll->madera; in madera_enable_fll() local
3978 switch (madera->type) { in madera_enable_fll()
3993 regmap_update_bits(fll->madera->regmap, in madera_enable_fll()
3998 regmap_update_bits(fll->madera->regmap, in madera_enable_fll()
4013 fll_change |= madera_write_fll(madera, sync_base, 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()
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()
4092 regmap_update_bits(madera->regmap, in madera_enable_fll()
4097 regmap_update_bits(madera->regmap, in madera_enable_fll()
4174 int madera_init_fll(struct madera *madera, int id, int base, in madera_init_fll() argument
4179 fll->madera = madera; in madera_init_fll()
4183 regmap_update_bits(madera->regmap, in madera_init_fll()
4244 struct madera *madera = fll->madera; in madera_enable_fll_ao() local
4253 pm_runtime_get_sync(madera->dev); in madera_enable_fll_ao()
4259 regmap_update_bits(fll->madera->regmap, in madera_enable_fll_ao()
4276 regmap_write(madera->regmap, patch[i].reg, val); in madera_enable_fll_ao()
4281 regmap_update_bits(madera->regmap, in madera_enable_fll_ao()
4286 regmap_update_bits(madera->regmap, in madera_enable_fll_ao()
4298 struct madera *madera = fll->madera; in madera_disable_fll_ao() local
4303 regmap_update_bits(madera->regmap, in madera_disable_fll_ao()
4306 regmap_update_bits_check(madera->regmap, in madera_disable_fll_ao()
4320 regmap_update_bits(madera->regmap, in madera_disable_fll_ao()
4326 pm_runtime_put_autosuspend(madera->dev); in madera_disable_fll_ao()
4379 struct madera *madera = fll->madera; in madera_fllhj_disable() local
4390 regmap_update_bits(madera->regmap, in madera_fllhj_disable()
4393 regmap_update_bits(madera->regmap, in madera_fllhj_disable()
4396 regmap_update_bits_check(madera->regmap, in madera_fllhj_disable()
4409 regmap_update_bits(madera->regmap, 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() local
4525 regmap_write(madera->regmap, in madera_fllhj_apply()
4528 regmap_update_bits(madera->regmap, in madera_fllhj_apply()
4532 regmap_update_bits(madera->regmap, in madera_fllhj_apply()
4536 regmap_update_bits(madera->regmap, in madera_fllhj_apply()
4540 regmap_update_bits(madera->regmap, in madera_fllhj_apply()
4544 regmap_update_bits(madera->regmap, in madera_fllhj_apply()
4550 regmap_update_bits(madera->regmap, in madera_fllhj_apply()
4554 regmap_update_bits(madera->regmap, in madera_fllhj_apply()
4558 regmap_update_bits(madera->regmap, in madera_fllhj_apply()
4569 struct madera *madera = fll->madera; in madera_fllhj_enable() local
4577 pm_runtime_get_sync(madera->dev); in madera_fllhj_enable()
4583 regmap_update_bits(fll->madera->regmap, in madera_fllhj_enable()
4597 regmap_update_bits(madera->regmap, in madera_fllhj_enable()
4604 regmap_update_bits(madera->regmap, in madera_fllhj_enable()
4610 regmap_update_bits(madera->regmap, in madera_fllhj_enable()
4615 regmap_update_bits(madera->regmap, in madera_fllhj_enable()
4621 regmap_update_bits(madera->regmap, in madera_fllhj_enable()
4748 struct madera *madera = priv->madera; in madera_eq_coeff_put() local
4755 len = params->num_regs * regmap_get_val_bytes(madera->regmap); in madera_eq_coeff_put()
4768 dev_err(madera->dev, "Rejecting unstable EQ coefficients\n"); 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() local
4800 dev_err(madera->dev, "Rejecting unstable LHPF coefficients\n"); in madera_lhpf_coeff_put()
4808 MODULE_SOFTDEP("pre: madera");
4809 MODULE_DESCRIPTION("ASoC Cirrus Logic Madera codec support");