[SRU][OEM-5.6][PATCH 00/15] alsa: add Dell tgl soundwire machines support

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
17 messages Options
Reply | Threaded
Open this post in threaded view
|

[SRU][OEM-5.6][PATCH 00/15] alsa: add Dell tgl soundwire machines support

Hui Wang
BugLink: https://bugs.launchpad.net/bugs/1900069

This fix is only for oem-5.6 kernel, the groovy 5.8 kernel doesn't
support soundwire audio at all, Intel said the linux-5.10 kernel
will have a good support for soundwire audio, so this SRU is
meaningless for groovy 5.8 kernel.


[Impact]
We enabled a new Dell TGL machine, the audio on this machine doesn't
work, the codec on this machine is soundwire bus connnected.

[Fix]
With Intel's help, we need to backport some patches from upstream
kernel and linux-next kernel.

[Test Case]
Boot the kernel, check with dmesg and aplay -l/arecord -l, the audio
card registered and speaker, headphone, mic and internal mic all
registered and worked.


[Regression Risk]
This could make the Dell cml soundwire audio fail to work or make
some sof dmic machines fail to work, but this possibility is very low,
we have tested this patchset on Dell cml soundwire audio machines and
some hp and lenovo dmic machines.


Bard Liao (4):
  ASoC: SOF: topology: send ipc for all found DAIs in sof_set_dai_config
  ASoC: topology: set component dai_index to ipc dai config dai_index
  ASoC: Intel: add support for new SoundWire hardware layout on TGL
  ASoC: Intel: sof_sdw_rt711: remove hard-coded codec name

Naveen Manohar (1):
  ASoC: Intel: common: add match table for TGL MAX98373 + RT5682
    SoundWire driver

Pierre-Louis Bossart (10):
  ALSA: hda: add autodetection for SoundWire
  ASoC: Intel: soc-acpi: mirror CML and TGL configurations
  ASoC: Intel: add codec name prefix to ACPI machine description
  ASoC: Intel: sof_sdw: remove hard-coded codec_conf table
  ASoC: Intel: sof_sdw_rt700: add codec prefix
  ASoC/soundwire: bus: use property to set interrupt masks
  soundwire: bus: filter-out unwanted interrupt reports
  soundwire: slave: add first_interrupt_done status
  soundwire: bus: use quirk to filter out invalid parity errors
  ASoC: codecs: realtek-soundwire: ignore initial PARITY errors

 drivers/soundwire/bus.c                       |  37 +++-
 drivers/soundwire/slave.c                     |   1 +
 include/linux/soundwire/sdw.h                 |   9 +
 include/sound/soc-acpi.h                      |   2 +
 sound/hda/intel-dsp-config.c                  |  65 ++++--
 sound/soc/codecs/rt1308-sdw.c                 |   3 +
 sound/soc/codecs/rt700-sdw.c                  |   5 +
 sound/soc/codecs/rt711-sdw.c                  |   5 +
 sound/soc/codecs/rt715-sdw.c                  |   5 +
 sound/soc/codecs/wsa881x.c                    |   1 +
 sound/soc/intel/boards/sof_sdw.c              | 128 +++++++-----
 sound/soc/intel/boards/sof_sdw_rt700.c        |   6 +-
 sound/soc/intel/boards/sof_sdw_rt711.c        |   2 +-
 .../intel/common/soc-acpi-intel-cml-match.c   |  13 +-
 .../intel/common/soc-acpi-intel-icl-match.c   |   7 +
 .../intel/common/soc-acpi-intel-tgl-match.c   | 188 +++++++++++++++++-
 sound/soc/sof/topology.c                      |  87 +++-----
 17 files changed, 420 insertions(+), 144 deletions(-)

--
2.17.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[SRU][OEM-5.6][PATCH 01/15] ALSA: hda: add autodetection for SoundWire

Hui Wang
From: Pierre-Louis Bossart <[hidden email]>

BugLink: https://bugs.launchpad.net/bugs/1900069

When an ACPI companion device is present and the SoundWire link mask
information is available, use SoundWire instead of legacy HDA or
Skylake drivers.

The SOF driver is selected when SoundWire or DMIC are detected. There
is no precedence at this level. In the SOF driver proper, SoundWire
will be handled first since it is mutually exclusive with HDaudio.

Known devices with an existing DMI quirk bypass this detection to
avoid any dependency on ACPI/DSDT tables.

Reviewed-by: Ranjani Sridharan <[hidden email]>
Reviewed-by: Guennadi Liakhovetski <[hidden email]>
Reviewed-by: Bard Liao <[hidden email]>
Reviewed-by: Kai Vehmanen <[hidden email]>
Signed-off-by: Pierre-Louis Bossart <[hidden email]>
Link: https://lore.kernel.org/r/20200409190251.16569-1-pierre-louis.bossart@...
Signed-off-by: Takashi Iwai <[hidden email]>
(backported from commit 0650857570d161486a95d37bc8682628881ae2da)
Signed-off-by: Hui Wang <[hidden email]>
---
 sound/hda/intel-dsp-config.c | 65 +++++++++++++++++++++++++++---------
 1 file changed, 49 insertions(+), 16 deletions(-)

diff --git a/sound/hda/intel-dsp-config.c b/sound/hda/intel-dsp-config.c
index a4f8149cac74..efa758adb62b 100644
--- a/sound/hda/intel-dsp-config.c
+++ b/sound/hda/intel-dsp-config.c
@@ -1,10 +1,13 @@
 // SPDX-License-Identifier: GPL-2.0
 // Copyright (c) 2019 Jaroslav Kysela <[hidden email]>
 
+#include <linux/acpi.h>
 #include <linux/bits.h>
 #include <linux/dmi.h>
 #include <linux/module.h>
 #include <linux/pci.h>
+#include <linux/soundwire/sdw.h>
+#include <linux/soundwire/sdw_intel.h>
 #include <sound/core.h>
 #include <sound/intel-dsp-config.h>
 #include <sound/intel-nhlt.h>
@@ -14,9 +17,13 @@ static int dsp_driver;
 module_param(dsp_driver, int, 0444);
 MODULE_PARM_DESC(dsp_driver, "Force the DSP driver for Intel DSP (0=auto, 1=legacy, 2=SST, 3=SOF)");
 
-#define FLAG_SST BIT(0)
-#define FLAG_SOF BIT(1)
-#define FLAG_SOF_ONLY_IF_DMIC BIT(16)
+#define FLAG_SST BIT(0)
+#define FLAG_SOF BIT(1)
+#define FLAG_SOF_ONLY_IF_DMIC BIT(16)
+#define FLAG_SOF_ONLY_IF_SOUNDWIRE BIT(17)
+
+#define FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE (FLAG_SOF_ONLY_IF_DMIC | \
+    FLAG_SOF_ONLY_IF_SOUNDWIRE)
 
 struct config_entry {
  u32 flags;
@@ -166,7 +173,7 @@ static const struct config_entry config_table[] = {
  }
  },
  {
- .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
+ .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
  .device = 0x9dc8,
  },
 #endif
@@ -187,7 +194,7 @@ static const struct config_entry config_table[] = {
  }
  },
  {
- .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
+ .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
  .device = 0xa348,
  },
 #endif
@@ -221,7 +228,7 @@ static const struct config_entry config_table[] = {
  }
  },
  {
- .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
+ .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
  .device = 0x02c8,
  },
 #endif
@@ -247,7 +254,7 @@ static const struct config_entry config_table[] = {
  }
  },
  {
- .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
+ .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
  .device = 0x06c8,
  },
 #endif
@@ -268,7 +275,7 @@ static const struct config_entry config_table[] = {
  }
  },
  {
- .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
+ .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
  .device = 0x34c8,
  },
 #endif
@@ -288,9 +295,8 @@ static const struct config_entry config_table[] = {
  {}
  }
  },
-
  {
- .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC,
+ .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
  .device = 0xa0c8,
  },
 #endif
@@ -335,6 +341,28 @@ static int snd_intel_dsp_check_dmic(struct pci_dev *pci)
  return ret;
 }
 
+#if IS_ENABLED(CONFIG_SND_SOC_SOF_INTEL_SOUNDWIRE)
+static int snd_intel_dsp_check_soundwire(struct pci_dev *pci)
+{
+ struct sdw_intel_acpi_info info = { 0 };
+ acpi_handle handle;
+ int ret;
+
+ handle = ACPI_HANDLE(&pci->dev);
+
+ ret = sdw_intel_acpi_scan(handle, &info);
+ if (ret < 0)
+ return ret;
+
+ return info.link_mask;
+}
+#else
+static int snd_intel_dsp_check_soundwire(struct pci_dev *pci)
+{
+ return 0;
+}
+#endif
+
 int snd_intel_dsp_driver_probe(struct pci_dev *pci)
 {
  const struct config_entry *cfg;
@@ -368,14 +396,18 @@ int snd_intel_dsp_driver_probe(struct pci_dev *pci)
  return SND_INTEL_DSP_DRIVER_ANY;
 
  if (cfg->flags & FLAG_SOF) {
- if (cfg->flags & FLAG_SOF_ONLY_IF_DMIC) {
- if (snd_intel_dsp_check_dmic(pci)) {
- dev_info(&pci->dev, "Digital mics found on Skylake+ platform, using SOF driver\n");
- return SND_INTEL_DSP_DRIVER_SOF;
- }
- } else {
+ if (cfg->flags & FLAG_SOF_ONLY_IF_SOUNDWIRE &&
+    snd_intel_dsp_check_soundwire(pci) > 0) {
+ dev_info(&pci->dev, "SoundWire enabled on CannonLake+ platform, using SOF driver\n");
  return SND_INTEL_DSP_DRIVER_SOF;
  }
+ if (cfg->flags & FLAG_SOF_ONLY_IF_DMIC &&
+    snd_intel_dsp_check_dmic(pci)) {
+ dev_info(&pci->dev, "Digital mics found on Skylake+ platform, using SOF driver\n");
+ return SND_INTEL_DSP_DRIVER_SOF;
+ }
+ if (!(cfg->flags & FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE))
+ return SND_INTEL_DSP_DRIVER_SOF;
  }
 
  if (cfg->flags & FLAG_SST)
@@ -387,3 +419,4 @@ EXPORT_SYMBOL_GPL(snd_intel_dsp_driver_probe);
 
 MODULE_LICENSE("GPL v2");
 MODULE_DESCRIPTION("Intel DSP config driver");
+MODULE_IMPORT_NS(SOUNDWIRE_INTEL_INIT);
--
2.17.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[SRU][OEM-5.6][PATCH 02/15] ASoC: Intel: common: add match table for TGL MAX98373 + RT5682 SoundWire driver

Hui Wang
In reply to this post by Hui Wang
From: Naveen Manohar <[hidden email]>

BugLink: https://bugs.launchpad.net/bugs/1900069

RT5682 is in Soundwire mode on Link0 & 2x MAX98373 on link1.

Signed-off-by: Naveen Manohar <[hidden email]>
Reviewed-by: Pierre-Louis Bossart <[hidden email]>
Reviewed-by: Guennadi Liakhovetski <[hidden email]>
Reviewed-by: Rander Wang <[hidden email]>
Link: https://lore.kernel.org/r/20200625192708.4416-1-pierre-louis.bossart@...
Signed-off-by: Mark Brown <[hidden email]>
(backported from commit 55caf37031f4860f4d47dd7c8000d61528e5832c)
Signed-off-by: Hui Wang <[hidden email]>
---
 .../intel/common/soc-acpi-intel-tgl-match.c   | 25 +++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/sound/soc/intel/common/soc-acpi-intel-tgl-match.c b/sound/soc/intel/common/soc-acpi-intel-tgl-match.c
index 449d9d2286ae..1d29e9257cff 100644
--- a/sound/soc/intel/common/soc-acpi-intel-tgl-match.c
+++ b/sound/soc/intel/common/soc-acpi-intel-tgl-match.c
@@ -56,6 +56,19 @@ static const struct snd_soc_acpi_adr_device rt1308_1_adr[] = {
  }
 };
 
+static const struct snd_soc_acpi_adr_device mx8373_1_adr[] = {
+ {
+ .adr = 0x000123019F837300,
+ .num_endpoints = 1,
+ .endpoints = &spk_l_endpoint,
+ },
+ {
+ .adr = 0x000127019F837300,
+ .num_endpoints = 1,
+ .endpoints = &spk_r_endpoint,
+ }
+};
+
 static const struct snd_soc_acpi_adr_device rt5682_0_adr[] = {
  {
  .adr = 0x000021025D568200,
@@ -93,6 +106,11 @@ static const struct snd_soc_acpi_link_adr tgl_chromebook_base[] = {
  .num_adr = ARRAY_SIZE(rt5682_0_adr),
  .adr_d = rt5682_0_adr,
  },
+ {
+ .mask = BIT(1),
+ .num_adr = ARRAY_SIZE(mx8373_1_adr),
+ .adr_d = mx8373_1_adr,
+ },
  {}
 };
 
@@ -139,6 +157,13 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_tgl_sdw_machines[] = {
  .sof_fw_filename = "sof-tgl.ri",
  .sof_tplg_filename = "sof-tgl-rt711-rt1308.tplg",
  },
+ {
+ .link_mask = 0x3, /* rt5682 on link0 & 2xmax98373 on link 1 */
+ .links = tgl_chromebook_base,
+ .drv_name = "sof_sdw",
+ .sof_fw_filename = "sof-tgl.ri",
+ .sof_tplg_filename = "sof-tgl-sdw-max98373-rt5682.tplg",
+ },
  {
  .link_mask = 0x1, /* this will only enable rt5682 for now */
  .links = tgl_chromebook_base,
--
2.17.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[SRU][OEM-5.6][PATCH 03/15] ASoC: Intel: soc-acpi: mirror CML and TGL configurations

Hui Wang
In reply to this post by Hui Wang
From: Pierre-Louis Bossart <[hidden email]>

BugLink: https://bugs.launchpad.net/bugs/1900069

Some TGL devices use the same audio hardware as on CML platforms, with
RT711 on link0, RT1308 on link1 and optionally link2, and RT715 on
link 3.

To clarify configurations, the rt1308 configurations are split between
single amp on link1 and dual amps on link1. The case with two amps on
different links is already identified with the group1 attribute.

Reviewed-by: Bard Liao <[hidden email]>
Reviewed-by: Rander Wang <[hidden email]>
Signed-off-by: Pierre-Louis Bossart <[hidden email]>
Link: https://lore.kernel.org/r/20200821195603.215535-5-pierre-louis.bossart@...
Signed-off-by: Mark Brown <[hidden email]>
(backported from commit 6cb8bd60ba5ca9eb8f05f3f8351bbbcb6b92c525 linux-next)
Signed-off-by: Hui Wang <[hidden email]>
---
 .../intel/common/soc-acpi-intel-cml-match.c   |   6 +-
 .../intel/common/soc-acpi-intel-tgl-match.c   | 100 +++++++++++++++++-
 2 files changed, 100 insertions(+), 6 deletions(-)

diff --git a/sound/soc/intel/common/soc-acpi-intel-cml-match.c b/sound/soc/intel/common/soc-acpi-intel-cml-match.c
index bcedec6c6117..fd2fdc0f52ba 100644
--- a/sound/soc/intel/common/soc-acpi-intel-cml-match.c
+++ b/sound/soc/intel/common/soc-acpi-intel-cml-match.c
@@ -105,7 +105,7 @@ static const struct snd_soc_acpi_adr_device rt711_0_adr[] = {
  }
 };
 
-static const struct snd_soc_acpi_adr_device rt1308_1_adr[] = {
+static const struct snd_soc_acpi_adr_device rt1308_1_single_adr[] = {
  {
  .adr = 0x000110025D130800,
  .num_endpoints = 1,
@@ -177,8 +177,8 @@ static const struct snd_soc_acpi_link_adr cml_3_in_1_mono_amp[] = {
  },
  {
  .mask = BIT(1),
- .num_adr = ARRAY_SIZE(rt1308_1_adr),
- .adr_d = rt1308_1_adr,
+ .num_adr = ARRAY_SIZE(rt1308_1_single_adr),
+ .adr_d = rt1308_1_single_adr,
  },
  {
  .mask = BIT(3),
diff --git a/sound/soc/intel/common/soc-acpi-intel-tgl-match.c b/sound/soc/intel/common/soc-acpi-intel-tgl-match.c
index 1d29e9257cff..4a7e20e5cec1 100644
--- a/sound/soc/intel/common/soc-acpi-intel-tgl-match.c
+++ b/sound/soc/intel/common/soc-acpi-intel-tgl-match.c
@@ -43,7 +43,7 @@ static const struct snd_soc_acpi_adr_device rt711_0_adr[] = {
  }
 };
 
-static const struct snd_soc_acpi_adr_device rt1308_1_adr[] = {
+static const struct snd_soc_acpi_adr_device rt1308_1_dual_adr[] = {
  {
  .adr = 0x000120025D130800,
  .num_endpoints = 1,
@@ -56,6 +56,38 @@ static const struct snd_soc_acpi_adr_device rt1308_1_adr[] = {
  }
 };
 
+static const struct snd_soc_acpi_adr_device rt1308_1_single_adr[] = {
+ {
+ .adr = 0x000120025D130800,
+ .num_endpoints = 1,
+ .endpoints = &single_endpoint,
+ }
+};
+
+static const struct snd_soc_acpi_adr_device rt1308_1_group1_adr[] = {
+ {
+ .adr = 0x000120025D130800,
+ .num_endpoints = 1,
+ .endpoints = &spk_l_endpoint,
+ }
+};
+
+static const struct snd_soc_acpi_adr_device rt1308_2_group1_adr[] = {
+ {
+ .adr = 0x000220025D130800,
+ .num_endpoints = 1,
+ .endpoints = &spk_r_endpoint,
+ }
+};
+
+static const struct snd_soc_acpi_adr_device rt715_3_adr[] = {
+ {
+ .adr = 0x000320025D071500,
+ .num_endpoints = 1,
+ .endpoints = &single_endpoint,
+ }
+};
+
 static const struct snd_soc_acpi_adr_device mx8373_1_adr[] = {
  {
  .adr = 0x000123019F837300,
@@ -94,8 +126,8 @@ static const struct snd_soc_acpi_link_adr tgl_rvp[] = {
  },
  {
  .mask = BIT(1),
- .num_adr = ARRAY_SIZE(rt1308_1_adr),
- .adr_d = rt1308_1_adr,
+ .num_adr = ARRAY_SIZE(rt1308_1_dual_adr),
+ .adr_d = rt1308_1_dual_adr,
  },
  {}
 };
@@ -114,6 +146,49 @@ static const struct snd_soc_acpi_link_adr tgl_chromebook_base[] = {
  {}
 };
 
+static const struct snd_soc_acpi_link_adr tgl_3_in_1_default[] = {
+ {
+ .mask = BIT(0),
+ .num_adr = ARRAY_SIZE(rt711_0_adr),
+ .adr_d = rt711_0_adr,
+ },
+ {
+ .mask = BIT(1),
+ .num_adr = ARRAY_SIZE(rt1308_1_group1_adr),
+ .adr_d = rt1308_1_group1_adr,
+ },
+ {
+ .mask = BIT(2),
+ .num_adr = ARRAY_SIZE(rt1308_2_group1_adr),
+ .adr_d = rt1308_2_group1_adr,
+ },
+ {
+ .mask = BIT(3),
+ .num_adr = ARRAY_SIZE(rt715_3_adr),
+ .adr_d = rt715_3_adr,
+ },
+ {}
+};
+
+static const struct snd_soc_acpi_link_adr tgl_3_in_1_mono_amp[] = {
+ {
+ .mask = BIT(0),
+ .num_adr = ARRAY_SIZE(rt711_0_adr),
+ .adr_d = rt711_0_adr,
+ },
+ {
+ .mask = BIT(1),
+ .num_adr = ARRAY_SIZE(rt1308_1_single_adr),
+ .adr_d = rt1308_1_single_adr,
+ },
+ {
+ .mask = BIT(3),
+ .num_adr = ARRAY_SIZE(rt715_3_adr),
+ .adr_d = rt715_3_adr,
+ },
+ {}
+};
+
 static struct snd_soc_acpi_codecs tgl_max98373_amp = {
  .num_codecs = 1,
  .codecs = {"MX98373"}
@@ -150,6 +225,25 @@ EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_tgl_machines);
 
 /* this table is used when there is no I2S codec present */
 struct snd_soc_acpi_mach snd_soc_acpi_intel_tgl_sdw_machines[] = {
+ {
+ .link_mask = 0xF, /* 4 active links required */
+ .links = tgl_3_in_1_default,
+ .drv_name = "sof_sdw",
+ .sof_fw_filename = "sof-tgl.ri",
+ .sof_tplg_filename = "sof-tgl-rt711-rt1308-rt715.tplg",
+ },
+ {
+ /*
+ * link_mask should be 0xB, but all links are enabled by BIOS.
+ * This entry will be selected if there is no rt1308 exposed
+ * on link2 since it will fail to match the above entry.
+ */
+ .link_mask = 0xF,
+ .links = tgl_3_in_1_mono_amp,
+ .drv_name = "sof_sdw",
+ .sof_fw_filename = "sof-tgl.ri",
+ .sof_tplg_filename = "sof-tgl-rt711-rt1308-mono-rt715.tplg",
+ },
  {
  .link_mask = 0x3, /* rt711 on link 0 and 2 rt1308s on link 1 */
  .links = tgl_rvp,
--
2.17.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[SRU][OEM-5.6][PATCH 04/15] ASoC: SOF: topology: send ipc for all found DAIs in sof_set_dai_config

Hui Wang
In reply to this post by Hui Wang
From: Bard Liao <[hidden email]>

BugLink: https://bugs.launchpad.net/bugs/1900069

We may find more than one DAIs in sof_set_dai_config() and we should
send message to DSP for each DAI we found.

Signed-off-by: Bard Liao <[hidden email]>
Signed-off-by: Ranjani Sridharan <[hidden email]>
Reviewed-by: Guennadi Liakhovetski <[hidden email]>
Reviewed-by: Kai Vehmanen <[hidden email]>
Link: https://lore.kernel.org/r/20200427172939.25848-2-ranjani.sridharan@...
Signed-off-by: Mark Brown <[hidden email]>
(backported from commit 726e6142b5c99b407a8118330598f82ba63617c3)
Signed-off-by: Hui Wang <[hidden email]>
---
 sound/soc/sof/topology.c | 79 +++++++++-------------------------------
 1 file changed, 18 insertions(+), 61 deletions(-)

diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c
index c78386d680f3..35f1050a643d 100644
--- a/sound/soc/sof/topology.c
+++ b/sound/soc/sof/topology.c
@@ -2632,7 +2632,11 @@ static void sof_dai_set_format(struct snd_soc_tplg_hw_config *hw_config,
  }
 }
 
-/* set config for all DAI's with name matching the link name */
+/*
+ * Send IPC and set the same config for all DAIs with name matching the link
+ * name. Note that the function can only be used for the case that all DAIs
+ * have a common DAI config for now.
+ */
 static int sof_set_dai_config(struct snd_sof_dev *sdev, u32 size,
       struct snd_soc_dai_link *link,
       struct sof_ipc_dai_config *config)
@@ -2645,6 +2649,19 @@ static int sof_set_dai_config(struct snd_sof_dev *sdev, u32 size,
  continue;
 
  if (strcmp(link->name, dai->name) == 0) {
+ struct sof_ipc_reply reply;
+ int ret;
+
+ /* send message to DSP */
+ ret = sof_ipc_tx_message(sdev->ipc,
+ config->hdr.cmd, config, size,
+ &reply, sizeof(reply));
+
+ if (ret < 0) {
+ dev_err(sdev->dev, "error: failed to set DAI config for %s index %d\n",
+ dai->name, config->dai_index);
+ return ret;
+ }
  dai->dai_config = kmemdup(config, size, GFP_KERNEL);
  if (!dai->dai_config)
  return -ENOMEM;
@@ -2677,7 +2694,6 @@ static int sof_link_ssp_load(struct snd_soc_component *scomp, int index,
 {
  struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
  struct snd_soc_tplg_private *private = &cfg->priv;
- struct sof_ipc_reply reply;
  u32 size = sizeof(*config);
  int ret;
 
@@ -2726,17 +2742,6 @@ static int sof_link_ssp_load(struct snd_soc_component *scomp, int index,
  return -EINVAL;
  }
 
- /* send message to DSP */
- ret = sof_ipc_tx_message(sdev->ipc,
- config->hdr.cmd, config, size, &reply,
- sizeof(reply));
-
- if (ret < 0) {
- dev_err(scomp->dev, "error: failed to set DAI config for SSP%d\n",
- config->dai_index);
- return ret;
- }
-
  /* set config for all DAI's with name matching the link name */
  ret = sof_set_dai_config(sdev, size, link, config);
  if (ret < 0)
@@ -2754,7 +2759,6 @@ static int sof_link_sai_load(struct snd_soc_component *scomp, int index,
 {
  struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
  struct snd_soc_tplg_private *private = &cfg->priv;
- struct sof_ipc_reply reply;
  u32 size = sizeof(*config);
  int ret;
 
@@ -2794,17 +2798,6 @@ static int sof_link_sai_load(struct snd_soc_component *scomp, int index,
  return -EINVAL;
  }
 
- /* send message to DSP */
- ret = sof_ipc_tx_message(sdev->ipc,
- config->hdr.cmd, config, size, &reply,
- sizeof(reply));
-
- if (ret < 0) {
- dev_err(scomp->dev, "error: failed to set DAI config for SAI%d\n",
- config->dai_index);
- return ret;
- }
-
  /* set config for all DAI's with name matching the link name */
  ret = sof_set_dai_config(sdev, size, link, config);
  if (ret < 0)
@@ -2822,7 +2815,6 @@ static int sof_link_esai_load(struct snd_soc_component *scomp, int index,
 {
  struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
  struct snd_soc_tplg_private *private = &cfg->priv;
- struct sof_ipc_reply reply;
  u32 size = sizeof(*config);
  int ret;
 
@@ -2863,16 +2855,6 @@ static int sof_link_esai_load(struct snd_soc_component *scomp, int index,
  return -EINVAL;
  }
 
- /* send message to DSP */
- ret = sof_ipc_tx_message(sdev->ipc,
- config->hdr.cmd, config, size, &reply,
- sizeof(reply));
- if (ret < 0) {
- dev_err(scomp->dev, "error: failed to set DAI config for ESAI%d\n",
- config->dai_index);
- return ret;
- }
-
  /* set config for all DAI's with name matching the link name */
  ret = sof_set_dai_config(sdev, size, link, config);
  if (ret < 0)
@@ -2891,7 +2873,6 @@ static int sof_link_dmic_load(struct snd_soc_component *scomp, int index,
  struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
  struct snd_soc_tplg_private *private = &cfg->priv;
  struct sof_ipc_dai_config *ipc_config;
- struct sof_ipc_reply reply;
  struct sof_ipc_fw_ready *ready = &sdev->fw_ready;
  struct sof_ipc_fw_version *v = &ready->version;
  u32 size;
@@ -2984,18 +2965,6 @@ static int sof_link_dmic_load(struct snd_soc_component *scomp, int index,
  ipc_config->dmic.reserved_2 = ipc_config->dmic.fifo_bits;
  }
 
- /* send message to DSP */
- ret = sof_ipc_tx_message(sdev->ipc,
- ipc_config->hdr.cmd, ipc_config, size, &reply,
- sizeof(reply));
-
- if (ret < 0) {
- dev_err(scomp->dev,
- "error: failed to set DAI config for DMIC%d\n",
- config->dai_index);
- goto err;
- }
-
  /* set config for all DAI's with name matching the link name */
  ret = sof_set_dai_config(sdev, size, link, ipc_config);
  if (ret < 0)
@@ -3117,24 +3086,12 @@ static int sof_link_alh_load(struct snd_soc_component *scomp, int index,
      struct sof_ipc_dai_config *config)
 {
  struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
- struct sof_ipc_reply reply;
  u32 size = sizeof(*config);
  int ret;
 
  /* init IPC */
  config->hdr.size = size;
 
- /* send message to DSP */
- ret = sof_ipc_tx_message(sdev->ipc,
- config->hdr.cmd, config, size, &reply,
- sizeof(reply));
-
- if (ret < 0) {
- dev_err(scomp->dev, "error: failed to set DAI config for ALH %d\n",
- config->dai_index);
- return ret;
- }
-
  /* set config for all DAI's with name matching the link name */
  ret = sof_set_dai_config(sdev, size, link, config);
  if (ret < 0)
--
2.17.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[SRU][OEM-5.6][PATCH 05/15] ASoC: topology: set component dai_index to ipc dai config dai_index

Hui Wang
In reply to this post by Hui Wang
From: Bard Liao <[hidden email]>

BugLink: https://bugs.launchpad.net/bugs/1900069

The ipc dai config dai_index is from topology. However, the same dai
config will be applied to all DAIs in the same dai link. We have to
ensure that the ipc dai config's dai_index match to the component's
dai_index.

Signed-off-by: Bard Liao <[hidden email]>
Signed-off-by: Ranjani Sridharan <[hidden email]>
Reviewed-by: Guennadi Liakhovetski <[hidden email]>
Reviewed-by: Kai Vehmanen <[hidden email]>
Link: https://lore.kernel.org/r/20200427172939.25848-3-ranjani.sridharan@...
Signed-off-by: Mark Brown <[hidden email]>
(cherry picked from commit 744a3bb3b4b6c4073ae9381a02c9824b29dd1a05)
Signed-off-by: Hui Wang <[hidden email]>
---
 sound/soc/sof/topology.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c
index 35f1050a643d..e344bd1121db 100644
--- a/sound/soc/sof/topology.c
+++ b/sound/soc/sof/topology.c
@@ -2652,6 +2652,14 @@ static int sof_set_dai_config(struct snd_sof_dev *sdev, u32 size,
  struct sof_ipc_reply reply;
  int ret;
 
+ /*
+ * the same dai config will be applied to all DAIs in
+ * the same dai link. We have to ensure that the ipc
+ * dai config's dai_index match to the component's
+ * dai_index.
+ */
+ config->dai_index = dai->comp_dai.dai_index;
+
  /* send message to DSP */
  ret = sof_ipc_tx_message(sdev->ipc,
  config->hdr.cmd, config, size,
--
2.17.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[SRU][OEM-5.6][PATCH 06/15] ASoC: Intel: add codec name prefix to ACPI machine description

Hui Wang
In reply to this post by Hui Wang
From: Pierre-Louis Bossart <[hidden email]>

BugLink: https://bugs.launchpad.net/bugs/1900069

The current SOF machine driver adds a name prefix for each codec,
mainly to differentiate ALSA controls for left and right amplifiers.

This is a good idea, but the machine driver duplicates some of the
information that already exists in ACPI descriptors, so add those
prefixes there. Follow-up patches will make use of the information
encoded in these tables and remove duplication.

Signed-off-by: Pierre-Louis Bossart <[hidden email]>
Reviewed-by: Bard Liao <[hidden email]>
Reviewed-by: Guennadi Liakhovetski <[hidden email]>
Signed-off-by: Kai Vehmanen <[hidden email]>
Link: https://lore.kernel.org/r/20200923080514.3242858-4-kai.vehmanen@...
Signed-off-by: Mark Brown <[hidden email]>
(backported from commit f93808308aab34071259fa8cffbda273bc346ea7 linux-next)
Signed-off-by: Hui Wang <[hidden email]>
---
 include/sound/soc-acpi.h                          |  2 ++
 sound/soc/intel/common/soc-acpi-intel-cml-match.c |  7 +++++++
 sound/soc/intel/common/soc-acpi-intel-icl-match.c |  7 +++++++
 sound/soc/intel/common/soc-acpi-intel-tgl-match.c | 10 ++++++++++
 4 files changed, 26 insertions(+)

diff --git a/include/sound/soc-acpi.h b/include/sound/soc-acpi.h
index 392e953d561e..ca4833e0aa54 100644
--- a/include/sound/soc-acpi.h
+++ b/include/sound/soc-acpi.h
@@ -93,11 +93,13 @@ struct snd_soc_acpi_endpoint {
  * @adr: 64 bit ACPI _ADR value
  * @num_endpoints: number of endpoints for this device
  * @endpoints: array of endpoints
+ * @name_prefix: string used for codec controls
  */
 struct snd_soc_acpi_adr_device {
  const u64 adr;
  const u8 num_endpoints;
  const struct snd_soc_acpi_endpoint *endpoints;
+ const char *name_prefix;
 };
 
 /**
diff --git a/sound/soc/intel/common/soc-acpi-intel-cml-match.c b/sound/soc/intel/common/soc-acpi-intel-cml-match.c
index fd2fdc0f52ba..928ce9dae528 100644
--- a/sound/soc/intel/common/soc-acpi-intel-cml-match.c
+++ b/sound/soc/intel/common/soc-acpi-intel-cml-match.c
@@ -85,6 +85,7 @@ static const struct snd_soc_acpi_adr_device rt700_1_adr[] = {
  .adr = 0x000110025D070000,
  .num_endpoints = 1,
  .endpoints = &single_endpoint,
+ .name_prefix = "rt700"
  }
 };
 
@@ -102,6 +103,7 @@ static const struct snd_soc_acpi_adr_device rt711_0_adr[] = {
  .adr = 0x000010025D071100,
  .num_endpoints = 1,
  .endpoints = &single_endpoint,
+ .name_prefix = "rt711"
  }
 };
 
@@ -110,6 +112,7 @@ static const struct snd_soc_acpi_adr_device rt1308_1_single_adr[] = {
  .adr = 0x000110025D130800,
  .num_endpoints = 1,
  .endpoints = &single_endpoint,
+ .name_prefix = "rt1308-1"
  }
 };
 
@@ -118,6 +121,7 @@ static const struct snd_soc_acpi_adr_device rt1308_2_adr[] = {
  .adr = 0x000210025D130800,
  .num_endpoints = 1,
  .endpoints = &single_endpoint,
+ .name_prefix = "rt1308-2"
  }
 };
 
@@ -126,6 +130,7 @@ static const struct snd_soc_acpi_adr_device rt1308_1_group1_adr[] = {
  .adr = 0x000110025D130800,
  .num_endpoints = 1,
  .endpoints = &spk_l_endpoint,
+ .name_prefix = "rt1308-1"
  }
 };
 
@@ -134,6 +139,7 @@ static const struct snd_soc_acpi_adr_device rt1308_2_group1_adr[] = {
  .adr = 0x000210025D130800,
  .num_endpoints = 1,
  .endpoints = &spk_r_endpoint,
+ .name_prefix = "rt1308-2"
  }
 };
 
@@ -142,6 +148,7 @@ static const struct snd_soc_acpi_adr_device rt715_3_adr[] = {
  .adr = 0x000310025D071500,
  .num_endpoints = 1,
  .endpoints = &single_endpoint,
+ .name_prefix = "rt715"
  }
 };
 
diff --git a/sound/soc/intel/common/soc-acpi-intel-icl-match.c b/sound/soc/intel/common/soc-acpi-intel-icl-match.c
index ef8500349f2f..c4196bf06281 100644
--- a/sound/soc/intel/common/soc-acpi-intel-icl-match.c
+++ b/sound/soc/intel/common/soc-acpi-intel-icl-match.c
@@ -59,6 +59,7 @@ static const struct snd_soc_acpi_adr_device rt700_0_adr[] = {
  .adr = 0x000010025D070000,
  .num_endpoints = 1,
  .endpoints = &single_endpoint,
+ .name_prefix = "rt700"
  }
 };
 
@@ -76,6 +77,7 @@ static const struct snd_soc_acpi_adr_device rt711_0_adr[] = {
  .adr = 0x000010025D071100,
  .num_endpoints = 1,
  .endpoints = &single_endpoint,
+ .name_prefix = "rt711"
  }
 };
 
@@ -84,6 +86,7 @@ static const struct snd_soc_acpi_adr_device rt1308_1_adr[] = {
  .adr = 0x000110025D130800,
  .num_endpoints = 1,
  .endpoints = &single_endpoint,
+ .name_prefix = "rt1308-1"
  }
 };
 
@@ -92,6 +95,7 @@ static const struct snd_soc_acpi_adr_device rt1308_2_adr[] = {
  .adr = 0x000210025D130800,
  .num_endpoints = 1,
  .endpoints = &single_endpoint,
+ .name_prefix = "rt1308-2"
  }
 };
 
@@ -100,6 +104,7 @@ static const struct snd_soc_acpi_adr_device rt1308_1_group1_adr[] = {
  .adr = 0x000110025D130800,
  .num_endpoints = 1,
  .endpoints = &spk_l_endpoint,
+ .name_prefix = "rt1308-1"
  }
 };
 
@@ -108,6 +113,7 @@ static const struct snd_soc_acpi_adr_device rt1308_2_group1_adr[] = {
  .adr = 0x000210025D130800,
  .num_endpoints = 1,
  .endpoints = &spk_r_endpoint,
+ .name_prefix = "rt1308-2"
  }
 };
 
@@ -116,6 +122,7 @@ static const struct snd_soc_acpi_adr_device rt715_3_adr[] = {
  .adr = 0x000310025D071500,
  .num_endpoints = 1,
  .endpoints = &single_endpoint,
+ .name_prefix = "rt715"
  }
 };
 
diff --git a/sound/soc/intel/common/soc-acpi-intel-tgl-match.c b/sound/soc/intel/common/soc-acpi-intel-tgl-match.c
index 4a7e20e5cec1..439c638c20f3 100644
--- a/sound/soc/intel/common/soc-acpi-intel-tgl-match.c
+++ b/sound/soc/intel/common/soc-acpi-intel-tgl-match.c
@@ -40,6 +40,7 @@ static const struct snd_soc_acpi_adr_device rt711_0_adr[] = {
  .adr = 0x000010025D071100,
  .num_endpoints = 1,
  .endpoints = &single_endpoint,
+ .name_prefix = "rt711"
  }
 };
 
@@ -48,11 +49,13 @@ static const struct snd_soc_acpi_adr_device rt1308_1_dual_adr[] = {
  .adr = 0x000120025D130800,
  .num_endpoints = 1,
  .endpoints = &spk_l_endpoint,
+ .name_prefix = "rt1308-1"
  },
  {
  .adr = 0x000122025D130800,
  .num_endpoints = 1,
  .endpoints = &spk_r_endpoint,
+ .name_prefix = "rt1308-2"
  }
 };
 
@@ -61,6 +64,7 @@ static const struct snd_soc_acpi_adr_device rt1308_1_single_adr[] = {
  .adr = 0x000120025D130800,
  .num_endpoints = 1,
  .endpoints = &single_endpoint,
+ .name_prefix = "rt1308-1"
  }
 };
 
@@ -69,6 +73,7 @@ static const struct snd_soc_acpi_adr_device rt1308_1_group1_adr[] = {
  .adr = 0x000120025D130800,
  .num_endpoints = 1,
  .endpoints = &spk_l_endpoint,
+ .name_prefix = "rt1308-1"
  }
 };
 
@@ -77,6 +82,7 @@ static const struct snd_soc_acpi_adr_device rt1308_2_group1_adr[] = {
  .adr = 0x000220025D130800,
  .num_endpoints = 1,
  .endpoints = &spk_r_endpoint,
+ .name_prefix = "rt1308-2"
  }
 };
 
@@ -85,6 +91,7 @@ static const struct snd_soc_acpi_adr_device rt715_3_adr[] = {
  .adr = 0x000320025D071500,
  .num_endpoints = 1,
  .endpoints = &single_endpoint,
+ .name_prefix = "rt715"
  }
 };
 
@@ -93,11 +100,13 @@ static const struct snd_soc_acpi_adr_device mx8373_1_adr[] = {
  .adr = 0x000123019F837300,
  .num_endpoints = 1,
  .endpoints = &spk_l_endpoint,
+ .name_prefix = "Right"
  },
  {
  .adr = 0x000127019F837300,
  .num_endpoints = 1,
  .endpoints = &spk_r_endpoint,
+ .name_prefix = "Left"
  }
 };
 
@@ -106,6 +115,7 @@ static const struct snd_soc_acpi_adr_device rt5682_0_adr[] = {
  .adr = 0x000021025D568200,
  .num_endpoints = 1,
  .endpoints = &single_endpoint,
+ .name_prefix = "rt5682"
  }
 };
 
--
2.17.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[SRU][OEM-5.6][PATCH 07/15] ASoC: Intel: sof_sdw: remove hard-coded codec_conf table

Hui Wang
In reply to this post by Hui Wang
From: Pierre-Louis Bossart <[hidden email]>

BugLink: https://bugs.launchpad.net/bugs/1900069

Now that the ACPI machine params provide all the information needed,
allocate the card codec_conf dynamically and set .dlc and
.prefix_name.

Signed-off-by: Pierre-Louis Bossart <[hidden email]>
Reviewed-by: Bard Liao <[hidden email]>
Reviewed-by: Guennadi Liakhovetski <[hidden email]>
Signed-off-by: Kai Vehmanen <[hidden email]>
Link: https://lore.kernel.org/r/20200923080514.3242858-5-kai.vehmanen@...
Signed-off-by: Mark Brown <[hidden email]>
(backported from commit 23c8aa3ebabf0008c1d05c38e9723e5deb720ba0 linux-next)
Signed-off-by: Hui Wang <[hidden email]>
---
 sound/soc/intel/boards/sof_sdw.c | 119 +++++++++++++++++++------------
 1 file changed, 73 insertions(+), 46 deletions(-)

diff --git a/sound/soc/intel/boards/sof_sdw.c b/sound/soc/intel/boards/sof_sdw.c
index 6a1b51c0546b..32b65bc2a4d3 100644
--- a/sound/soc/intel/boards/sof_sdw.c
+++ b/sound/soc/intel/boards/sof_sdw.c
@@ -103,45 +103,6 @@ static const struct dmi_system_id sof_sdw_quirk_table[] = {
  {}
 };
 
-static struct snd_soc_codec_conf codec_conf[] = {
- {
- .dlc = COMP_CODEC_CONF("sdw:0:25d:711:0"),
- .name_prefix = "rt711",
- },
- /* rt1308 w/ I2S connection */
- {
- .dlc = COMP_CODEC_CONF("i2c-10EC1308:00"),
- .name_prefix = "rt1308-1",
- },
- /* rt1308 left on link 1 */
- {
- .dlc = COMP_CODEC_CONF("sdw:1:25d:1308:0"),
- .name_prefix = "rt1308-1",
- },
- /* two 1308s on link1 with different unique id */
- {
- .dlc = COMP_CODEC_CONF("sdw:1:25d:1308:0:0"),
- .name_prefix = "rt1308-1",
- },
- {
- .dlc = COMP_CODEC_CONF("sdw:1:25d:1308:0:2"),
- .name_prefix = "rt1308-2",
- },
- /* rt1308 right on link 2 */
- {
- .dlc = COMP_CODEC_CONF("sdw:2:25d:1308:0"),
- .name_prefix = "rt1308-2",
- },
- {
- .dlc = COMP_CODEC_CONF("sdw:3:25d:715:0"),
- .name_prefix = "rt715",
- },
- {
- .dlc = COMP_CODEC_CONF("sdw:0:25d:5682:0"),
- .name_prefix = "rt5682",
- },
-};
-
 static struct snd_soc_dai_link_component dmic_component[] = {
  {
  .name = "dmic-codec",
@@ -359,10 +320,19 @@ static bool is_unique_device(const struct snd_soc_acpi_link_adr *link,
 static int create_codec_dai_name(struct device *dev,
  const struct snd_soc_acpi_link_adr *link,
  struct snd_soc_dai_link_component *codec,
- int offset)
+ int offset,
+ struct snd_soc_codec_conf *codec_conf,
+ int codec_count,
+ int *codec_conf_index)
 {
  int i;
 
+ /* sanity check */
+ if (*codec_conf_index + link->num_adr > codec_count) {
+ dev_err(dev, "codec_conf: out-of-bounds access requested\n");
+ return -EINVAL;
+ }
+
  for (i = 0; i < link->num_adr; i++) {
  unsigned int sdw_version, unique_id, mfg_id;
  unsigned int link_id, part_id, class_id;
@@ -404,6 +374,11 @@ static int create_codec_dai_name(struct device *dev,
 
  codec[comp_index].dai_name =
  codec_info_list[codec_index].dai_name;
+
+ codec_conf[*codec_conf_index].dlc = codec[comp_index];
+ codec_conf[*codec_conf_index].name_prefix = link->adr_d[i].name_prefix;
+
+ ++*codec_conf_index;
  }
 
  return 0;
@@ -524,7 +499,10 @@ static int create_sdw_dailink(struct device *dev, int *be_index,
       int sdw_be_num, int sdw_cpu_dai_num,
       struct snd_soc_dai_link_component *cpus,
       const struct snd_soc_acpi_link_adr *link,
-      int *cpu_id, bool *group_generated)
+      int *cpu_id, bool *group_generated,
+      struct snd_soc_codec_conf *codec_conf,
+      int codec_count,
+      int *codec_conf_index)
 {
  const struct snd_soc_acpi_link_adr *link_next;
  struct snd_soc_dai_link_component *codecs;
@@ -562,7 +540,8 @@ static int create_sdw_dailink(struct device *dev, int *be_index,
  if (cpu_dai_id[i] != ffs(link_next->mask) - 1)
  continue;
 
- ret = create_codec_dai_name(dev, link_next, codecs, codec_idx);
+ ret = create_codec_dai_name(dev, link_next, codecs, codec_idx,
+    codec_conf, codec_count, codec_conf_index);
  if (ret < 0)
  return ret;
 
@@ -658,6 +637,42 @@ static inline int get_next_be_id(struct snd_soc_dai_link *links,
  return links[be_id - 1].id + 1;
 }
 
+static int sof_card_codec_conf_alloc(struct device *dev,
+     struct snd_soc_acpi_mach_params *mach_params,
+     struct snd_soc_codec_conf **codec_conf,
+     int *codec_conf_count)
+{
+ const struct snd_soc_acpi_link_adr *adr_link;
+ struct snd_soc_codec_conf *c_conf;
+ int num_codecs = 0;
+ int i;
+
+ adr_link = mach_params->links;
+ if (!adr_link)
+ return -EINVAL;
+
+ /* generate DAI links by each sdw link */
+ for (; adr_link->num_adr; adr_link++) {
+ for (i = 0; i < adr_link->num_adr; i++) {
+ if (!adr_link->adr_d[i].name_prefix) {
+ dev_err(dev, "codec 0x%llx does not have a name prefix\n",
+ adr_link->adr_d[i].adr);
+ return -EINVAL;
+ }
+ }
+ num_codecs += adr_link->num_adr;
+ }
+
+ c_conf = devm_kzalloc(dev, num_codecs * sizeof(*c_conf), GFP_KERNEL);
+ if (!c_conf)
+ return -ENOMEM;
+
+ *codec_conf = c_conf;
+ *codec_conf_count = num_codecs;
+
+ return 0;
+}
+
 static int sof_card_dai_links_create(struct device *dev,
      struct snd_soc_acpi_mach *mach,
      struct snd_soc_card *card)
@@ -670,6 +685,9 @@ static int sof_card_dai_links_create(struct device *dev,
  struct snd_soc_acpi_mach_params *mach_params;
  const struct snd_soc_acpi_link_adr *adr_link;
  struct snd_soc_dai_link_component *cpus;
+ struct snd_soc_codec_conf *codec_conf;
+ int codec_conf_count;
+ int codec_conf_index = 0;
  bool group_generated[SDW_MAX_GROUPS];
  int ssp_codec_index, ssp_mask;
  struct snd_soc_dai_link *links;
@@ -682,6 +700,13 @@ static int sof_card_dai_links_create(struct device *dev,
  int comp_num;
  int ret;
 
+ mach_params = &mach->mach_params;
+
+ /* allocate codec conf, will be populated when dailinks are created */
+ ret = sof_card_codec_conf_alloc(dev, mach_params, &codec_conf, &codec_conf_count);
+ if (ret < 0)
+ return ret;
+
  /* reset amp_num to ensure amp_num++ starts from 0 in each probe */
  for (i = 0; i < ARRAY_SIZE(codec_info_list); i++)
  codec_info_list[i].amp_num = 0;
@@ -702,7 +727,6 @@ static int sof_card_dai_links_create(struct device *dev,
  ssp_num = ssp_codec_index >= 0 ? hweight_long(ssp_mask) : 0;
  comp_num = hdmi_num + ssp_num;
 
- mach_params = &mach->mach_params;
  ret = get_sdw_dailink_info(mach_params->links,
    &sdw_be_num, &sdw_cpu_dai_num);
  if (ret < 0) {
@@ -763,7 +787,9 @@ static int sof_card_dai_links_create(struct device *dev,
 
  ret = create_sdw_dailink(dev, &be_id, links, sdw_be_num,
  sdw_cpu_dai_num, cpus, adr_link,
- &cpu_id, group_generated);
+ &cpu_id, group_generated,
+ codec_conf, codec_conf_count,
+ &codec_conf_index);
  if (ret < 0) {
  dev_err(dev, "failed to create dai link %d", be_id);
  return -ENOMEM;
@@ -891,6 +917,9 @@ static int sof_card_dai_links_create(struct device *dev,
  card->dai_link = links;
  card->num_links = num_links;
 
+ card->codec_conf = codec_conf;
+ card->num_configs = codec_conf_count;
+
  return 0;
 }
 
@@ -900,8 +929,6 @@ static const char sdw_card_long_name[] = "Intel Soundwire SOF";
 static struct snd_soc_card card_sof_sdw = {
  .name = "soundwire",
  .late_probe = sof_sdw_hdmi_card_late_probe,
- .codec_conf = codec_conf,
- .num_configs = ARRAY_SIZE(codec_conf),
 };
 
 static int mc_probe(struct platform_device *pdev)
--
2.17.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[SRU][OEM-5.6][PATCH 08/15] ASoC: Intel: sof_sdw_rt700: add codec prefix

Hui Wang
In reply to this post by Hui Wang
From: Pierre-Louis Bossart <[hidden email]>

BugLink: https://bugs.launchpad.net/bugs/1900069

Somehow for this codec we never used any prefix for the controls,
likely because the test platform has a single SoundWire device.

Follow the convention and use the codec prefix across the board to
avoid possible conflicts.

Signed-off-by: Pierre-Louis Bossart <[hidden email]>
Reviewed-by: Bard Liao <[hidden email]>
Reviewed-by: Guennadi Liakhovetski <[hidden email]>
Signed-off-by: Kai Vehmanen <[hidden email]>
Link: https://lore.kernel.org/r/20200923080514.3242858-6-kai.vehmanen@...
Signed-off-by: Mark Brown <[hidden email]>
(cherry picked from commit fbcc27d18115f5e2bdad15a087831190c3f05d9b linux-next)
Signed-off-by: Hui Wang <[hidden email]>
---
 sound/soc/intel/boards/sof_sdw_rt700.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/sound/soc/intel/boards/sof_sdw_rt700.c b/sound/soc/intel/boards/sof_sdw_rt700.c
index 2ee4e6910d7f..23103f152b12 100644
--- a/sound/soc/intel/boards/sof_sdw_rt700.c
+++ b/sound/soc/intel/boards/sof_sdw_rt700.c
@@ -21,9 +21,9 @@ static const struct snd_soc_dapm_widget rt700_widgets[] = {
 
 static const struct snd_soc_dapm_route rt700_map[] = {
  /* Headphones */
- { "Headphones", NULL, "HP" },
- { "Speaker", NULL, "SPK" },
- { "MIC2", NULL, "AMIC" },
+ { "Headphones", NULL, "rt700 HP" },
+ { "Speaker", NULL, "rt700 SPK" },
+ { "rt700 MIC2", NULL, "AMIC" },
 };
 
 static const struct snd_kcontrol_new rt700_controls[] = {
--
2.17.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[SRU][OEM-5.6][PATCH 09/15] ASoC: Intel: add support for new SoundWire hardware layout on TGL

Hui Wang
In reply to this post by Hui Wang
From: Bard Liao <[hidden email]>

BugLink: https://bugs.launchpad.net/bugs/1900069

The creativity of hardware folks is endless, with a complete
permutation of rt711 (was link0 now link1), rt1308 (was link1 now
link2) and rt715 (was link3 now link0).

Someday we will get all this information from platform firmware, for
now let's add the mapping table.

Signed-off-by: Bard Liao <[hidden email]>
Signed-off-by: Pierre-Louis Bossart <[hidden email]>
Reviewed-by: Bard Liao <[hidden email]>
Reviewed-by: Guennadi Liakhovetski <[hidden email]>
Signed-off-by: Kai Vehmanen <[hidden email]>
Link: https://lore.kernel.org/r/20200923080514.3242858-7-kai.vehmanen@...
Signed-off-by: Mark Brown <[hidden email]>
(backported from commit e787f5b5b14061bf76518d780b9bc0e9e7dd2739 linux-next)
Signed-off-by: Hui Wang <[hidden email]>
---
 sound/soc/intel/boards/sof_sdw.c              |  9 ++++
 .../intel/common/soc-acpi-intel-tgl-match.c   | 53 +++++++++++++++++++
 2 files changed, 62 insertions(+)

diff --git a/sound/soc/intel/boards/sof_sdw.c b/sound/soc/intel/boards/sof_sdw.c
index 32b65bc2a4d3..25baa13df7a3 100644
--- a/sound/soc/intel/boards/sof_sdw.c
+++ b/sound/soc/intel/boards/sof_sdw.c
@@ -25,6 +25,15 @@ static int sof_sdw_quirk_cb(const struct dmi_system_id *id)
 }
 
 static const struct dmi_system_id sof_sdw_quirk_table[] = {
+ {
+ .callback = sof_sdw_quirk_cb,
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"),
+ DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "0A3E")
+ },
+ .driver_data = (void *)(SOF_RT711_JD_SRC_JD2 |
+ SOF_RT715_DAI_ID_FIX),
+ },
  {
  .callback = sof_sdw_quirk_cb,
  .matches = {
diff --git a/sound/soc/intel/common/soc-acpi-intel-tgl-match.c b/sound/soc/intel/common/soc-acpi-intel-tgl-match.c
index 439c638c20f3..081a2da67e4a 100644
--- a/sound/soc/intel/common/soc-acpi-intel-tgl-match.c
+++ b/sound/soc/intel/common/soc-acpi-intel-tgl-match.c
@@ -44,6 +44,15 @@ static const struct snd_soc_acpi_adr_device rt711_0_adr[] = {
  }
 };
 
+static const struct snd_soc_acpi_adr_device rt711_1_adr[] = {
+ {
+ .adr = 0x000120025D071100,
+ .num_endpoints = 1,
+ .endpoints = &single_endpoint,
+ .name_prefix = "rt711"
+ }
+};
+
 static const struct snd_soc_acpi_adr_device rt1308_1_dual_adr[] = {
  {
  .adr = 0x000120025D130800,
@@ -68,6 +77,15 @@ static const struct snd_soc_acpi_adr_device rt1308_1_single_adr[] = {
  }
 };
 
+static const struct snd_soc_acpi_adr_device rt1308_2_single_adr[] = {
+ {
+ .adr = 0x000220025D130800,
+ .num_endpoints = 1,
+ .endpoints = &single_endpoint,
+ .name_prefix = "rt1308-1"
+ }
+};
+
 static const struct snd_soc_acpi_adr_device rt1308_1_group1_adr[] = {
  {
  .adr = 0x000120025D130800,
@@ -86,6 +104,15 @@ static const struct snd_soc_acpi_adr_device rt1308_2_group1_adr[] = {
  }
 };
 
+static const struct snd_soc_acpi_adr_device rt715_0_adr[] = {
+ {
+ .adr = 0x000021025D071500,
+ .num_endpoints = 1,
+ .endpoints = &single_endpoint,
+ .name_prefix = "rt715"
+ }
+};
+
 static const struct snd_soc_acpi_adr_device rt715_3_adr[] = {
  {
  .adr = 0x000320025D071500,
@@ -199,6 +226,25 @@ static const struct snd_soc_acpi_link_adr tgl_3_in_1_mono_amp[] = {
  {}
 };
 
+static const struct snd_soc_acpi_link_adr tgl_sdw_rt711_link1_rt1308_link2_rt715_link0[] = {
+ {
+ .mask = BIT(1),
+ .num_adr = ARRAY_SIZE(rt711_1_adr),
+ .adr_d = rt711_1_adr,
+ },
+ {
+ .mask = BIT(2),
+ .num_adr = ARRAY_SIZE(rt1308_2_single_adr),
+ .adr_d = rt1308_2_single_adr,
+ },
+ {
+ .mask = BIT(0),
+ .num_adr = ARRAY_SIZE(rt715_0_adr),
+ .adr_d = rt715_0_adr,
+ },
+ {}
+};
+
 static struct snd_soc_acpi_codecs tgl_max98373_amp = {
  .num_codecs = 1,
  .codecs = {"MX98373"}
@@ -235,6 +281,13 @@ EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_tgl_machines);
 
 /* this table is used when there is no I2S codec present */
 struct snd_soc_acpi_mach snd_soc_acpi_intel_tgl_sdw_machines[] = {
+ {
+ .link_mask = 0x7,
+ .links = tgl_sdw_rt711_link1_rt1308_link2_rt715_link0,
+ .drv_name = "sof_sdw",
+ .sof_fw_filename = "sof-tgl.ri",
+ .sof_tplg_filename = "sof-tgl-rt715-rt711-rt1308-mono.tplg",
+ },
  {
  .link_mask = 0xF, /* 4 active links required */
  .links = tgl_3_in_1_default,
--
2.17.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[SRU][OEM-5.6][PATCH 10/15] ASoC: Intel: sof_sdw_rt711: remove hard-coded codec name

Hui Wang
In reply to this post by Hui Wang
From: Bard Liao <[hidden email]>

BugLink: https://bugs.launchpad.net/bugs/1900069

We can get codec name from dai link.

Suggested-by: Rander Wang <[hidden email]>
Signed-off-by: Bard Liao <[hidden email]>
Signed-off-by: Pierre-Louis Bossart <[hidden email]>
Reviewed-by: Kai Vehmanen <[hidden email]>
Link: https://lore.kernel.org/r/20200717211337.31956-2-pierre-louis.bossart@...
Signed-off-by: Mark Brown <[hidden email]>
(cherry picked from commit 1f891055c7d0ce665247c09e97db927f2db37ce7)
Signed-off-by: Hui Wang <[hidden email]>
---
 sound/soc/intel/boards/sof_sdw_rt711.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sound/soc/intel/boards/sof_sdw_rt711.c b/sound/soc/intel/boards/sof_sdw_rt711.c
index 2a4917e3d561..d40965426d3e 100644
--- a/sound/soc/intel/boards/sof_sdw_rt711.c
+++ b/sound/soc/intel/boards/sof_sdw_rt711.c
@@ -146,7 +146,7 @@ int sof_sdw_rt711_init(const struct snd_soc_acpi_link_adr *link,
  if (!playback)
  return 0;
 
- ret = rt711_add_codec_device_props("sdw:0:25d:711:0");
+ ret = rt711_add_codec_device_props(dai_links->codecs[0].name);
  if (ret < 0)
  return ret;
 
--
2.17.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[SRU][OEM-5.6][PATCH 11/15] ASoC/soundwire: bus: use property to set interrupt masks

Hui Wang
In reply to this post by Hui Wang
From: Pierre-Louis Bossart <[hidden email]>

BugLink: https://bugs.launchpad.net/bugs/1900069

Add a slave-level property and program the SCP_INT1_MASK as desired by
the codec driver. Since there is no DisCo property this has to be an
implementation-specific firmware property or hard-coded in the driver.

The only functionality change is that implementation-defined
interrupts are no longer set for amplifiers - those interrupts are
typically for jack detection or acoustic event detection/hotwording.

Signed-off-by: Pierre-Louis Bossart <[hidden email]>
Signed-off-by: Bard Liao <[hidden email]>
Tested-by: Srinivas Kandagatla <[hidden email]>
Reviewed-by: Kai Vehmanen <[hidden email]>
Reviewed-by: Guennadi Liakhovetski <[hidden email]>
Acked-by: Mark Brown <[hidden email]>
Link: https://lore.kernel.org/r/20200908134521.6781-2-yung-chuan.liao@...
Signed-off-by: Vinod Koul <[hidden email]>
(backported from commit 2acd30b9f6032c6cbefc5e255c17ebbb0718e56a linux-next)
Signed-off-by: Hui Wang <[hidden email]>
---
 drivers/soundwire/bus.c       | 12 ++++++------
 include/linux/soundwire/sdw.h |  2 ++
 sound/soc/codecs/rt1308-sdw.c |  2 ++
 sound/soc/codecs/rt700-sdw.c  |  4 ++++
 sound/soc/codecs/rt711-sdw.c  |  4 ++++
 sound/soc/codecs/rt715-sdw.c  |  4 ++++
 sound/soc/codecs/wsa881x.c    |  1 +
 7 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c
index 0c563d78cef9..930dce04b793 100644
--- a/drivers/soundwire/bus.c
+++ b/drivers/soundwire/bus.c
@@ -1048,13 +1048,13 @@ static int sdw_initialize_slave(struct sdw_slave *slave)
  u8 val;
 
  /*
- * Set bus clash, parity and SCP implementation
- * defined interrupt mask
- * TODO: Read implementation defined interrupt mask
- * from Slave property
+ * Set SCP_INT1_MASK register, typically bus clash and
+ * implementation-defined interrupt mask. The Parity detection
+ * may not always be correct on startup so its use is
+ * device-dependent, it might e.g. only be enabled in
+ * steady-state after a couple of frames.
  */
- val = SDW_SCP_INT1_IMPL_DEF | SDW_SCP_INT1_BUS_CLASH |
- SDW_SCP_INT1_PARITY;
+ val = slave->prop.scp_int1_mask;
 
  /* Enable SCP interrupts */
  ret = sdw_update(slave, SDW_SCP_INTMASK1, val, val);
diff --git a/include/linux/soundwire/sdw.h b/include/linux/soundwire/sdw.h
index 56dc689b4d80..6bea524c3154 100644
--- a/include/linux/soundwire/sdw.h
+++ b/include/linux/soundwire/sdw.h
@@ -355,6 +355,7 @@ struct sdw_dpn_prop {
  * @dp0_prop: Data Port 0 properties
  * @src_dpn_prop: Source Data Port N properties
  * @sink_dpn_prop: Sink Data Port N properties
+ * @scp_int1_mask: SCP_INT1_MASK desired settings
  */
 struct sdw_slave_prop {
  u32 mipi_revision;
@@ -376,6 +377,7 @@ struct sdw_slave_prop {
  struct sdw_dp0_prop *dp0_prop;
  struct sdw_dpn_prop *src_dpn_prop;
  struct sdw_dpn_prop *sink_dpn_prop;
+ u8 scp_int1_mask;
 };
 
 /**
diff --git a/sound/soc/codecs/rt1308-sdw.c b/sound/soc/codecs/rt1308-sdw.c
index a5a7e46de246..858ed2903d12 100644
--- a/sound/soc/codecs/rt1308-sdw.c
+++ b/sound/soc/codecs/rt1308-sdw.c
@@ -123,6 +123,8 @@ static int rt1308_read_prop(struct sdw_slave *slave)
  unsigned long addr;
  struct sdw_dpn_prop *dpn;
 
+ prop->scp_int1_mask = SDW_SCP_INT1_BUS_CLASH | SDW_SCP_INT1_PARITY;
+
  prop->paging_support = true;
 
  /* first we need to allocate memory for set bits in port lists */
diff --git a/sound/soc/codecs/rt700-sdw.c b/sound/soc/codecs/rt700-sdw.c
index d4e0f953bcce..e18d8f3c70c2 100644
--- a/sound/soc/codecs/rt700-sdw.c
+++ b/sound/soc/codecs/rt700-sdw.c
@@ -11,6 +11,7 @@
 #include <linux/mod_devicetable.h>
 #include <linux/soundwire/sdw.h>
 #include <linux/soundwire/sdw_type.h>
+#include <linux/soundwire/sdw_registers.h>
 #include <linux/module.h>
 #include <linux/regmap.h>
 #include <sound/soc.h>
@@ -338,6 +339,9 @@ static int rt700_read_prop(struct sdw_slave *slave)
  unsigned long addr;
  struct sdw_dpn_prop *dpn;
 
+ prop->scp_int1_mask = SDW_SCP_INT1_IMPL_DEF | SDW_SCP_INT1_BUS_CLASH |
+ SDW_SCP_INT1_PARITY;
+
  prop->paging_support = false;
 
  /* first we need to allocate memory for set bits in port lists */
diff --git a/sound/soc/codecs/rt711-sdw.c b/sound/soc/codecs/rt711-sdw.c
index fc3a3fa3d51b..699fabdf41f1 100644
--- a/sound/soc/codecs/rt711-sdw.c
+++ b/sound/soc/codecs/rt711-sdw.c
@@ -11,6 +11,7 @@
 #include <linux/mod_devicetable.h>
 #include <linux/soundwire/sdw.h>
 #include <linux/soundwire/sdw_type.h>
+#include <linux/soundwire/sdw_registers.h>
 #include <linux/module.h>
 #include <linux/regmap.h>
 #include <sound/soc.h>
@@ -342,6 +343,9 @@ static int rt711_read_prop(struct sdw_slave *slave)
  unsigned long addr;
  struct sdw_dpn_prop *dpn;
 
+ prop->scp_int1_mask = SDW_SCP_INT1_IMPL_DEF | SDW_SCP_INT1_BUS_CLASH |
+ SDW_SCP_INT1_PARITY;
+
  prop->paging_support = false;
 
  /* first we need to allocate memory for set bits in port lists */
diff --git a/sound/soc/codecs/rt715-sdw.c b/sound/soc/codecs/rt715-sdw.c
index 64ef56ef0318..ca2c4d806b3d 100644
--- a/sound/soc/codecs/rt715-sdw.c
+++ b/sound/soc/codecs/rt715-sdw.c
@@ -12,6 +12,7 @@
 #include <linux/mod_devicetable.h>
 #include <linux/soundwire/sdw.h>
 #include <linux/soundwire/sdw_type.h>
+#include <linux/soundwire/sdw_registers.h>
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/regmap.h>
@@ -436,6 +437,9 @@ static int rt715_read_prop(struct sdw_slave *slave)
  unsigned long addr;
  struct sdw_dpn_prop *dpn;
 
+ prop->scp_int1_mask = SDW_SCP_INT1_IMPL_DEF | SDW_SCP_INT1_BUS_CLASH |
+ SDW_SCP_INT1_PARITY;
+
  prop->paging_support = false;
 
  /* first we need to allocate memory for set bits in port lists */
diff --git a/sound/soc/codecs/wsa881x.c b/sound/soc/codecs/wsa881x.c
index b59f1d0e7f84..7a560c5955f4 100644
--- a/sound/soc/codecs/wsa881x.c
+++ b/sound/soc/codecs/wsa881x.c
@@ -1150,6 +1150,7 @@ static int wsa881x_probe(struct sdw_slave *pdev,
  wsa881x->sconfig.type = SDW_STREAM_PDM;
  pdev->prop.sink_ports = GENMASK(WSA881X_MAX_SWR_PORTS, 0);
  pdev->prop.sink_dpn_prop = wsa_sink_dpn_prop;
+ pdev->prop.scp_int1_mask = SDW_SCP_INT1_BUS_CLASH | SDW_SCP_INT1_PARITY;
  gpiod_set_value(wsa881x->sd_n, 1);
 
  wsa881x->regmap = devm_regmap_init_sdw(pdev, &wsa881x_regmap_config);
--
2.17.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[SRU][OEM-5.6][PATCH 12/15] soundwire: bus: filter-out unwanted interrupt reports

Hui Wang
In reply to this post by Hui Wang
From: Pierre-Louis Bossart <[hidden email]>

BugLink: https://bugs.launchpad.net/bugs/1900069

Unlike the traditional usage, in the SoundWire specification the
interrupt masks only gate the propagation of an interrupt condition to
the PING frame status. They do not gate the changes of the INT_STAT
registers, which will happen regardless of the mask settings. See
Figure 116 of the SoundWire 1.2 specification for an in-depth
description of the interrupt model.

When the bus driver reads the SCP_INT1_STAT register, it will retrieve
all the interrupt status, including for the mask fields that were not
explicitly set. For example, even if the PARITY mask is not set, the
PARITY error status will be reported if an implementation-defined
interrupt for jack detection is enabled and occurs.

Filtering undesired interrupt reports and handling has to be
implemented in software. This patch enables this filtering for the
INT1_IMPL_DEF, PARITY and BUS_CLASH interrupt sources.

Signed-off-by: Pierre-Louis Bossart <[hidden email]>
Signed-off-by: Bard Liao <[hidden email]>
Reviewed-by: Kai Vehmanen <[hidden email]>
Reviewed-by: Guennadi Liakhovetski <[hidden email]>
Link: https://lore.kernel.org/r/20200908134521.6781-3-yung-chuan.liao@...
Signed-off-by: Vinod Koul <[hidden email]>
(backported from commit 310f6dc6dc5d7372e878e3e401ae087b63d545de linux-next)
Signed-off-by: Hui Wang <[hidden email]>
---
 drivers/soundwire/bus.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c
index 930dce04b793..9b74d38511e6 100644
--- a/drivers/soundwire/bus.c
+++ b/drivers/soundwire/bus.c
@@ -1258,12 +1258,14 @@ static int sdw_handle_slave_alerts(struct sdw_slave *slave)
  * interrupt
  */
  if (buf & SDW_SCP_INT1_PARITY) {
- dev_err(&slave->dev, "Parity error detected\n");
+ if (slave->prop.scp_int1_mask & SDW_SCP_INT1_PARITY)
+ dev_err(&slave->dev, "Parity error detected\n");
  clear |= SDW_SCP_INT1_PARITY;
  }
 
  if (buf & SDW_SCP_INT1_BUS_CLASH) {
- dev_err(&slave->dev, "Bus clash error detected\n");
+ if (slave->prop.scp_int1_mask & SDW_SCP_INT1_BUS_CLASH)
+ dev_err(&slave->dev, "Bus clash detected\n");
  clear |= SDW_SCP_INT1_BUS_CLASH;
  }
 
@@ -1275,9 +1277,11 @@ static int sdw_handle_slave_alerts(struct sdw_slave *slave)
  */
 
  if (buf & SDW_SCP_INT1_IMPL_DEF) {
- dev_dbg(&slave->dev, "Slave impl defined interrupt\n");
+ if (slave->prop.scp_int1_mask & SDW_SCP_INT1_IMPL_DEF) {
+ dev_dbg(&slave->dev, "Slave impl defined interrupt\n");
+ slave_notify = true;
+ }
  clear |= SDW_SCP_INT1_IMPL_DEF;
- slave_notify = true;
  }
 
  /* Check port 0 - 3 interrupts */
--
2.17.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[SRU][OEM-5.6][PATCH 13/15] soundwire: slave: add first_interrupt_done status

Hui Wang
In reply to this post by Hui Wang
From: Pierre-Louis Bossart <[hidden email]>

BugLink: https://bugs.launchpad.net/bugs/1900069

Some Slaves report incorrect information in their interrupt status
registers after a master/bus reset, track the initial interrupt
handling so that quirks can be introduced to filter out incorrect
information while keeping interrupts enabled in steady state.

Signed-off-by: Pierre-Louis Bossart <[hidden email]>
Signed-off-by: Bard Liao <[hidden email]>
Reviewed-by: Kai Vehmanen <[hidden email]>
Reviewed-by: Guennadi Liakhovetski <[hidden email]>
Link: https://lore.kernel.org/r/20200908134521.6781-4-yung-chuan.liao@...
Signed-off-by: Vinod Koul <[hidden email]>
(backported from commit c2819e196b3cc1901a4612f72e66da4821966a5e linux-next)
Signed-off-by: Hui Wang <[hidden email]>
---
 drivers/soundwire/bus.c       | 7 ++++++-
 drivers/soundwire/slave.c     | 1 +
 include/linux/soundwire/sdw.h | 3 +++
 3 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c
index 9b74d38511e6..738468918041 100644
--- a/drivers/soundwire/bus.c
+++ b/drivers/soundwire/bus.c
@@ -1336,6 +1336,9 @@ static int sdw_handle_slave_alerts(struct sdw_slave *slave)
  goto io_err;
  }
 
+ /* at this point all initial interrupt sources were handled */
+ slave->first_interrupt_done = true;
+
  /*
  * Read status again to ensure no new interrupts arrived
  * while servicing interrupts.
@@ -1538,8 +1541,10 @@ void sdw_clear_slave_status(struct sdw_bus *bus, u32 request)
  if (!slave)
  continue;
 
- if (slave->status != SDW_SLAVE_UNATTACHED)
+ if (slave->status != SDW_SLAVE_UNATTACHED) {
  sdw_modify_slave_status(slave, SDW_SLAVE_UNATTACHED);
+ slave->first_interrupt_done = false;
+ }
 
  /* keep track of request, used in pm_runtime resume */
  slave->unattach_request = request;
diff --git a/drivers/soundwire/slave.c b/drivers/soundwire/slave.c
index 7ca4f2d9bfa6..b10c6bfea07c 100644
--- a/drivers/soundwire/slave.c
+++ b/drivers/soundwire/slave.c
@@ -56,6 +56,7 @@ static int sdw_slave_add(struct sdw_bus *bus,
  slave->dev_num = 0;
  init_completion(&slave->probe_complete);
  slave->probed = false;
+ slave->first_interrupt_done = false;
 
  mutex_lock(&bus->bus_lock);
  list_add_tail(&slave->node, &bus->slaves);
diff --git a/include/linux/soundwire/sdw.h b/include/linux/soundwire/sdw.h
index 6bea524c3154..4aee224dbd23 100644
--- a/include/linux/soundwire/sdw.h
+++ b/include/linux/soundwire/sdw.h
@@ -609,6 +609,8 @@ struct sdw_slave_ops {
  * between the Master suspending and the codec resuming, and make sure that
  * when the Master triggered a reset the Slave is properly enumerated and
  * initialized
+ * @first_interrupt_done: status flag tracking if the interrupt handling
+ * for a Slave happens for the first time after enumeration
  */
 struct sdw_slave {
  struct sdw_slave_id id;
@@ -630,6 +632,7 @@ struct sdw_slave {
  struct completion enumeration_complete;
  struct completion initialization_complete;
  u32 unattach_request;
+ bool first_interrupt_done;
 };
 
 #define dev_to_sdw_dev(_dev) container_of(_dev, struct sdw_slave, dev)
--
2.17.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[SRU][OEM-5.6][PATCH 14/15] soundwire: bus: use quirk to filter out invalid parity errors

Hui Wang
In reply to this post by Hui Wang
From: Pierre-Louis Bossart <[hidden email]>

BugLink: https://bugs.launchpad.net/bugs/1900069

If a Slave device reports with a quirk that its initial parity check
may be incorrect, filter it but keep the parity checks active in
steady state.

Signed-off-by: Pierre-Louis Bossart <[hidden email]>
Signed-off-by: Bard Liao <[hidden email]>
Reviewed-by: Kai Vehmanen <[hidden email]>
Reviewed-by: Guennadi Liakhovetski <[hidden email]>
Link: https://lore.kernel.org/r/20200908134521.6781-5-yung-chuan.liao@...
Signed-off-by: Vinod Koul <[hidden email]>
(backported from commit 4724f12c1315efa79a0cbf74dfb0c9b98b1a4bff linux-next)
Signed-off-by: Hui Wang <[hidden email]>
---
 drivers/soundwire/bus.c       | 8 +++++++-
 include/linux/soundwire/sdw.h | 4 ++++
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c
index 738468918041..3e124ea73743 100644
--- a/drivers/soundwire/bus.c
+++ b/drivers/soundwire/bus.c
@@ -1226,6 +1226,8 @@ static int sdw_handle_slave_alerts(struct sdw_slave *slave)
  unsigned long port;
  bool slave_notify = false;
  u8 buf, buf2[2], _buf, _buf2[2];
+ bool parity_check;
+ bool parity_quirk;
 
  sdw_modify_slave_status(slave, SDW_SLAVE_ALERT);
 
@@ -1258,7 +1260,11 @@ static int sdw_handle_slave_alerts(struct sdw_slave *slave)
  * interrupt
  */
  if (buf & SDW_SCP_INT1_PARITY) {
- if (slave->prop.scp_int1_mask & SDW_SCP_INT1_PARITY)
+ parity_check = slave->prop.scp_int1_mask & SDW_SCP_INT1_PARITY;
+ parity_quirk = !slave->first_interrupt_done &&
+ (slave->prop.quirks & SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY);
+
+ if (parity_check && !parity_quirk)
  dev_err(&slave->dev, "Parity error detected\n");
  clear |= SDW_SCP_INT1_PARITY;
  }
diff --git a/include/linux/soundwire/sdw.h b/include/linux/soundwire/sdw.h
index 4aee224dbd23..671ca68aa3cb 100644
--- a/include/linux/soundwire/sdw.h
+++ b/include/linux/soundwire/sdw.h
@@ -356,6 +356,7 @@ struct sdw_dpn_prop {
  * @src_dpn_prop: Source Data Port N properties
  * @sink_dpn_prop: Sink Data Port N properties
  * @scp_int1_mask: SCP_INT1_MASK desired settings
+ * @quirks: bitmask identifying deltas from the MIPI specification
  */
 struct sdw_slave_prop {
  u32 mipi_revision;
@@ -378,8 +379,11 @@ struct sdw_slave_prop {
  struct sdw_dpn_prop *src_dpn_prop;
  struct sdw_dpn_prop *sink_dpn_prop;
  u8 scp_int1_mask;
+ u32 quirks;
 };
 
+#define SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY BIT(0)
+
 /**
  * struct sdw_master_prop - Master properties
  * @revision: MIPI spec version of the implementation
--
2.17.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[SRU][OEM-5.6][PATCH 15/15] ASoC: codecs: realtek-soundwire: ignore initial PARITY errors

Hui Wang
In reply to this post by Hui Wang
From: Pierre-Louis Bossart <[hidden email]>

BugLink: https://bugs.launchpad.net/bugs/1900069

The parity calculation is not reset on a Severe Reset, which leads to
misleading/harmless errors reported on startup. The addition of a
quirk helps filter out such errors while leaving the error checks on
in steady-state.

Signed-off-by: Pierre-Louis Bossart <[hidden email]>
Signed-off-by: Bard Liao <[hidden email]>
Reviewed-by: Kai Vehmanen <[hidden email]>
Reviewed-by: Guennadi Liakhovetski <[hidden email]>
Acked-by: Mark Brown <[hidden email]>
Link: https://lore.kernel.org/r/20200908134521.6781-6-yung-chuan.liao@...
Signed-off-by: Vinod Koul <[hidden email]>
(backported from commit 38edbfae6c7f4ad402dd0464c1887eaf068468b8 linux-next)
Signed-off-by: Hui Wang <[hidden email]>
---
 sound/soc/codecs/rt1308-sdw.c | 1 +
 sound/soc/codecs/rt700-sdw.c  | 1 +
 sound/soc/codecs/rt711-sdw.c  | 1 +
 sound/soc/codecs/rt715-sdw.c  | 1 +
 4 files changed, 4 insertions(+)

diff --git a/sound/soc/codecs/rt1308-sdw.c b/sound/soc/codecs/rt1308-sdw.c
index 858ed2903d12..2baab4236189 100644
--- a/sound/soc/codecs/rt1308-sdw.c
+++ b/sound/soc/codecs/rt1308-sdw.c
@@ -124,6 +124,7 @@ static int rt1308_read_prop(struct sdw_slave *slave)
  struct sdw_dpn_prop *dpn;
 
  prop->scp_int1_mask = SDW_SCP_INT1_BUS_CLASH | SDW_SCP_INT1_PARITY;
+ prop->quirks = SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY;
 
  prop->paging_support = true;
 
diff --git a/sound/soc/codecs/rt700-sdw.c b/sound/soc/codecs/rt700-sdw.c
index e18d8f3c70c2..e305a324a263 100644
--- a/sound/soc/codecs/rt700-sdw.c
+++ b/sound/soc/codecs/rt700-sdw.c
@@ -341,6 +341,7 @@ static int rt700_read_prop(struct sdw_slave *slave)
 
  prop->scp_int1_mask = SDW_SCP_INT1_IMPL_DEF | SDW_SCP_INT1_BUS_CLASH |
  SDW_SCP_INT1_PARITY;
+ prop->quirks = SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY;
 
  prop->paging_support = false;
 
diff --git a/sound/soc/codecs/rt711-sdw.c b/sound/soc/codecs/rt711-sdw.c
index 699fabdf41f1..13f7c299f8c2 100644
--- a/sound/soc/codecs/rt711-sdw.c
+++ b/sound/soc/codecs/rt711-sdw.c
@@ -345,6 +345,7 @@ static int rt711_read_prop(struct sdw_slave *slave)
 
  prop->scp_int1_mask = SDW_SCP_INT1_IMPL_DEF | SDW_SCP_INT1_BUS_CLASH |
  SDW_SCP_INT1_PARITY;
+ prop->quirks = SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY;
 
  prop->paging_support = false;
 
diff --git a/sound/soc/codecs/rt715-sdw.c b/sound/soc/codecs/rt715-sdw.c
index ca2c4d806b3d..695e42e9de44 100644
--- a/sound/soc/codecs/rt715-sdw.c
+++ b/sound/soc/codecs/rt715-sdw.c
@@ -439,6 +439,7 @@ static int rt715_read_prop(struct sdw_slave *slave)
 
  prop->scp_int1_mask = SDW_SCP_INT1_IMPL_DEF | SDW_SCP_INT1_BUS_CLASH |
  SDW_SCP_INT1_PARITY;
+ prop->quirks = SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY;
 
  prop->paging_support = false;
 
--
2.17.1


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

APPLIED Re: [SRU][OEM-5.6][PATCH 00/15] alsa: add Dell tgl soundwire machines support

Timo Aaltonen-6
In reply to this post by Hui Wang
On 16.10.2020 4.22, Hui Wang wrote:

> BugLink: https://bugs.launchpad.net/bugs/1900069
>
> This fix is only for oem-5.6 kernel, the groovy 5.8 kernel doesn't
> support soundwire audio at all, Intel said the linux-5.10 kernel
> will have a good support for soundwire audio, so this SRU is
> meaningless for groovy 5.8 kernel.
>
>
> [Impact]
> We enabled a new Dell TGL machine, the audio on this machine doesn't
> work, the codec on this machine is soundwire bus connnected.
>
> [Fix]
> With Intel's help, we need to backport some patches from upstream
> kernel and linux-next kernel.
>
> [Test Case]
> Boot the kernel, check with dmesg and aplay -l/arecord -l, the audio
> card registered and speaker, headphone, mic and internal mic all
> registered and worked.
>
>
> [Regression Risk]
> This could make the Dell cml soundwire audio fail to work or make
> some sof dmic machines fail to work, but this possibility is very low,
> we have tested this patchset on Dell cml soundwire audio machines and
> some hp and lenovo dmic machines.
>
>
> Bard Liao (4):
>    ASoC: SOF: topology: send ipc for all found DAIs in sof_set_dai_config
>    ASoC: topology: set component dai_index to ipc dai config dai_index
>    ASoC: Intel: add support for new SoundWire hardware layout on TGL
>    ASoC: Intel: sof_sdw_rt711: remove hard-coded codec name
>
> Naveen Manohar (1):
>    ASoC: Intel: common: add match table for TGL MAX98373 + RT5682
>      SoundWire driver
>
> Pierre-Louis Bossart (10):
>    ALSA: hda: add autodetection for SoundWire
>    ASoC: Intel: soc-acpi: mirror CML and TGL configurations
>    ASoC: Intel: add codec name prefix to ACPI machine description
>    ASoC: Intel: sof_sdw: remove hard-coded codec_conf table
>    ASoC: Intel: sof_sdw_rt700: add codec prefix
>    ASoC/soundwire: bus: use property to set interrupt masks
>    soundwire: bus: filter-out unwanted interrupt reports
>    soundwire: slave: add first_interrupt_done status
>    soundwire: bus: use quirk to filter out invalid parity errors
>    ASoC: codecs: realtek-soundwire: ignore initial PARITY errors
>
>   drivers/soundwire/bus.c                       |  37 +++-
>   drivers/soundwire/slave.c                     |   1 +
>   include/linux/soundwire/sdw.h                 |   9 +
>   include/sound/soc-acpi.h                      |   2 +
>   sound/hda/intel-dsp-config.c                  |  65 ++++--
>   sound/soc/codecs/rt1308-sdw.c                 |   3 +
>   sound/soc/codecs/rt700-sdw.c                  |   5 +
>   sound/soc/codecs/rt711-sdw.c                  |   5 +
>   sound/soc/codecs/rt715-sdw.c                  |   5 +
>   sound/soc/codecs/wsa881x.c                    |   1 +
>   sound/soc/intel/boards/sof_sdw.c              | 128 +++++++-----
>   sound/soc/intel/boards/sof_sdw_rt700.c        |   6 +-
>   sound/soc/intel/boards/sof_sdw_rt711.c        |   2 +-
>   .../intel/common/soc-acpi-intel-cml-match.c   |  13 +-
>   .../intel/common/soc-acpi-intel-icl-match.c   |   7 +
>   .../intel/common/soc-acpi-intel-tgl-match.c   | 188 +++++++++++++++++-
>   sound/soc/sof/topology.c                      |  87 +++-----
>   17 files changed, 420 insertions(+), 144 deletions(-)
>

though it's a fairly big set at this point but also well tested so..
applied to oem-5.6, thanks

--
t

--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team