This updates the driver to gpiod API, and removes yet another use of
of_get_named_gpio().
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/net/ieee802154/ca8210.c | 57 +++++++++++----------------------
1 file changed, 19 insertions(+), 38 deletions(-)
diff --git a/drivers/net/ieee802154/ca8210.c b/drivers/net/ieee802154/ca8210.c
index 65f042c8734b..d4c1f00d29fe 100644
--- a/drivers/net/ieee802154/ca8210.c
+++ b/drivers/net/ieee802154/ca8210.c
@@ -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, 0);
reinit_completion(&priv->ca8210_is_awake);
msleep(ms);
- gpio_set_value(pdata->gpio_reset, 1);
+ gpiod_set_value(pdata->reset_gpio, 1);
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_HIGH);
+ 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;
}
--
2.47.2
On Mon, Mar 3, 2025 at 5:49 PM Andy Shevchenko
<andriy.shevchenko@linux.intel.com> wrote:
> This updates the driver to gpiod API, and removes yet another use of
> of_get_named_gpio().
>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
But note:
> @@ -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, 0);
> reinit_completion(&priv->ca8210_is_awake);
> msleep(ms);
> - gpio_set_value(pdata->gpio_reset, 1);
> + gpiod_set_value(pdata->reset_gpio, 1);
This drives the GPIO low to assert reset, meaning it is something
that should have GPIO_ACTIVE_LOW set in the device tree,
and it might even have, so let's check what we can check:
git grep cascoda,ca8210
Documentation/devicetree/bindings/net/ieee802154/ca8210.txt: -
compatible: Should be "cascoda,ca8210"
Documentation/devicetree/bindings/net/ieee802154/ca8210.txt:
compatible = "cascoda,ca8210";
drivers/net/ieee802154/ca8210.c: {.compatible = "cascoda,ca8210", },
well ain't that typical, all users are out of tree. The example
in the bindings file is wrong, setting ACTIVE_HIGH. Sigh, let's
assume all those DTS files somewhere are wrong and they
didn't set GPIO_ACTIVE_LOW in them...
Maybe add a comment in the code that this is wrong and the
driver and DTS files should be fixed.
Alternatively patch Documentation/devicetree/bindings/net/ieee802154/ca8210.txt
to set GPIO_ACTIVE_LOW and fix the code to invert it both
here and when getting the GPIO, but it could cause problems
for outoftree users.
Either way, this is good progress:
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Yours,
Linus Walleij
Mon, Mar 03, 2025 at 09:00:39PM +0100, Linus Walleij kirjoitti:
> On Mon, Mar 3, 2025 at 5:49 PM Andy Shevchenko
> <andriy.shevchenko@linux.intel.com> wrote:
...
> > reinit_completion(&priv->ca8210_is_awake);
> > msleep(ms);
> > - gpio_set_value(pdata->gpio_reset, 1);
> > + gpiod_set_value(pdata->reset_gpio, 1);
>
> This drives the GPIO low to assert reset, meaning it is something
> that should have GPIO_ACTIVE_LOW set in the device tree,
Yeah, the pin 27 is marked as NRESET and description is pointing out to it as
active low.
> and it might even have, so let's check what we can check:
>
> git grep cascoda,ca8210
> Documentation/devicetree/bindings/net/ieee802154/ca8210.txt: -
> compatible: Should be "cascoda,ca8210"
> Documentation/devicetree/bindings/net/ieee802154/ca8210.txt:
> compatible = "cascoda,ca8210";
> drivers/net/ieee802154/ca8210.c: {.compatible = "cascoda,ca8210", },
>
> well ain't that typical, all users are out of tree. The example
> in the bindings file is wrong, setting ACTIVE_HIGH. Sigh, let's
> assume all those DTS files somewhere are wrong and they
> didn't set GPIO_ACTIVE_LOW in them...
> Maybe add a comment in the code that this is wrong and the
> driver and DTS files should be fixed.
Or maybe fix in the driver and schema and add a quirk to gpiolib-of.c?
> Alternatively patch Documentation/devicetree/bindings/net/ieee802154/ca8210.txt
> to set GPIO_ACTIVE_LOW and fix the code to invert it both
> here and when getting the GPIO, but it could cause problems
> for outoftree users.
Would it? We have such quirks to fix a polarity for other drivers/devices.
> Either way, this is good progress:
> Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Thank you!
--
With Best Regards,
Andy Shevchenko
On Mon, Mar 3, 2025 at 9:39 PM Andy Shevchenko <andy.shevchenko@gmail.com> wrote: > > Maybe add a comment in the code that this is wrong and the > > driver and DTS files should be fixed. > > Or maybe fix in the driver and schema and add a quirk to gpiolib-of.c? Even better! Yours, Linus Walleij
On Tue, Mar 04, 2025 at 01:03:41AM +0100, Linus Walleij wrote: > On Mon, Mar 3, 2025 at 9:39 PM Andy Shevchenko > <andy.shevchenko@gmail.com> wrote: > > > > Maybe add a comment in the code that this is wrong and the > > > driver and DTS files should be fixed. > > > > Or maybe fix in the driver and schema and add a quirk to gpiolib-of.c? > > Even better! I am about to send a v3, I'm going to leave your tag despite a few changes as discussed. I hope this is okay with you. -- With Best Regards, Andy Shevchenko
On Tue, Mar 4, 2025 at 12:13 PM Andy Shevchenko <andy.shevchenko@gmail.com> wrote: > On Tue, Mar 04, 2025 at 01:03:41AM +0100, Linus Walleij wrote: > > On Mon, Mar 3, 2025 at 9:39 PM Andy Shevchenko > > <andy.shevchenko@gmail.com> wrote: > > > > > > Maybe add a comment in the code that this is wrong and the > > > > driver and DTS files should be fixed. > > > > > > Or maybe fix in the driver and schema and add a quirk to gpiolib-of.c? > > > > Even better! > > I am about to send a v3, I'm going to leave your tag despite a few changes as > discussed. I hope this is okay with you. Of course! Linus Walleij
© 2016 - 2026 Red Hat, Inc.