From: Ajay Singh <ajay.kat...@microchip.com>

Make use of 'interrupts' property instead of using gpio for handling
the interrupt as suggested in [1].

[1]. https://lore.kernel.org/linux-wireless/20200303015558.GA6876@bogus

Signed-off-by: Ajay Singh <ajay.kat...@microchip.com>
---
 drivers/staging/wilc1000/netdev.c | 24 ++++++++----------------
 drivers/staging/wilc1000/netdev.h |  1 -
 drivers/staging/wilc1000/sdio.c   | 31 ++++++++++++-------------------
 drivers/staging/wilc1000/spi.c    | 15 +--------------
 drivers/staging/wilc1000/wlan.h   |  1 -
 5 files changed, 21 insertions(+), 51 deletions(-)

diff --git a/drivers/staging/wilc1000/netdev.c 
b/drivers/staging/wilc1000/netdev.c
index 045f5cdfdca0..a61c1a7aefa8 100644
--- a/drivers/staging/wilc1000/netdev.c
+++ b/drivers/staging/wilc1000/netdev.c
@@ -46,29 +46,21 @@ static irqreturn_t isr_bh_routine(int irq, void *userdata)
 
 static int init_irq(struct net_device *dev)
 {
-       int ret = 0;
        struct wilc_vif *vif = netdev_priv(dev);
        struct wilc *wl = vif->wilc;
-
-       ret = gpiod_direction_input(wl->gpio_irq);
-       if (ret) {
-               netdev_err(dev, "could not obtain gpio for WILC_INTR\n");
-               return ret;
-       }
-
-       wl->dev_irq_num = gpiod_to_irq(wl->gpio_irq);
+       int ret;
 
        ret = request_threaded_irq(wl->dev_irq_num, isr_uh_routine,
                                   isr_bh_routine,
                                   IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
                                   "WILC_IRQ", dev);
-       if (ret < 0)
-               netdev_err(dev, "Failed to request IRQ\n");
-       else
-               netdev_dbg(dev, "IRQ request succeeded IRQ-NUM= %d\n",
-                          wl->dev_irq_num);
+       if (ret) {
+               netdev_err(dev, "Failed to request IRQ [%d]\n", ret);
+               return ret;
+       }
+       netdev_dbg(dev, "IRQ request succeeded IRQ-NUM= %d\n", wl->dev_irq_num);
 
-       return ret;
+       return 0;
 }
 
 static void deinit_irq(struct net_device *dev)
@@ -501,7 +493,7 @@ static int wilc_wlan_initialize(struct net_device *dev, 
struct wilc_vif *vif)
                if (ret)
                        goto fail_wilc_wlan;
 
-               if (wl->gpio_irq && init_irq(dev)) {
+               if (wl->dev_irq_num && init_irq(dev)) {
                        ret = -EIO;
                        goto fail_threads;
                }
diff --git a/drivers/staging/wilc1000/netdev.h 
b/drivers/staging/wilc1000/netdev.h
index e3689e2a4abb..61cbec674a62 100644
--- a/drivers/staging/wilc1000/netdev.h
+++ b/drivers/staging/wilc1000/netdev.h
@@ -209,7 +209,6 @@ struct wilc {
        const struct wilc_hif_func *hif_func;
        int io_type;
        s8 mac_status;
-       struct gpio_desc *gpio_irq;
        struct clk *rtc_clk;
        bool initialized;
        int dev_irq_num;
diff --git a/drivers/staging/wilc1000/sdio.c b/drivers/staging/wilc1000/sdio.c
index 2301e90c21ca..44b426874c1b 100644
--- a/drivers/staging/wilc1000/sdio.c
+++ b/drivers/staging/wilc1000/sdio.c
@@ -8,6 +8,7 @@
 #include <linux/mmc/sdio_func.h>
 #include <linux/mmc/host.h>
 #include <linux/mmc/sdio.h>
+#include <linux/of_irq.h>
 
 #include "netdev.h"
 #include "cfg80211.h"
@@ -122,33 +123,32 @@ static int wilc_sdio_probe(struct sdio_func *func,
 {
        struct wilc *wilc;
        int ret;
-       struct gpio_desc *gpio = NULL;
        struct wilc_sdio *sdio_priv;
 
        sdio_priv = kzalloc(sizeof(*sdio_priv), GFP_KERNEL);
        if (!sdio_priv)
                return -ENOMEM;
 
-       if (IS_ENABLED(CONFIG_WILC1000_HW_OOB_INTR)) {
-               gpio = gpiod_get(&func->dev, "irq", GPIOD_IN);
-               if (IS_ERR(gpio)) {
-                       /* get the GPIO descriptor from hardcode GPIO number */
-                       gpio = gpio_to_desc(GPIO_NUM);
-                       if (!gpio)
-                               dev_err(&func->dev, "failed to get irq gpio\n");
-               }
-       }
-
        ret = wilc_cfg80211_init(&wilc, &func->dev, WILC_HIF_SDIO,
                                 &wilc_hif_sdio);
        if (ret) {
                kfree(sdio_priv);
                return ret;
        }
+
+       if (IS_ENABLED(CONFIG_WILC1000_HW_OOB_INTR)) {
+               struct device_node *np = func->card->dev.of_node;
+               int irq_num = of_irq_get(np, 0);
+
+               if (irq_num > 0) {
+                       wilc->dev_irq_num = irq_num;
+                       sdio_priv->irq_gpio = true;
+               }
+       }
+
        sdio_set_drvdata(func, wilc);
        wilc->bus_data = sdio_priv;
        wilc->dev = &func->dev;
-       wilc->gpio_irq = gpio;
 
        wilc->rtc_clk = devm_clk_get(&func->card->dev, "rtc_clk");
        if (PTR_ERR_OR_ZERO(wilc->rtc_clk) == -EPROBE_DEFER)
@@ -164,10 +164,6 @@ static void wilc_sdio_remove(struct sdio_func *func)
 {
        struct wilc *wilc = sdio_get_drvdata(func);
 
-       /* free the GPIO in module remove */
-       if (wilc->gpio_irq)
-               gpiod_put(wilc->gpio_irq);
-
        if (!IS_ERR(wilc->rtc_clk))
                clk_disable_unprepare(wilc->rtc_clk);
 
@@ -592,9 +588,6 @@ static int wilc_sdio_init(struct wilc *wilc, bool resume)
        int loop, ret;
        u32 chipid;
 
-       if (!resume)
-               sdio_priv->irq_gpio = wilc->dev_irq_num;
-
        /**
         *      function 0 csa enable
         **/
diff --git a/drivers/staging/wilc1000/spi.c b/drivers/staging/wilc1000/spi.c
index dfd25df75780..852f318a86f0 100644
--- a/drivers/staging/wilc1000/spi.c
+++ b/drivers/staging/wilc1000/spi.c
@@ -151,21 +151,12 @@ static int wilc_bus_probe(struct spi_device *spi)
 {
        int ret;
        struct wilc *wilc;
-       struct gpio_desc *gpio;
        struct wilc_spi *spi_priv;
 
        spi_priv = kzalloc(sizeof(*spi_priv), GFP_KERNEL);
        if (!spi_priv)
                return -ENOMEM;
 
-       gpio = gpiod_get(&spi->dev, "irq", GPIOD_IN);
-       if (IS_ERR(gpio)) {
-               /* get the GPIO descriptor from hardcode GPIO number */
-               gpio = gpio_to_desc(GPIO_NUM);
-               if (!gpio)
-                       dev_err(&spi->dev, "failed to get the irq gpio\n");
-       }
-
        ret = wilc_cfg80211_init(&wilc, &spi->dev, WILC_HIF_SPI, &wilc_hif_spi);
        if (ret) {
                kfree(spi_priv);
@@ -175,7 +166,7 @@ static int wilc_bus_probe(struct spi_device *spi)
        spi_set_drvdata(spi, wilc);
        wilc->dev = &spi->dev;
        wilc->bus_data = spi_priv;
-       wilc->gpio_irq = gpio;
+       wilc->dev_irq_num = spi->irq;
 
        wilc->rtc_clk = devm_clk_get(&spi->dev, "rtc_clk");
        if (PTR_ERR_OR_ZERO(wilc->rtc_clk) == -EPROBE_DEFER)
@@ -190,10 +181,6 @@ static int wilc_bus_remove(struct spi_device *spi)
 {
        struct wilc *wilc = spi_get_drvdata(spi);
 
-       /* free the GPIO in module remove */
-       if (wilc->gpio_irq)
-               gpiod_put(wilc->gpio_irq);
-
        if (!IS_ERR(wilc->rtc_clk))
                clk_disable_unprepare(wilc->rtc_clk);
 
diff --git a/drivers/staging/wilc1000/wlan.h b/drivers/staging/wilc1000/wlan.h
index 5999c5490ea5..7689569cd82f 100644
--- a/drivers/staging/wilc1000/wlan.h
+++ b/drivers/staging/wilc1000/wlan.h
@@ -206,7 +206,6 @@
 #define WILC_TX_BUFF_SIZE      (64 * 1024)
 
 #define MODALIAS               "WILC_SPI"
-#define GPIO_NUM               0x44
 
 #define WILC_PKT_HDR_CONFIG_FIELD      BIT(31)
 #define WILC_PKT_HDR_OFFSET_FIELD      GENMASK(30, 22)
-- 
2.24.0
_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to