ASoC: arizona: Add support for setting the output volume limits
The output volume limits allow signals to be limited to specific levels appropriate for the hardware attached. As this is a property of the hardware itself these will be configured through device tree. Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com> Acked-by: Lee Jones <lee.jones@linaro.org> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
601516a6f8
commit
85e7dd3f87
|
@ -174,6 +174,9 @@ struct arizona_pdata {
|
|||
/** Mode for outputs */
|
||||
int out_mono[ARIZONA_MAX_OUTPUT];
|
||||
|
||||
/** Limit output volumes */
|
||||
unsigned int out_vol_limit[2 * ARIZONA_MAX_OUTPUT];
|
||||
|
||||
/** PDM speaker mute setting */
|
||||
unsigned int spk_mute[ARIZONA_MAX_PDM_SPK];
|
||||
|
||||
|
|
|
@ -372,6 +372,22 @@ int arizona_init_common(struct arizona *arizona)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(arizona_init_common);
|
||||
|
||||
int arizona_init_vol_limit(struct arizona *arizona)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(arizona->pdata.out_vol_limit); ++i) {
|
||||
if (arizona->pdata.out_vol_limit[i])
|
||||
regmap_update_bits(arizona->regmap,
|
||||
ARIZONA_DAC_VOLUME_LIMIT_1L + i * 4,
|
||||
ARIZONA_OUT1L_VOL_LIM_MASK,
|
||||
arizona->pdata.out_vol_limit[i]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(arizona_init_vol_limit);
|
||||
|
||||
const char * const arizona_mixer_texts[ARIZONA_NUM_MIXER_INPUTS] = {
|
||||
"None",
|
||||
"Tone Generator 1",
|
||||
|
@ -2810,6 +2826,15 @@ int arizona_of_get_audio_pdata(struct arizona *arizona)
|
|||
count++;
|
||||
}
|
||||
|
||||
count = 0;
|
||||
of_property_for_each_u32(np, "wlf,out-volume-limit", prop, cur, val) {
|
||||
if (count == ARRAY_SIZE(pdata->out_vol_limit))
|
||||
break;
|
||||
|
||||
pdata->out_vol_limit[count] = val;
|
||||
count++;
|
||||
}
|
||||
|
||||
ret = of_property_read_u32_array(np, "wlf,spk-fmt",
|
||||
pdm_val, ARRAY_SIZE(pdm_val));
|
||||
|
||||
|
|
|
@ -315,6 +315,7 @@ int arizona_init_gpio(struct snd_soc_codec *codec);
|
|||
int arizona_init_mono(struct snd_soc_codec *codec);
|
||||
|
||||
int arizona_init_common(struct arizona *arizona);
|
||||
int arizona_init_vol_limit(struct arizona *arizona);
|
||||
|
||||
int arizona_init_spk_irqs(struct arizona *arizona);
|
||||
int arizona_free_spk_irqs(struct arizona *arizona);
|
||||
|
|
|
@ -1297,6 +1297,9 @@ static int cs47l24_probe(struct platform_device *pdev)
|
|||
|
||||
arizona_init_common(arizona);
|
||||
|
||||
ret = arizona_init_vol_limit(arizona);
|
||||
if (ret < 0)
|
||||
goto err_dsp_irq;
|
||||
ret = arizona_init_spk_irqs(arizona);
|
||||
if (ret < 0)
|
||||
goto err_dsp_irq;
|
||||
|
|
|
@ -2107,6 +2107,9 @@ static int wm5102_probe(struct platform_device *pdev)
|
|||
|
||||
arizona_init_common(arizona);
|
||||
|
||||
ret = arizona_init_vol_limit(arizona);
|
||||
if (ret < 0)
|
||||
goto err_dsp_irq;
|
||||
ret = arizona_init_spk_irqs(arizona);
|
||||
if (ret < 0)
|
||||
goto err_dsp_irq;
|
||||
|
|
|
@ -2463,6 +2463,9 @@ static int wm5110_probe(struct platform_device *pdev)
|
|||
|
||||
arizona_init_common(arizona);
|
||||
|
||||
ret = arizona_init_vol_limit(arizona);
|
||||
if (ret < 0)
|
||||
goto err_dsp_irq;
|
||||
ret = arizona_init_spk_irqs(arizona);
|
||||
if (ret < 0)
|
||||
goto err_dsp_irq;
|
||||
|
|
|
@ -1176,6 +1176,9 @@ static int wm8997_probe(struct platform_device *pdev)
|
|||
|
||||
arizona_init_common(arizona);
|
||||
|
||||
ret = arizona_init_vol_limit(arizona);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
ret = arizona_init_spk_irqs(arizona);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
|
Loading…
Reference in New Issue