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)
                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;
                }
 
        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;
 
 #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"
 {
        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)
 {
        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);
 
        int loop, ret;
        u32 chipid;
 
-       if (!resume)
-               sdio_priv->irq_gpio = wilc->dev_irq_num;
-
        /**
         *      function 0 csa enable
         **/
 
 {
        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);
        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)
 {
        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);
 
 
 #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)