|
@@ -481,7 +481,7 @@ static int swrm_get_ssp_period(struct swr_mstr_ctrl *swrm,
|
|
|
return ((swrm->bus_clk * 2) / ((row * col) * frame_sync));
|
|
|
}
|
|
|
|
|
|
-static int swrm_core_vote_request(struct swr_mstr_ctrl *swrm)
|
|
|
+static int swrm_core_vote_request(struct swr_mstr_ctrl *swrm, bool enable)
|
|
|
{
|
|
|
int ret = 0;
|
|
|
|
|
@@ -494,7 +494,7 @@ static int swrm_core_vote_request(struct swr_mstr_ctrl *swrm)
|
|
|
goto exit;
|
|
|
}
|
|
|
if (swrm->core_vote) {
|
|
|
- ret = swrm->core_vote(swrm->handle, true);
|
|
|
+ ret = swrm->core_vote(swrm->handle, enable);
|
|
|
if (ret)
|
|
|
dev_err_ratelimited(swrm->dev,
|
|
|
"%s: core vote request failed\n", __func__);
|
|
@@ -525,8 +525,10 @@ static int swrm_clk_request(struct swr_mstr_ctrl *swrm, bool enable)
|
|
|
dev_err_ratelimited(swrm->dev,
|
|
|
"%s: core vote request failed\n",
|
|
|
__func__);
|
|
|
+ swrm->core_vote(swrm->handle, false);
|
|
|
goto exit;
|
|
|
}
|
|
|
+ ret = swrm->core_vote(swrm->handle, false);
|
|
|
}
|
|
|
}
|
|
|
swrm->clk_ref_count++;
|
|
@@ -562,6 +564,7 @@ static int swrm_ahb_write(struct swr_mstr_ctrl *swrm,
|
|
|
{
|
|
|
u32 temp = (u32)(*value);
|
|
|
int ret = 0;
|
|
|
+ int vote_ret = 0;
|
|
|
|
|
|
mutex_lock(&swrm->devlock);
|
|
|
if (!swrm->dev_up)
|
|
@@ -575,13 +578,20 @@ static int swrm_ahb_write(struct swr_mstr_ctrl *swrm,
|
|
|
__func__);
|
|
|
goto err;
|
|
|
}
|
|
|
- } else if (swrm_core_vote_request(swrm)) {
|
|
|
- goto err;
|
|
|
+ } else {
|
|
|
+ vote_ret = swrm_core_vote_request(swrm, true);
|
|
|
+ if (vote_ret == -ENOTSYNC)
|
|
|
+ goto err_vote;
|
|
|
+ else if (vote_ret)
|
|
|
+ goto err;
|
|
|
}
|
|
|
|
|
|
iowrite32(temp, swrm->swrm_dig_base + reg);
|
|
|
if (is_swr_clk_needed(swrm))
|
|
|
swrm_clk_request(swrm, FALSE);
|
|
|
+err_vote:
|
|
|
+ if (!is_swr_clk_needed(swrm))
|
|
|
+ swrm_core_vote_request(swrm, false);
|
|
|
err:
|
|
|
mutex_unlock(&swrm->devlock);
|
|
|
return ret;
|
|
@@ -592,6 +602,7 @@ static int swrm_ahb_read(struct swr_mstr_ctrl *swrm,
|
|
|
{
|
|
|
u32 temp = 0;
|
|
|
int ret = 0;
|
|
|
+ int vote_ret = 0;
|
|
|
|
|
|
mutex_lock(&swrm->devlock);
|
|
|
if (!swrm->dev_up)
|
|
@@ -604,14 +615,21 @@ static int swrm_ahb_read(struct swr_mstr_ctrl *swrm,
|
|
|
__func__);
|
|
|
goto err;
|
|
|
}
|
|
|
- } else if (swrm_core_vote_request(swrm)) {
|
|
|
- goto err;
|
|
|
+ } else {
|
|
|
+ vote_ret = swrm_core_vote_request(swrm, true);
|
|
|
+ if (vote_ret == -ENOTSYNC)
|
|
|
+ goto err_vote;
|
|
|
+ else if (vote_ret)
|
|
|
+ goto err;
|
|
|
}
|
|
|
|
|
|
temp = ioread32(swrm->swrm_dig_base + reg);
|
|
|
*value = temp;
|
|
|
if (is_swr_clk_needed(swrm))
|
|
|
swrm_clk_request(swrm, FALSE);
|
|
|
+err_vote:
|
|
|
+ if (!is_swr_clk_needed(swrm))
|
|
|
+ swrm_core_vote_request(swrm, false);
|
|
|
err:
|
|
|
mutex_unlock(&swrm->devlock);
|
|
|
return ret;
|
|
@@ -2623,6 +2641,7 @@ static int swrm_probe(struct platform_device *pdev)
|
|
|
int ret = 0;
|
|
|
struct clk *lpass_core_hw_vote = NULL;
|
|
|
struct clk *lpass_core_audio = NULL;
|
|
|
+ u32 swrm_hw_ver = 0;
|
|
|
|
|
|
/* Allocate soundwire master driver structure */
|
|
|
swrm = devm_kzalloc(&pdev->dev, sizeof(struct swr_mstr_ctrl),
|
|
@@ -2657,6 +2676,14 @@ static int swrm_probe(struct platform_device *pdev)
|
|
|
__func__);
|
|
|
swrm->ee_val = 0x1;
|
|
|
}
|
|
|
+ ret = of_property_read_u32(pdev->dev.of_node,
|
|
|
+ "qcom,swr-master-version",
|
|
|
+ &swrm->version);
|
|
|
+ if (ret) {
|
|
|
+ dev_dbg(&pdev->dev, "%s: swrm version not defined, use default\n",
|
|
|
+ __func__);
|
|
|
+ swrm->version = SWRM_VERSION_1_6;
|
|
|
+ }
|
|
|
ret = of_property_read_u32(pdev->dev.of_node, "qcom,swr_master_id",
|
|
|
&swrm->master_id);
|
|
|
if (ret) {
|
|
@@ -2913,13 +2940,18 @@ static int swrm_probe(struct platform_device *pdev)
|
|
|
dev_dbg(&pdev->dev, "%s: Audio HW Vote is failed\n", __func__);
|
|
|
mutex_lock(&swrm->mlock);
|
|
|
swrm_clk_request(swrm, true);
|
|
|
- swrm->version = swr_master_read(swrm, SWRM_COMP_HW_VERSION);
|
|
|
|
|
|
swrm->rd_fifo_depth = ((swr_master_read(swrm, SWRM_COMP_PARAMS)
|
|
|
& SWRM_COMP_PARAMS_RD_FIFO_DEPTH) >> 15);
|
|
|
swrm->wr_fifo_depth = ((swr_master_read(swrm, SWRM_COMP_PARAMS)
|
|
|
& SWRM_COMP_PARAMS_WR_FIFO_DEPTH) >> 10);
|
|
|
|
|
|
+ swrm_hw_ver = swr_master_read(swrm, SWRM_COMP_HW_VERSION);
|
|
|
+ if (swrm->version != swrm_hw_ver)
|
|
|
+ dev_info(&pdev->dev,
|
|
|
+ "%s: version specified in dtsi: 0x%x not match with HW read version 0x%x\n",
|
|
|
+ __func__, swrm->version, swrm_hw_ver);
|
|
|
+
|
|
|
swrm->num_auto_enum = ((swr_master_read(swrm, SWRM_COMP_PARAMS)
|
|
|
& SWRM_COMP_PARAMS_AUTO_ENUM_SLAVES) >> 20);
|
|
|
ret = of_property_read_u32(swrm->dev->of_node, "qcom,swr-num-dev",
|