diff --git a/asoc/codecs/bolero/bolero-cdc.c b/asoc/codecs/bolero/bolero-cdc.c index 32a34fd898de..f1283f3df204 100644 --- a/asoc/codecs/bolero/bolero-cdc.c +++ b/asoc/codecs/bolero/bolero-cdc.c @@ -464,6 +464,46 @@ void bolero_unregister_macro(struct device *dev, u16 macro_id) } EXPORT_SYMBOL(bolero_unregister_macro); +static void bolero_fs_gen_enable(struct bolero_priv *priv, bool enable) +{ + if (enable) { + if (++priv->clk_users == 1) { + mutex_unlock(&priv->clk_lock); + regmap_update_bits(priv->regmap, + BOLERO_CDC_VA_CLK_RST_CTRL_MCLK_CONTROL, + 0x01, 0x01); + regmap_update_bits(priv->regmap, + BOLERO_CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL, + 0x01, 0x01); + regmap_update_bits(priv->regmap, + BOLERO_CDC_VA_TOP_CSR_TOP_CFG0, + 0x02, 0x02); + mutex_lock(&priv->clk_lock); + } + } else { + if (priv->clk_users <= 0) { + dev_err(priv->dev, + "%s:clock already disabled\n", + __func__); + priv->clk_users = 0; + return; + } + if (--priv->clk_users == 0) { + mutex_unlock(&priv->clk_lock); + regmap_update_bits(priv->regmap, + BOLERO_CDC_VA_TOP_CSR_TOP_CFG0, + 0x02, 0x00); + regmap_update_bits(priv->regmap, + BOLERO_CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL, + 0x01, 0x00); + regmap_update_bits(priv->regmap, + BOLERO_CDC_VA_CLK_RST_CTRL_MCLK_CONTROL, + 0x01, 0x00); + mutex_lock(&priv->clk_lock); + } + } +} + /** * bolero_request_clock - request for clock enable/disable * @@ -510,6 +550,7 @@ int bolero_request_clock(struct device *dev, u16 macro_id, macro_id, mclk_mux0_macro); goto err; } + bolero_fs_gen_enable(priv, enable); break; case MCLK_MUX1: mclk_mux1_macro = bolero_mclk_mux_tbl[macro_id][MCLK_MUX1]; @@ -527,6 +568,7 @@ int bolero_request_clock(struct device *dev, u16 macro_id, if (enable) goto err; } + bolero_fs_gen_enable(priv, enable); /* * need different return value as ret variable * is used to track mclk_mux0 enable success or fail diff --git a/asoc/codecs/bolero/internal.h b/asoc/codecs/bolero/internal.h index 909333420897..1e5651bae920 100644 --- a/asoc/codecs/bolero/internal.h +++ b/asoc/codecs/bolero/internal.h @@ -73,6 +73,7 @@ struct bolero_priv { struct wcd_ctrl_platform_data plat_data; struct device *wcd_dev; struct blocking_notifier_head notifier; + int clk_users; }; struct regmap *bolero_regmap_init(struct device *dev, diff --git a/asoc/codecs/bolero/va-macro.c b/asoc/codecs/bolero/va-macro.c index e89042e17e85..f8df0b7722f2 100644 --- a/asoc/codecs/bolero/va-macro.c +++ b/asoc/codecs/bolero/va-macro.c @@ -166,15 +166,6 @@ static int va_macro_mclk_enable(struct va_macro_priv *va_priv, regcache_sync_region(regmap, VA_START_OFFSET, VA_MAX_OFFSET); - regmap_update_bits(regmap, - BOLERO_CDC_VA_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x01); - regmap_update_bits(regmap, - BOLERO_CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x01); - regmap_update_bits(regmap, - BOLERO_CDC_VA_TOP_CSR_TOP_CFG0, - 0x02, 0x02); } va_priv->va_mclk_users++; } else { @@ -186,15 +177,6 @@ static int va_macro_mclk_enable(struct va_macro_priv *va_priv, } va_priv->va_mclk_users--; if (va_priv->va_mclk_users == 0) { - regmap_update_bits(regmap, - BOLERO_CDC_VA_TOP_CSR_TOP_CFG0, - 0x02, 0x00); - regmap_update_bits(regmap, - BOLERO_CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL, - 0x01, 0x00); - regmap_update_bits(regmap, - BOLERO_CDC_VA_CLK_RST_CTRL_MCLK_CONTROL, - 0x01, 0x00); bolero_request_clock(va_priv->dev, VA_MACRO, va_priv->mclk_mux_sel, false);