From 8280a19ab81ed6ee16d2b3a84d4b1cd10e703ba7 Mon Sep 17 00:00:00 2001 From: Ganapathiraju Sarath Varma Date: Thu, 25 Aug 2022 23:56:53 +0530 Subject: [PATCH] asoc: lpass-cdc: Handle pbr clk based with its ref cnt. Disable the common pbr clk register only when no one uses RX0 and RX1 channels. Change-Id: Ia5fab1d3e4be7d9ecb01ad0b612b9f6ef7406bea Signed-off-by: Ganapathiraju Sarath Varma --- asoc/codecs/lpass-cdc/lpass-cdc-wsa-macro.c | 19 +++++++++++++------ asoc/codecs/lpass-cdc/lpass-cdc-wsa2-macro.c | 19 +++++++++++++------ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/asoc/codecs/lpass-cdc/lpass-cdc-wsa-macro.c b/asoc/codecs/lpass-cdc/lpass-cdc-wsa-macro.c index ec6901bc82..1ee8c9a296 100644 --- a/asoc/codecs/lpass-cdc/lpass-cdc-wsa-macro.c +++ b/asoc/codecs/lpass-cdc/lpass-cdc-wsa-macro.c @@ -317,6 +317,7 @@ struct lpass_cdc_wsa_macro_priv { u8 idle_detect_en; int noise_gate_mode; bool pre_dev_up; + int pbr_clk_users; }; static struct snd_soc_dai_driver lpass_cdc_wsa_macro_dai[]; @@ -1580,15 +1581,18 @@ static int lpass_cdc_was_macro_config_pbr(struct snd_soc_component *component, reg3, 0x80, 0x80); lpass_cdc_wsa_macro_enable_softclip_clk(component, wsa_priv, softclip_path, true); - snd_soc_component_update_bits(component, - LPASS_CDC_WSA_PBR_PATH_CTL, - 0x01, 0x01); + if (wsa_priv->pbr_clk_users == 0) + snd_soc_component_update_bits(component, + LPASS_CDC_WSA_PBR_PATH_CTL, + 0x01, 0x01); + ++wsa_priv->pbr_clk_users; } if (SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_component_update_bits(component, - LPASS_CDC_WSA_PBR_PATH_CTL, - 0x01, 0x00); + if (wsa_priv->pbr_clk_users == 1) + snd_soc_component_update_bits(component, + LPASS_CDC_WSA_PBR_PATH_CTL, + 0x01, 0x00); lpass_cdc_wsa_macro_enable_softclip_clk(component, wsa_priv, softclip_path, false); snd_soc_component_update_bits(component, @@ -1597,6 +1601,9 @@ static int lpass_cdc_was_macro_config_pbr(struct snd_soc_component *component, reg2, 0x40, 0x00); snd_soc_component_update_bits(component, reg3, 0x80, 0x00); + --wsa_priv->pbr_clk_users; + if (wsa_priv->pbr_clk_users < 0) + wsa_priv->pbr_clk_users = 0; } return 0; } diff --git a/asoc/codecs/lpass-cdc/lpass-cdc-wsa2-macro.c b/asoc/codecs/lpass-cdc/lpass-cdc-wsa2-macro.c index 8d5c17977a..022a009c78 100644 --- a/asoc/codecs/lpass-cdc/lpass-cdc-wsa2-macro.c +++ b/asoc/codecs/lpass-cdc/lpass-cdc-wsa2-macro.c @@ -317,6 +317,7 @@ struct lpass_cdc_wsa2_macro_priv { u8 idle_detect_en; int noise_gate_mode; bool pre_dev_up; + int pbr_clk_users; }; static struct snd_soc_dai_driver lpass_cdc_wsa2_macro_dai[]; @@ -1585,15 +1586,18 @@ static int lpass_cdc_was_macro_config_pbr(struct snd_soc_component *component, reg3, 0x80, 0x80); lpass_cdc_wsa2_macro_enable_softclip_clk(component, wsa2_priv, softclip_path, true); - snd_soc_component_update_bits(component, - LPASS_CDC_WSA2_PBR_PATH_CTL, - 0x01, 0x01); + if (wsa2_priv->pbr_clk_users == 0) + snd_soc_component_update_bits(component, + LPASS_CDC_WSA2_PBR_PATH_CTL, + 0x01, 0x01); + ++wsa2_priv->pbr_clk_users; } if (SND_SOC_DAPM_EVENT_OFF(event)) { - snd_soc_component_update_bits(component, - LPASS_CDC_WSA2_PBR_PATH_CTL, - 0x01, 0x00); + if (wsa2_priv->pbr_clk_users) + snd_soc_component_update_bits(component, + LPASS_CDC_WSA2_PBR_PATH_CTL, + 0x01, 0x00); lpass_cdc_wsa2_macro_enable_softclip_clk(component, wsa2_priv, softclip_path, false); snd_soc_component_update_bits(component, @@ -1602,6 +1606,9 @@ static int lpass_cdc_was_macro_config_pbr(struct snd_soc_component *component, reg2, 0x40, 0x00); snd_soc_component_update_bits(component, reg3, 0x80, 0x00); + --wsa2_priv->pbr_clk_users; + if (wsa2_priv->pbr_clk_users < 0) + wsa2_priv->pbr_clk_users = 0; } return 0; }