[PATCH] ASoC: fsl_sai: Correct the clock source for mclk0
On VF610, mclk0 = bus_clk; On i.MX6SX/6UL/6ULL/7D, mclk0 = mclk1; On i.MX7ULP, mclk0 = bus_clk; On i.MX8QM/8QXP, mclk0 = bus_clk; On i.MX8MQ/8MN/8MM/8MP, mclk0 = bus_clk;
So add variable mclk0_mclk1_match in fsl_sai_soc_data to distinguish these platforms.
Signed-off-by: Shengjiu Wang shengjiu.wang@nxp.com --- sound/soc/fsl/fsl_sai.c | 11 ++++++++++- sound/soc/fsl/fsl_sai.h | 1 + 2 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/sound/soc/fsl/fsl_sai.c b/sound/soc/fsl/fsl_sai.c index 3e5c1eaccd5e..479fd27ace35 100644 --- a/sound/soc/fsl/fsl_sai.c +++ b/sound/soc/fsl/fsl_sai.c @@ -1040,7 +1040,6 @@ static int fsl_sai_probe(struct platform_device *pdev) sai->bus_clk = NULL; }
- sai->mclk_clk[0] = sai->bus_clk; for (i = 1; i < FSL_SAI_MCLK_MAX; i++) { sprintf(tmp, "mclk%d", i); sai->mclk_clk[i] = devm_clk_get(&pdev->dev, tmp); @@ -1051,6 +1050,11 @@ static int fsl_sai_probe(struct platform_device *pdev) } }
+ if (sai->soc_data->mclk0_mclk1_match) + sai->mclk_clk[0] = sai->mclk_clk[1]; + else + sai->mclk_clk[0] = sai->bus_clk; + irq = platform_get_irq(pdev, 0); if (irq < 0) return irq; @@ -1165,6 +1169,7 @@ static const struct fsl_sai_soc_data fsl_sai_vf610_data = { .use_edma = false, .fifo_depth = 32, .reg_offset = 0, + .mclk0_mclk1_match = false, };
static const struct fsl_sai_soc_data fsl_sai_imx6sx_data = { @@ -1172,6 +1177,7 @@ static const struct fsl_sai_soc_data fsl_sai_imx6sx_data = { .use_edma = false, .fifo_depth = 32, .reg_offset = 0, + .mclk0_mclk1_match = true, };
static const struct fsl_sai_soc_data fsl_sai_imx7ulp_data = { @@ -1179,6 +1185,7 @@ static const struct fsl_sai_soc_data fsl_sai_imx7ulp_data = { .use_edma = false, .fifo_depth = 16, .reg_offset = 8, + .mclk0_mclk1_match = false, };
static const struct fsl_sai_soc_data fsl_sai_imx8mq_data = { @@ -1186,6 +1193,7 @@ static const struct fsl_sai_soc_data fsl_sai_imx8mq_data = { .use_edma = false, .fifo_depth = 128, .reg_offset = 8, + .mclk0_mclk1_match = false, };
static const struct fsl_sai_soc_data fsl_sai_imx8qm_data = { @@ -1193,6 +1201,7 @@ static const struct fsl_sai_soc_data fsl_sai_imx8qm_data = { .use_edma = true, .fifo_depth = 64, .reg_offset = 0, + .mclk0_mclk1_match = false, };
static const struct of_device_id fsl_sai_ids[] = { diff --git a/sound/soc/fsl/fsl_sai.h b/sound/soc/fsl/fsl_sai.h index 4bbcd0dbe8f1..390a9ca3b531 100644 --- a/sound/soc/fsl/fsl_sai.h +++ b/sound/soc/fsl/fsl_sai.h @@ -219,6 +219,7 @@ struct fsl_sai_soc_data { bool use_imx_pcm; bool use_edma; + bool mclk0_mclk1_match; unsigned int fifo_depth; unsigned int reg_offset; };
On Thu, Nov 19, 2020 at 10:29:16AM +0800, Shengjiu Wang wrote:
On VF610, mclk0 = bus_clk; On i.MX6SX/6UL/6ULL/7D, mclk0 = mclk1; On i.MX7ULP, mclk0 = bus_clk; On i.MX8QM/8QXP, mclk0 = bus_clk; On i.MX8MQ/8MN/8MM/8MP, mclk0 = bus_clk;
So add variable mclk0_mclk1_match in fsl_sai_soc_data To
Not in favor of "mclk0_mclk1_match" as it doesn't sound explicit to me. Instead, "mclk0_is_bus_clk" or "mclk0_is_mclk1" might be better. Or in case that you foresee some other implementation:
enum { MCLK0_IS_BUS_CLK, MCLK0_IS_MCLK1, };
static const struct fsl_sai_soc_data fsl_sai_vf610_data = { + .mclk0_alias = MCLK0_IS_BUS_CLK, };
On Thu, Nov 19, 2020 at 1:02 PM Nicolin Chen nicoleotsuka@gmail.com wrote:
On Thu, Nov 19, 2020 at 10:29:16AM +0800, Shengjiu Wang wrote:
On VF610, mclk0 = bus_clk; On i.MX6SX/6UL/6ULL/7D, mclk0 = mclk1; On i.MX7ULP, mclk0 = bus_clk; On i.MX8QM/8QXP, mclk0 = bus_clk; On i.MX8MQ/8MN/8MM/8MP, mclk0 = bus_clk;
So add variable mclk0_mclk1_match in fsl_sai_soc_data To
Not in favor of "mclk0_mclk1_match" as it doesn't sound explicit to me. Instead, "mclk0_is_bus_clk" or "mclk0_is_mclk1" might be better. Or in case that you foresee some other implementation:
enum { MCLK0_IS_BUS_CLK, MCLK0_IS_MCLK1, };
static const struct fsl_sai_soc_data fsl_sai_vf610_data = {
.mclk0_alias = MCLK0_IS_BUS_CLK,
};
No problem.
But I just find this patch doesn't consider the mqs case. MCLK0 can't be used for mqs, it needs MCLK1, even the MCLK0 is same as MCLK1, MCLK1 need to be selected for mqs case.
Is there a decent way for this case?
best regards wang shengjiu
On Thu, Nov 19, 2020 at 01:28:32PM +0800, Shengjiu Wang wrote:
On Thu, Nov 19, 2020 at 1:02 PM Nicolin Chen nicoleotsuka@gmail.com wrote:
On Thu, Nov 19, 2020 at 10:29:16AM +0800, Shengjiu Wang wrote:
On VF610, mclk0 = bus_clk; On i.MX6SX/6UL/6ULL/7D, mclk0 = mclk1; On i.MX7ULP, mclk0 = bus_clk; On i.MX8QM/8QXP, mclk0 = bus_clk; On i.MX8MQ/8MN/8MM/8MP, mclk0 = bus_clk;
So add variable mclk0_mclk1_match in fsl_sai_soc_data To
Not in favor of "mclk0_mclk1_match" as it doesn't sound explicit to me. Instead, "mclk0_is_bus_clk" or "mclk0_is_mclk1" might be better. Or in case that you foresee some other implementation:
enum { MCLK0_IS_BUS_CLK, MCLK0_IS_MCLK1, };
static const struct fsl_sai_soc_data fsl_sai_vf610_data = {
.mclk0_alias = MCLK0_IS_BUS_CLK,
};
No problem.
But I just find this patch doesn't consider the mqs case. MCLK0 can't be used for mqs, it needs MCLK1, even the MCLK0 is same as MCLK1, MCLK1 need to be selected for mqs case.
Is there a decent way for this case?
Is there any use case that we have to use MCLK0 instead of MCLK1 on SoCs where MCLK0=MCLK1? If no, how about skip MCLK0 at all in the for-loop at fsl_sai_set_bclk?
/* * There is no point in polling MCLK0 if it is identical to MCLK1. * And given that MQS use case has to use MCLK1 though two clocks * are the same, we simply skip MCLK0 and start to find from MCLK1. */ id = mclk0_is_mclk1 ? 1 : 0;
for (; id < FSL_SAI_MCLK_MAX; id++) {
On Thu, Nov 19, 2020 at 1:54 PM Nicolin Chen nicoleotsuka@gmail.com wrote:
On Thu, Nov 19, 2020 at 01:28:32PM +0800, Shengjiu Wang wrote:
On Thu, Nov 19, 2020 at 1:02 PM Nicolin Chen nicoleotsuka@gmail.com wrote:
On Thu, Nov 19, 2020 at 10:29:16AM +0800, Shengjiu Wang wrote:
On VF610, mclk0 = bus_clk; On i.MX6SX/6UL/6ULL/7D, mclk0 = mclk1; On i.MX7ULP, mclk0 = bus_clk; On i.MX8QM/8QXP, mclk0 = bus_clk; On i.MX8MQ/8MN/8MM/8MP, mclk0 = bus_clk;
So add variable mclk0_mclk1_match in fsl_sai_soc_data To
Not in favor of "mclk0_mclk1_match" as it doesn't sound explicit to me. Instead, "mclk0_is_bus_clk" or "mclk0_is_mclk1" might be better. Or in case that you foresee some other implementation:
enum { MCLK0_IS_BUS_CLK, MCLK0_IS_MCLK1, };
static const struct fsl_sai_soc_data fsl_sai_vf610_data = {
.mclk0_alias = MCLK0_IS_BUS_CLK,
};
No problem.
But I just find this patch doesn't consider the mqs case. MCLK0 can't be used for mqs, it needs MCLK1, even the MCLK0 is same as MCLK1, MCLK1 need to be selected for mqs case.
Is there a decent way for this case?
Is there any use case that we have to use MCLK0 instead of MCLK1 on SoCs where MCLK0=MCLK1? If no, how about skip MCLK0 at all in the for-loop at fsl_sai_set_bclk?
/* * There is no point in polling MCLK0 if it is identical to MCLK1. * And given that MQS use case has to use MCLK1 though two clocks * are the same, we simply skip MCLK0 and start to find from MCLK1. */ id = mclk0_is_mclk1 ? 1 : 0; for (; id < FSL_SAI_MCLK_MAX; id++) {
Ok, thanks, will update the patch.
best regards wang shengjiu
participants (3)
-
Nicolin Chen
-
Shengjiu Wang
-
Shengjiu Wang