RE: [PATCH v1] ALSA: hda/tas2781: Support ACPI_ID both TXNW2781 and TIAS2781

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Shenghao Ding,

Thanks for the patch.

> Subject: [PATCH v1] ALSA: hda/tas2781: Support ACPI_ID both TXNW2781 and
> TIAS2781
> 
> 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@xxxxxx>
> 
> ---
> 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" };

This you should get from match_data().
See below.

>  	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++)

Why not aviding for loop as it can be retrieved directly
using i2c_get_match_data()?

Update the ACPI/ID table to use pointer to the device_name
as data in the table.

Then,

device_name = i2c_get_match_data(client);
if (!device_name && strstr(dev_name(&clt->dev), device_name)))
	return dev_err_probe(tas_priv->dev, -ENODEV,
	"Device not available\n");

Cheers,
Biju

> +static const struct acpi_device_id tas2781_acpi_hda_match[] = {
> +	{"TIAS2781", 0 },
> +	{"TXNW2781", 1 },
> +	{}
> +};


> +		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





[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Pulse Audio]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux