diff --git a/asoc/codecs/bolero/rx-macro.c b/asoc/codecs/bolero/rx-macro.c index 322d1de2aea6..c6a9d3dd62fb 100644 --- a/asoc/codecs/bolero/rx-macro.c +++ b/asoc/codecs/bolero/rx-macro.c @@ -1798,14 +1798,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: @@ -1817,7 +1826,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; }