From c0f75b77270d5e4bc37ad960390158ec0897f8b1 Mon Sep 17 00:00:00 2001 From: Sudheer Papothi Date: Tue, 16 Jul 2019 06:04:10 +0530 Subject: [PATCH] ASoC: bolero: check for port validation before configuration Check for valid port before mux configuration. Change-Id: Iaa32925f0c23305a2a3cedd0e476372aac380e0c Signed-off-by: Sudheer Papothi --- asoc/codecs/bolero/rx-macro.c | 18 ++++++++++++++---- asoc/codecs/bolero/wsa-macro.c | 19 +++++++++++++++---- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/asoc/codecs/bolero/rx-macro.c b/asoc/codecs/bolero/rx-macro.c index 03dea2093639..1fe591f86997 100644 --- a/asoc/codecs/bolero/rx-macro.c +++ b/asoc/codecs/bolero/rx-macro.c @@ -1810,14 +1810,23 @@ static int rx_macro_mux_put(struct snd_kcontrol *kcontrol, dev_err(rx_dev, "%s:AIF reset already\n", __func__); return 0; } + if (aif_rst > RX_MACRO_AIF4_PB) { + dev_err(rx_dev, "%s: Invalid AIF reset\n", __func__); + return 0; + } } rx_priv->rx_port_value[widget->shift] = rx_port_value; + dev_dbg(rx_dev, "%s: mux input: %d, mux output: %d, aif_rst: %d\n", + __func__, rx_port_value, widget->shift, aif_rst); + switch (rx_port_value) { case 0: - clear_bit(widget->shift, - &rx_priv->active_ch_mask[aif_rst]); - rx_priv->active_ch_cnt[aif_rst]--; + if (rx_priv->active_ch_cnt[aif_rst]) { + clear_bit(widget->shift, + &rx_priv->active_ch_mask[aif_rst]); + rx_priv->active_ch_cnt[aif_rst]--; + } break; case 1: case 2: @@ -1829,7 +1838,8 @@ static int rx_macro_mux_put(struct snd_kcontrol *kcontrol, break; default: dev_err(component->dev, - "%s:Invalid AIF_ID for RX_MACRO MUX\n", __func__); + "%s:Invalid AIF_ID for RX_MACRO MUX %d\n", + __func__, rx_port_value); goto err; } diff --git a/asoc/codecs/bolero/wsa-macro.c b/asoc/codecs/bolero/wsa-macro.c index 928aec0d5e0d..dd12ad237362 100644 --- a/asoc/codecs/bolero/wsa-macro.c +++ b/asoc/codecs/bolero/wsa-macro.c @@ -2057,6 +2057,10 @@ static int wsa_macro_rx_mux_put(struct snd_kcontrol *kcontrol, dev_err(wsa_dev, "%s: AIF reset already\n", __func__); return 0; } + if (aif_rst >= WSA_MACRO_RX_MAX) { + dev_err(wsa_dev, "%s: Invalid AIF reset\n", __func__); + return 0; + } } wsa_priv->rx_port_value[widget->shift] = rx_port_value; @@ -2064,11 +2068,17 @@ static int wsa_macro_rx_mux_put(struct snd_kcontrol *kcontrol, if (widget->shift >= WSA_MACRO_RX_MIX) bit_input %= WSA_MACRO_RX_MIX; + dev_dbg(wsa_dev, + "%s: mux input: %d, mux output: %d, bit: %d\n", + __func__, rx_port_value, widget->shift, bit_input); + switch (rx_port_value) { case 0: - clear_bit(bit_input, - &wsa_priv->active_ch_mask[aif_rst]); - wsa_priv->active_ch_cnt[aif_rst]--; + if (wsa_priv->active_ch_cnt[aif_rst]) { + clear_bit(bit_input, + &wsa_priv->active_ch_mask[aif_rst]); + wsa_priv->active_ch_cnt[aif_rst]--; + } break; case 1: case 2: @@ -2078,7 +2088,8 @@ static int wsa_macro_rx_mux_put(struct snd_kcontrol *kcontrol, break; default: dev_err(wsa_dev, - "%s: Invalid AIF_ID for WSA RX MUX\n", __func__); + "%s: Invalid AIF_ID for WSA RX MUX %d\n", + __func__, rx_port_value); return -EINVAL; }