Alsa-devel
Threads by month
- ----- 2025 -----
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- 37 participants
- 51262 discussions

08 Feb '21
From: Shuming Fan <shumingf(a)realtek.com>
This is the initial amplifier driver for rt1316 SDCA version.
Signed-off-by: Shuming Fan <shumingf(a)realtek.com>
---
sound/soc/codecs/Kconfig | 6 +
sound/soc/codecs/Makefile | 2 +
sound/soc/codecs/rt1316-sdw.c | 808 ++++++++++++++++++++++++++++++++++
sound/soc/codecs/rt1316-sdw.h | 57 +++
4 files changed, 873 insertions(+)
create mode 100644 sound/soc/codecs/rt1316-sdw.c
create mode 100644 sound/soc/codecs/rt1316-sdw.h
diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
index df34b3b3bb14..0b9e9047377e 100644
--- a/sound/soc/codecs/Kconfig
+++ b/sound/soc/codecs/Kconfig
@@ -181,6 +181,7 @@ config SND_SOC_ALL_CODECS
imply SND_SOC_RT711_SDW
imply SND_SOC_RT715_SDW
imply SND_SOC_RT1308_SDW
+ imply SND_SOC_RT1316_SDW
imply SND_SOC_SGTL5000
imply SND_SOC_SI476X
imply SND_SOC_SIMPLE_AMPLIFIER
@@ -1129,6 +1130,11 @@ config SND_SOC_RT1308_SDW
depends on I2C && SOUNDWIRE
select REGMAP_SOUNDWIRE
+config SND_SOC_RT1316_SDW
+ tristate "Realtek RT1316 Codec - SDW"
+ depends on SOUNDWIRE
+ select REGMAP_SOUNDWIRE
+
config SND_SOC_RT5514
tristate
depends on I2C
diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile
index 628b0c9b3e2a..ddf59532e9ca 100644
--- a/sound/soc/codecs/Makefile
+++ b/sound/soc/codecs/Makefile
@@ -170,6 +170,7 @@ snd-soc-rt1015p-objs := rt1015p.o
snd-soc-rt1305-objs := rt1305.o
snd-soc-rt1308-objs := rt1308.o
snd-soc-rt1308-sdw-objs := rt1308-sdw.o
+snd-soc-rt1316-sdw-objs := rt1316-sdw.o
snd-soc-rt274-objs := rt274.o
snd-soc-rt286-objs := rt286.o
snd-soc-rt298-objs := rt298.o
@@ -483,6 +484,7 @@ obj-$(CONFIG_SND_SOC_RT1015P) += snd-soc-rt1015p.o
obj-$(CONFIG_SND_SOC_RT1305) += snd-soc-rt1305.o
obj-$(CONFIG_SND_SOC_RT1308) += snd-soc-rt1308.o
obj-$(CONFIG_SND_SOC_RT1308_SDW) += snd-soc-rt1308-sdw.o
+obj-$(CONFIG_SND_SOC_RT1316_SDW) += snd-soc-rt1316-sdw.o
obj-$(CONFIG_SND_SOC_RT274) += snd-soc-rt274.o
obj-$(CONFIG_SND_SOC_RT286) += snd-soc-rt286.o
obj-$(CONFIG_SND_SOC_RT298) += snd-soc-rt298.o
diff --git a/sound/soc/codecs/rt1316-sdw.c b/sound/soc/codecs/rt1316-sdw.c
new file mode 100644
index 000000000000..a09ebb768667
--- /dev/null
+++ b/sound/soc/codecs/rt1316-sdw.c
@@ -0,0 +1,808 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// rt1316-sdw.c -- rt1316 SDCA ALSA SoC amplifier audio driver
+//
+// Copyright(c) 2020 Realtek Semiconductor Corp.
+//
+//
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/pm_runtime.h>
+#include <linux/mod_devicetable.h>
+#include <linux/module.h>
+#include <linux/regmap.h>
+#include <sound/core.h>
+#include <sound/pcm.h>
+#include <sound/pcm_params.h>
+#include <sound/soc-dapm.h>
+#include <sound/initval.h>
+#include "rt1316-sdw.h"
+
+static const struct reg_default rt1316_reg_defaults[] = {
+ { 0x3004, 0x00 },
+ { 0x3005, 0x00 },
+ { 0x3206, 0x00 },
+ { 0xc001, 0x00 },
+ { 0xc002, 0x00 },
+ { 0xc003, 0x00 },
+ { 0xc004, 0x00 },
+ { 0xc005, 0x00 },
+ { 0xc006, 0x00 },
+ { 0xc007, 0x00 },
+ { 0xc008, 0x00 },
+ { 0xc009, 0x00 },
+ { 0xc00a, 0x00 },
+ { 0xc00b, 0x00 },
+ { 0xc00c, 0x00 },
+ { 0xc00d, 0x00 },
+ { 0xc00e, 0x00 },
+ { 0xc00f, 0x00 },
+ { 0xc010, 0xa5 },
+ { 0xc011, 0x00 },
+ { 0xc012, 0xff },
+ { 0xc013, 0xff },
+ { 0xc014, 0x40 },
+ { 0xc015, 0x00 },
+ { 0xc016, 0x00 },
+ { 0xc017, 0x00 },
+ { 0xc605, 0x30 },
+ { 0xc700, 0x0a },
+ { 0xc701, 0xaa },
+ { 0xc702, 0x1a },
+ { 0xc703, 0x0a },
+ { 0xc710, 0x80 },
+ { 0xc711, 0x00 },
+ { 0xc712, 0x3e },
+ { 0xc713, 0x80 },
+ { 0xc714, 0x80 },
+ { 0xc715, 0x06 },
+ { 0xd101, 0x00 },
+ { 0xd102, 0x30 },
+ { 0xd103, 0x00 },
+ { SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_UDMPU21, RT1316_SDCA_CTL_UDMPU_CLUSTER, 0), 0x00 },
+ { SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_FU21, RT1316_SDCA_CTL_FU_MUTE, CH_L), 0x01 },
+ { SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_FU21, RT1316_SDCA_CTL_FU_MUTE, CH_R), 0x01 },
+ { SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_XU24, RT1316_SDCA_CTL_BYPASS, 0), 0x01 },
+ { SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_PDE23, RT1316_SDCA_CTL_REQ_POWER_STATE, 0), 0x03 },
+ { SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_PDE22, RT1316_SDCA_CTL_REQ_POWER_STATE, 0), 0x03 },
+ { SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_PDE24, RT1316_SDCA_CTL_REQ_POWER_STATE, 0), 0x03 },
+};
+
+static bool rt1316_readable_register(struct device *dev, unsigned int reg)
+{
+ switch (reg) {
+ case 0x2f0a:
+ case 0x2f36:
+ case 0x3203 ... 0x320e:
+ case 0xc000 ... 0xc7b4:
+ case 0xcf00 ... 0xcf03:
+ case 0xd101 ... 0xd103:
+ case SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_UDMPU21, RT1316_SDCA_CTL_UDMPU_CLUSTER, 0):
+ case SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_FU21, RT1316_SDCA_CTL_FU_MUTE, CH_L):
+ case SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_FU21, RT1316_SDCA_CTL_FU_MUTE, CH_R):
+ case SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_PDE23, RT1316_SDCA_CTL_REQ_POWER_STATE, 0):
+ case SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_PDE27, RT1316_SDCA_CTL_REQ_POWER_STATE, 0):
+ case SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_PDE22, RT1316_SDCA_CTL_REQ_POWER_STATE, 0):
+ case SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_PDE24, RT1316_SDCA_CTL_REQ_POWER_STATE, 0):
+ return true;
+ default:
+ return false;
+ }
+}
+
+static bool rt1316_volatile_register(struct device *dev, unsigned int reg)
+{
+ switch (reg) {
+ case 0xc000:
+ case 0xc093:
+ case 0xc09d:
+ case 0xc0a3:
+ case 0xc201:
+ case 0xc427 ... 0xc428:
+ case 0xd102:
+ return true;
+ default:
+ return false;
+ }
+}
+
+static const struct regmap_config rt1316_sdw_regmap = {
+ .reg_bits = 32,
+ .val_bits = 8,
+ .readable_reg = rt1316_readable_register,
+ .volatile_reg = rt1316_volatile_register,
+ .max_register = 0x4108ffff,
+ .reg_defaults = rt1316_reg_defaults,
+ .num_reg_defaults = ARRAY_SIZE(rt1316_reg_defaults),
+ .cache_type = REGCACHE_RBTREE,
+ .use_single_read = true,
+ .use_single_write = true,
+};
+
+static int rt1316_read_prop(struct sdw_slave *slave)
+{
+ struct sdw_slave_prop *prop = &slave->prop;
+ int nval;
+ int i, j;
+ u32 bit;
+ unsigned long addr;
+ 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->is_sdca = true;
+
+ prop->paging_support = true;
+
+ /* first we need to allocate memory for set bits in port lists */
+ prop->source_ports = 0x04; /* BITMAP: 00000100 */
+ prop->sink_ports = 0x2; /* BITMAP: 00000010 */
+
+ nval = hweight32(prop->source_ports);
+ prop->src_dpn_prop = devm_kcalloc(&slave->dev, nval,
+ sizeof(*prop->src_dpn_prop), GFP_KERNEL);
+ if (!prop->src_dpn_prop)
+ return -ENOMEM;
+
+ i = 0;
+ dpn = prop->src_dpn_prop;
+ addr = prop->source_ports;
+ for_each_set_bit(bit, &addr, 32) {
+ dpn[i].num = bit;
+ dpn[i].type = SDW_DPN_FULL;
+ dpn[i].simple_ch_prep_sm = true;
+ dpn[i].ch_prep_timeout = 10;
+ i++;
+ }
+
+ /* do this again for sink now */
+ nval = hweight32(prop->sink_ports);
+ prop->sink_dpn_prop = devm_kcalloc(&slave->dev, nval,
+ sizeof(*prop->sink_dpn_prop), GFP_KERNEL);
+ if (!prop->sink_dpn_prop)
+ return -ENOMEM;
+
+ j = 0;
+ dpn = prop->sink_dpn_prop;
+ addr = prop->sink_ports;
+ for_each_set_bit(bit, &addr, 32) {
+ dpn[j].num = bit;
+ dpn[j].type = SDW_DPN_FULL;
+ dpn[j].simple_ch_prep_sm = true;
+ dpn[j].ch_prep_timeout = 10;
+ j++;
+ }
+
+ /* set the timeout values */
+ prop->clk_stop_timeout = 20;
+
+ dev_dbg(&slave->dev, "%s\n", __func__);
+
+ return 0;
+}
+
+static int rt1316_io_init(struct device *dev, struct sdw_slave *slave)
+{
+ struct rt1316_sdw_priv *rt1316 = dev_get_drvdata(dev);
+
+ if (rt1316->hw_init)
+ return 0;
+
+ if (rt1316->first_hw_init) {
+ regcache_cache_only(rt1316->regmap, false);
+ regcache_cache_bypass(rt1316->regmap, true);
+ } else {
+ /*
+ * PM runtime is only enabled when a Slave reports as Attached
+ */
+
+ /* set autosuspend parameters */
+ pm_runtime_set_autosuspend_delay(&slave->dev, 3000);
+ pm_runtime_use_autosuspend(&slave->dev);
+
+ /* update count of parent 'active' children */
+ pm_runtime_set_active(&slave->dev);
+
+ /* make sure the device does not suspend immediately */
+ pm_runtime_mark_last_busy(&slave->dev);
+
+ pm_runtime_enable(&slave->dev);
+ }
+
+ pm_runtime_get_noresume(&slave->dev);
+
+ /* sw reset */
+ regmap_write(rt1316->regmap, 0xc000, 0x02);
+
+ /* initial settings - blind write */
+ regmap_write(rt1316->regmap, 0xc710, 0x17);
+ regmap_write(rt1316->regmap, 0xc711, 0x80);
+ regmap_write(rt1316->regmap, 0xc712, 0x26);
+ regmap_write(rt1316->regmap, 0xc713, 0x06);
+ regmap_write(rt1316->regmap, 0xc714, 0x80);
+ regmap_write(rt1316->regmap, 0xc715, 0x06);
+ regmap_write(rt1316->regmap, 0xc702, 0x0a);
+ regmap_write(rt1316->regmap, 0xc703, 0x0a);
+ regmap_write(rt1316->regmap, 0xc001, 0x45);
+ regmap_write(rt1316->regmap, 0xc003, 0x00);
+ regmap_write(rt1316->regmap, 0xc004, 0x11);
+ regmap_write(rt1316->regmap, 0xc005, 0x00);
+ regmap_write(rt1316->regmap, 0xc006, 0x00);
+ regmap_write(rt1316->regmap, 0xc106, 0x00);
+ regmap_write(rt1316->regmap, 0xc007, 0x11);
+ regmap_write(rt1316->regmap, 0xc008, 0x11);
+ regmap_write(rt1316->regmap, 0xc009, 0x00);
+
+ regmap_write(rt1316->regmap, 0x2f0a, 0x00);
+ regmap_write(rt1316->regmap, 0xd101, 0xf0);
+ regmap_write(rt1316->regmap, 0xd103, 0x9b);
+ regmap_write(rt1316->regmap, 0x2f36, 0x8e);
+ regmap_write(rt1316->regmap, 0x3206, 0x80);
+ regmap_write(rt1316->regmap, 0x3211, 0x0b);
+ regmap_write(rt1316->regmap, 0x3216, 0x06);
+ regmap_write(rt1316->regmap, 0xc614, 0x20);
+ regmap_write(rt1316->regmap, 0xc615, 0x0a);
+ regmap_write(rt1316->regmap, 0xc616, 0x02);
+ regmap_write(rt1316->regmap, 0xc617, 0x00);
+ regmap_write(rt1316->regmap, 0xc60b, 0x10);
+ regmap_write(rt1316->regmap, 0xc60e, 0x05);
+ regmap_write(rt1316->regmap, 0xc102, 0x00);
+ regmap_write(rt1316->regmap, 0xc090, 0xb0);
+ regmap_write(rt1316->regmap, 0xc00f, 0x01);
+ regmap_write(rt1316->regmap, 0xc09c, 0x7b);
+
+ regmap_write(rt1316->regmap, 0xc602, 0x07);
+ regmap_write(rt1316->regmap, 0xc603, 0x07);
+ regmap_write(rt1316->regmap, 0xc0a3, 0x71);
+ regmap_write(rt1316->regmap, 0xc00b, 0x30);
+ regmap_write(rt1316->regmap, 0xc093, 0x80);
+ regmap_write(rt1316->regmap, 0xc09d, 0x80);
+ regmap_write(rt1316->regmap, 0xc0b0, 0x77);
+ regmap_write(rt1316->regmap, 0xc010, 0xa5);
+ regmap_write(rt1316->regmap, 0xc050, 0x83);
+ regmap_write(rt1316->regmap, 0x2f55, 0x03);
+ regmap_write(rt1316->regmap, 0x3217, 0xb5);
+ regmap_write(rt1316->regmap, 0x3202, 0x02);
+
+ regmap_write(rt1316->regmap,
+ SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_XU24, RT1316_SDCA_CTL_BYPASS, 0), 0x00);
+
+ /* for IV sense */
+ regmap_write(rt1316->regmap, 0x2232, 0x80);
+ regmap_write(rt1316->regmap, 0xc0b0, 0x77);
+ regmap_write(rt1316->regmap, 0xc011, 0x00);
+ regmap_write(rt1316->regmap, 0xc020, 0x00);
+ regmap_write(rt1316->regmap, 0xc023, 0x00);
+ regmap_write(rt1316->regmap, 0x3101, 0x00);
+ regmap_write(rt1316->regmap, 0x3004, 0xa0);
+ regmap_write(rt1316->regmap, 0x3005, 0xb1);
+ regmap_write(rt1316->regmap, 0xc007, 0x11);
+ regmap_write(rt1316->regmap, 0xc008, 0x11);
+ regmap_write(rt1316->regmap, 0xc009, 0x00);
+ regmap_write(rt1316->regmap, 0xc022, 0xd6);
+ regmap_write(rt1316->regmap, 0xc025, 0xd6);
+
+ regmap_write(rt1316->regmap, 0xd001, 0x03);
+ regmap_write(rt1316->regmap, 0xd002, 0xbf);
+ regmap_write(rt1316->regmap, 0xd003, 0x03);
+ regmap_write(rt1316->regmap, 0xd004, 0xbf);
+
+ if (rt1316->first_hw_init) {
+ regcache_cache_bypass(rt1316->regmap, false);
+ regcache_mark_dirty(rt1316->regmap);
+ } else
+ rt1316->first_hw_init = true;
+
+ /* Mark Slave initialization complete */
+ rt1316->hw_init = true;
+
+ pm_runtime_mark_last_busy(&slave->dev);
+ pm_runtime_put_autosuspend(&slave->dev);
+
+ dev_dbg(&slave->dev, "%s hw_init complete\n", __func__);
+ return 0;
+}
+
+static int rt1316_update_status(struct sdw_slave *slave,
+ enum sdw_slave_status status)
+{
+ struct rt1316_sdw_priv *rt1316 = dev_get_drvdata(&slave->dev);
+
+ /* Update the status */
+ rt1316->status = status;
+
+ if (status == SDW_SLAVE_UNATTACHED)
+ rt1316->hw_init = false;
+
+ if (status == SDW_SLAVE_ATTACHED)
+ regcache_mark_dirty(rt1316->regmap);
+
+ /*
+ * Perform initialization only if slave status is present and
+ * hw_init flag is false
+ */
+ if (rt1316->hw_init || rt1316->status != SDW_SLAVE_ATTACHED)
+ return 0;
+
+ /* perform I/O transfers required for Slave initialization */
+ return rt1316_io_init(&slave->dev, slave);
+}
+
+static int rt1316_classd_event(struct snd_soc_dapm_widget *w,
+ struct snd_kcontrol *kcontrol, int event)
+{
+ struct snd_soc_component *component =
+ snd_soc_dapm_to_component(w->dapm);
+ struct rt1316_sdw_priv *rt1316 = snd_soc_component_get_drvdata(component);
+ unsigned char ps0 = 0x0, ps3 = 0x3;
+
+ switch (event) {
+ case SND_SOC_DAPM_POST_PMU:
+ regmap_write(rt1316->regmap,
+ SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_PDE23,
+ RT1316_SDCA_CTL_REQ_POWER_STATE, 0),
+ ps0);
+ regmap_write(rt1316->regmap,
+ SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_PDE27,
+ RT1316_SDCA_CTL_REQ_POWER_STATE, 0),
+ ps0);
+ regmap_write(rt1316->regmap,
+ SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_PDE22,
+ RT1316_SDCA_CTL_REQ_POWER_STATE, 0),
+ ps0);
+ break;
+ case SND_SOC_DAPM_PRE_PMD:
+ regmap_write(rt1316->regmap,
+ SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_PDE23,
+ RT1316_SDCA_CTL_REQ_POWER_STATE, 0),
+ ps3);
+ regmap_write(rt1316->regmap,
+ SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_PDE27,
+ RT1316_SDCA_CTL_REQ_POWER_STATE, 0),
+ ps3);
+ regmap_write(rt1316->regmap,
+ SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_PDE22,
+ RT1316_SDCA_CTL_REQ_POWER_STATE, 0),
+ ps3);
+ break;
+
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+static int rt1316_pde24_event(struct snd_soc_dapm_widget *w,
+ struct snd_kcontrol *kcontrol, int event)
+{
+ struct snd_soc_component *component =
+ snd_soc_dapm_to_component(w->dapm);
+ struct rt1316_sdw_priv *rt1316 = snd_soc_component_get_drvdata(component);
+ unsigned char ps0 = 0x0, ps3 = 0x3;
+
+ switch (event) {
+ case SND_SOC_DAPM_POST_PMU:
+ regmap_write(rt1316->regmap,
+ SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_PDE24,
+ RT1316_SDCA_CTL_REQ_POWER_STATE, 0),
+ ps0);
+ break;
+ case SND_SOC_DAPM_PRE_PMD:
+ regmap_write(rt1316->regmap,
+ SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_PDE24,
+ RT1316_SDCA_CTL_REQ_POWER_STATE, 0),
+ ps3);
+ break;
+ }
+ return 0;
+}
+
+static const char * const rt1316_rx_data_ch_select[] = {
+ "L,R",
+ "L,L",
+ "L,R",
+ "L,L+R",
+ "R,L",
+ "R,R",
+ "R,L+R",
+ "L+R,L",
+ "L+R,R",
+ "L+R,L+R",
+};
+
+static SOC_ENUM_SINGLE_DECL(rt1316_rx_data_ch_enum,
+ SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_UDMPU21, RT1316_SDCA_CTL_UDMPU_CLUSTER, 0), 0,
+ rt1316_rx_data_ch_select);
+
+static const char * const rt1316_xu24_bypass_ctl[] = {
+ "Not Bypass",
+ "Bypass",
+};
+
+static SOC_ENUM_SINGLE_DECL(rt1316_xu24_bypass_enum,
+ SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_XU24, RT1316_SDCA_CTL_BYPASS, 0), 0,
+ rt1316_xu24_bypass_ctl);
+
+static const char * const rt1316_lr_iv_sel[] = {
+ "0",
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+};
+
+static SOC_ENUM_SINGLE_DECL(rt1316_l_v_tag_enum,
+ 0x3004, 0, rt1316_lr_iv_sel);
+static SOC_ENUM_SINGLE_DECL(rt1316_l_i_tag_enum,
+ 0x3004, 4, rt1316_lr_iv_sel);
+static SOC_ENUM_SINGLE_DECL(rt1316_r_v_tag_enum,
+ 0x3005, 0, rt1316_lr_iv_sel);
+static SOC_ENUM_SINGLE_DECL(rt1316_r_i_tag_enum,
+ 0x3005, 4, rt1316_lr_iv_sel);
+
+static const struct snd_kcontrol_new rt1316_snd_controls[] = {
+
+ /* I2S Data Channel Selection */
+ SOC_ENUM("RX Channel Select", rt1316_rx_data_ch_enum),
+
+ /* XU24 Bypass Control */
+ SOC_ENUM("XU24 Bypass Switch", rt1316_xu24_bypass_enum),
+
+ /* Left/Right IV tag */
+ SOC_ENUM("Left V Tag Select", rt1316_l_v_tag_enum),
+ SOC_ENUM("Left I Tag Select", rt1316_l_i_tag_enum),
+ SOC_ENUM("Right V Tag Select", rt1316_r_v_tag_enum),
+ SOC_ENUM("Right I Tag Select", rt1316_r_i_tag_enum),
+
+ /* IV mixer Control */
+ SOC_DOUBLE("Isense Mixer Switch", 0xc605, 2, 0, 1, 1),
+ SOC_DOUBLE("Vsense Mixer Switch", 0xc605, 3, 1, 1, 1),
+};
+
+static const struct snd_kcontrol_new rt1316_sto_dac_l =
+ SOC_DAPM_SINGLE_AUTODISABLE("Switch",
+ SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_FU21, RT1316_SDCA_CTL_FU_MUTE, CH_L),
+ 0, 1, 1);
+
+static const struct snd_kcontrol_new rt1316_sto_dac_r =
+ SOC_DAPM_SINGLE_AUTODISABLE("Switch",
+ SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1316_SDCA_ENT_FU21, RT1316_SDCA_CTL_FU_MUTE, CH_R),
+ 0, 1, 1);
+
+static const struct snd_soc_dapm_widget rt1316_dapm_widgets[] = {
+ /* Audio Interface */
+ SND_SOC_DAPM_AIF_IN("DP1RX", "DP1 Playback", 0, SND_SOC_NOPM, 0, 0),
+ SND_SOC_DAPM_AIF_OUT("DP2TX", "DP2 Capture", 0, SND_SOC_NOPM, 0, 0),
+
+ /* Digital Interface */
+ SND_SOC_DAPM_DAC("DAC", NULL, SND_SOC_NOPM, 0, 0),
+ SND_SOC_DAPM_SWITCH("DAC L", SND_SOC_NOPM, 0, 0, &rt1316_sto_dac_l),
+ SND_SOC_DAPM_SWITCH("DAC R", SND_SOC_NOPM, 0, 0, &rt1316_sto_dac_r),
+
+ /* Output Lines */
+ SND_SOC_DAPM_PGA_E("CLASS D", SND_SOC_NOPM, 0, 0, NULL, 0,
+ rt1316_classd_event,
+ SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
+ SND_SOC_DAPM_OUTPUT("SPOL"),
+ SND_SOC_DAPM_OUTPUT("SPOR"),
+
+ SND_SOC_DAPM_SUPPLY("PDE 24", SND_SOC_NOPM, 0, 0,
+ rt1316_pde24_event,
+ SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
+ SND_SOC_DAPM_PGA("I Sense", SND_SOC_NOPM, 0, 0, NULL, 0),
+ SND_SOC_DAPM_PGA("V Sense", SND_SOC_NOPM, 0, 0, NULL, 0),
+ SND_SOC_DAPM_SIGGEN("I Gen"),
+ SND_SOC_DAPM_SIGGEN("V Gen"),
+};
+
+static const struct snd_soc_dapm_route rt1316_dapm_routes[] = {
+ { "DAC", NULL, "DP1RX" },
+ { "DAC L", "Switch", "DAC" },
+ { "DAC R", "Switch", "DAC" },
+ { "CLASS D", NULL, "DAC L" },
+ { "CLASS D", NULL, "DAC R" },
+ { "SPOL", NULL, "CLASS D" },
+ { "SPOR", NULL, "CLASS D" },
+
+ { "I Sense", NULL, "I Gen" },
+ { "V Sense", NULL, "V Gen" },
+ { "I Sense", NULL, "PDE 24" },
+ { "V Sense", NULL, "PDE 24" },
+ { "DP2TX", NULL, "I Sense" },
+ { "DP2TX", NULL, "V Sense" },
+};
+
+static int rt1316_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream,
+ int direction)
+{
+ struct sdw_stream_data *stream;
+
+ if (!sdw_stream)
+ return 0;
+
+ stream = kzalloc(sizeof(*stream), GFP_KERNEL);
+ if (!stream)
+ return -ENOMEM;
+
+ stream->sdw_stream = sdw_stream;
+
+ /* Use tx_mask or rx_mask to configure stream tag and set dma_data */
+ if (direction == SNDRV_PCM_STREAM_PLAYBACK)
+ dai->playback_dma_data = stream;
+ else
+ dai->capture_dma_data = stream;
+
+ return 0;
+}
+
+static void rt1316_sdw_shutdown(struct snd_pcm_substream *substream,
+ struct snd_soc_dai *dai)
+{
+ struct sdw_stream_data *stream;
+
+ stream = snd_soc_dai_get_dma_data(dai, substream);
+ snd_soc_dai_set_dma_data(dai, substream, NULL);
+ kfree(stream);
+}
+
+static int rt1316_sdw_set_tdm_slot(struct snd_soc_dai *dai,
+ unsigned int tx_mask,
+ unsigned int rx_mask,
+ int slots, int slot_width)
+{
+ struct snd_soc_component *component = dai->component;
+ struct rt1316_sdw_priv *rt1316 =
+ snd_soc_component_get_drvdata(component);
+
+ if (tx_mask)
+ return -EINVAL;
+
+ if (slots > 2)
+ return -EINVAL;
+
+ rt1316->rx_mask = rx_mask;
+ rt1316->slots = slots;
+ /* slot_width is not used since it's irrelevant for SoundWire */
+
+ return 0;
+}
+
+static int rt1316_sdw_hw_params(struct snd_pcm_substream *substream,
+ struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
+{
+ struct snd_soc_component *component = dai->component;
+ struct rt1316_sdw_priv *rt1316 =
+ snd_soc_component_get_drvdata(component);
+ struct sdw_stream_config stream_config;
+ struct sdw_port_config port_config;
+ enum sdw_data_direction direction;
+ struct sdw_stream_data *stream;
+ int retval, port, num_channels, ch_mask;
+
+ dev_dbg(dai->dev, "%s %s", __func__, dai->name);
+ stream = snd_soc_dai_get_dma_data(dai, substream);
+
+ if (!stream)
+ return -EINVAL;
+
+ if (!rt1316->sdw_slave)
+ return -EINVAL;
+
+ /* SoundWire specific configuration */
+ /* port 1 for playback */
+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+ direction = SDW_DATA_DIR_RX;
+ port = 1;
+ } else {
+ direction = SDW_DATA_DIR_TX;
+ port = 2;
+ }
+
+ if (rt1316->slots) {
+ num_channels = rt1316->slots;
+ ch_mask = rt1316->rx_mask;
+ } else {
+ num_channels = params_channels(params);
+ ch_mask = (1 << num_channels) - 1;
+ }
+
+ stream_config.frame_rate = params_rate(params);
+ stream_config.ch_count = num_channels;
+ stream_config.bps = snd_pcm_format_width(params_format(params));
+ stream_config.direction = direction;
+
+ port_config.ch_mask = ch_mask;
+ port_config.num = port;
+
+ retval = sdw_stream_add_slave(rt1316->sdw_slave, &stream_config,
+ &port_config, 1, stream->sdw_stream);
+ if (retval) {
+ dev_err(dai->dev, "Unable to configure port\n");
+ return retval;
+ }
+
+ return 0;
+}
+
+static int rt1316_sdw_pcm_hw_free(struct snd_pcm_substream *substream,
+ struct snd_soc_dai *dai)
+{
+ struct snd_soc_component *component = dai->component;
+ struct rt1316_sdw_priv *rt1316 =
+ snd_soc_component_get_drvdata(component);
+ struct sdw_stream_data *stream =
+ snd_soc_dai_get_dma_data(dai, substream);
+
+ if (!rt1316->sdw_slave)
+ return -EINVAL;
+
+ sdw_stream_remove_slave(rt1316->sdw_slave, stream->sdw_stream);
+ return 0;
+}
+
+/*
+ * slave_ops: callbacks for get_clock_stop_mode, clock_stop and
+ * port_prep are not defined for now
+ */
+static struct sdw_slave_ops rt1316_slave_ops = {
+ .read_prop = rt1316_read_prop,
+ .update_status = rt1316_update_status,
+};
+
+static const struct snd_soc_component_driver soc_component_sdw_rt1316 = {
+ .controls = rt1316_snd_controls,
+ .num_controls = ARRAY_SIZE(rt1316_snd_controls),
+ .dapm_widgets = rt1316_dapm_widgets,
+ .num_dapm_widgets = ARRAY_SIZE(rt1316_dapm_widgets),
+ .dapm_routes = rt1316_dapm_routes,
+ .num_dapm_routes = ARRAY_SIZE(rt1316_dapm_routes),
+};
+
+static const struct snd_soc_dai_ops rt1316_aif_dai_ops = {
+ .hw_params = rt1316_sdw_hw_params,
+ .hw_free = rt1316_sdw_pcm_hw_free,
+ .set_sdw_stream = rt1316_set_sdw_stream,
+ .shutdown = rt1316_sdw_shutdown,
+ .set_tdm_slot = rt1316_sdw_set_tdm_slot,
+};
+
+#define RT1316_STEREO_RATES SNDRV_PCM_RATE_48000
+#define RT1316_FORMATS (SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S16_LE | \
+ SNDRV_PCM_FMTBIT_S24_LE)
+
+static struct snd_soc_dai_driver rt1316_sdw_dai[] = {
+ {
+ .name = "rt1316-aif",
+ .playback = {
+ .stream_name = "DP1 Playback",
+ .channels_min = 1,
+ .channels_max = 2,
+ .rates = RT1316_STEREO_RATES,
+ .formats = RT1316_FORMATS,
+ },
+ .capture = {
+ .stream_name = "DP2 Capture",
+ .channels_min = 1,
+ .channels_max = 2,
+ .rates = RT1316_STEREO_RATES,
+ .formats = RT1316_FORMATS,
+ },
+ .ops = &rt1316_aif_dai_ops,
+ },
+};
+
+static int rt1316_sdw_init(struct device *dev, struct regmap *regmap,
+ struct sdw_slave *slave)
+{
+ struct rt1316_sdw_priv *rt1316;
+ int ret;
+
+ rt1316 = devm_kzalloc(dev, sizeof(*rt1316), GFP_KERNEL);
+ if (!rt1316)
+ return -ENOMEM;
+
+ dev_set_drvdata(dev, rt1316);
+ rt1316->sdw_slave = slave;
+ rt1316->regmap = regmap;
+
+ /*
+ * Mark hw_init to false
+ * HW init will be performed when device reports present
+ */
+ rt1316->hw_init = false;
+ rt1316->first_hw_init = false;
+
+ ret = devm_snd_soc_register_component(dev,
+ &soc_component_sdw_rt1316,
+ rt1316_sdw_dai,
+ ARRAY_SIZE(rt1316_sdw_dai));
+
+ dev_dbg(&slave->dev, "%s\n", __func__);
+
+ return ret;
+}
+
+static int rt1316_sdw_probe(struct sdw_slave *slave,
+ const struct sdw_device_id *id)
+{
+ struct regmap *regmap;
+
+ /* Regmap Initialization */
+ regmap = devm_regmap_init_sdw(slave, &rt1316_sdw_regmap);
+ if (!regmap)
+ return -EINVAL;
+
+ return rt1316_sdw_init(&slave->dev, regmap, slave);
+}
+
+static const struct sdw_device_id rt1316_id[] = {
+ SDW_SLAVE_ENTRY_EXT(0x025d, 0x1316, 0x3, 0x1, 0),
+ {},
+};
+MODULE_DEVICE_TABLE(sdw, rt1316_id);
+
+static int __maybe_unused rt1316_dev_suspend(struct device *dev)
+{
+ struct rt1316_sdw_priv *rt1316 = dev_get_drvdata(dev);
+
+ if (!rt1316->hw_init)
+ return 0;
+
+ regcache_cache_only(rt1316->regmap, true);
+
+ return 0;
+}
+
+#define RT1316_PROBE_TIMEOUT 5000
+
+static int __maybe_unused rt1316_dev_resume(struct device *dev)
+{
+ struct sdw_slave *slave = dev_to_sdw_dev(dev);
+ struct rt1316_sdw_priv *rt1316 = dev_get_drvdata(dev);
+ unsigned long time;
+
+ if (!rt1316->hw_init)
+ return 0;
+
+ if (!slave->unattach_request)
+ goto regmap_sync;
+
+ time = wait_for_completion_timeout(&slave->initialization_complete,
+ msecs_to_jiffies(RT1316_PROBE_TIMEOUT));
+ if (!time) {
+ dev_err(&slave->dev, "Initialization not complete, timed out\n");
+ return -ETIMEDOUT;
+ }
+
+regmap_sync:
+ slave->unattach_request = 0;
+ regcache_cache_only(rt1316->regmap, false);
+ regcache_sync(rt1316->regmap);
+
+ return 0;
+}
+
+static const struct dev_pm_ops rt1316_pm = {
+ SET_SYSTEM_SLEEP_PM_OPS(rt1316_dev_suspend, rt1316_dev_resume)
+ SET_RUNTIME_PM_OPS(rt1316_dev_suspend, rt1316_dev_resume, NULL)
+};
+
+static struct sdw_driver rt1316_sdw_driver = {
+ .driver = {
+ .name = "rt1316-sdca",
+ .owner = THIS_MODULE,
+ .pm = &rt1316_pm,
+ },
+ .probe = rt1316_sdw_probe,
+ .ops = &rt1316_slave_ops,
+ .id_table = rt1316_id,
+};
+module_sdw_driver(rt1316_sdw_driver);
+
+MODULE_DESCRIPTION("ASoC RT1316 driver SDCA SDW");
+MODULE_AUTHOR("Shuming Fan <shumingf(a)realtek.com>");
+MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/rt1316-sdw.h b/sound/soc/codecs/rt1316-sdw.h
new file mode 100644
index 000000000000..9883a5f90695
--- /dev/null
+++ b/sound/soc/codecs/rt1316-sdw.h
@@ -0,0 +1,57 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * rt1316-sdw.h -- RT1316 SDCA ALSA SoC audio driver header
+ *
+ * Copyright(c) 2020 Realtek Semiconductor Corp.
+ */
+
+#ifndef __RT1316_SDW_H__
+#define __RT1316_SDW_H__
+
+#include <linux/regmap.h>
+#include <linux/soundwire/sdw.h>
+#include <linux/soundwire/sdw_type.h>
+#include <linux/soundwire/sdw_registers.h>
+#include <sound/soc.h>
+
+/* RT1316 SDCA Control - function number */
+#define FUNC_NUM_SMART_AMP 0x04
+
+/* RT1316 SDCA entity */
+#define RT1316_SDCA_ENT_PDE23 0x31
+#define RT1316_SDCA_ENT_PDE27 0x32
+#define RT1316_SDCA_ENT_PDE22 0x33
+#define RT1316_SDCA_ENT_PDE24 0x34
+#define RT1316_SDCA_ENT_XU24 0x24
+#define RT1316_SDCA_ENT_FU21 0x03
+#define RT1316_SDCA_ENT_UDMPU21 0x02
+
+/* RT1316 SDCA control */
+#define RT1316_SDCA_CTL_SAMPLE_FREQ_INDEX 0x10
+#define RT1316_SDCA_CTL_REQ_POWER_STATE 0x01
+#define RT1316_SDCA_CTL_BYPASS 0x01
+#define RT1316_SDCA_CTL_FU_MUTE 0x01
+#define RT1316_SDCA_CTL_FU_VOLUME 0x02
+#define RT1316_SDCA_CTL_UDMPU_CLUSTER 0x10
+
+/* RT1316 SDCA channel */
+#define CH_L 0x01
+#define CH_R 0x02
+
+struct rt1316_sdw_priv {
+ struct snd_soc_component *component;
+ struct regmap *regmap;
+ struct sdw_slave *sdw_slave;
+ enum sdw_slave_status status;
+ struct sdw_bus_params params;
+ bool hw_init;
+ bool first_hw_init;
+ int rx_mask;
+ int slots;
+};
+
+struct sdw_stream_data {
+ struct sdw_stream_runtime *sdw_stream;
+};
+
+#endif /* __RT1316_SDW_H__ */
--
2.29.0
3
3

[RFC PATCH] soundwire: bus: use correct driver name in error messages
by Pierre-Louis Bossart 08 Feb '21
by Pierre-Louis Bossart 08 Feb '21
08 Feb '21
None of the existing codec drivers set the sdw_driver.name, but
instead set sdw_driver.driver.name.
This leads to error messages such as
[ 23.935355] rt700 sdw:2:25d:700:0: Probe of (null) failed: -19
We could remove this sdw_driver.name if it doesn't have any
purpose. This patch only suggests using the proper indirection.
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart(a)linux.intel.com>
Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski(a)intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen(a)linux.intel.com>
---
drivers/soundwire/bus_type.c | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/drivers/soundwire/bus_type.c b/drivers/soundwire/bus_type.c
index 575b9bad99d5..893296f3fe39 100644
--- a/drivers/soundwire/bus_type.c
+++ b/drivers/soundwire/bus_type.c
@@ -82,6 +82,7 @@ static int sdw_drv_probe(struct device *dev)
struct sdw_slave *slave = dev_to_sdw_dev(dev);
struct sdw_driver *drv = drv_to_sdw_driver(dev->driver);
const struct sdw_device_id *id;
+ const char *name;
int ret;
/*
@@ -108,7 +109,10 @@ static int sdw_drv_probe(struct device *dev)
ret = drv->probe(slave, id);
if (ret) {
- dev_err(dev, "Probe of %s failed: %d\n", drv->name, ret);
+ name = drv->name;
+ if (!name)
+ name = drv->driver.name;
+ dev_err(dev, "Probe of %s failed: %d\n", name, ret);
dev_pm_domain_detach(dev, false);
return ret;
}
@@ -174,11 +178,16 @@ static void sdw_drv_shutdown(struct device *dev)
*/
int __sdw_register_driver(struct sdw_driver *drv, struct module *owner)
{
+ const char *name;
+
drv->driver.bus = &sdw_bus_type;
if (!drv->probe) {
- pr_err("driver %s didn't provide SDW probe routine\n",
- drv->name);
+ name = drv->name;
+ if (!name)
+ name = drv->driver.name;
+
+ pr_err("driver %s didn't provide SDW probe routine\n", name);
return -EINVAL;
}
--
2.25.1
1
0

[PATCH v2] ALSA: hda: intel-dsp-config: Add SND_INTEL_BYT_PREFER_SOF Kconfig option
by Hans de Goede 08 Feb '21
by Hans de Goede 08 Feb '21
08 Feb '21
The kernel has 2 drivers for the Low Power Engine audio-block on
Bay- and Cherry-Trail SoCs. The old SST driver and the new SOF
driver. If both drivers are enabled then the kernel will default
to using the old SST driver, unless told otherwise through the
snd_intel_dspcfg.dsp_driver module-parameter.
Add a boolean SND_INTEL_BYT_PREFER_SOF Kconfig option, which when set to Y
will make the kernel default to the new SOF driver instead.
The option defaults to n, preserving the current behavior.
Making this configurable will help distributions such as Fedora:
https://fedoraproject.org/w/index.php?title=Changes/SofDefaultForIntelLpe
to test using SOF on BYT/CHT during the transition phase where we
have both drivers (eventually the old driver and this option will
be removed).
Note that this drops the acpi_config_table[] containing 2 entries per ACPI
hardware-id if both drivers are enabled. snd_intel_acpi_dsp_find_config()
will always return the first hit, so we only need a single entry with the
flags value set depending on the Kconfig settings.
Suggested-by: Takashi Iwai <tiwai(a)suse.de>
Signed-off-by: Hans de Goede <hdegoede(a)redhat.com>
---
Changes in v2:
- Rework following Takashi's suggestions
---
sound/hda/Kconfig | 14 ++++++++++++++
sound/hda/intel-dsp-config.c | 29 ++++++++++++-----------------
2 files changed, 26 insertions(+), 17 deletions(-)
diff --git a/sound/hda/Kconfig b/sound/hda/Kconfig
index 3bc9224d5e4f..9ed5cfa3c18c 100644
--- a/sound/hda/Kconfig
+++ b/sound/hda/Kconfig
@@ -46,3 +46,17 @@ config SND_INTEL_DSP_CONFIG
select SND_INTEL_NHLT if ACPI
# this config should be selected only for Intel DSP platforms.
# A fallback is provided so that the code compiles in all cases.
+
+config SND_INTEL_BYT_PREFER_SOF
+ bool "Prefer SOF driver over SST on BY/CHT platforms"
+ depends on SND_SST_ATOM_HIFI2_PLATFORM_ACPI && SND_SOC_SOF_BAYTRAIL
+ default n
+ help
+ The kernel has 2 drivers for the Low Power Engine audio-block on
+ Bay- and Cherry-Trail SoCs. The old SST driver and the new SOF
+ driver. If both drivers are enabled then the kernel will default
+ to using the old SST driver, unless told otherwise through the
+ snd_intel_dspcfg.dsp_driver module-parameter.
+
+ Set this option to Y to make the kernel default to the new SOF
+ driver instead.
diff --git a/sound/hda/intel-dsp-config.c b/sound/hda/intel-dsp-config.c
index c45686172517..68bb977c6a37 100644
--- a/sound/hda/intel-dsp-config.c
+++ b/sound/hda/intel-dsp-config.c
@@ -452,35 +452,30 @@ int snd_intel_dsp_driver_probe(struct pci_dev *pci)
}
EXPORT_SYMBOL_GPL(snd_intel_dsp_driver_probe);
+/* Should we default to SOF or SST for BYT/CHT ? */
+#if IS_ENABLED(CONFIG_SND_INTEL_BYT_PREFER_SOF) || \
+ !IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
+#define FLAG_SST_OR_SOF_BYT FLAG_SOF
+#else
+#define FLAG_SST_OR_SOF_BYT FLAG_SST
+#endif
+
/*
* configuration table
* - the order of similar ACPI ID entries is important!
* - the first successful match will win
*/
static const struct config_entry acpi_config_table[] = {
+#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) || \
+ IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
/* BayTrail */
-#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
- {
- .flags = FLAG_SST,
- .acpi_hid = "80860F28",
- },
-#endif
-#if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
{
- .flags = FLAG_SOF,
+ .flags = FLAG_SST_OR_SOF_BYT,
.acpi_hid = "80860F28",
},
-#endif
/* CherryTrail */
-#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
- {
- .flags = FLAG_SST,
- .acpi_hid = "808622A8",
- },
-#endif
-#if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
{
- .flags = FLAG_SOF,
+ .flags = FLAG_SST_OR_SOF_BYT,
.acpi_hid = "808622A8",
},
#endif
--
2.30.0
3
2

[PATCH] ALSA: fireface: fix to parse sync status register of latter protocol
by Takashi Sakamoto 08 Feb '21
by Takashi Sakamoto 08 Feb '21
08 Feb '21
Fireface UCX, UFX, and FF802 are categorized for latter protocol of the
series. Current support for FF802 (and UFX) includes failure to parse
sync status register and results in EIO.
Further investigation figures out that the content of register differs
depending on models. This commit adds tables specific to FF802 and UFX
to fix it.
Fixes: 062bb452b078b ("ALSA: fireface: add support for RME FireFace 802")
Cc: <stable(a)vger.kernel.org>
Signed-off-by: Takashi Sakamoto <o-takashi(a)sakamocchi.jp>
---
sound/firewire/fireface/ff-protocol-latter.c | 118 ++++++++++++++++---
1 file changed, 100 insertions(+), 18 deletions(-)
diff --git a/sound/firewire/fireface/ff-protocol-latter.c b/sound/firewire/fireface/ff-protocol-latter.c
index 8d3b23778eb2..7ddb7b97f02d 100644
--- a/sound/firewire/fireface/ff-protocol-latter.c
+++ b/sound/firewire/fireface/ff-protocol-latter.c
@@ -15,6 +15,61 @@
#define LATTER_FETCH_MODE 0xffff00000010ULL
#define LATTER_SYNC_STATUS 0x0000801c0000ULL
+// The content of sync status register differs between models.
+//
+// Fireface UCX:
+// 0xf0000000: (unidentified)
+// 0x0f000000: effective rate of sampling clock
+// 0x00f00000: detected rate of word clock on BNC interface
+// 0x000f0000: detected rate of ADAT or S/PDIF on optical interface
+// 0x0000f000: detected rate of S/PDIF on coaxial interface
+// 0x00000e00: effective source of sampling clock
+// 0x00000e00: Internal
+// 0x00000800: (unidentified)
+// 0x00000600: Word clock on BNC interface
+// 0x00000400: ADAT on optical interface
+// 0x00000200: S/PDIF on coaxial or optical interface
+// 0x00000100: Optical interface is used for ADAT signal
+// 0x00000080: (unidentified)
+// 0x00000040: Synchronized to word clock on BNC interface
+// 0x00000020: Synchronized to ADAT or S/PDIF on optical interface
+// 0x00000010: Synchronized to S/PDIF on coaxial interface
+// 0x00000008: (unidentified)
+// 0x00000004: Lock word clock on BNC interface
+// 0x00000002: Lock ADAT or S/PDIF on optical interface
+// 0x00000001: Lock S/PDIF on coaxial interface
+//
+// Fireface 802 (and perhaps UFX):
+// 0xf0000000: effective rate of sampling clock
+// 0x0f000000: detected rate of ADAT-B on 2nd optical interface
+// 0x00f00000: detected rate of ADAT-A on 1st optical interface
+// 0x000f0000: detected rate of AES/EBU on XLR or coaxial interface
+// 0x0000f000: detected rate of word clock on BNC interface
+// 0x00000e00: effective source of sampling clock
+// 0x00000e00: internal
+// 0x00000800: ADAT-B
+// 0x00000600: ADAT-A
+// 0x00000400: AES/EBU
+// 0x00000200: Word clock
+// 0x00000080: Synchronized to ADAT-B on 2nd optical interface
+// 0x00000040: Synchronized to ADAT-A on 1st optical interface
+// 0x00000020: Synchronized to AES/EBU on XLR or 2nd optical interface
+// 0x00000010: Synchronized to word clock on BNC interface
+// 0x00000008: Lock ADAT-B on 2nd optical interface
+// 0x00000004: Lock ADAT-A on 1st optical interface
+// 0x00000002: Lock AES/EBU on XLR or 2nd optical interface
+// 0x00000001: Lock word clock on BNC interface
+//
+// The pattern for rate bits:
+// 0x00: 32.0 kHz
+// 0x01: 44.1 kHz
+// 0x02: 48.0 kHz
+// 0x04: 64.0 kHz
+// 0x05: 88.2 kHz
+// 0x06: 96.0 kHz
+// 0x08: 128.0 kHz
+// 0x09: 176.4 kHz
+// 0x0a: 192.0 kHz
static int parse_clock_bits(u32 data, unsigned int *rate,
enum snd_ff_clock_src *src,
enum snd_ff_unit_version unit_version)
@@ -23,35 +78,48 @@ static int parse_clock_bits(u32 data, unsigned int *rate,
unsigned int rate;
u32 flag;
} *rate_entry, rate_entries[] = {
- { 32000, 0x00000000, },
- { 44100, 0x01000000, },
- { 48000, 0x02000000, },
- { 64000, 0x04000000, },
- { 88200, 0x05000000, },
- { 96000, 0x06000000, },
- { 128000, 0x08000000, },
- { 176400, 0x09000000, },
- { 192000, 0x0a000000, },
+ { 32000, 0x00, },
+ { 44100, 0x01, },
+ { 48000, 0x02, },
+ { 64000, 0x04, },
+ { 88200, 0x05, },
+ { 96000, 0x06, },
+ { 128000, 0x08, },
+ { 176400, 0x09, },
+ { 192000, 0x0a, },
};
static const struct {
enum snd_ff_clock_src src;
u32 flag;
- } *clk_entry, clk_entries[] = {
+ } *clk_entry, *clk_entries, ucx_clk_entries[] = {
{ SND_FF_CLOCK_SRC_SPDIF, 0x00000200, },
{ SND_FF_CLOCK_SRC_ADAT1, 0x00000400, },
{ SND_FF_CLOCK_SRC_WORD, 0x00000600, },
{ SND_FF_CLOCK_SRC_INTERNAL, 0x00000e00, },
+ }, ufx_ff802_clk_entries[] = {
+ { SND_FF_CLOCK_SRC_WORD, 0x00000200, },
+ { SND_FF_CLOCK_SRC_SPDIF, 0x00000400, },
+ { SND_FF_CLOCK_SRC_ADAT1, 0x00000600, },
+ { SND_FF_CLOCK_SRC_ADAT2, 0x00000800, },
+ { SND_FF_CLOCK_SRC_INTERNAL, 0x00000e00, },
};
+ u32 rate_bits;
+ unsigned int clk_entry_count;
int i;
- if (unit_version != SND_FF_UNIT_VERSION_UCX) {
- // e.g. 0x00fe0f20 but expected 0x00eff002.
- data = ((data & 0xf0f0f0f0) >> 4) | ((data & 0x0f0f0f0f) << 4);
+ if (unit_version == SND_FF_UNIT_VERSION_UCX) {
+ rate_bits = (data & 0x0f000000) >> 24;
+ clk_entries = ucx_clk_entries;
+ clk_entry_count = ARRAY_SIZE(ucx_clk_entries);
+ } else {
+ rate_bits = (data & 0xf0000000) >> 28;
+ clk_entries = ufx_ff802_clk_entries;
+ clk_entry_count = ARRAY_SIZE(ufx_ff802_clk_entries);
}
for (i = 0; i < ARRAY_SIZE(rate_entries); ++i) {
rate_entry = rate_entries + i;
- if ((data & 0x0f000000) == rate_entry->flag) {
+ if (rate_bits == rate_entry->flag) {
*rate = rate_entry->rate;
break;
}
@@ -59,14 +127,14 @@ static int parse_clock_bits(u32 data, unsigned int *rate,
if (i == ARRAY_SIZE(rate_entries))
return -EIO;
- for (i = 0; i < ARRAY_SIZE(clk_entries); ++i) {
+ for (i = 0; i < clk_entry_count; ++i) {
clk_entry = clk_entries + i;
if ((data & 0x000e00) == clk_entry->flag) {
*src = clk_entry->src;
break;
}
}
- if (i == ARRAY_SIZE(clk_entries))
+ if (i == clk_entry_count)
return -EIO;
return 0;
@@ -249,16 +317,22 @@ static void latter_dump_status(struct snd_ff *ff, struct snd_info_buffer *buffer
char *const label;
u32 locked_mask;
u32 synced_mask;
- } *clk_entry, clk_entries[] = {
+ } *clk_entry, *clk_entries, ucx_clk_entries[] = {
{ "S/PDIF", 0x00000001, 0x00000010, },
{ "ADAT", 0x00000002, 0x00000020, },
{ "WDClk", 0x00000004, 0x00000040, },
+ }, ufx_ff802_clk_entries[] = {
+ { "WDClk", 0x00000001, 0x00000010, },
+ { "AES/EBU", 0x00000002, 0x00000020, },
+ { "ADAT-A", 0x00000004, 0x00000040, },
+ { "ADAT-B", 0x00000008, 0x00000080, },
};
__le32 reg;
u32 data;
unsigned int rate;
enum snd_ff_clock_src src;
const char *label;
+ unsigned int clk_entry_count;
int i;
int err;
@@ -270,7 +344,15 @@ static void latter_dump_status(struct snd_ff *ff, struct snd_info_buffer *buffer
snd_iprintf(buffer, "External source detection:\n");
- for (i = 0; i < ARRAY_SIZE(clk_entries); ++i) {
+ if (ff->unit_version == SND_FF_UNIT_VERSION_UCX) {
+ clk_entries = ucx_clk_entries;
+ clk_entry_count = ARRAY_SIZE(ucx_clk_entries);
+ } else {
+ clk_entries = ufx_ff802_clk_entries;
+ clk_entry_count = ARRAY_SIZE(ufx_ff802_clk_entries);
+ }
+
+ for (i = 0; i < clk_entry_count; ++i) {
clk_entry = clk_entries + i;
snd_iprintf(buffer, "%s: ", clk_entry->label);
if (data & clk_entry->locked_mask) {
--
2.27.0
2
1
Here's the 2nd iteration of the patch to improve link management
granularity between controllers using HDA extended bus and HDA
codec drivers.
Based on feedback to V1, this now adds a new link_power op.
This allows to decouple HDA codec drivers from the hdac_ext core.
I also included two patches to SOF to show how this interface is
used in SOF.
Kai Vehmanen (3):
ALSA: hda: add link_power op to hdac_bus_ops
ASoC: SOF: Intel: hda: use hdac_ext fine-grained link management
ASoC: SOF: Intel: hda: release display power at link_power
include/sound/hdaudio.h | 14 ++++-------
include/sound/hdaudio_ext.h | 2 ++
sound/hda/ext/hdac_ext_controller.c | 37 +++++++++++++++++++++++++++++
sound/hda/hdac_bus.c | 23 ++++++++++++++++++
sound/hda/hdac_controller.c | 14 +++++++++++
sound/soc/sof/intel/hda-bus.c | 33 ++++++++++++++++++++++++-
sound/soc/sof/intel/hda.h | 3 ++-
7 files changed, 115 insertions(+), 11 deletions(-)
base-commit: 387740a5e9532db13dfb577bd4b8d1aa496487ab
--
2.29.2
3
6

08 Feb '21
Unfortunately the DSDT often exposes _ADR information which reports
the presence of the wrong codecs, which prevents drivers from being
probed, or they are reported on the wrong link, which breaks the ASoC
machine driver. This patchset suggests a device-specific remapping to
the expected values reported by codecs, controlled by a DMI check.
Adding such quirks in the kernel code is ugly, but for commercial
devices it's certainly better than asking every user to override the
DSDT.
Pierre-Louis Bossart (2):
soundwire: slave: introduce DMI quirks for HP Spectre x360 Convertible
soundwire: slave: add DMI quirk for Dell SKU 0A3E
drivers/soundwire/slave.c | 79 +++++++++++++++++++++++++++++++++++++++
1 file changed, 79 insertions(+)
--
2.25.1
2
6

[PATCH 1/2] ALSA: hda: intel-dsp-config: Add FLAG_BYT_FIRST / _SECOND defines
by Hans de Goede 08 Feb '21
by Hans de Goede 08 Feb '21
08 Feb '21
Instead of hardcording the SST driver having the highest prio, add
FLAG_BYT_FIRST and FLAG_BYT_SECOND defines, which get set like this
when both drivers are enabled:
#define FLAG_BYT_FIRST FLAG_SST
#define FLAG_BYT_SECOND FLAG_SOF
And when only 1 driver is enabled then FLAG_BYT_FIRST gets set to
the flag for that driver.
This is a preparation patch for making which driver is preferred
configurable through Kconfig.
Signed-off-by: Hans de Goede <hdegoede(a)redhat.com>
---
sound/hda/intel-dsp-config.c | 26 ++++++++++++++++++--------
1 file changed, 18 insertions(+), 8 deletions(-)
diff --git a/sound/hda/intel-dsp-config.c b/sound/hda/intel-dsp-config.c
index c45686172517..2201a1e6944e 100644
--- a/sound/hda/intel-dsp-config.c
+++ b/sound/hda/intel-dsp-config.c
@@ -452,6 +452,16 @@ int snd_intel_dsp_driver_probe(struct pci_dev *pci)
}
EXPORT_SYMBOL_GPL(snd_intel_dsp_driver_probe);
+/* FLAG_BYT_FIRST / _SECOND determine which driver is preferred on BYT/CHT when both are enabled */
+#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) && IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
+#define FLAG_BYT_FIRST FLAG_SST
+#define FLAG_BYT_SECOND FLAG_SOF
+#elif IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
+#define FLAG_BYT_FIRST FLAG_SST
+#elif IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
+#define FLAG_BYT_FIRST FLAG_SOF
+#endif
+
/*
* configuration table
* - the order of similar ACPI ID entries is important!
@@ -459,28 +469,28 @@ EXPORT_SYMBOL_GPL(snd_intel_dsp_driver_probe);
*/
static const struct config_entry acpi_config_table[] = {
/* BayTrail */
-#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
+#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) || IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
{
- .flags = FLAG_SST,
+ .flags = FLAG_BYT_FIRST,
.acpi_hid = "80860F28",
},
#endif
-#if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
+#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) && IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
{
- .flags = FLAG_SOF,
+ .flags = FLAG_BYT_SECOND,
.acpi_hid = "80860F28",
},
#endif
/* CherryTrail */
-#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
+#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) || IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
{
- .flags = FLAG_SST,
+ .flags = FLAG_BYT_FIRST,
.acpi_hid = "808622A8",
},
#endif
-#if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
+#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) && IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
{
- .flags = FLAG_SOF,
+ .flags = FLAG_BYT_SECOND,
.acpi_hid = "808622A8",
},
#endif
--
2.30.0
2
6
This series implements a driver part of the virtio sound device
specification v8 [1].
The driver supports PCM playback and capture substreams, jack and
channel map controls. A message-based transport is used to write/read
PCM frames to/from a device.
The series is based (and was actually tested) on Linus's master
branch [2], on top of
commit 1e2a199f6ccd ("Merge tag 'spi-fix-v5.11-rc4' of ...")
As a device part was used OpenSynergy proprietary implementation.
Any comments are very welcome.
v1->v2 changes:
1. For some reason, in the previous patch series, several patches were
squashed. Fixed this issue to make the review easier.
2. Added mst(a)redhat.com to the MAINTAINERS.
3. When creating virtqueues, now only the event virtqueue is disabled.
It's enabled only after successful initialization of the device.
4. Added additional comments to the reset worker function:
[2/9] virtio_card.c:virtsnd_reset_fn()
5. Added check that VIRTIO_F_VERSION_1 feature bit is set.
6. Added additional comments to the device removing function:
[2/9] virtio_card.c:virtsnd_remove()
7. Added additional comments to the tx/rx interrupt handler:
[5/9] virtio_pcm_msg.c:virtsnd_pcm_msg_complete()
8. Added additional comments to substream release wait function.
[6/9] virtio_pcm_ops.c:virtsnd_pcm_released()
[1] https://lists.oasis-open.org/archives/virtio-dev/202003/msg00185.html
[2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
Anton Yakovlev (9):
uapi: virtio_ids: add a sound device type ID from OASIS spec
ALSA: virtio: add virtio sound driver
ALSA: virtio: handling control messages
ALSA: virtio: build PCM devices and substream hardware descriptors
ALSA: virtio: handling control and I/O messages for the PCM device
ALSA: virtio: PCM substream operators
ALSA: virtio: introduce jack support
ALSA: virtio: introduce PCM channel map support
ALSA: virtio: introduce device suspend/resume support
MAINTAINERS | 9 +
include/uapi/linux/virtio_ids.h | 1 +
include/uapi/linux/virtio_snd.h | 361 ++++++++++++++++++++
sound/Kconfig | 2 +
sound/Makefile | 3 +-
sound/virtio/Kconfig | 10 +
sound/virtio/Makefile | 13 +
sound/virtio/virtio_card.c | 577 +++++++++++++++++++++++++++++++
sound/virtio/virtio_card.h | 121 +++++++
sound/virtio/virtio_chmap.c | 237 +++++++++++++
sound/virtio/virtio_ctl_msg.c | 293 ++++++++++++++++
sound/virtio/virtio_ctl_msg.h | 122 +++++++
sound/virtio/virtio_jack.c | 255 ++++++++++++++
sound/virtio/virtio_pcm.c | 582 ++++++++++++++++++++++++++++++++
sound/virtio/virtio_pcm.h | 132 ++++++++
sound/virtio/virtio_pcm_msg.c | 325 ++++++++++++++++++
sound/virtio/virtio_pcm_ops.c | 528 +++++++++++++++++++++++++++++
17 files changed, 3570 insertions(+), 1 deletion(-)
create mode 100644 include/uapi/linux/virtio_snd.h
create mode 100644 sound/virtio/Kconfig
create mode 100644 sound/virtio/Makefile
create mode 100644 sound/virtio/virtio_card.c
create mode 100644 sound/virtio/virtio_card.h
create mode 100644 sound/virtio/virtio_chmap.c
create mode 100644 sound/virtio/virtio_ctl_msg.c
create mode 100644 sound/virtio/virtio_ctl_msg.h
create mode 100644 sound/virtio/virtio_jack.c
create mode 100644 sound/virtio/virtio_pcm.c
create mode 100644 sound/virtio/virtio_pcm.h
create mode 100644 sound/virtio/virtio_pcm_msg.c
create mode 100644 sound/virtio/virtio_pcm_ops.c
--
2.30.0
3
29

08 Feb '21
The function simple_write_to_buffer() doesn't add string termination
at the end of buf, we need to add it on our own if calling that
function to write the size of count chars to buf. This change refers
to the function tokenize_input() in debug.c and the function
sof_dfsentry_trace_filter_write() in trace.c.
We didn't find this potential issue in the past because sometimes we
are very lucky, we kzalloc the size of count buf, the kernel not only
returns a buf with buf[0 ... (count - 1)] = 0 but buf[count] = 0, with
this luck, this issue will not be exposed.
Fixes: 091c12e1f50c ("ASoC: SOF: debug: add new debugfs entries for IPC flood test")
Signed-off-by: Hui Wang <hui.wang(a)canonical.com>
---
sound/soc/sof/debug.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/sound/soc/sof/debug.c b/sound/soc/sof/debug.c
index 30213a1beaaa..edd4893119dd 100644
--- a/sound/soc/sof/debug.c
+++ b/sound/soc/sof/debug.c
@@ -352,9 +352,10 @@ static ssize_t sof_dfsentry_write(struct file *file, const char __user *buffer,
char *string;
int ret;
- string = kzalloc(count, GFP_KERNEL);
+ string = kzalloc(count+1, GFP_KERNEL);
if (!string)
return -ENOMEM;
+ string[count] = '\0';
size = simple_write_to_buffer(string, count, ppos, buffer, count);
ret = size;
--
2.25.1
2
2

[sound:for-next 76/104] powerpc-linux-ld: warning: orphan section `.data..LASANLOC27' from `sound/core/init.o' being placed in section `.data..LASANLOC27'
by kernel test robot 08 Feb '21
by kernel test robot 08 Feb '21
08 Feb '21
tree: https://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git for-next
head: 3c4ab49ec59b94651dea7c7b0104c781c79c62b5
commit: 75b1a8f9d62e50f05d0e4e9f3c8bcde32527ffc1 [76/104] ALSA: Convert strlcpy to strscpy when return value is unused
config: powerpc64-randconfig-r032-20210207 (attached as .config)
compiler: powerpc-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git/commit/?id=…
git remote add sound https://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git
git fetch --no-tags sound for-next
git checkout 75b1a8f9d62e50f05d0e4e9f3c8bcde32527ffc1
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=powerpc64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp(a)intel.com>
All warnings (new ones prefixed by >>):
powerpc-linux-ld: warning: orphan section `.data..LASANLOC7' from `drivers/tee/tee_core.o' being placed in section `.data..LASANLOC7'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC8' from `drivers/tee/tee_core.o' being placed in section `.data..LASANLOC8'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC9' from `drivers/tee/tee_core.o' being placed in section `.data..LASANLOC9'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `drivers/tee/tee_shm.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `drivers/tee/tee_shm.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `drivers/tee/tee_shm_pool.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `drivers/tee/tee_shm_pool.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `drivers/mux/core.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `drivers/mux/core.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `drivers/mux/core.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `drivers/mux/core.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `drivers/mux/core.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC5' from `drivers/mux/core.o' being placed in section `.data..LASANLOC5'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC6' from `drivers/mux/core.o' being placed in section `.data..LASANLOC6'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `drivers/mux/adg792a.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `drivers/mux/adg792a.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `drivers/mux/adg792a.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `drivers/mux/adg792a.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `drivers/mux/adg792a.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `drivers/mux/adgs1408.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `drivers/mux/adgs1408.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `drivers/mux/adgs1408.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `drivers/mux/adgs1408.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `drivers/mux/adgs1408.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `drivers/mux/mmio.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `drivers/mux/mmio.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `drivers/mux/mmio.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `drivers/mux/mmio.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `drivers/counter/counter.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `drivers/counter/counter.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `drivers/counter/counter.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `drivers/counter/counter.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `drivers/counter/counter.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC5' from `drivers/counter/counter.o' being placed in section `.data..LASANLOC5'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC6' from `drivers/counter/counter.o' being placed in section `.data..LASANLOC6'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC7' from `drivers/counter/counter.o' being placed in section `.data..LASANLOC7'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC8' from `drivers/counter/counter.o' being placed in section `.data..LASANLOC8'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC9' from `drivers/counter/counter.o' being placed in section `.data..LASANLOC9'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `drivers/counter/ti-eqep.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `drivers/counter/ti-eqep.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC10' from `drivers/counter/ti-eqep.o' being placed in section `.data..LASANLOC10'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC11' from `drivers/counter/ti-eqep.o' being placed in section `.data..LASANLOC11'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC12' from `drivers/counter/ti-eqep.o' being placed in section `.data..LASANLOC12'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC13' from `drivers/counter/ti-eqep.o' being placed in section `.data..LASANLOC13'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `drivers/counter/ti-eqep.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `drivers/counter/ti-eqep.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `drivers/counter/ti-eqep.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC5' from `drivers/counter/ti-eqep.o' being placed in section `.data..LASANLOC5'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC6' from `drivers/counter/ti-eqep.o' being placed in section `.data..LASANLOC6'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC7' from `drivers/counter/ti-eqep.o' being placed in section `.data..LASANLOC7'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC8' from `drivers/counter/ti-eqep.o' being placed in section `.data..LASANLOC8'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC9' from `drivers/counter/ti-eqep.o' being placed in section `.data..LASANLOC9'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `drivers/counter/microchip-tcb-capture.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `drivers/counter/microchip-tcb-capture.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC10' from `drivers/counter/microchip-tcb-capture.o' being placed in section `.data..LASANLOC10'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC11' from `drivers/counter/microchip-tcb-capture.o' being placed in section `.data..LASANLOC11'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC12' from `drivers/counter/microchip-tcb-capture.o' being placed in section `.data..LASANLOC12'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC13' from `drivers/counter/microchip-tcb-capture.o' being placed in section `.data..LASANLOC13'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `drivers/counter/microchip-tcb-capture.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `drivers/counter/microchip-tcb-capture.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `drivers/counter/microchip-tcb-capture.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC5' from `drivers/counter/microchip-tcb-capture.o' being placed in section `.data..LASANLOC5'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC6' from `drivers/counter/microchip-tcb-capture.o' being placed in section `.data..LASANLOC6'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC7' from `drivers/counter/microchip-tcb-capture.o' being placed in section `.data..LASANLOC7'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC8' from `drivers/counter/microchip-tcb-capture.o' being placed in section `.data..LASANLOC8'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC9' from `drivers/counter/microchip-tcb-capture.o' being placed in section `.data..LASANLOC9'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/sound_core.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/sound_core.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/sound_core.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/sound.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/sound.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC10' from `sound/core/sound.o' being placed in section `.data..LASANLOC10'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/core/sound.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `sound/core/sound.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `sound/core/sound.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC5' from `sound/core/sound.o' being placed in section `.data..LASANLOC5'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC6' from `sound/core/sound.o' being placed in section `.data..LASANLOC6'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC7' from `sound/core/sound.o' being placed in section `.data..LASANLOC7'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC8' from `sound/core/sound.o' being placed in section `.data..LASANLOC8'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC9' from `sound/core/sound.o' being placed in section `.data..LASANLOC9'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/init.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/init.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC10' from `sound/core/init.o' being placed in section `.data..LASANLOC10'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC11' from `sound/core/init.o' being placed in section `.data..LASANLOC11'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC12' from `sound/core/init.o' being placed in section `.data..LASANLOC12'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC13' from `sound/core/init.o' being placed in section `.data..LASANLOC13'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC14' from `sound/core/init.o' being placed in section `.data..LASANLOC14'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC15' from `sound/core/init.o' being placed in section `.data..LASANLOC15'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC16' from `sound/core/init.o' being placed in section `.data..LASANLOC16'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC17' from `sound/core/init.o' being placed in section `.data..LASANLOC17'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC18' from `sound/core/init.o' being placed in section `.data..LASANLOC18'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC19' from `sound/core/init.o' being placed in section `.data..LASANLOC19'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/core/init.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC20' from `sound/core/init.o' being placed in section `.data..LASANLOC20'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC21' from `sound/core/init.o' being placed in section `.data..LASANLOC21'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC22' from `sound/core/init.o' being placed in section `.data..LASANLOC22'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC23' from `sound/core/init.o' being placed in section `.data..LASANLOC23'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC24' from `sound/core/init.o' being placed in section `.data..LASANLOC24'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC25' from `sound/core/init.o' being placed in section `.data..LASANLOC25'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC26' from `sound/core/init.o' being placed in section `.data..LASANLOC26'
>> powerpc-linux-ld: warning: orphan section `.data..LASANLOC27' from `sound/core/init.o' being placed in section `.data..LASANLOC27'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `sound/core/init.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `sound/core/init.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC5' from `sound/core/init.o' being placed in section `.data..LASANLOC5'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC6' from `sound/core/init.o' being placed in section `.data..LASANLOC6'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC7' from `sound/core/init.o' being placed in section `.data..LASANLOC7'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC8' from `sound/core/init.o' being placed in section `.data..LASANLOC8'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC9' from `sound/core/init.o' being placed in section `.data..LASANLOC9'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/memory.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/control.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/control.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC10' from `sound/core/control.o' being placed in section `.data..LASANLOC10'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC11' from `sound/core/control.o' being placed in section `.data..LASANLOC11'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/core/control.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `sound/core/control.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `sound/core/control.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC5' from `sound/core/control.o' being placed in section `.data..LASANLOC5'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC6' from `sound/core/control.o' being placed in section `.data..LASANLOC6'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC7' from `sound/core/control.o' being placed in section `.data..LASANLOC7'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC8' from `sound/core/control.o' being placed in section `.data..LASANLOC8'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC9' from `sound/core/control.o' being placed in section `.data..LASANLOC9'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/info.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/info.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/core/info.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `sound/core/info.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `sound/core/info.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC5' from `sound/core/info.o' being placed in section `.data..LASANLOC5'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC6' from `sound/core/info.o' being placed in section `.data..LASANLOC6'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC7' from `sound/core/info.o' being placed in section `.data..LASANLOC7'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/timer.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/timer.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC10' from `sound/core/timer.o' being placed in section `.data..LASANLOC10'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC11' from `sound/core/timer.o' being placed in section `.data..LASANLOC11'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC12' from `sound/core/timer.o' being placed in section `.data..LASANLOC12'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC13' from `sound/core/timer.o' being placed in section `.data..LASANLOC13'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC14' from `sound/core/timer.o' being placed in section `.data..LASANLOC14'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC15' from `sound/core/timer.o' being placed in section `.data..LASANLOC15'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC16' from `sound/core/timer.o' being placed in section `.data..LASANLOC16'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC17' from `sound/core/timer.o' being placed in section `.data..LASANLOC17'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC18' from `sound/core/timer.o' being placed in section `.data..LASANLOC18'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC19' from `sound/core/timer.o' being placed in section `.data..LASANLOC19'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/core/timer.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC20' from `sound/core/timer.o' being placed in section `.data..LASANLOC20'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC21' from `sound/core/timer.o' being placed in section `.data..LASANLOC21'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC22' from `sound/core/timer.o' being placed in section `.data..LASANLOC22'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC23' from `sound/core/timer.o' being placed in section `.data..LASANLOC23'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC24' from `sound/core/timer.o' being placed in section `.data..LASANLOC24'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `sound/core/timer.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `sound/core/timer.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC5' from `sound/core/timer.o' being placed in section `.data..LASANLOC5'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC6' from `sound/core/timer.o' being placed in section `.data..LASANLOC6'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC7' from `sound/core/timer.o' being placed in section `.data..LASANLOC7'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC8' from `sound/core/timer.o' being placed in section `.data..LASANLOC8'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC9' from `sound/core/timer.o' being placed in section `.data..LASANLOC9'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/hrtimer.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/hrtimer.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/core/hrtimer.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `sound/core/hrtimer.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `sound/core/hrtimer.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/pcm.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/pcm.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC10' from `sound/core/pcm.o' being placed in section `.data..LASANLOC10'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC11' from `sound/core/pcm.o' being placed in section `.data..LASANLOC11'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC12' from `sound/core/pcm.o' being placed in section `.data..LASANLOC12'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC13' from `sound/core/pcm.o' being placed in section `.data..LASANLOC13'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC14' from `sound/core/pcm.o' being placed in section `.data..LASANLOC14'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC15' from `sound/core/pcm.o' being placed in section `.data..LASANLOC15'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC16' from `sound/core/pcm.o' being placed in section `.data..LASANLOC16'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC17' from `sound/core/pcm.o' being placed in section `.data..LASANLOC17'
>> powerpc-linux-ld: warning: orphan section `.data..LASANLOC18' from `sound/core/pcm.o' being placed in section `.data..LASANLOC18'
>> powerpc-linux-ld: warning: orphan section `.data..LASANLOC19' from `sound/core/pcm.o' being placed in section `.data..LASANLOC19'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/core/pcm.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `sound/core/pcm.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `sound/core/pcm.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC5' from `sound/core/pcm.o' being placed in section `.data..LASANLOC5'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC6' from `sound/core/pcm.o' being placed in section `.data..LASANLOC6'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC7' from `sound/core/pcm.o' being placed in section `.data..LASANLOC7'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC8' from `sound/core/pcm.o' being placed in section `.data..LASANLOC8'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC9' from `sound/core/pcm.o' being placed in section `.data..LASANLOC9'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/pcm_native.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/pcm_native.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC10' from `sound/core/pcm_native.o' being placed in section `.data..LASANLOC10'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC11' from `sound/core/pcm_native.o' being placed in section `.data..LASANLOC11'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC12' from `sound/core/pcm_native.o' being placed in section `.data..LASANLOC12'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC13' from `sound/core/pcm_native.o' being placed in section `.data..LASANLOC13'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC14' from `sound/core/pcm_native.o' being placed in section `.data..LASANLOC14'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC15' from `sound/core/pcm_native.o' being placed in section `.data..LASANLOC15'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC16' from `sound/core/pcm_native.o' being placed in section `.data..LASANLOC16'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC17' from `sound/core/pcm_native.o' being placed in section `.data..LASANLOC17'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC18' from `sound/core/pcm_native.o' being placed in section `.data..LASANLOC18'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC19' from `sound/core/pcm_native.o' being placed in section `.data..LASANLOC19'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/core/pcm_native.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC20' from `sound/core/pcm_native.o' being placed in section `.data..LASANLOC20'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `sound/core/pcm_native.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `sound/core/pcm_native.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC5' from `sound/core/pcm_native.o' being placed in section `.data..LASANLOC5'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC6' from `sound/core/pcm_native.o' being placed in section `.data..LASANLOC6'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC7' from `sound/core/pcm_native.o' being placed in section `.data..LASANLOC7'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC8' from `sound/core/pcm_native.o' being placed in section `.data..LASANLOC8'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC9' from `sound/core/pcm_native.o' being placed in section `.data..LASANLOC9'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/pcm_lib.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/pcm_lib.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/core/pcm_lib.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `sound/core/pcm_lib.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `sound/core/pcm_lib.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/pcm_misc.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/pcm_misc.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/pcm_memory.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/pcm_memory.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/core/pcm_memory.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `sound/core/pcm_memory.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `sound/core/pcm_memory.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC5' from `sound/core/pcm_memory.o' being placed in section `.data..LASANLOC5'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC6' from `sound/core/pcm_memory.o' being placed in section `.data..LASANLOC6'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/memalloc.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/seq_device.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/seq_device.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/core/seq_device.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `sound/core/seq_device.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/rawmidi.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/rawmidi.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC10' from `sound/core/rawmidi.o' being placed in section `.data..LASANLOC10'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC11' from `sound/core/rawmidi.o' being placed in section `.data..LASANLOC11'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC12' from `sound/core/rawmidi.o' being placed in section `.data..LASANLOC12'
>> powerpc-linux-ld: warning: orphan section `.data..LASANLOC13' from `sound/core/rawmidi.o' being placed in section `.data..LASANLOC13'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/core/rawmidi.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `sound/core/rawmidi.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `sound/core/rawmidi.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC5' from `sound/core/rawmidi.o' being placed in section `.data..LASANLOC5'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC6' from `sound/core/rawmidi.o' being placed in section `.data..LASANLOC6'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC7' from `sound/core/rawmidi.o' being placed in section `.data..LASANLOC7'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC8' from `sound/core/rawmidi.o' being placed in section `.data..LASANLOC8'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC9' from `sound/core/rawmidi.o' being placed in section `.data..LASANLOC9'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/seq/seq.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/seq/seq.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC10' from `sound/core/seq/seq.o' being placed in section `.data..LASANLOC10'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC11' from `sound/core/seq/seq.o' being placed in section `.data..LASANLOC11'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC12' from `sound/core/seq/seq.o' being placed in section `.data..LASANLOC12'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC13' from `sound/core/seq/seq.o' being placed in section `.data..LASANLOC13'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC14' from `sound/core/seq/seq.o' being placed in section `.data..LASANLOC14'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC15' from `sound/core/seq/seq.o' being placed in section `.data..LASANLOC15'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/core/seq/seq.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `sound/core/seq/seq.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `sound/core/seq/seq.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC5' from `sound/core/seq/seq.o' being placed in section `.data..LASANLOC5'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC6' from `sound/core/seq/seq.o' being placed in section `.data..LASANLOC6'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC7' from `sound/core/seq/seq.o' being placed in section `.data..LASANLOC7'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC8' from `sound/core/seq/seq.o' being placed in section `.data..LASANLOC8'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC9' from `sound/core/seq/seq.o' being placed in section `.data..LASANLOC9'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/seq/seq_clientmgr.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/seq/seq_clientmgr.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC10' from `sound/core/seq/seq_clientmgr.o' being placed in section `.data..LASANLOC10'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC11' from `sound/core/seq/seq_clientmgr.o' being placed in section `.data..LASANLOC11'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC12' from `sound/core/seq/seq_clientmgr.o' being placed in section `.data..LASANLOC12'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC13' from `sound/core/seq/seq_clientmgr.o' being placed in section `.data..LASANLOC13'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/core/seq/seq_clientmgr.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `sound/core/seq/seq_clientmgr.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `sound/core/seq/seq_clientmgr.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC5' from `sound/core/seq/seq_clientmgr.o' being placed in section `.data..LASANLOC5'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC6' from `sound/core/seq/seq_clientmgr.o' being placed in section `.data..LASANLOC6'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC7' from `sound/core/seq/seq_clientmgr.o' being placed in section `.data..LASANLOC7'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC8' from `sound/core/seq/seq_clientmgr.o' being placed in section `.data..LASANLOC8'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC9' from `sound/core/seq/seq_clientmgr.o' being placed in section `.data..LASANLOC9'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/seq/seq_memory.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/seq/seq_memory.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/core/seq/seq_memory.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/seq/seq_queue.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/seq/seq_queue.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/core/seq/seq_queue.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `sound/core/seq/seq_queue.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `sound/core/seq/seq_queue.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC5' from `sound/core/seq/seq_queue.o' being placed in section `.data..LASANLOC5'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC6' from `sound/core/seq/seq_queue.o' being placed in section `.data..LASANLOC6'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/seq/seq_fifo.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/seq/seq_fifo.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/core/seq/seq_fifo.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/seq/seq_prioq.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/seq/seq_prioq.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/seq/seq_timer.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/seq/seq_timer.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/seq/seq_system.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/seq/seq_system.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/core/seq/seq_system.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `sound/core/seq/seq_system.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `sound/core/seq/seq_system.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/seq/seq_ports.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/seq/seq_ports.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/core/seq/seq_ports.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `sound/core/seq/seq_ports.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `sound/core/seq/seq_ports.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/seq/seq_info.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/seq/seq_info.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/core/seq/seq_info.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `sound/core/seq/seq_info.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/seq/seq_midi.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/seq/seq_midi.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/core/seq/seq_midi.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `sound/core/seq/seq_midi.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `sound/core/seq/seq_midi.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC5' from `sound/core/seq/seq_midi.o' being placed in section `.data..LASANLOC5'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC6' from `sound/core/seq/seq_midi.o' being placed in section `.data..LASANLOC6'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC7' from `sound/core/seq/seq_midi.o' being placed in section `.data..LASANLOC7'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC8' from `sound/core/seq/seq_midi.o' being placed in section `.data..LASANLOC8'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC9' from `sound/core/seq/seq_midi.o' being placed in section `.data..LASANLOC9'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/seq/seq_midi_event.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/seq/seq_midi_event.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/core/seq/seq_midi_event.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `sound/core/seq/seq_midi_event.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `sound/core/seq/seq_midi_event.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC5' from `sound/core/seq/seq_midi_event.o' being placed in section `.data..LASANLOC5'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC6' from `sound/core/seq/seq_midi_event.o' being placed in section `.data..LASANLOC6'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/core/seq/seq_virmidi.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/core/seq/seq_virmidi.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC2' from `sound/core/seq/seq_virmidi.o' being placed in section `.data..LASANLOC2'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC3' from `sound/core/seq/seq_virmidi.o' being placed in section `.data..LASANLOC3'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC4' from `sound/core/seq/seq_virmidi.o' being placed in section `.data..LASANLOC4'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC5' from `sound/core/seq/seq_virmidi.o' being placed in section `.data..LASANLOC5'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC6' from `sound/core/seq/seq_virmidi.o' being placed in section `.data..LASANLOC6'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC7' from `sound/core/seq/seq_virmidi.o' being placed in section `.data..LASANLOC7'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC8' from `sound/core/seq/seq_virmidi.o' being placed in section `.data..LASANLOC8'
powerpc-linux-ld: warning: orphan section `.data..LASAN0' from `sound/drivers/dummy.o' being placed in section `.data..LASAN0'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC1' from `sound/drivers/dummy.o' being placed in section `.data..LASANLOC1'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC10' from `sound/drivers/dummy.o' being placed in section `.data..LASANLOC10'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC11' from `sound/drivers/dummy.o' being placed in section `.data..LASANLOC11'
powerpc-linux-ld: warning: orphan section `.data..LASANLOC12' from `sound/drivers/dummy.o' being placed in section `.data..LASANLOC12'
..
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
3
2