소스 검색

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 년 전
부모
커밋
cd5462dda2
1개의 변경된 파일13개의 추가작업 그리고 6개의 파일을 삭제
  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;