Re: [PATCH] ASoC: Intel: boards: eve: Fix DMIC records zero

From: Pierre-Louis Bossart
Date: Thu Jul 09 2020 - 12:53:27 EST




On 7/9/20 10:25 AM, vamshi.krishna.gopal@xxxxxxxxx wrote:
From: Brent Lu <brent.lu@xxxxxxxxx>

Add a dapm route to provide ssp mclk/sclk early
for DMIC on SSP0(rt5514) and Headset on SSP1(rt5663)
since sclk for both codecs are different the
struct now defines SSP0 and SSP1 mclk , sclk separately
This change ensures the DMIC PCM port
will not return all-zero data

Signed-off-by: Brent Lu <brent.lu@xxxxxxxxx>
Signed-off-by: Vamshi Krishna Gopal <vamshi.krishna.gopal@xxxxxxxxx>
---
.../intel/boards/kbl_rt5663_rt5514_max98927.c | 150 ++++++++++++------
1 file changed, 102 insertions(+), 48 deletions(-)

diff --git a/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c b/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c
index b34cf6cf1139..584e4f9cedc2 100644
--- a/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c
+++ b/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c
@@ -53,8 +53,10 @@ struct kbl_codec_private {
struct snd_soc_jack kabylake_headset;
struct list_head hdmi_pcm_list;
struct snd_soc_jack kabylake_hdmi[2];
- struct clk *mclk;
- struct clk *sclk;
+ struct clk *ssp0_mclk;
+ struct clk *ssp0_sclk;
+ struct clk *ssp1_mclk;
+ struct clk *ssp1_sclk;

The definition of a per-SSP MCLK is just wrong. there are 2 MCLKs regardless of the number of SSPs, this should be MCLK0 and MCLK1.

It probably works in your case since you have 2 SSPs, but the Skylake driver exposes ssp2..5_mclk clocks that don't exist in hardware. Oh well.

If you don't mind I'd prefer it if you used mclk0 and mclk1 and drop the ssp_ prefix. You can still use the "ssp0_mclk" and "ssp1_mclk" strings when calling devm_clk_get(), but that way if the Skylake driver is fixed at some point we will not have to change the code in this driver, only the clock names.

[...]

@@ -757,6 +800,29 @@ static struct snd_soc_card kabylake_audio_card = {
.late_probe = kabylake_card_late_probe,
};
+static int kabylake_audio_clk_get(struct device *dev, const char *id,
+ struct clk **clk)
+{
+ int ret = 0;
+
+ if (!clk)
+ return -EINVAL;
+
+ *clk = devm_clk_get(dev, id);
+ if (IS_ERR(*clk)) {
+ ret = PTR_ERR(*clk);
+ if (ret == -ENOENT) {
+ dev_info(dev, "Failed to get %s, defer probe\n", id);
+ return -EPROBE_DEFER;
+ }
+
+ dev_err(dev, "Failed to get %s with err:%d\n", id, ret);
+ return ret;

nit-pick: you can remove this return since you already have one two lines below.

+ }
+
+ return ret;
+}
+