Răsfoiți Sursa

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 <[email protected]>
Yuhui Zhao 1 an în urmă
părinte
comite
cd5462dda2
1 a modificat fișierele cu 13 adăugiri și 6 ștergeri
  1. 13 6
      asoc/codecs/wcd9378/wcd9378.c

+ 13 - 6
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);
 		swr_write(swr_dev, swr_dev->dev_num,
-				scale_reg, &clk_scale);
+					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;