asoc: codecs: Correct the clk users increment/decrement logic
The clk users count goes out of sync with the actual clk requests from clients during SSR/PDR. Increment the clk users only after the clk request is successful. Change-Id: I512f037a118f4763a64e7a64f7f559bcfa37a37f Signed-off-by: Aditya Bavanari <abavanar@codeaurora.org>
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

parent
3a0e91bf0c
commit
c496ed25a9
@@ -157,8 +157,7 @@ static int va_macro_mclk_enable(struct va_macro_priv *va_priv,
|
|||||||
|
|
||||||
mutex_lock(&va_priv->mclk_lock);
|
mutex_lock(&va_priv->mclk_lock);
|
||||||
if (mclk_enable) {
|
if (mclk_enable) {
|
||||||
va_priv->va_mclk_users++;
|
if (va_priv->va_mclk_users == 0) {
|
||||||
if (va_priv->va_mclk_users == 1) {
|
|
||||||
ret = bolero_request_clock(va_priv->dev,
|
ret = bolero_request_clock(va_priv->dev,
|
||||||
VA_MACRO, MCLK_MUX0, true);
|
VA_MACRO, MCLK_MUX0, true);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
@@ -181,8 +180,16 @@ static int va_macro_mclk_enable(struct va_macro_priv *va_priv,
|
|||||||
BOLERO_CDC_VA_TOP_CSR_TOP_CFG0,
|
BOLERO_CDC_VA_TOP_CSR_TOP_CFG0,
|
||||||
0x02, 0x02);
|
0x02, 0x02);
|
||||||
}
|
}
|
||||||
|
va_priv->va_mclk_users++;
|
||||||
} else {
|
} else {
|
||||||
if (va_priv->va_mclk_users == 1) {
|
if (va_priv->va_mclk_users <= 0) {
|
||||||
|
dev_err(va_priv->dev, "%s: clock already disabled\n",
|
||||||
|
__func__);
|
||||||
|
va_priv->va_mclk_users = 0;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
va_priv->va_mclk_users--;
|
||||||
|
if (va_priv->va_mclk_users == 0) {
|
||||||
regmap_update_bits(regmap,
|
regmap_update_bits(regmap,
|
||||||
BOLERO_CDC_VA_TOP_CSR_TOP_CFG0,
|
BOLERO_CDC_VA_TOP_CSR_TOP_CFG0,
|
||||||
0x02, 0x00);
|
0x02, 0x00);
|
||||||
@@ -195,7 +202,6 @@ static int va_macro_mclk_enable(struct va_macro_priv *va_priv,
|
|||||||
bolero_request_clock(va_priv->dev,
|
bolero_request_clock(va_priv->dev,
|
||||||
VA_MACRO, MCLK_MUX0, false);
|
VA_MACRO, MCLK_MUX0, false);
|
||||||
}
|
}
|
||||||
va_priv->va_mclk_users--;
|
|
||||||
}
|
}
|
||||||
exit:
|
exit:
|
||||||
mutex_unlock(&va_priv->mclk_lock);
|
mutex_unlock(&va_priv->mclk_lock);
|
||||||
|
@@ -766,8 +766,7 @@ static int wsa_macro_mclk_enable(struct wsa_macro_priv *wsa_priv,
|
|||||||
|
|
||||||
mutex_lock(&wsa_priv->mclk_lock);
|
mutex_lock(&wsa_priv->mclk_lock);
|
||||||
if (mclk_enable) {
|
if (mclk_enable) {
|
||||||
wsa_priv->wsa_mclk_users++;
|
if (wsa_priv->wsa_mclk_users == 0) {
|
||||||
if (wsa_priv->wsa_mclk_users == 1) {
|
|
||||||
ret = bolero_request_clock(wsa_priv->dev,
|
ret = bolero_request_clock(wsa_priv->dev,
|
||||||
WSA_MACRO, MCLK_MUX0, true);
|
WSA_MACRO, MCLK_MUX0, true);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
@@ -790,7 +789,14 @@ static int wsa_macro_mclk_enable(struct wsa_macro_priv *wsa_priv,
|
|||||||
BOLERO_CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL,
|
BOLERO_CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL,
|
||||||
0x01, 0x01);
|
0x01, 0x01);
|
||||||
}
|
}
|
||||||
|
wsa_priv->wsa_mclk_users++;
|
||||||
} else {
|
} else {
|
||||||
|
if (wsa_priv->wsa_mclk_users <= 0) {
|
||||||
|
dev_err(wsa_priv->dev, "%s: clock already disabled\n",
|
||||||
|
__func__);
|
||||||
|
wsa_priv->wsa_mclk_users = 0;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
wsa_priv->wsa_mclk_users--;
|
wsa_priv->wsa_mclk_users--;
|
||||||
if (wsa_priv->wsa_mclk_users == 0) {
|
if (wsa_priv->wsa_mclk_users == 0) {
|
||||||
regmap_update_bits(regmap,
|
regmap_update_bits(regmap,
|
||||||
@@ -2435,6 +2441,7 @@ static int wsa_swrm_clock(void *handle, bool enable)
|
|||||||
{
|
{
|
||||||
struct wsa_macro_priv *wsa_priv = (struct wsa_macro_priv *) handle;
|
struct wsa_macro_priv *wsa_priv = (struct wsa_macro_priv *) handle;
|
||||||
struct regmap *regmap = dev_get_regmap(wsa_priv->dev->parent, NULL);
|
struct regmap *regmap = dev_get_regmap(wsa_priv->dev->parent, NULL);
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
if (regmap == NULL) {
|
if (regmap == NULL) {
|
||||||
dev_err(wsa_priv->dev, "%s: regmap is NULL\n", __func__);
|
dev_err(wsa_priv->dev, "%s: regmap is NULL\n", __func__);
|
||||||
@@ -2446,9 +2453,14 @@ static int wsa_swrm_clock(void *handle, bool enable)
|
|||||||
dev_dbg(wsa_priv->dev, "%s: swrm clock %s\n",
|
dev_dbg(wsa_priv->dev, "%s: swrm clock %s\n",
|
||||||
__func__, (enable ? "enable" : "disable"));
|
__func__, (enable ? "enable" : "disable"));
|
||||||
if (enable) {
|
if (enable) {
|
||||||
wsa_priv->swr_clk_users++;
|
if (wsa_priv->swr_clk_users == 0) {
|
||||||
if (wsa_priv->swr_clk_users == 1) {
|
ret = wsa_macro_mclk_enable(wsa_priv, 1, true);
|
||||||
wsa_macro_mclk_enable(wsa_priv, 1, true);
|
if (ret < 0) {
|
||||||
|
dev_err(wsa_priv->dev,
|
||||||
|
"%s: wsa request clock enable failed\n",
|
||||||
|
__func__);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
regmap_update_bits(regmap,
|
regmap_update_bits(regmap,
|
||||||
BOLERO_CDC_WSA_CLK_RST_CTRL_SWR_CONTROL,
|
BOLERO_CDC_WSA_CLK_RST_CTRL_SWR_CONTROL,
|
||||||
0x01, 0x01);
|
0x01, 0x01);
|
||||||
@@ -2458,7 +2470,14 @@ static int wsa_swrm_clock(void *handle, bool enable)
|
|||||||
msm_cdc_pinctrl_select_active_state(
|
msm_cdc_pinctrl_select_active_state(
|
||||||
wsa_priv->wsa_swr_gpio_p);
|
wsa_priv->wsa_swr_gpio_p);
|
||||||
}
|
}
|
||||||
|
wsa_priv->swr_clk_users++;
|
||||||
} else {
|
} else {
|
||||||
|
if (wsa_priv->swr_clk_users <= 0) {
|
||||||
|
dev_err(wsa_priv->dev, "%s: clock already disabled\n",
|
||||||
|
__func__);
|
||||||
|
wsa_priv->swr_clk_users = 0;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
wsa_priv->swr_clk_users--;
|
wsa_priv->swr_clk_users--;
|
||||||
if (wsa_priv->swr_clk_users == 0) {
|
if (wsa_priv->swr_clk_users == 0) {
|
||||||
regmap_update_bits(regmap,
|
regmap_update_bits(regmap,
|
||||||
@@ -2471,8 +2490,9 @@ static int wsa_swrm_clock(void *handle, bool enable)
|
|||||||
}
|
}
|
||||||
dev_dbg(wsa_priv->dev, "%s: swrm clock users %d\n",
|
dev_dbg(wsa_priv->dev, "%s: swrm clock users %d\n",
|
||||||
__func__, wsa_priv->swr_clk_users);
|
__func__, wsa_priv->swr_clk_users);
|
||||||
|
exit:
|
||||||
mutex_unlock(&wsa_priv->swr_clk_lock);
|
mutex_unlock(&wsa_priv->swr_clk_lock);
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int wsa_macro_init(struct snd_soc_codec *codec)
|
static int wsa_macro_init(struct snd_soc_codec *codec)
|
||||||
|
Reference in New Issue
Block a user