Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Charles Keepax and committed by
Mark Brown
85e7dd3f 601516a6

+41
+3
include/linux/mfd/arizona/pdata.h
··· 174 174 /** Mode for outputs */ 175 175 int out_mono[ARIZONA_MAX_OUTPUT]; 176 176 177 + /** Limit output volumes */ 178 + unsigned int out_vol_limit[2 * ARIZONA_MAX_OUTPUT]; 179 + 177 180 /** PDM speaker mute setting */ 178 181 unsigned int spk_mute[ARIZONA_MAX_PDM_SPK]; 179 182
+25
sound/soc/codecs/arizona.c
··· 372 372 } 373 373 EXPORT_SYMBOL_GPL(arizona_init_common); 374 374 375 + int arizona_init_vol_limit(struct arizona *arizona) 376 + { 377 + int i; 378 + 379 + for (i = 0; i < ARRAY_SIZE(arizona->pdata.out_vol_limit); ++i) { 380 + if (arizona->pdata.out_vol_limit[i]) 381 + regmap_update_bits(arizona->regmap, 382 + ARIZONA_DAC_VOLUME_LIMIT_1L + i * 4, 383 + ARIZONA_OUT1L_VOL_LIM_MASK, 384 + arizona->pdata.out_vol_limit[i]); 385 + } 386 + 387 + return 0; 388 + } 389 + EXPORT_SYMBOL_GPL(arizona_init_vol_limit); 390 + 375 391 const char * const arizona_mixer_texts[ARIZONA_NUM_MIXER_INPUTS] = { 376 392 "None", 377 393 "Tone Generator 1", ··· 2823 2807 break; 2824 2808 2825 2809 pdata->max_channels_clocked[count] = val; 2810 + count++; 2811 + } 2812 + 2813 + count = 0; 2814 + of_property_for_each_u32(np, "wlf,out-volume-limit", prop, cur, val) { 2815 + if (count == ARRAY_SIZE(pdata->out_vol_limit)) 2816 + break; 2817 + 2818 + pdata->out_vol_limit[count] = val; 2826 2819 count++; 2827 2820 } 2828 2821
+1
sound/soc/codecs/arizona.h
··· 315 315 int arizona_init_mono(struct snd_soc_codec *codec); 316 316 317 317 int arizona_init_common(struct arizona *arizona); 318 + int arizona_init_vol_limit(struct arizona *arizona); 318 319 319 320 int arizona_init_spk_irqs(struct arizona *arizona); 320 321 int arizona_free_spk_irqs(struct arizona *arizona);
+3
sound/soc/codecs/cs47l24.c
··· 1297 1297 1298 1298 arizona_init_common(arizona); 1299 1299 1300 + ret = arizona_init_vol_limit(arizona); 1301 + if (ret < 0) 1302 + goto err_dsp_irq; 1300 1303 ret = arizona_init_spk_irqs(arizona); 1301 1304 if (ret < 0) 1302 1305 goto err_dsp_irq;
+3
sound/soc/codecs/wm5102.c
··· 2107 2107 2108 2108 arizona_init_common(arizona); 2109 2109 2110 + ret = arizona_init_vol_limit(arizona); 2111 + if (ret < 0) 2112 + goto err_dsp_irq; 2110 2113 ret = arizona_init_spk_irqs(arizona); 2111 2114 if (ret < 0) 2112 2115 goto err_dsp_irq;
+3
sound/soc/codecs/wm5110.c
··· 2463 2463 2464 2464 arizona_init_common(arizona); 2465 2465 2466 + ret = arizona_init_vol_limit(arizona); 2467 + if (ret < 0) 2468 + goto err_dsp_irq; 2466 2469 ret = arizona_init_spk_irqs(arizona); 2467 2470 if (ret < 0) 2468 2471 goto err_dsp_irq;
+3
sound/soc/codecs/wm8997.c
··· 1176 1176 1177 1177 arizona_init_common(arizona); 1178 1178 1179 + ret = arizona_init_vol_limit(arizona); 1180 + if (ret < 0) 1181 + return ret; 1179 1182 ret = arizona_init_spk_irqs(arizona); 1180 1183 if (ret < 0) 1181 1184 return ret;