From 4b12aed7a0cebe8a0f825d9956d46c77e692b48f Mon Sep 17 00:00:00 2001 From: Yuhui Zhao Date: Fri, 21 Jun 2024 20:47:12 +0800 Subject: [PATCH] asoc: wcd9378: disable swr slave path when any usecase stop As of now swr slave path disable only when no usecase running, that is incorrect. When stop the usecase itself disable the swr slave path and set the clk for inactive bank. Change-Id: I35bc693dc65028ba8ad04f59d47a1101c7bb470c Signed-off-by: Yuhui Zhao --- asoc/codecs/wcd9378/wcd9378.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/asoc/codecs/wcd9378/wcd9378.c b/asoc/codecs/wcd9378/wcd9378.c index e23808d0ec..3b73792b9b 100644 --- a/asoc/codecs/wcd9378/wcd9378.c +++ b/asoc/codecs/wcd9378/wcd9378.c @@ -293,8 +293,9 @@ static int wcd9378_swr_slvdev_datapath_control(struct device *dev, struct wcd9378_priv *wcd9378 = NULL; struct swr_device *swr_dev = NULL; int bank = 0, ret = 0; - u8 clk_rst = 0x00, scale_rst = 0x00, swr_clk = 0, clk_scale = 0; - u16 scale_reg = 0; + u8 clk_rst = 0x00, scale_rst = 0x00; + u8 swr_clk = 0, clk_scale = 0; + u16 scale_reg = 0, scale_reg2 = 0; wcd9378 = dev_get_drvdata(dev); if (!wcd9378) @@ -315,12 +316,16 @@ static int wcd9378_swr_slvdev_datapath_control(struct device *dev, scale_reg = (bank ? SWRS_SCP_BUSCLOCK_SCALE_BANK1 : SWRS_SCP_BUSCLOCK_SCALE_BANK0); + scale_reg2 = (!bank ? SWRS_SCP_BUSCLOCK_SCALE_BANK1 : + SWRS_SCP_BUSCLOCK_SCALE_BANK0); if (enable) { swr_write(swr_dev, swr_dev->dev_num, - SWRS_SCP_BASE_CLK_BASE, &swr_clk); + SWRS_SCP_BASE_CLK_BASE, &swr_clk); swr_write(swr_dev, swr_dev->dev_num, - scale_reg, &clk_scale); + scale_reg, &clk_scale); + swr_write(swr_dev, swr_dev->dev_num, + scale_reg2, &clk_scale); ret = swr_slvdev_datapath_control(swr_dev, swr_dev->dev_num, true); } else { @@ -329,9 +334,11 @@ static int wcd9378_swr_slvdev_datapath_control(struct device *dev, SWRS_SCP_BASE_CLK_BASE, &clk_rst); swr_write(swr_dev, swr_dev->dev_num, scale_reg, &scale_rst); - ret = swr_slvdev_datapath_control(swr_dev, - swr_dev->dev_num, false); + swr_write(swr_dev, swr_dev->dev_num, + scale_reg2, &scale_rst); } + ret = swr_slvdev_datapath_control(swr_dev, + swr_dev->dev_num, false); } return ret;