wifi: wl1251: switch to using gpiod API
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Wed, 9 Nov 2022 22:42:50 +0000 (14:42 -0800)
committerKalle Valo <kvalo@kernel.org>
Wed, 16 Nov 2022 09:37:37 +0000 (11:37 +0200)
Switch the driver from legacy gpio API to the newer gpiod API.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20221109224250.2885119-3-dmitry.torokhov@gmail.com
drivers/net/wireless/ti/wl1251/spi.c
drivers/net/wireless/ti/wl1251/wl1251.h

index 08d9814..29292f0 100644 (file)
@@ -5,6 +5,7 @@
  * Copyright (C) 2008 Nokia Corporation
  */
 
+#include <linux/err.h>
 #include <linux/interrupt.h>
 #include <linux/irq.h>
 #include <linux/module.h>
 #include <linux/swab.h>
 #include <linux/crc7.h>
 #include <linux/spi/spi.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/of.h>
-#include <linux/of_gpio.h>
 #include <linux/regulator/consumer.h>
 
 #include "wl1251.h"
 #include "reg.h"
 #include "spi.h"
 
+struct wl1251_spi {
+       struct spi_device *spi;
+       struct gpio_desc *power_gpio;
+};
+
 static irqreturn_t wl1251_irq(int irq, void *cookie)
 {
        struct wl1251 *wl;
@@ -34,13 +39,9 @@ static irqreturn_t wl1251_irq(int irq, void *cookie)
        return IRQ_HANDLED;
 }
 
-static struct spi_device *wl_to_spi(struct wl1251 *wl)
-{
-       return wl->if_priv;
-}
-
 static void wl1251_spi_reset(struct wl1251 *wl)
 {
+       struct wl1251_spi *wl_spi = wl->if_priv;
        u8 *cmd;
        struct spi_transfer t;
        struct spi_message m;
@@ -60,7 +61,7 @@ static void wl1251_spi_reset(struct wl1251 *wl)
        t.len = WSPI_INIT_CMD_LEN;
        spi_message_add_tail(&t, &m);
 
-       spi_sync(wl_to_spi(wl), &m);
+       spi_sync(wl_spi->spi, &m);
 
        wl1251_dump(DEBUG_SPI, "spi reset -> ", cmd, WSPI_INIT_CMD_LEN);
 
@@ -69,6 +70,7 @@ static void wl1251_spi_reset(struct wl1251 *wl)
 
 static void wl1251_spi_wake(struct wl1251 *wl)
 {
+       struct wl1251_spi *wl_spi = wl->if_priv;
        struct spi_transfer t;
        struct spi_message m;
        u8 *cmd = kzalloc(WSPI_INIT_CMD_LEN, GFP_KERNEL);
@@ -112,7 +114,7 @@ static void wl1251_spi_wake(struct wl1251 *wl)
        t.len = WSPI_INIT_CMD_LEN;
        spi_message_add_tail(&t, &m);
 
-       spi_sync(wl_to_spi(wl), &m);
+       spi_sync(wl_spi->spi, &m);
 
        wl1251_dump(DEBUG_SPI, "spi init -> ", cmd, WSPI_INIT_CMD_LEN);
 
@@ -128,6 +130,7 @@ static void wl1251_spi_reset_wake(struct wl1251 *wl)
 static void wl1251_spi_read(struct wl1251 *wl, int addr, void *buf,
                            size_t len)
 {
+       struct wl1251_spi *wl_spi = wl->if_priv;
        struct spi_transfer t[3];
        struct spi_message m;
        u8 *busy_buf;
@@ -157,7 +160,7 @@ static void wl1251_spi_read(struct wl1251 *wl, int addr, void *buf,
        t[2].len = len;
        spi_message_add_tail(&t[2], &m);
 
-       spi_sync(wl_to_spi(wl), &m);
+       spi_sync(wl_spi->spi, &m);
 
        /* FIXME: check busy words */
 
@@ -168,6 +171,7 @@ static void wl1251_spi_read(struct wl1251 *wl, int addr, void *buf,
 static void wl1251_spi_write(struct wl1251 *wl, int addr, void *buf,
                             size_t len)
 {
+       struct wl1251_spi *wl_spi = wl->if_priv;
        struct spi_transfer t[2];
        struct spi_message m;
        u32 *cmd;
@@ -190,7 +194,7 @@ static void wl1251_spi_write(struct wl1251 *wl, int addr, void *buf,
        t[1].len = len;
        spi_message_add_tail(&t[1], &m);
 
-       spi_sync(wl_to_spi(wl), &m);
+       spi_sync(wl_spi->spi, &m);
 
        wl1251_dump(DEBUG_SPI, "spi_write cmd -> ", cmd, sizeof(*cmd));
        wl1251_dump(DEBUG_SPI, "spi_write buf -> ", buf, len);
@@ -208,8 +212,10 @@ static void wl1251_spi_disable_irq(struct wl1251 *wl)
 
 static int wl1251_spi_set_power(struct wl1251 *wl, bool enable)
 {
-       if (gpio_is_valid(wl->power_gpio))
-               gpio_set_value(wl->power_gpio, enable);
+       struct wl1251_spi *wl_spi = wl->if_priv;
+
+       if (wl_spi->power_gpio)
+               gpiod_set_value_cansleep(wl_spi->power_gpio, enable);
 
        return 0;
 }
@@ -227,12 +233,19 @@ static int wl1251_spi_probe(struct spi_device *spi)
 {
        struct device_node *np = spi->dev.of_node;
        struct ieee80211_hw *hw;
+       struct wl1251_spi *wl_spi;
        struct wl1251 *wl;
        int ret;
 
        if (!np)
                return -ENODEV;
 
+       wl_spi = devm_kzalloc(&spi->dev, sizeof(*wl_spi), GFP_KERNEL);
+       if (!wl_spi)
+               return -ENOMEM;
+
+       wl_spi->spi = spi;
+
        hw = wl1251_alloc_hw();
        if (IS_ERR(hw))
                return PTR_ERR(hw);
@@ -241,7 +254,7 @@ static int wl1251_spi_probe(struct spi_device *spi)
 
        SET_IEEE80211_DEV(hw, &spi->dev);
        spi_set_drvdata(spi, wl);
-       wl->if_priv = spi;
+       wl->if_priv = wl_spi;
        wl->if_ops = &wl1251_spi_ops;
 
        /* This is the only SPI value that we need to set here, the rest
@@ -257,25 +270,17 @@ static int wl1251_spi_probe(struct spi_device *spi)
 
        wl->use_eeprom = of_property_read_bool(np, "ti,wl1251-has-eeprom");
 
-       wl->power_gpio = of_get_named_gpio(np, "ti,power-gpio", 0);
-       if (wl->power_gpio == -EPROBE_DEFER) {
-               ret = -EPROBE_DEFER;
-               goto out_free;
-       }
-
-       if (gpio_is_valid(wl->power_gpio)) {
-               ret = devm_gpio_request_one(&spi->dev, wl->power_gpio,
-                                       GPIOF_OUT_INIT_LOW, "wl1251 power");
-               if (ret) {
+       wl_spi->power_gpio = devm_gpiod_get_optional(&spi->dev, "ti,power",
+                                                    GPIOD_OUT_LOW);
+       ret = PTR_ERR_OR_ZERO(wl_spi->power_gpio);
+       if (ret) {
+               if (ret != -EPROBE_DEFER)
                        wl1251_error("Failed to request gpio: %d\n", ret);
-                       goto out_free;
-               }
-       } else {
-               wl1251_error("set power gpio missing in platform data");
-               ret = -ENODEV;
                goto out_free;
        }
 
+       gpiod_set_consumer_name(wl_spi->power_gpio, "wl1251 power");
+
        wl->irq = spi->irq;
        if (wl->irq < 0) {
                wl1251_error("irq missing in platform data");
index 23ae07d..83adbc3 100644 (file)
@@ -262,7 +262,6 @@ struct wl1251 {
        void *if_priv;
        const struct wl1251_if_operations *if_ops;
 
-       int power_gpio;
        int irq;
        bool use_eeprom;