Commit 20629a48 authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Stefan Schmidt
Browse files

ieee802154: ca8210: Switch to using gpiod API



This updates the driver to gpiod API, and removes yet another use of
of_get_named_gpio().

With this, invert the logic of the reset pin which is active-low
and add a quirk for the legacy and incorrect device tree descriptions.

Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Reviewed-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/20250305105656.2133487-4-andriy.shevchenko@linux.intel.com


Signed-off-by: default avatarStefan Schmidt <stefan@datenfreihafen.org>
parent 0a3e89b0
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -203,6 +203,15 @@ static void of_gpio_try_fixup_polarity(const struct device_node *np,
		 */
		{ "qi,lb60",		"rb-gpios",	true },
#endif
#if IS_ENABLED(CONFIG_IEEE802154_CA8210)
		/*
		 * According to the datasheet, the NRST pin 27 is an active-low
		 * signal. However, the device tree schema and admittedly
		 * the out-of-tree implementations have been used for a long
		 * time incorrectly by describing reset GPIO as active-high.
		 */
		{ "cascoda,ca8210",	"reset-gpio",	false },
#endif
#if IS_ENABLED(CONFIG_PCI_LANTIQ)
		/*
		 * According to the PCI specification, the RST# pin is an
+19 −38
Original line number Diff line number Diff line
@@ -52,12 +52,10 @@
#include <linux/debugfs.h>
#include <linux/delay.h>
#include <linux/gpio/consumer.h>
#include <linux/gpio.h>
#include <linux/ieee802154.h>
#include <linux/io.h>
#include <linux/kfifo.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/poll.h>
@@ -350,8 +348,8 @@ struct work_priv_container {
 * @extclockenable: true if the external clock is to be enabled
 * @extclockfreq:   frequency of the external clock
 * @extclockgpio:   ca8210 output gpio of the external clock
 * @gpio_reset:     gpio number of ca8210 reset line
 * @gpio_irq:       gpio number of ca8210 interrupt line
 * @reset_gpio:     ca8210 reset GPIO descriptor
 * @irq_gpio:       ca8210 interrupt GPIO descriptor
 * @irq_id:         identifier for the ca8210 irq
 *
 */
@@ -359,8 +357,8 @@ struct ca8210_platform_data {
	bool extclockenable;
	unsigned int extclockfreq;
	unsigned int extclockgpio;
	int gpio_reset;
	int gpio_irq;
	struct gpio_desc *reset_gpio;
	struct gpio_desc *irq_gpio;
	int irq_id;
};

@@ -632,10 +630,10 @@ static void ca8210_reset_send(struct spi_device *spi, unsigned int ms)
	struct ca8210_priv *priv = spi_get_drvdata(spi);
	long status;

	gpio_set_value(pdata->gpio_reset, 0);
	gpiod_set_value(pdata->reset_gpio, 1);
	reinit_completion(&priv->ca8210_is_awake);
	msleep(ms);
	gpio_set_value(pdata->gpio_reset, 1);
	gpiod_set_value(pdata->reset_gpio, 0);
	priv->promiscuous = false;

	/* Wait until wakeup indication seen */
@@ -2788,24 +2786,14 @@ static int ca8210_reset_init(struct spi_device *spi)
{
	struct device *dev = &spi->dev;
	struct ca8210_platform_data *pdata = dev_get_platdata(dev);
	int ret;

	pdata->gpio_reset = of_get_named_gpio(
		spi->dev.of_node,
		"reset-gpio",
		0
	);

	ret = gpio_direction_output(pdata->gpio_reset, 1);
	if (ret < 0) {
		dev_crit(
			&spi->dev,
			"Reset GPIO %d did not set to output mode\n",
			pdata->gpio_reset
		);
	pdata->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
	if (IS_ERR(pdata->reset_gpio)) {
		dev_crit(dev, "Reset GPIO did not set to output mode\n");
		return PTR_ERR(pdata->reset_gpio);
	}

	return ret;
	return 0;
}

/**
@@ -2820,20 +2808,15 @@ static int ca8210_interrupt_init(struct spi_device *spi)
	struct ca8210_platform_data *pdata = dev_get_platdata(dev);
	int ret;

	pdata->gpio_irq = of_get_named_gpio(
		spi->dev.of_node,
		"irq-gpio",
		0
	);
	pdata->irq_gpio = devm_gpiod_get(dev, "irq", GPIOD_IN);
	if (IS_ERR(pdata->irq_gpio)) {
		dev_crit(dev, "Could not retrieve IRQ GPIO\n");
		return PTR_ERR(pdata->irq_gpio);
	}

	pdata->irq_id = gpio_to_irq(pdata->gpio_irq);
	pdata->irq_id = gpiod_to_irq(pdata->irq_gpio);
	if (pdata->irq_id < 0) {
		dev_crit(
			&spi->dev,
			"Could not get irq for gpio pin %d\n",
			pdata->gpio_irq
		);
		gpio_free(pdata->gpio_irq);
		dev_crit(dev, "Could not get irq for IRQ GPIO\n");
		return pdata->irq_id;
	}

@@ -2844,10 +2827,8 @@ static int ca8210_interrupt_init(struct spi_device *spi)
		"ca8210-irq",
		spi_get_drvdata(spi)
	);
	if (ret) {
	if (ret)
		dev_crit(&spi->dev, "request_irq %d failed\n", pdata->irq_id);
		gpio_free(pdata->gpio_irq);
	}

	return ret;
}