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

ASoC: arizona: Implement stability check for LHPF coefficients

Specifying unstable coefficients for the low/high pass filters can have
a severe impact on the audio. This patchs adds a stability check on the
coefficients written to the low/high pass filter block to prevent this.

Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Charles Keepax and committed by
Mark Brown
5f8e671a c05d9a8c

+38 -12
+17
sound/soc/codecs/arizona.c
··· 2372 2372 } 2373 2373 EXPORT_SYMBOL_GPL(arizona_eq_coeff_put); 2374 2374 2375 + int arizona_lhpf_coeff_put(struct snd_kcontrol *kcontrol, 2376 + struct snd_ctl_elem_value *ucontrol) 2377 + { 2378 + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); 2379 + struct arizona *arizona = dev_get_drvdata(codec->dev->parent); 2380 + __be16 *data = (__be16 *)ucontrol->value.bytes.data; 2381 + s16 val = be16_to_cpu(*data); 2382 + 2383 + if (abs(val) >= 4096) { 2384 + dev_err(arizona->dev, "Rejecting unstable LHPF coefficients\n"); 2385 + return -EINVAL; 2386 + } 2387 + 2388 + return snd_soc_bytes_put(kcontrol, ucontrol); 2389 + } 2390 + EXPORT_SYMBOL_GPL(arizona_lhpf_coeff_put); 2391 + 2375 2392 MODULE_DESCRIPTION("ASoC Wolfson Arizona class device support"); 2376 2393 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); 2377 2394 MODULE_LICENSE("GPL");
+9
sound/soc/codecs/arizona.h
··· 201 201 ((unsigned long)&(struct soc_bytes) { .base = xbase, \ 202 202 .num_regs = 20, .mask = ~ARIZONA_EQ1_B1_MODE }) } 203 203 204 + #define ARIZONA_LHPF_CONTROL(xname, xbase) \ 205 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ 206 + .info = snd_soc_bytes_info, .get = snd_soc_bytes_get, \ 207 + .put = arizona_lhpf_coeff_put, .private_value = \ 208 + ((unsigned long)&(struct soc_bytes) { .base = xbase, \ 209 + .num_regs = 1 }) } 210 + 204 211 #define ARIZONA_RATE_ENUM_SIZE 4 205 212 extern const char *arizona_rate_text[ARIZONA_RATE_ENUM_SIZE]; 206 213 extern const int arizona_rate_val[ARIZONA_RATE_ENUM_SIZE]; ··· 245 238 246 239 extern int arizona_eq_coeff_put(struct snd_kcontrol *kcontrol, 247 240 struct snd_ctl_elem_value *ucontrol); 241 + extern int arizona_lhpf_coeff_put(struct snd_kcontrol *kcontrol, 242 + struct snd_ctl_elem_value *ucontrol); 248 243 249 244 extern int arizona_set_sysclk(struct snd_soc_codec *codec, int clk_id, 250 245 int source, unsigned int freq, int dir);
+4 -4
sound/soc/codecs/wm5102.c
··· 847 847 ARIZONA_MIXER_CONTROLS("LHPF3", ARIZONA_HPLP3MIX_INPUT_1_SOURCE), 848 848 ARIZONA_MIXER_CONTROLS("LHPF4", ARIZONA_HPLP4MIX_INPUT_1_SOURCE), 849 849 850 - SND_SOC_BYTES("LHPF1 Coefficients", ARIZONA_HPLPF1_2, 1), 851 - SND_SOC_BYTES("LHPF2 Coefficients", ARIZONA_HPLPF2_2, 1), 852 - SND_SOC_BYTES("LHPF3 Coefficients", ARIZONA_HPLPF3_2, 1), 853 - SND_SOC_BYTES("LHPF4 Coefficients", ARIZONA_HPLPF4_2, 1), 850 + ARIZONA_LHPF_CONTROL("LHPF1 Coefficients", ARIZONA_HPLPF1_2), 851 + ARIZONA_LHPF_CONTROL("LHPF2 Coefficients", ARIZONA_HPLPF2_2), 852 + ARIZONA_LHPF_CONTROL("LHPF3 Coefficients", ARIZONA_HPLPF3_2), 853 + ARIZONA_LHPF_CONTROL("LHPF4 Coefficients", ARIZONA_HPLPF4_2), 854 854 855 855 ARIZONA_MIXER_CONTROLS("DSP1L", ARIZONA_DSP1LMIX_INPUT_1_SOURCE), 856 856 ARIZONA_MIXER_CONTROLS("DSP1R", ARIZONA_DSP1RMIX_INPUT_1_SOURCE),
+4 -4
sound/soc/codecs/wm5110.c
··· 310 310 ARIZONA_MIXER_CONTROLS("LHPF3", ARIZONA_HPLP3MIX_INPUT_1_SOURCE), 311 311 ARIZONA_MIXER_CONTROLS("LHPF4", ARIZONA_HPLP4MIX_INPUT_1_SOURCE), 312 312 313 - SND_SOC_BYTES("LHPF1 Coefficients", ARIZONA_HPLPF1_2, 1), 314 - SND_SOC_BYTES("LHPF2 Coefficients", ARIZONA_HPLPF2_2, 1), 315 - SND_SOC_BYTES("LHPF3 Coefficients", ARIZONA_HPLPF3_2, 1), 316 - SND_SOC_BYTES("LHPF4 Coefficients", ARIZONA_HPLPF4_2, 1), 313 + ARIZONA_LHPF_CONTROL("LHPF1 Coefficients", ARIZONA_HPLPF1_2), 314 + ARIZONA_LHPF_CONTROL("LHPF2 Coefficients", ARIZONA_HPLPF2_2), 315 + ARIZONA_LHPF_CONTROL("LHPF3 Coefficients", ARIZONA_HPLPF3_2), 316 + ARIZONA_LHPF_CONTROL("LHPF4 Coefficients", ARIZONA_HPLPF4_2), 317 317 318 318 SOC_ENUM("LHPF1 Mode", arizona_lhpf1_mode), 319 319 SOC_ENUM("LHPF2 Mode", arizona_lhpf2_mode),
+4 -4
sound/soc/codecs/wm8997.c
··· 238 238 SOC_ENUM("LHPF3 Mode", arizona_lhpf3_mode), 239 239 SOC_ENUM("LHPF4 Mode", arizona_lhpf4_mode), 240 240 241 - SND_SOC_BYTES("LHPF1 Coefficients", ARIZONA_HPLPF1_2, 1), 242 - SND_SOC_BYTES("LHPF2 Coefficients", ARIZONA_HPLPF2_2, 1), 243 - SND_SOC_BYTES("LHPF3 Coefficients", ARIZONA_HPLPF3_2, 1), 244 - SND_SOC_BYTES("LHPF4 Coefficients", ARIZONA_HPLPF4_2, 1), 241 + ARIZONA_LHPF_CONTROL("LHPF1 Coefficients", ARIZONA_HPLPF1_2), 242 + ARIZONA_LHPF_CONTROL("LHPF2 Coefficients", ARIZONA_HPLPF2_2), 243 + ARIZONA_LHPF_CONTROL("LHPF3 Coefficients", ARIZONA_HPLPF3_2), 244 + ARIZONA_LHPF_CONTROL("LHPF4 Coefficients", ARIZONA_HPLPF4_2), 245 245 246 246 SOC_ENUM("ISRC1 FSL", arizona_isrc_fsl[0]), 247 247 SOC_ENUM("ISRC2 FSL", arizona_isrc_fsl[1]),