diff --git a/asoc/codecs/wcd9378/wcd9378.c b/asoc/codecs/wcd9378/wcd9378.c index d0920bdf4e..5d9e952ee9 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;