]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ASoC: tas2781-i2c: Drop weird GPIO code
authorLinus Walleij <linus.walleij@linaro.org>
Wed, 7 Aug 2024 15:02:32 +0000 (17:02 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 4 Oct 2024 14:32:37 +0000 (16:32 +0200)
[ Upstream commit c2c0b67dca3cb3b3cea0dd60075a1c5ba77e2fcd ]

The tas2781-i2c driver gets an IRQ from either ACPI or device tree,
then proceeds to check if the IRQ has a corresponding GPIO and in
case it does enforce the GPIO as input and set a label on it.

This is abuse of the API:

- First we cannot guarantee that the numberspaces of the GPIOs and
  the IRQs are the same, i.e that an IRQ number corresponds to
  a GPIO number like that.

- Second, GPIO chips and IRQ chips should be treated as orthogonal
  APIs, the irqchip needs to ascertain that the backing GPIO line
  is set to input etc just using the irqchip.

- Third it is using the legacy <linux/gpio.h> API which should not
  be used in new code yet this was added just a year ago.

Delete the offending code.

If this creates problems the GPIO and irqchip maintainers can help
to fix the issues.

It *should* not create any problems, because the irq isn't
used anywhere in the driver, it's just obtained and then
left unused.

Fixes: ef3bcde75d06 ("ASoC: tas2781: Add tas2781 driver")
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://patch.msgid.link/20240807-asoc-tas-gpios-v2-1-bd0f2705d58b@linaro.org
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
include/sound/tas2781.h
sound/pci/hda/tas2781_hda_i2c.c
sound/soc/codecs/tas2781-comlib.c
sound/soc/codecs/tas2781-fmwlib.c
sound/soc/codecs/tas2781-i2c.c

index 99ca3e401fd1fe36422a77a71eb87c26bbdaeacf..6f6e3e2f652c96620936a5da2c5cecee1d5b62f0 100644 (file)
@@ -80,11 +80,6 @@ struct tasdevice {
        bool is_loaderr;
 };
 
-struct tasdevice_irqinfo {
-       int irq_gpio;
-       int irq;
-};
-
 struct calidata {
        unsigned char *data;
        unsigned long total_sz;
@@ -92,7 +87,6 @@ struct calidata {
 
 struct tasdevice_priv {
        struct tasdevice tasdevice[TASDEVICE_MAX_CHANNELS];
-       struct tasdevice_irqinfo irq_info;
        struct tasdevice_rca rcabin;
        struct calidata cali_data;
        struct tasdevice_fw *fmw;
@@ -113,6 +107,7 @@ struct tasdevice_priv {
        unsigned int chip_id;
        unsigned int sysclk;
 
+       int irq;
        int cur_prog;
        int cur_conf;
        int fw_state;
index 9e88d39eac1e2298b32bb4a9f7112e52de6c761e..0676b4160566079bfd1966be2b66710863aa08e0 100644 (file)
@@ -822,7 +822,7 @@ static int tas2781_hda_i2c_probe(struct i2c_client *clt)
        } else
                return -ENODEV;
 
-       tas_hda->priv->irq_info.irq = clt->irq;
+       tas_hda->priv->irq = clt->irq;
        ret = tas2781_read_acpi(tas_hda->priv, device_name);
        if (ret)
                return dev_err_probe(tas_hda->dev, ret,
index 3aa81514dad76f319e3bd0fc86b1709855dde28c..0444cf90c5119f580c336d0efae349c833abe637 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/interrupt.h>
 #include <linux/module.h>
 #include <linux/of.h>
-#include <linux/of_gpio.h>
 #include <linux/of_irq.h>
 #include <linux/regmap.h>
 #include <linux/slab.h>
@@ -406,8 +405,6 @@ EXPORT_SYMBOL_GPL(tasdevice_dsp_remove);
 
 void tasdevice_remove(struct tasdevice_priv *tas_priv)
 {
-       if (gpio_is_valid(tas_priv->irq_info.irq_gpio))
-               gpio_free(tas_priv->irq_info.irq_gpio);
        mutex_destroy(&tas_priv->codec_lock);
 }
 EXPORT_SYMBOL_GPL(tasdevice_remove);
index 8f9a3ae7153e948146b96e92f1205fc0dd7ea56b..f3a7605f07104323ba702a01d2d42dc4d9383be4 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/interrupt.h>
 #include <linux/module.h>
 #include <linux/of.h>
-#include <linux/of_gpio.h>
 #include <linux/of_irq.h>
 #include <linux/regmap.h>
 #include <linux/slab.h>
index 1963c777ba8e041491022c2e77bb55eb8b1bb5e6..d6bbf94d55713e46ba368325279c56dfe3a13fb5 100644 (file)
@@ -22,7 +22,6 @@
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
-#include <linux/of_gpio.h>
 #include <linux/of_irq.h>
 #include <linux/regmap.h>
 #include <linux/slab.h>
@@ -619,7 +618,7 @@ static void tasdevice_parse_dt(struct tasdevice_priv *tas_priv)
 {
        struct i2c_client *client = (struct i2c_client *)tas_priv->client;
        unsigned int dev_addrs[TASDEVICE_MAX_CHANNELS];
-       int rc, i, ndev = 0;
+       int i, ndev = 0;
 
        if (tas_priv->isacpi) {
                ndev = device_property_read_u32_array(&client->dev,
@@ -634,7 +633,7 @@ static void tasdevice_parse_dt(struct tasdevice_priv *tas_priv)
                                "ti,audio-slots", dev_addrs, ndev);
                }
 
-               tas_priv->irq_info.irq_gpio =
+               tas_priv->irq =
                        acpi_dev_gpio_irq_get(ACPI_COMPANION(&client->dev), 0);
        } else if (IS_ENABLED(CONFIG_OF)) {
                struct device_node *np = tas_priv->dev->of_node;
@@ -646,7 +645,7 @@ static void tasdevice_parse_dt(struct tasdevice_priv *tas_priv)
                        dev_addrs[ndev++] = addr;
                }
 
-               tas_priv->irq_info.irq_gpio = of_irq_get(np, 0);
+               tas_priv->irq = of_irq_get(np, 0);
        } else {
                ndev = 1;
                dev_addrs[0] = client->addr;
@@ -662,23 +661,6 @@ static void tasdevice_parse_dt(struct tasdevice_priv *tas_priv)
                        __func__);
 
        strcpy(tas_priv->dev_name, tasdevice_id[tas_priv->chip_id].name);
-
-       if (gpio_is_valid(tas_priv->irq_info.irq_gpio)) {
-               rc = gpio_request(tas_priv->irq_info.irq_gpio,
-                               "AUDEV-IRQ");
-               if (!rc) {
-                       gpio_direction_input(
-                               tas_priv->irq_info.irq_gpio);
-
-                       tas_priv->irq_info.irq =
-                               gpio_to_irq(tas_priv->irq_info.irq_gpio);
-               } else
-                       dev_err(tas_priv->dev, "%s: GPIO %d request error\n",
-                               __func__, tas_priv->irq_info.irq_gpio);
-       } else
-               dev_err(tas_priv->dev,
-                       "Looking up irq-gpio property failed %d\n",
-                       tas_priv->irq_info.irq_gpio);
 }
 
 static int tasdevice_i2c_probe(struct i2c_client *i2c)