ASoC: madera: Enable clocks for input pins when used as a direct clock
When one of the MCLK pins is used to supply an internal clock directly enable the source clock for that pin. Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com> Link: https://lore.kernel.org/r/20191230143517.21005-1-ckeepax@opensource.cirrus.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
9ea7a991cc
commit
1094af1199
|
@ -438,11 +438,13 @@ static const struct snd_kcontrol_new cs47l15_aec_loopback_mux[] = {
|
|||
static const struct snd_soc_dapm_widget cs47l15_dapm_widgets[] = {
|
||||
SND_SOC_DAPM_SUPPLY("SYSCLK", MADERA_SYSTEM_CLOCK_1, MADERA_SYSCLK_ENA_SHIFT,
|
||||
0, madera_sysclk_ev,
|
||||
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
|
||||
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
|
||||
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
|
||||
SND_SOC_DAPM_SUPPLY("OPCLK", MADERA_OUTPUT_SYSTEM_CLOCK,
|
||||
MADERA_OPCLK_ENA_SHIFT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("DSPCLK", MADERA_DSP_CLOCK_1,
|
||||
MADERA_DSP_CLK_ENA_SHIFT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("DSPCLK", MADERA_DSP_CLOCK_1, MADERA_DSP_CLK_ENA_SHIFT,
|
||||
0, madera_clk_ev,
|
||||
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
|
||||
|
||||
SND_SOC_DAPM_REGULATOR_SUPPLY("CPVDD1", 20, 0),
|
||||
SND_SOC_DAPM_REGULATOR_SUPPLY("MICVDD", 0, SND_SOC_DAPM_REGULATOR_BYPASS),
|
||||
|
|
|
@ -521,11 +521,13 @@ static const struct snd_kcontrol_new cs47l35_aec_loopback_mux[] = {
|
|||
static const struct snd_soc_dapm_widget cs47l35_dapm_widgets[] = {
|
||||
SND_SOC_DAPM_SUPPLY("SYSCLK", MADERA_SYSTEM_CLOCK_1, MADERA_SYSCLK_ENA_SHIFT,
|
||||
0, madera_sysclk_ev,
|
||||
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
|
||||
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
|
||||
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
|
||||
SND_SOC_DAPM_SUPPLY("OPCLK", MADERA_OUTPUT_SYSTEM_CLOCK,
|
||||
MADERA_OPCLK_ENA_SHIFT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("DSPCLK", MADERA_DSP_CLOCK_1, MADERA_DSP_CLK_ENA_SHIFT,
|
||||
0, NULL, 0),
|
||||
0, madera_clk_ev,
|
||||
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
|
||||
|
||||
SND_SOC_DAPM_REGULATOR_SUPPLY("DBVDD2", 0, 0),
|
||||
SND_SOC_DAPM_REGULATOR_SUPPLY("CPVDD1", 20, 0),
|
||||
|
|
|
@ -790,15 +790,18 @@ static const struct snd_kcontrol_new cs47l85_output_anc_src[] = {
|
|||
static const struct snd_soc_dapm_widget cs47l85_dapm_widgets[] = {
|
||||
SND_SOC_DAPM_SUPPLY("SYSCLK", MADERA_SYSTEM_CLOCK_1, MADERA_SYSCLK_ENA_SHIFT,
|
||||
0, madera_sysclk_ev,
|
||||
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
|
||||
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
|
||||
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
|
||||
SND_SOC_DAPM_SUPPLY("ASYNCCLK", MADERA_ASYNC_CLOCK_1,
|
||||
MADERA_ASYNC_CLK_ENA_SHIFT, 0, NULL, 0),
|
||||
MADERA_ASYNC_CLK_ENA_SHIFT, 0, madera_clk_ev,
|
||||
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
|
||||
SND_SOC_DAPM_SUPPLY("OPCLK", MADERA_OUTPUT_SYSTEM_CLOCK,
|
||||
MADERA_OPCLK_ENA_SHIFT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("ASYNCOPCLK", MADERA_OUTPUT_ASYNC_CLOCK,
|
||||
MADERA_OPCLK_ASYNC_ENA_SHIFT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("DSPCLK", MADERA_DSP_CLOCK_1,
|
||||
MADERA_DSP_CLK_ENA_SHIFT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("DSPCLK", MADERA_DSP_CLOCK_1, MADERA_DSP_CLK_ENA_SHIFT,
|
||||
0, madera_clk_ev,
|
||||
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
|
||||
|
||||
SND_SOC_DAPM_REGULATOR_SUPPLY("DBVDD2", 0, 0),
|
||||
SND_SOC_DAPM_REGULATOR_SUPPLY("DBVDD3", 0, 0),
|
||||
|
|
|
@ -744,15 +744,18 @@ static const struct snd_kcontrol_new cs47l90_output_anc_src[] = {
|
|||
static const struct snd_soc_dapm_widget cs47l90_dapm_widgets[] = {
|
||||
SND_SOC_DAPM_SUPPLY("SYSCLK", MADERA_SYSTEM_CLOCK_1, MADERA_SYSCLK_ENA_SHIFT,
|
||||
0, madera_sysclk_ev,
|
||||
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
|
||||
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
|
||||
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
|
||||
SND_SOC_DAPM_SUPPLY("ASYNCCLK", MADERA_ASYNC_CLOCK_1,
|
||||
MADERA_ASYNC_CLK_ENA_SHIFT, 0, NULL, 0),
|
||||
MADERA_ASYNC_CLK_ENA_SHIFT, 0, madera_clk_ev,
|
||||
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
|
||||
SND_SOC_DAPM_SUPPLY("OPCLK", MADERA_OUTPUT_SYSTEM_CLOCK,
|
||||
MADERA_OPCLK_ENA_SHIFT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("ASYNCOPCLK", MADERA_OUTPUT_ASYNC_CLOCK,
|
||||
MADERA_OPCLK_ASYNC_ENA_SHIFT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("DSPCLK", MADERA_DSP_CLOCK_1,
|
||||
MADERA_DSP_CLK_ENA_SHIFT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("DSPCLK", MADERA_DSP_CLOCK_1, MADERA_DSP_CLK_ENA_SHIFT,
|
||||
0, madera_clk_ev,
|
||||
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
|
||||
|
||||
SND_SOC_DAPM_REGULATOR_SUPPLY("DBVDD2", 0, 0),
|
||||
SND_SOC_DAPM_REGULATOR_SUPPLY("DBVDD3", 0, 0),
|
||||
|
|
|
@ -163,6 +163,51 @@ static int cs47l92_adsp_power_ev(struct snd_soc_dapm_widget *w,
|
|||
return wm_adsp_early_event(w, kcontrol, event);
|
||||
}
|
||||
|
||||
static int cs47l92_outclk_ev(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol,
|
||||
int event)
|
||||
{
|
||||
struct snd_soc_component *component =
|
||||
snd_soc_dapm_to_component(w->dapm);
|
||||
struct cs47l92 *cs47l92 = snd_soc_component_get_drvdata(component);
|
||||
struct madera_priv *priv = &cs47l92->core;
|
||||
struct madera *madera = priv->madera;
|
||||
unsigned int val;
|
||||
int ret;
|
||||
|
||||
ret = regmap_read(madera->regmap, MADERA_OUTPUT_RATE_1, &val);
|
||||
if (ret) {
|
||||
dev_err(madera->dev, "Failed to read OUTCLK source: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
val &= MADERA_OUT_CLK_SRC_MASK;
|
||||
|
||||
switch (val) {
|
||||
case MADERA_OUTCLK_MCLK1:
|
||||
case MADERA_OUTCLK_MCLK2:
|
||||
case MADERA_OUTCLK_MCLK3:
|
||||
val -= (MADERA_OUTCLK_MCLK1 - MADERA_MCLK1);
|
||||
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_PRE_PMU:
|
||||
ret = clk_prepare_enable(madera->mclk[val].clk);
|
||||
if (ret)
|
||||
return ret;
|
||||
break;
|
||||
case SND_SOC_DAPM_POST_PMD:
|
||||
clk_disable_unprepare(madera->mclk[val].clk);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return madera_domain_clk_ev(w, kcontrol, event);
|
||||
}
|
||||
|
||||
#define CS47L92_NG_SRC(name, base) \
|
||||
SOC_SINGLE(name " NG HPOUT1L Switch", base, 0, 1, 0), \
|
||||
SOC_SINGLE(name " NG HPOUT1R Switch", base, 1, 1, 0), \
|
||||
|
@ -615,15 +660,18 @@ static const struct snd_kcontrol_new cs47l92_aec_loopback_mux =
|
|||
static const struct snd_soc_dapm_widget cs47l92_dapm_widgets[] = {
|
||||
SND_SOC_DAPM_SUPPLY("SYSCLK", MADERA_SYSTEM_CLOCK_1, MADERA_SYSCLK_ENA_SHIFT,
|
||||
0, madera_sysclk_ev,
|
||||
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
|
||||
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
|
||||
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
|
||||
SND_SOC_DAPM_SUPPLY("ASYNCCLK", MADERA_ASYNC_CLOCK_1,
|
||||
MADERA_ASYNC_CLK_ENA_SHIFT, 0, NULL, 0),
|
||||
MADERA_ASYNC_CLK_ENA_SHIFT, 0, madera_clk_ev,
|
||||
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
|
||||
SND_SOC_DAPM_SUPPLY("OPCLK", MADERA_OUTPUT_SYSTEM_CLOCK,
|
||||
MADERA_OPCLK_ENA_SHIFT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("ASYNCOPCLK", MADERA_OUTPUT_ASYNC_CLOCK,
|
||||
MADERA_OPCLK_ASYNC_ENA_SHIFT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("DSPCLK", MADERA_DSP_CLOCK_1,
|
||||
MADERA_DSP_CLK_ENA_SHIFT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("DSPCLK", MADERA_DSP_CLOCK_1, MADERA_DSP_CLK_ENA_SHIFT,
|
||||
0, madera_clk_ev,
|
||||
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
|
||||
|
||||
SND_SOC_DAPM_REGULATOR_SUPPLY("CPVDD1", 20, 0),
|
||||
SND_SOC_DAPM_REGULATOR_SUPPLY("CPVDD2", 20, 0),
|
||||
|
@ -666,7 +714,7 @@ SND_SOC_DAPM_SUPPLY("ISRC2CLK", SND_SOC_NOPM,
|
|||
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
|
||||
SND_SOC_DAPM_SUPPLY("OUTCLK", SND_SOC_NOPM,
|
||||
MADERA_DOM_GRP_OUT, 0,
|
||||
madera_domain_clk_ev,
|
||||
cs47l92_outclk_ev,
|
||||
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
|
||||
SND_SOC_DAPM_SUPPLY("SPDCLK", SND_SOC_NOPM,
|
||||
MADERA_DOM_GRP_SPD, 0,
|
||||
|
|
|
@ -163,6 +163,48 @@ static const int madera_dsp_bus_error_irqs[MADERA_MAX_ADSP] = {
|
|||
MADERA_IRQ_DSP7_BUS_ERR,
|
||||
};
|
||||
|
||||
int madera_clk_ev(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
|
||||
struct madera_priv *priv = snd_soc_component_get_drvdata(component);
|
||||
struct madera *madera = priv->madera;
|
||||
unsigned int val;
|
||||
int clk_idx;
|
||||
int ret;
|
||||
|
||||
ret = regmap_read(madera->regmap, w->reg, &val);
|
||||
if (ret) {
|
||||
dev_err(madera->dev, "Failed to check clock source: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
switch ((val & MADERA_SYSCLK_SRC_MASK) >> MADERA_SYSCLK_SRC_SHIFT) {
|
||||
case MADERA_CLK_SRC_MCLK1:
|
||||
clk_idx = MADERA_MCLK1;
|
||||
break;
|
||||
case MADERA_CLK_SRC_MCLK2:
|
||||
clk_idx = MADERA_MCLK2;
|
||||
break;
|
||||
case MADERA_CLK_SRC_MCLK3:
|
||||
clk_idx = MADERA_MCLK3;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_PRE_PMU:
|
||||
return clk_prepare_enable(madera->mclk[clk_idx].clk);
|
||||
case SND_SOC_DAPM_POST_PMD:
|
||||
clk_disable_unprepare(madera->mclk[clk_idx].clk);
|
||||
return 0;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(madera_clk_ev);
|
||||
|
||||
static void madera_spin_sysclk(struct madera_priv *priv)
|
||||
{
|
||||
struct madera *madera = priv->madera;
|
||||
|
@ -193,9 +235,16 @@ int madera_sysclk_ev(struct snd_soc_dapm_widget *w,
|
|||
struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
|
||||
struct madera_priv *priv = snd_soc_component_get_drvdata(component);
|
||||
|
||||
madera_spin_sysclk(priv);
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_POST_PMU:
|
||||
case SND_SOC_DAPM_PRE_PMD:
|
||||
madera_spin_sysclk(priv);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return madera_clk_ev(w, kcontrol, event);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(madera_sysclk_ev);
|
||||
|
||||
|
|
|
@ -383,6 +383,8 @@ int madera_eq_coeff_put(struct snd_kcontrol *kcontrol,
|
|||
int madera_lhpf_coeff_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol);
|
||||
|
||||
int madera_clk_ev(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event);
|
||||
int madera_sysclk_ev(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event);
|
||||
int madera_spk_ev(struct snd_soc_dapm_widget *w,
|
||||
|
|
Loading…
Reference in a new issue