* add error handling in case register read fails * clamp the values if the register value read is out of range
Signed-off-by: Niranjan H Y niranjan.hy@ti.com -- v5: - remove clamp parameter - move the boundary check after sign-bit extension --- sound/soc/soc-ops.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/sound/soc/soc-ops.c b/sound/soc/soc-ops.c index a629e0eac..03f74c32d 100644 --- a/sound/soc/soc-ops.c +++ b/sound/soc/soc-ops.c @@ -118,6 +118,7 @@ static int soc_mixer_reg_to_ctl(struct soc_mixer_control *mc, unsigned int reg_v if (mc->sign_bit) val = sign_extend32(val, mc->sign_bit);
+ val = clamp(val, mc->min, mc->max); val -= mc->min;
if (mc->invert) @@ -249,9 +250,15 @@ static int soc_get_volsw(struct snd_kcontrol *kcontrol, { struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); unsigned int reg_val; - int val; + int val, ret = 0;
reg_val = snd_soc_component_read(component, mc->reg); + val = reg_val; + if (val < 0) { + ret = val; + goto get_volsw_done; + } + val = soc_mixer_reg_to_ctl(mc, reg_val, mask, mc->shift, max);
ucontrol->value.integer.value[0] = val; @@ -261,13 +268,19 @@ static int soc_get_volsw(struct snd_kcontrol *kcontrol, val = soc_mixer_reg_to_ctl(mc, reg_val, mask, mc->rshift, max); } else { reg_val = snd_soc_component_read(component, mc->rreg); + val = reg_val; + if (val < 0) { + ret = val; + goto get_volsw_done; + } val = soc_mixer_reg_to_ctl(mc, reg_val, mask, mc->shift, max); }
ucontrol->value.integer.value[1] = val; }
- return 0; +get_volsw_done: + return ret; }
/**