From 5990a54d8ef1a9993e7e71417db86e96d5d3f980 Mon Sep 17 00:00:00 2001 From: Yuhui Zhao Date: Mon, 3 Apr 2023 14:38:16 +0800 Subject: [PATCH] asoc: lpass-cdc: add enable check before tx mixer put Check whether tx channel had been enabled or disabled before tx channel set. Change-Id: I1f2e0132f0905a53df989b5d52370c4dfdf7d99b --- asoc/codecs/lpass-cdc/lpass-cdc-tx-macro.c | 20 +++++++++++++++----- asoc/codecs/lpass-cdc/lpass-cdc-va-macro.c | 20 +++++++++++++++----- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/asoc/codecs/lpass-cdc/lpass-cdc-tx-macro.c b/asoc/codecs/lpass-cdc/lpass-cdc-tx-macro.c index 1e108235a0..9095a62342 100644 --- a/asoc/codecs/lpass-cdc/lpass-cdc-tx-macro.c +++ b/asoc/codecs/lpass-cdc/lpass-cdc-tx-macro.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved. */ #include @@ -612,11 +612,21 @@ static int lpass_cdc_tx_macro_tx_mixer_put(struct snd_kcontrol *kcontrol, return -EINVAL; if (enable) { - set_bit(dec_id, &tx_priv->active_ch_mask[dai_id]); - tx_priv->active_ch_cnt[dai_id]++; + if (test_bit(dec_id, &tx_priv->active_ch_mask[dai_id])) { + dev_err(component->dev, "%s: channel is already enabled, dec_id = %d, dai_id = %d\n", + __func__, dec_id, dai_id); + } else { + set_bit(dec_id, &tx_priv->active_ch_mask[dai_id]); + tx_priv->active_ch_cnt[dai_id]++; + } } else { - tx_priv->active_ch_cnt[dai_id]--; - clear_bit(dec_id, &tx_priv->active_ch_mask[dai_id]); + if (!test_bit(dec_id, &tx_priv->active_ch_mask[dai_id])) { + dev_err(component->dev, "%s: channel is already disabled, dec_id = %d, dai_id = %d\n", + __func__, dec_id, dai_id); + } else { + tx_priv->active_ch_cnt[dai_id]--; + clear_bit(dec_id, &tx_priv->active_ch_mask[dai_id]); + } } snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, update); diff --git a/asoc/codecs/lpass-cdc/lpass-cdc-va-macro.c b/asoc/codecs/lpass-cdc/lpass-cdc-va-macro.c index bfd134beb2..c082a5b11e 100644 --- a/asoc/codecs/lpass-cdc/lpass-cdc-va-macro.c +++ b/asoc/codecs/lpass-cdc/lpass-cdc-va-macro.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved. */ #include @@ -1186,11 +1186,21 @@ static int lpass_cdc_va_macro_tx_mixer_put(struct snd_kcontrol *kcontrol, return -EINVAL; if (enable) { - set_bit(dec_id, &va_priv->active_ch_mask[dai_id]); - va_priv->active_ch_cnt[dai_id]++; + if (test_bit(dec_id, &va_priv->active_ch_mask[dai_id])) { + dev_err_ratelimited(component->dev, "%s: channel is already enabled, dec_id = %d, dai_id = %d\n", + __func__, dec_id, dai_id); + } else { + set_bit(dec_id, &va_priv->active_ch_mask[dai_id]); + va_priv->active_ch_cnt[dai_id]++; + } } else { - clear_bit(dec_id, &va_priv->active_ch_mask[dai_id]); - va_priv->active_ch_cnt[dai_id]--; + if (!test_bit(dec_id, &va_priv->active_ch_mask[dai_id])) { + dev_err_ratelimited(component->dev, "%s: channel is already disabled, dec_id = %d, dai_id = %d\n", + __func__, dec_id, dai_id); + } else { + va_priv->active_ch_mask[dai_id]--; + clear_bit(dec_id, &va_priv->active_ch_mask[dai_id]); + } } snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, update);