Skip to content

Commit

Permalink
ASoC: tas2781-i2c: Drop weird GPIO code
Browse files Browse the repository at this point in the history
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: ef3bcde ("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>
  • Loading branch information
Linus Walleij authored and Mark Brown committed Aug 7, 2024
1 parent 7d2fb38 commit c2c0b67
Show file tree
Hide file tree
Showing 5 changed files with 5 additions and 32 deletions.
7 changes: 1 addition & 6 deletions include/sound/tas2781.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,19 +81,13 @@ struct tasdevice {
bool is_loaderr;
};

struct tasdevice_irqinfo {
int irq_gpio;
int irq;
};

struct calidata {
unsigned char *data;
unsigned long total_sz;
};

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;
Expand All @@ -115,6 +109,7 @@ struct tasdevice_priv {
unsigned int chip_id;
unsigned int sysclk;

int irq;
int cur_prog;
int cur_conf;
int fw_state;
Expand Down
2 changes: 1 addition & 1 deletion sound/pci/hda/tas2781_hda_i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -814,7 +814,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,
Expand Down
3 changes: 0 additions & 3 deletions sound/soc/codecs/tas2781-comlib.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -411,8 +410,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);
Expand Down
1 change: 0 additions & 1 deletion sound/soc/codecs/tas2781-fmwlib.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
24 changes: 3 additions & 21 deletions sound/soc/codecs/tas2781-i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -758,7 +757,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,
Expand All @@ -773,7 +772,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;
Expand All @@ -785,7 +784,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;
Expand All @@ -801,23 +800,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)
Expand Down

0 comments on commit c2c0b67

Please sign in to comment.