Linux Sound subsystem development
 help / color / mirror / Atom feed
* [PATCH] ASoC: rt721: Add support for the RT721_U and RT718 codec variants
@ 2026-09-17 10:42 Oder Chiou
  2026-09-22 10:48 ` Mark Brown
  0 siblings, 1 reply; 2+ messages in thread
From: Oder Chiou @ 2026-09-17 10:42 UTC (permalink / raw)
  To: broonie, lgirdwood
  Cc: linux-sound, lars, flove, shumingf, jack.yu, derek.fang,
	Oder Chiou

The RT721_U and RT718 variants share most of the register layout and
driver behavior with RT721. Extend the existing RT721 driver to
recognize these variants and apply variant-specific settings where
required.

Signed-off-by: Oder Chiou <oder_chiou@realtek.com>
---
 sound/soc/codecs/rt721-sdca-sdw.c   |   3 +
 sound/soc/codecs/rt721-sdca.c       | 199 +++++++++++++++++++++++++---
 sound/soc/codecs/rt721-sdca.h       |  12 ++
 sound/soc/sdw_utils/soc_sdw_utils.c |  46 +++++++
 4 files changed, 242 insertions(+), 18 deletions(-)

diff --git a/sound/soc/codecs/rt721-sdca-sdw.c b/sound/soc/codecs/rt721-sdca-sdw.c
index 0ebb5688f848..a8c7b42898db 100644
--- a/sound/soc/codecs/rt721-sdca-sdw.c
+++ b/sound/soc/codecs/rt721-sdca-sdw.c
@@ -91,6 +91,7 @@ static bool rt721_sdca_mbq_readable_register(struct device *dev, unsigned int re
 	case 0x5810037:
 	case 0x5810038:
 	case 0x5810039:
+	case 0x5810100:
 	case 0x5b10018:
 	case 0x5b10019:
 	case 0x5f00045:
@@ -167,6 +168,7 @@ static bool rt721_sdca_mbq_volatile_register(struct device *dev, unsigned int re
 	case 0x5810037:
 	case 0x5810038:
 	case 0x5810039:
+	case 0x5810100:
 	case 0x5b10018:
 	case 0x5b10019:
 	case 0x6100006:
@@ -448,6 +450,7 @@ static void rt721_sdca_sdw_remove(struct sdw_slave *slave)
 
 static const struct sdw_device_id rt721_sdca_id[] = {
 	SDW_SLAVE_ENTRY_EXT(0x025d, 0x721, 0x3, 0x1, 0),
+	SDW_SLAVE_ENTRY_EXT(0x025d, 0x718, 0x3, 0x1, 0),
 	{},
 };
 MODULE_DEVICE_TABLE(sdw, rt721_sdca_id);
diff --git a/sound/soc/codecs/rt721-sdca.c b/sound/soc/codecs/rt721-sdca.c
index dbf61fa382a2..ef003c93f533 100644
--- a/sound/soc/codecs/rt721-sdca.c
+++ b/sound/soc/codecs/rt721-sdca.c
@@ -169,8 +169,12 @@ static void rt721_sdca_dmic_preset(struct rt721_sdca_priv *rt721)
 			RT721_ENT_FLOAT_CTL8, 0x1e00);
 		rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT,
 			RT721_ENT_FLOAT_CTL7, 0x1515);
-		rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT,
-			RT721_CH_FLOAT_CTL3, 0x0304);
+		if (rt721->wf_id == RT721_S)
+			rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT,
+				RT721_CH_FLOAT_CTL3, 0x0304);
+		else
+			rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT,
+				RT721_CH_FLOAT_CTL5, 0x0304);
 		rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT,
 			RT721_CH_FLOAT_CTL4, 0x0304);
 		rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT,
@@ -183,7 +187,12 @@ static void rt721_sdca_dmic_preset(struct rt721_sdca_priv *rt721)
 			RT721_RC_CALIB_CTRL0, 0x0b00);
 		rt_sdca_index_write(rt721->mbq_regmap, RT721_RC_CALIB_CTRL,
 			RT721_RC_CALIB_CTRL0, 0x0b40);
-		regmap_write(rt721->regmap, 0x2f5c, 0x25);
+		if (rt721->wf_id == RT721_S) {
+			regmap_write(rt721->regmap, 0x2f5c, 0x25);
+		} else {
+			regmap_write(rt721->regmap, 0x2f5c, 0x01);
+			regmap_write(rt721->regmap, 0x2f52, 0x00);
+		}
 		/* clear flag */
 		regmap_write(rt721->regmap,
 			SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT721_SDCA_ENT0,
@@ -208,9 +217,11 @@ static void rt721_sdca_amp_preset(struct rt721_sdca_priv *rt721)
 			RT721_VREF1_HV_CTRL1, 0xe000);
 		rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_ANA_CTL,
 			RT721_MISC_POWER_CTL31, 0x8007);
-		regmap_write(rt721->mbq_regmap, 0x5810000, 0x6420);
-		regmap_write(rt721->mbq_regmap, 0x5810000, 0x6421);
-		regmap_write(rt721->mbq_regmap, 0x5810000, 0xe421);
+		if (rt721->wf_id == RT721_S) {
+			regmap_write(rt721->mbq_regmap, 0x5810000, 0x6420);
+			regmap_write(rt721->mbq_regmap, 0x5810000, 0x6421);
+			regmap_write(rt721->mbq_regmap, 0x5810000, 0xe421);
+		}
 		rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT,
 			RT721_CH_FLOAT_CTL6, 0x5561);
 		rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_REG,
@@ -231,6 +242,8 @@ static void rt721_sdca_amp_preset(struct rt721_sdca_priv *rt721)
 			SDW_SDCA_CTL(FUNC_NUM_AMP, RT721_SDCA_ENT_FU55,
 				RT721_SDCA_CTL_FU_MUTE, CH_02), 0x00);
 		regmap_write(rt721->regmap, 0x2f5d, 0x1);
+		if (rt721->wf_id == RT721_U)
+			regmap_write(rt721->regmap, 0x2f54, 0x00);
 		/* clear flag */
 		regmap_write(rt721->regmap,
 			SDW_SDCA_CTL(FUNC_NUM_AMP, RT721_SDCA_ENT0, RT721_SDCA_CTL_FUNC_STATUS, 0),
@@ -245,7 +258,7 @@ static void rt721_sdca_jack_preset(struct rt721_sdca_priv *rt721)
 
 	regmap_read(rt721->regmap,
 		SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT721_SDCA_ENT0, RT721_SDCA_CTL_FUNC_STATUS, 0),
-			&jack_func_status);
+		&jack_func_status);
 	dev_dbg(dev, "%s jack func_status=0x%x\n", __func__, jack_func_status);
 
 	if ((jack_func_status & FUNCTION_NEEDS_INITIALIZATION) || (!rt721->first_hw_init)) {
@@ -330,6 +343,113 @@ static void rt721_sdca_jack_preset(struct rt721_sdca_priv *rt721)
 	}
 }
 
+static void rt721u_sdca_jack_preset(struct rt721_sdca_priv *rt721)
+{
+	unsigned int jack_func_status, calibration_status, i;
+	int ret;
+	struct device *dev = &rt721->slave->dev;
+
+	regmap_read(rt721->regmap,
+		SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT721_SDCA_ENT0, RT721_SDCA_CTL_FUNC_STATUS, 0),
+		&jack_func_status);
+	dev_dbg(dev, "%s jack func_status=0x%x\n", __func__, jack_func_status);
+
+	if ((jack_func_status & BIT(5)) || (!rt721->first_hw_init)) {
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_ANA_CTL,
+			RT721_MISC_POWER_CTL31, 0x8000);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_ANA_POW_PART,
+			RT721_VREF1_HV_CTRL1, 0xe000);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_ANA_CTL,
+			RT721_MISC_POWER_CTL31, 0x8007);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_ANA_CTL,
+			0x10, 0xffb7);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_ANA_CTL,
+			0x20, 0xffb7);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_ANA_CTL,
+			0x30, 0xffb7);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_ANA_CTL,
+			RT721_UAJ_TOP_TCON13, 0x6048);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT,
+			RT721_GE_REL_CTRL1, 0x8011);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT,
+			RT721_UMP_HID_CTRL3, 0xcf00);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT,
+			RT721_UMP_HID_CTRL4, 0x000f);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT,
+			RT721_UMP_HID_CTRL1, 0x1100);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT,
+			RT721_UMP_HID_CTRL5, 0x0c12);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_JD_CTRL,
+			RT721_JD_1PIN_GAT_CTRL2, 0xc004);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_RC_CALIB_CTRL,
+			RT721_RC_CALIB_CTRL0, 0x0b00);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_RC_CALIB_CTRL,
+			RT721_RC_CALIB_CTRL0, 0x0b40);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_ANA_CTL,
+			RT721_UAJ_TOP_TCON14, 0x333b);
+		regmap_write(rt721->mbq_regmap, 0x5810135, 0x8036);
+		regmap_write(rt721->mbq_regmap, 0x5810130, 0xee03);
+		regmap_write(rt721->mbq_regmap, 0x5810133, 0x6000);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_CAP_PORT_CTRL,
+			RT721_HP_AMP_2CH_CAL1, 0x4140);
+		regmap_write(rt721->mbq_regmap, 0x5810100, 0x0006);
+		regmap_write(rt721->mbq_regmap, 0x5810100, 0x8006);
+		for (i = 0; i < 5; i++) {
+			ret = regmap_read(rt721->mbq_regmap, 0x5810100,
+				&calibration_status);
+			if (ret < 0)
+				dev_dbg(dev, "calibration failed!, ret=%d\n",
+					ret);
+			if (!(calibration_status & 0x8000))
+				break;
+		}
+		if (rt721->hw_vid == RT721_U_VB)
+			rt_sdca_index_write(rt721->mbq_regmap, RT721_CBJ_CTRL,
+				RT721_CBJ_A0_GAT_CTRL1, 0x2205);
+		else
+			rt_sdca_index_write(rt721->mbq_regmap, RT721_CBJ_CTRL,
+				RT721_CBJ_A0_GAT_CTRL1, 0x2e05);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_ANA_CTL,
+			RT721_UAJ_TOP_TCON14, 0x3b3b);
+		regmap_write(rt721->mbq_regmap, 0x310400, 0x3043);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_ANA_CTL,
+			RT721_UAJ_TOP_TCON14, 0x3f33);
+		regmap_write(rt721->mbq_regmap, 0x310401, 0x3000);
+		regmap_write(rt721->mbq_regmap, 0x310402, 0x1b00);
+		regmap_write(rt721->mbq_regmap, 0x310300, 0x000f);
+		regmap_write(rt721->mbq_regmap, 0x310301, 0x3000);
+		regmap_write(rt721->mbq_regmap, 0x310302, 0x1b00);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_ANA_CTL,
+			RT721_UAJ_TOP_TCON17, 0x0008);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT,
+			RT721_ENT_FLOAT_CTL2, 0x1234);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT,
+			RT721_ENT_FLOAT_CTL3, 0x3512);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT,
+			RT721_ENT_FLOAT_CTL1, 0x4040);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT,
+			RT721_ENT_FLOAT_CTL4, 0x1201);
+		regmap_write(rt721->regmap, 0x2f58, 0x01);
+		regmap_write(rt721->regmap, 0x2f59, 0x01);
+		regmap_write(rt721->regmap, 0x2f51, 0x00);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_VENDOR_ANA_CTL,
+			RT721_UAJ_TOP_TCON13, 0x6040);
+		regmap_write(rt721->mbq_regmap, 0x910001, 0x3256);
+		regmap_write(rt721->mbq_regmap, 0x910002, 0x0000);
+		regmap_write(rt721->mbq_regmap, 0x910003, 0x0000);
+		regmap_write(rt721->mbq_regmap, 0x900004, 0x7778);
+		regmap_write(rt721->mbq_regmap, 0x910202, 0x02e4);
+		regmap_write(rt721->mbq_regmap, 0x800002, 0xcc04);
+		rt_sdca_index_write(rt721->mbq_regmap, RT721_CAP_PORT_CTRL,
+			RT721_HP_AMP_2CH_CAL4, 0xa105);
+		rt_sdca_index_write(rt721->mbq_regmap, 0x0b, 0x01, 0x0000);
+		/* clear flag */
+		regmap_write(rt721->regmap,
+			SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT721_SDCA_ENT0,
+			RT721_SDCA_CTL_FUNC_STATUS, 0), FUNCTION_NEEDS_INITIALIZATION);
+	}
+}
+
 static void rt721_sdca_jack_init(struct rt721_sdca_priv *rt721)
 {
 	guard(mutex)(&rt721->calibrate_mutex);
@@ -733,19 +853,47 @@ static int rt721_sdca_dmic_set_gain_put(struct snd_kcontrol *kcontrol,
 	return changed;
 }
 
-static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -6525, 75, 0);
+static const DECLARE_TLV_DB_SCALE(out_vol_tlv_s, -6525, 75, 0);
+static const DECLARE_TLV_DB_SCALE(out_vol_tlv_u, -9225, 75, 0);
 static const DECLARE_TLV_DB_SCALE(mic_vol_tlv, -1725, 75, 0);
 static const DECLARE_TLV_DB_SCALE(boost_vol_tlv, 0, 1000, 0);
 static const DECLARE_TLV_DB_SCALE(mic2_boost_vol_tlv, -200, 200, 0);
 
-static const struct snd_kcontrol_new rt721_sdca_controls[] = {
+static const struct snd_kcontrol_new rt721s_sdca_controls[] = {
 	/* Headphone playback settings */
 	SOC_DOUBLE_R_EXT_TLV("FU05 Playback Volume",
 		SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT721_SDCA_ENT_USER_FU05,
 			RT721_SDCA_CTL_FU_VOLUME, CH_L),
 		SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT721_SDCA_ENT_USER_FU05,
 			RT721_SDCA_CTL_FU_VOLUME, CH_R), 0, 0x57, 0,
-		rt721_sdca_set_gain_get, rt721_sdca_set_gain_put, out_vol_tlv),
+		rt721_sdca_set_gain_get, rt721_sdca_set_gain_put, out_vol_tlv_s),
+	/* AMP playback settings */
+	SOC_DOUBLE_R_EXT_TLV("FU06 Playback Volume",
+		SDW_SDCA_CTL(FUNC_NUM_AMP, RT721_SDCA_ENT_USER_FU06,
+			RT721_SDCA_CTL_FU_VOLUME, CH_L),
+		SDW_SDCA_CTL(FUNC_NUM_AMP, RT721_SDCA_ENT_USER_FU06,
+			RT721_SDCA_CTL_FU_VOLUME, CH_R), 0, 0x57, 0,
+		rt721_sdca_set_gain_get, rt721_sdca_set_gain_put, out_vol_tlv_s),
+};
+
+static const struct snd_kcontrol_new rt721u_sdca_controls[] = {
+	/* Headphone playback settings */
+	SOC_DOUBLE_R_EXT_TLV("FU05 Playback Volume",
+		SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT721_SDCA_ENT_USER_FU05,
+			RT721_SDCA_CTL_FU_VOLUME, CH_L),
+		SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT721_SDCA_ENT_USER_FU05,
+			RT721_SDCA_CTL_FU_VOLUME, CH_R), 0, 0x7b, 0,
+		rt721_sdca_set_gain_get, rt721_sdca_set_gain_put, out_vol_tlv_u),
+	/* AMP playback settings */
+	SOC_DOUBLE_R_EXT_TLV("FU06 Playback Volume",
+		SDW_SDCA_CTL(FUNC_NUM_AMP, RT721_SDCA_ENT_USER_FU06,
+			RT721_SDCA_CTL_FU_VOLUME, CH_L),
+		SDW_SDCA_CTL(FUNC_NUM_AMP, RT721_SDCA_ENT_USER_FU06,
+			RT721_SDCA_CTL_FU_VOLUME, CH_R), 0, 0x7b, 0,
+		rt721_sdca_set_gain_get, rt721_sdca_set_gain_put, out_vol_tlv_u),
+};
+
+static const struct snd_kcontrol_new rt721_sdca_controls[] = {
 	/* Headset mic capture settings */
 	SOC_DOUBLE_EXT("FU0F Capture Switch", SND_SOC_NOPM, 0, 1, 1, 0,
 		rt721_sdca_fu0f_capture_get, rt721_sdca_fu0f_capture_put),
@@ -761,13 +909,6 @@ static const struct snd_kcontrol_new rt721_sdca_controls[] = {
 		SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT721_SDCA_ENT_PLATFORM_FU44,
 			RT721_SDCA_CTL_FU_CH_GAIN, CH_R), 1, 0x15, 0,
 		rt721_sdca_set_gain_get, rt721_sdca_set_gain_put, mic2_boost_vol_tlv),
-	/* AMP playback settings */
-	SOC_DOUBLE_R_EXT_TLV("FU06 Playback Volume",
-		SDW_SDCA_CTL(FUNC_NUM_AMP, RT721_SDCA_ENT_USER_FU06,
-			RT721_SDCA_CTL_FU_VOLUME, CH_L),
-		SDW_SDCA_CTL(FUNC_NUM_AMP, RT721_SDCA_ENT_USER_FU06,
-			RT721_SDCA_CTL_FU_VOLUME, CH_R), 0, 0x57, 0,
-		rt721_sdca_set_gain_get, rt721_sdca_set_gain_put, out_vol_tlv),
 	/* DMIC capture settings */
 	RT_SDCA_FU_CTRL("FU1E Capture Switch",
 		SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT721_SDCA_ENT_USER_FU1E,
@@ -1276,6 +1417,15 @@ static int rt721_sdca_probe(struct snd_soc_component *component)
 	if (ret < 0 && ret != -EACCES)
 		return ret;
 
+	if (rt721->wf_id == RT721_S)
+		snd_soc_add_component_controls(component,
+			rt721s_sdca_controls,
+			ARRAY_SIZE(rt721s_sdca_controls));
+	else
+		snd_soc_add_component_controls(component,
+			rt721u_sdca_controls,
+			ARRAY_SIZE(rt721u_sdca_controls));
+
 	return 0;
 }
 
@@ -1533,6 +1683,7 @@ int rt721_sdca_init(struct device *dev, struct regmap *regmap,
 	rt721->fu0f_mixer_l_mute = rt721->fu0f_mixer_r_mute = true;
 	rt721->fu1e_mixer_mute[0] = rt721->fu1e_mixer_mute[1] =
 		rt721->fu1e_mixer_mute[2] = rt721->fu1e_mixer_mute[3] = true;
+	rt721->wf_id = -1;
 
 	return devm_snd_soc_register_component(dev,
 			&soc_sdca_dev_rt721, rt721_sdca_dai, ARRAY_SIZE(rt721_sdca_dai));
@@ -1550,6 +1701,7 @@ static void rt721_sdca_reset(struct rt721_sdca_priv *rt721)
 int rt721_sdca_io_init(struct device *dev, struct sdw_slave *slave)
 {
 	struct rt721_sdca_priv *rt721 = dev_get_drvdata(dev);
+	int val;
 
 	rt721->disable_irq = false;
 
@@ -1581,12 +1733,23 @@ int rt721_sdca_io_init(struct device *dev, struct sdw_slave *slave)
 
 	pm_runtime_get_noresume(&slave->dev);
 
+	if (rt721->wf_id < 0) {
+		rt_sdca_index_read(rt721->mbq_regmap, RT721_VENDOR_REG,
+			RT721_JD_PRODUCT_NUM, &val);
+		rt721->wf_id = (val >> 4) & 0xf;
+		rt721->hw_vid = val & 0xf;
+		dev_dbg(&slave->dev, "wf_id = %d hw_vid = %d\n", rt721->wf_id, rt721->hw_vid);
+	}
+
 	if (!rt721->first_hw_init)
 		rt721_sdca_reset(rt721);
 
 	rt721_sdca_dmic_preset(rt721);
 	rt721_sdca_amp_preset(rt721);
-	rt721_sdca_jack_preset(rt721);
+	if (rt721->wf_id == RT721_S)
+		rt721_sdca_jack_preset(rt721);
+	else
+		rt721u_sdca_jack_preset(rt721);
 
 	if (rt721->hs_jack && (!rt721->first_hw_init))
 		rt721_sdca_jack_init(rt721);
diff --git a/sound/soc/codecs/rt721-sdca.h b/sound/soc/codecs/rt721-sdca.h
index b8873b18a648..16cf40cd88de 100644
--- a/sound/soc/codecs/rt721-sdca.h
+++ b/sound/soc/codecs/rt721-sdca.h
@@ -40,6 +40,8 @@ struct  rt721_sdca_priv {
 	/* For DMIC */
 	bool fu1e_dapm_mute;
 	bool fu1e_mixer_mute[4];
+	int wf_id;
+	int hw_vid;
 };
 
 struct rt721_sdca_dmic_kctrl_priv {
@@ -273,6 +275,16 @@ enum {
 	RT721_AIFS,
 };
 
+enum rt721_wf_id {
+	RT721_S,
+	RT721_U,
+};
+
+enum rt721u_hw_ver {
+	RT721_U_VB = 1,
+	RT721_U_VD = 3,
+};
+
 int rt721_sdca_io_init(struct device *dev, struct sdw_slave *slave);
 int rt721_sdca_init(struct device *dev, struct regmap *regmap,
 			struct regmap *mbq_regmap, struct sdw_slave *slave);
diff --git a/sound/soc/sdw_utils/soc_sdw_utils.c b/sound/soc/sdw_utils/soc_sdw_utils.c
index 88031238c04e..dccc27921272 100644
--- a/sound/soc/sdw_utils/soc_sdw_utils.c
+++ b/sound/soc/sdw_utils/soc_sdw_utils.c
@@ -685,6 +685,52 @@ struct asoc_sdw_codec_info codec_info_list[] = {
 		},
 		.dai_num = 3,
 	},
+	{
+		.vendor_id = 0x025d,
+		.part_id = 0x718,
+		.name_prefix = "rt721",
+		.version_id = 3,
+		.dais = {
+			{
+				.direction = {true, true},
+				.dai_name = "rt721-sdca-aif1",
+				.dai_type = SOC_SDW_DAI_TYPE_JACK,
+				.dailink = {SOC_SDW_JACK_OUT_DAI_ID, SOC_SDW_JACK_IN_DAI_ID},
+				.init = asoc_sdw_rt_sdca_jack_init,
+				.exit = asoc_sdw_rt_sdca_jack_exit,
+				.rtd_init = asoc_sdw_rt_sdca_jack_rtd_init,
+				.controls = generic_jack_controls,
+				.num_controls = ARRAY_SIZE(generic_jack_controls),
+				.widgets = generic_jack_widgets,
+				.num_widgets = ARRAY_SIZE(generic_jack_widgets),
+			},
+			{
+				.direction = {true, false},
+				.dai_name = "rt721-sdca-aif2",
+				.component_name = "rt721",
+				.dai_type = SOC_SDW_DAI_TYPE_AMP,
+				/* No feedback capability is provided by rt721-sdca codec driver*/
+				.dailink = {SOC_SDW_AMP_OUT_DAI_ID, SOC_SDW_UNUSED_DAI_ID},
+				.init = asoc_sdw_rt_amp_init,
+				.exit = asoc_sdw_rt_amp_exit,
+				.rtd_init = asoc_sdw_rt_mf_sdca_spk_rtd_init,
+				.controls = generic_spk_controls,
+				.num_controls = ARRAY_SIZE(generic_spk_controls),
+				.widgets = generic_spk_widgets,
+				.num_widgets = ARRAY_SIZE(generic_spk_widgets),
+			},
+			{
+				.direction = {false, true},
+				.dai_name = "rt721-sdca-aif3",
+				.dai_type = SOC_SDW_DAI_TYPE_MIC,
+				.dailink = {SOC_SDW_UNUSED_DAI_ID, SOC_SDW_DMIC_DAI_ID},
+				.rtd_init = asoc_sdw_rt_dmic_rtd_init,
+				.quirk = SOC_SDW_CODEC_MIC,
+				.quirk_exclude = true,
+			},
+		},
+		.dai_num = 3,
+	},
 	{
 		.vendor_id = 0x025d,
 		.part_id = 0x722,
-- 
2.54.0


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] ASoC: rt721: Add support for the RT721_U and RT718 codec variants
  2026-09-17 10:42 [PATCH] ASoC: rt721: Add support for the RT721_U and RT718 codec variants Oder Chiou
@ 2026-09-22 10:48 ` Mark Brown
  0 siblings, 0 replies; 2+ messages in thread
From: Mark Brown @ 2026-09-22 10:48 UTC (permalink / raw)
  To: lgirdwood, Oder Chiou
  Cc: linux-sound, lars, flove, shumingf, jack.yu, derek.fang

On Thu, 17 Sep 2026 18:42:44 +0800, Oder Chiou wrote:
> ASoC: rt721: Add support for the RT721_U and RT718 codec variants

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-7.4

Thanks!

[1/1] ASoC: rt721: Add support for the RT721_U and RT718 codec variants
      https://git.kernel.org/broonie/sound/c/7325b35a12d7

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-09-22 12:35 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-17 10:42 [PATCH] ASoC: rt721: Add support for the RT721_U and RT718 codec variants Oder Chiou
2026-09-22 10:48 ` Mark Brown

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox