public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v1] ALSA: hda/tas2781: Support ACPI_ID both TXNW2781 and TIAS2781
@ 2023-09-10  7:27 Shenghao Ding
  2023-09-10  7:52 ` Biju Das
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Shenghao Ding @ 2023-09-10  7:27 UTC (permalink / raw)
  To: tiwai
  Cc: robh+dt, andriy.shevchenko, lgirdwood, perex,
	pierre-louis.bossart, kevin-lu, 13916275206, alsa-devel,
	linux-kernel, liam.r.girdwood, mengdong.lin, baojun.xu,
	thomas.gfeller, peeyush, navada, broonie, gentuser, Shenghao Ding

Support ACPI_ID both TXNW2781 and TIAS2781, TXNW2781 is the only one legal
ACPI ID, TIAS2781 is the widely-used ACPI ID named by our customers, so
far it is not registered. We have discussed this with them, they requested
TIAS2781 must be supported for the laptops already released to market,
their new laptops will switch to TXNW2781.

Signed-off-by: Shenghao Ding <shenghao-ding@ti.com>

---
Changes in v1:
 - Add TXNW2781 into tas2781_acpi_hda_match and move it to the top
 - Redefine tas2781_generic_fixup, remove hid param
 - TIAS2781 has been used by our customers, see following dstd.dsl. We
    have discussed this with them, they requested TIAS2781 must be
    supported for the laptops already released to market, their new
    laptops will switch to TXNW2781
   Name (_HID, "TIAS2781")  // _HID: Hardware ID
   Name (_UID, Zero)  // _UID: Unique ID
   Method (_SUB, 0, NotSerialized)  // _SUB: Subsystem ID
   {
       If ((SPID == Zero))
       {
          Return ("17AA3886")
       }

       If ((SPID == One))
       {
           Return ("17AA3884")
       }
   }
 - Add TXNW2781 support in comp_match_tas2781_dev_name
---
 sound/pci/hda/patch_realtek.c   | 36 ++++++++++++++++++---------------
 sound/pci/hda/tas2781_hda_i2c.c | 33 ++++++++++++++++++------------
 2 files changed, 40 insertions(+), 29 deletions(-)

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index b7e78bfcff..6dae58a8ef 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -6770,24 +6770,35 @@ static int comp_match_cs35l41_dev_name(struct device *dev, void *data)
 	return !strcmp(d + n, tmp);
 }
 
+/* TIAS2781 is the unofficial ACPI id, but widely used in current devices.
+ * TXNW2781 is the official ACPI id, and will be used in the new devices.
+ * Check TIAS2781 or TXNW2781
+ */
 static int comp_match_tas2781_dev_name(struct device *dev,
 	void *data)
 {
-	struct scodec_dev_name *p = data;
+	const char c[][10] = { "TXNW2781", "TIAS2781" };
 	const char *d = dev_name(dev);
-	int n = strlen(p->bus);
+	const char *bus = data;
+	int n = strlen(bus), i;
 	char tmp[32];
 
 	/* check the bus name */
-	if (strncmp(d, p->bus, n))
+	if (strncmp(d, bus, n))
 		return 0;
 	/* skip the bus number */
 	if (isdigit(d[n]))
 		n++;
-	/* the rest must be exact matching */
-	snprintf(tmp, sizeof(tmp), "-%s:00", p->hid);
 
-	return !strcmp(d + n, tmp);
+	for (i = 0; i < ARRAY_SIZE(c); i++) {
+		/* the rest must be exact matching */
+		snprintf(tmp, sizeof(tmp), "-%s:00", c[i]);
+
+		if (!strcmp(d + n, tmp))
+			return 1;
+	}
+
+	return 0;
 }
 
 static void cs35l41_generic_fixup(struct hda_codec *cdc, int action, const char *bus,
@@ -6824,24 +6835,17 @@ static void cs35l41_generic_fixup(struct hda_codec *cdc, int action, const char
 }
 
 static void tas2781_generic_fixup(struct hda_codec *cdc, int action,
-	const char *bus, const char *hid)
+	const char *bus)
 {
 	struct device *dev = hda_codec_dev(cdc);
 	struct alc_spec *spec = cdc->spec;
-	struct scodec_dev_name *rec;
 	int ret;
 
 	switch (action) {
 	case HDA_FIXUP_ACT_PRE_PROBE:
-		rec = devm_kmalloc(dev, sizeof(*rec), GFP_KERNEL);
-		if (!rec)
-			return;
-		rec->bus = bus;
-		rec->hid = hid;
-		rec->index = 0;
 		spec->comps[0].codec = cdc;
 		component_match_add(dev, &spec->match,
-			comp_match_tas2781_dev_name, rec);
+			comp_match_tas2781_dev_name, (void *)bus);
 		ret = component_master_add_with_match(dev, &comp_master_ops,
 			spec->match);
 		if (ret)
@@ -6888,7 +6892,7 @@ static void alc287_fixup_legion_16ithg6_speakers(struct hda_codec *cdc, const st
 static void tas2781_fixup_i2c(struct hda_codec *cdc,
 	const struct hda_fixup *fix, int action)
 {
-	 tas2781_generic_fixup(cdc, action, "i2c", "TIAS2781");
+	 tas2781_generic_fixup(cdc, action, "i2c");
 }
 
 /* for alc295_fixup_hp_top_speakers */
diff --git a/sound/pci/hda/tas2781_hda_i2c.c b/sound/pci/hda/tas2781_hda_i2c.c
index fb80280293..8493952305 100644
--- a/sound/pci/hda/tas2781_hda_i2c.c
+++ b/sound/pci/hda/tas2781_hda_i2c.c
@@ -65,6 +65,16 @@ enum calib_data {
 	CALIB_MAX
 };
 
+/* TIAS2781 is the unofficial ACPI id, but widely used in current devices.
+ * TXNW2781 is the official ACPI id, and will be used in the new devices.
+ */
+static const struct acpi_device_id tas2781_acpi_hda_match[] = {
+	{"TIAS2781", 0 },
+	{"TXNW2781", 1 },
+	{}
+};
+MODULE_DEVICE_TABLE(acpi, tas2781_acpi_hda_match);
+
 static int tas2781_get_i2c_res(struct acpi_resource *ares, void *data)
 {
 	struct tasdevice_priv *tas_priv = data;
@@ -644,20 +654,23 @@ static void tas2781_hda_remove(struct device *dev)
 static int tas2781_hda_i2c_probe(struct i2c_client *clt)
 {
 	struct tasdevice_priv *tas_priv;
-	const char *device_name;
-	int ret;
+	int ret, i;
 
-	if (strstr(dev_name(&clt->dev), "TIAS2781"))
-		device_name = "TIAS2781";
-	else
-		return -ENODEV;
+	/* Check TIAS2781 or TXNW2781 */
+	for (i = 0; i < ARRAY_SIZE(tas2781_acpi_hda_match); i++)
+		if (strstr(dev_name(&clt->dev), tas2781_acpi_hda_match[i].id))
+			break;
+
+	if (i == ARRAY_SIZE(tas2781_acpi_hda_match))
+		return dev_err_probe(tas_priv->dev, -ENODEV,
+			"Device not available\n");
 
 	tas_priv = tasdevice_kzalloc(clt);
 	if (!tas_priv)
 		return -ENOMEM;
 
 	tas_priv->irq_info.irq = clt->irq;
-	ret = tas2781_read_acpi(tas_priv, device_name);
+	ret = tas2781_read_acpi(tas_priv, tas2781_acpi_hda_match[i].id);
 	if (ret)
 		return dev_err_probe(tas_priv->dev, ret,
 			"Platform not supported\n");
@@ -822,12 +835,6 @@ static const struct i2c_device_id tas2781_hda_i2c_id[] = {
 	{}
 };
 
-static const struct acpi_device_id tas2781_acpi_hda_match[] = {
-	{"TIAS2781", 0 },
-	{}
-};
-MODULE_DEVICE_TABLE(acpi, tas2781_acpi_hda_match);
-
 static struct i2c_driver tas2781_hda_i2c_driver = {
 	.driver = {
 		.name		= "tas2781-hda",
-- 
2.34.1


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

end of thread, other threads:[~2023-09-12 16:29 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-09-10  7:27 [PATCH v1] ALSA: hda/tas2781: Support ACPI_ID both TXNW2781 and TIAS2781 Shenghao Ding
2023-09-10  7:52 ` Biju Das
2023-09-11 10:23 ` Andy Shevchenko
2023-09-12 16:11 ` kernel test robot

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