#include <linux/module.h>
 #include <linux/interrupt.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/delay.h>
 #include <linux/mmc/host.h>
 #include <linux/mmc/sdio_func.h>
        return ret;
 }
 
+/* Like the rest of the driver, this only supports one device per system */
+static struct gpio_desc *cw1200_reset;
+static struct gpio_desc *cw1200_powerup;
+
 static int cw1200_sdio_off(const struct cw1200_platform_data_sdio *pdata)
 {
-       if (pdata->reset) {
-               gpio_set_value(pdata->reset, 0);
+       if (cw1200_reset) {
+               gpiod_set_value(cw1200_reset, 0);
                msleep(30); /* Min is 2 * CLK32K cycles */
-               gpio_free(pdata->reset);
        }
 
        if (pdata->power_ctrl)
 
 static int cw1200_sdio_on(const struct cw1200_platform_data_sdio *pdata)
 {
-       /* Ensure I/Os are pulled low */
-       if (pdata->reset) {
-               gpio_request(pdata->reset, "cw1200_wlan_reset");
-               gpio_direction_output(pdata->reset, 0);
+       /* Ensure I/Os are pulled low (reset is active low) */
+       cw1200_reset = devm_gpiod_get_optional(NULL, "reset", GPIOD_OUT_HIGH);
+       if (IS_ERR(cw1200_reset)) {
+               pr_err("could not get CW1200 SDIO reset GPIO\n");
+               return PTR_ERR(cw1200_reset);
        }
-       if (pdata->powerup) {
-               gpio_request(pdata->powerup, "cw1200_wlan_powerup");
-               gpio_direction_output(pdata->powerup, 0);
+       gpiod_set_consumer_name(cw1200_reset, "cw1200_wlan_reset");
+       cw1200_powerup = devm_gpiod_get_optional(NULL, "powerup", GPIOD_OUT_LOW);
+       if (IS_ERR(cw1200_powerup)) {
+               pr_err("could not get CW1200 SDIO powerup GPIO\n");
+               return PTR_ERR(cw1200_powerup);
        }
-       if (pdata->reset || pdata->powerup)
+       gpiod_set_consumer_name(cw1200_powerup, "cw1200_wlan_powerup");
+
+       if (cw1200_reset || cw1200_powerup)
                msleep(10); /* Settle time? */
 
        /* Enable 3v3 and 1v8 to hardware */
        }
 
        /* Enable POWERUP signal */
-       if (pdata->powerup) {
-               gpio_set_value(pdata->powerup, 1);
+       if (cw1200_powerup) {
+               gpiod_set_value(cw1200_powerup, 1);
                msleep(250); /* or more..? */
        }
-       /* Enable RSTn signal */
-       if (pdata->reset) {
-               gpio_set_value(pdata->reset, 1);
+       /* Deassert RSTn signal, note active low */
+       if (cw1200_reset) {
+               gpiod_set_value(cw1200_reset, 0);
                msleep(50); /* Or more..? */
        }
        return 0;
 
  */
 
 #include <linux/module.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/delay.h>
 #include <linux/spinlock.h>
 #include <linux/interrupt.h>
        const struct cw1200_platform_data_spi *pdata;
        spinlock_t              lock; /* Serialize all bus operations */
        wait_queue_head_t       wq;
+       struct gpio_desc        *reset;
+       struct gpio_desc        *powerup;
        int claimed;
 };
 
        free_irq(self->func->irq, self);
 }
 
-static int cw1200_spi_off(const struct cw1200_platform_data_spi *pdata)
+static int cw1200_spi_off(struct hwbus_priv *self, const struct cw1200_platform_data_spi *pdata)
 {
-       if (pdata->reset) {
-               gpio_set_value(pdata->reset, 0);
+       if (self->reset) {
+               /* Assert RESET, note active low */
+               gpiod_set_value(self->reset, 1);
                msleep(30); /* Min is 2 * CLK32K cycles */
-               gpio_free(pdata->reset);
        }
 
        if (pdata->power_ctrl)
        return 0;
 }
 
-static int cw1200_spi_on(const struct cw1200_platform_data_spi *pdata)
+static int cw1200_spi_on(struct hwbus_priv *self, const struct cw1200_platform_data_spi *pdata)
 {
        /* Ensure I/Os are pulled low */
-       if (pdata->reset) {
-               gpio_request(pdata->reset, "cw1200_wlan_reset");
-               gpio_direction_output(pdata->reset, 0);
-       }
-       if (pdata->powerup) {
-               gpio_request(pdata->powerup, "cw1200_wlan_powerup");
-               gpio_direction_output(pdata->powerup, 0);
-       }
-       if (pdata->reset || pdata->powerup)
+       gpiod_direction_output(self->reset, 1); /* Active low */
+       gpiod_direction_output(self->powerup, 0);
+       if (self->reset || self->powerup)
                msleep(10); /* Settle time? */
 
        /* Enable 3v3 and 1v8 to hardware */
        }
 
        /* Enable POWERUP signal */
-       if (pdata->powerup) {
-               gpio_set_value(pdata->powerup, 1);
+       if (self->powerup) {
+               gpiod_set_value(self->powerup, 1);
                msleep(250); /* or more..? */
        }
-       /* Enable RSTn signal */
-       if (pdata->reset) {
-               gpio_set_value(pdata->reset, 1);
+       /* Assert RSTn signal, note active low */
+       if (self->reset) {
+               gpiod_set_value(self->reset, 0);
                msleep(50); /* Or more..? */
        }
        return 0;
                spi_get_chipselect(func, 0), func->mode, func->bits_per_word,
                func->max_speed_hz);
 
-       if (cw1200_spi_on(plat_data)) {
+       self = devm_kzalloc(&func->dev, sizeof(*self), GFP_KERNEL);
+       if (!self) {
+               pr_err("Can't allocate SPI hwbus_priv.");
+               return -ENOMEM;
+       }
+
+       /* Request reset asserted */
+       self->reset = devm_gpiod_get_optional(&func->dev, "reset", GPIOD_OUT_HIGH);
+       if (IS_ERR(self->reset))
+               return dev_err_probe(&func->dev, PTR_ERR(self->reset),
+                                    "could not get reset GPIO\n");
+       gpiod_set_consumer_name(self->reset, "cw1200_wlan_reset");
+
+       self->powerup = devm_gpiod_get_optional(&func->dev, "powerup", GPIOD_OUT_LOW);
+       if (IS_ERR(self->powerup))
+               return dev_err_probe(&func->dev, PTR_ERR(self->powerup),
+                                    "could not get powerup GPIO\n");
+       gpiod_set_consumer_name(self->reset, "cw1200_wlan_powerup");
+
+       if (cw1200_spi_on(self, plat_data)) {
                pr_err("spi_on() failed!\n");
-               return -1;
+               return -ENODEV;
        }
 
        if (spi_setup(func)) {
                pr_err("spi_setup() failed!\n");
-               return -1;
-       }
-
-       self = devm_kzalloc(&func->dev, sizeof(*self), GFP_KERNEL);
-       if (!self) {
-               pr_err("Can't allocate SPI hwbus_priv.");
-               return -ENOMEM;
+               return -ENODEV;
        }
 
        self->pdata = plat_data;
 
        if (status) {
                cw1200_spi_irq_unsubscribe(self);
-               cw1200_spi_off(plat_data);
+               cw1200_spi_off(self, plat_data);
        }
 
        return status;
                        self->core = NULL;
                }
        }
-       cw1200_spi_off(dev_get_platdata(&func->dev));
+       cw1200_spi_off(self, dev_get_platdata(&func->dev));
 }
 
 static int __maybe_unused cw1200_spi_suspend(struct device *dev)