#include <linux/fs.h>
 #include <linux/ip.h>
 #include <linux/dmapool.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/sched.h>
 #include <linux/time.h>
 #include <linux/wait.h>
 #define IFX_SPI_HEADER_F               (-2)
 
 #define PO_POST_DELAY          200
-#define IFX_MDM_RST_PMU        4
 
 /* forward reference */
 static void ifx_spi_handle_srdy(struct ifx_spi_device *ifx_dev);
 
 static int ifx_modem_power_off(struct ifx_spi_device *ifx_dev)
 {
-       gpio_set_value(IFX_MDM_RST_PMU, 1);
+       gpiod_set_value(ifx_dev->gpio.pmu_reset, 1);
        msleep(PO_POST_DELAY);
 
        return 0;
  */
 static inline void mrdy_set_high(struct ifx_spi_device *ifx)
 {
-       gpio_set_value(ifx->gpio.mrdy, 1);
+       gpiod_set_value(ifx->gpio.mrdy, 1);
 }
 
 /**
  */
 static inline void mrdy_set_low(struct ifx_spi_device *ifx)
 {
-       gpio_set_value(ifx->gpio.mrdy, 0);
+       gpiod_set_value(ifx->gpio.mrdy, 0);
 }
 
 /**
  */
 static void mrdy_assert(struct ifx_spi_device *ifx_dev)
 {
-       int val = gpio_get_value(ifx_dev->gpio.srdy);
+       int val = gpiod_get_value(ifx_dev->gpio.srdy);
        if (!val) {
                if (!test_and_set_bit(IFX_SPI_STATE_TIMER_PENDING,
                                      &ifx_dev->flags)) {
        clear_bit(IFX_SPI_STATE_IO_IN_PROGRESS, &(ifx_dev->flags));
 
        queue_length = kfifo_len(&ifx_dev->tx_fifo);
-       srdy = gpio_get_value(ifx_dev->gpio.srdy);
+       srdy = gpiod_get_value(ifx_dev->gpio.srdy);
        if (!srdy)
                ifx_spi_power_state_clear(ifx_dev, IFX_SPI_POWER_SRDY);
 
 static irqreturn_t ifx_spi_reset_interrupt(int irq, void *dev)
 {
        struct ifx_spi_device *ifx_dev = dev;
-       int val = gpio_get_value(ifx_dev->gpio.reset_out);
+       int val = gpiod_get_value(ifx_dev->gpio.reset_out);
        int solreset = test_bit(MR_START, &ifx_dev->mdm_reset_state);
 
        if (val == 0) {
         * to reset properly
         */
        set_bit(MR_START, &ifx_dev->mdm_reset_state);
-       gpio_set_value(ifx_dev->gpio.po, 0);
-       gpio_set_value(ifx_dev->gpio.reset, 0);
+       gpiod_set_value(ifx_dev->gpio.po, 0);
+       gpiod_set_value(ifx_dev->gpio.reset, 0);
        msleep(25);
-       gpio_set_value(ifx_dev->gpio.reset, 1);
+       gpiod_set_value(ifx_dev->gpio.reset, 1);
        msleep(1);
-       gpio_set_value(ifx_dev->gpio.po, 1);
+       gpiod_set_value(ifx_dev->gpio.po, 1);
        msleep(1);
-       gpio_set_value(ifx_dev->gpio.po, 0);
+       gpiod_set_value(ifx_dev->gpio.po, 0);
        ret = wait_event_timeout(ifx_dev->mdm_reset_wait,
                                 test_bit(MR_COMPLETE,
                                          &ifx_dev->mdm_reset_state),
                goto error_ret;
        }
 
-       ifx_dev->gpio.reset = pl_data->rst_pmu;
-       ifx_dev->gpio.po = pl_data->pwr_on;
-       ifx_dev->gpio.mrdy = pl_data->mrdy;
-       ifx_dev->gpio.srdy = pl_data->srdy;
-       ifx_dev->gpio.reset_out = pl_data->rst_out;
-
-       dev_info(dev, "gpios %d, %d, %d, %d, %d",
-                ifx_dev->gpio.reset, ifx_dev->gpio.po, ifx_dev->gpio.mrdy,
-                ifx_dev->gpio.srdy, ifx_dev->gpio.reset_out);
-
-       /* Configure gpios */
-       ret = gpio_request(ifx_dev->gpio.reset, "ifxModem");
-       if (ret < 0) {
-               dev_err(dev, "Unable to allocate GPIO%d (RESET)",
-                       ifx_dev->gpio.reset);
+       ifx_dev->gpio.reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+       if (IS_ERR(ifx_dev->gpio.reset)) {
+               dev_err(dev, "could not obtain reset GPIO\n");
+               ret = PTR_ERR(ifx_dev->gpio.reset);
                goto error_ret;
        }
-       ret += gpio_direction_output(ifx_dev->gpio.reset, 0);
-       ret += gpio_export(ifx_dev->gpio.reset, 1);
-       if (ret) {
-               dev_err(dev, "Unable to configure GPIO%d (RESET)",
-                       ifx_dev->gpio.reset);
-               ret = -EBUSY;
-               goto error_ret2;
-       }
-
-       ret = gpio_request(ifx_dev->gpio.po, "ifxModem");
-       ret += gpio_direction_output(ifx_dev->gpio.po, 0);
-       ret += gpio_export(ifx_dev->gpio.po, 1);
-       if (ret) {
-               dev_err(dev, "Unable to configure GPIO%d (ON)",
-                       ifx_dev->gpio.po);
-               ret = -EBUSY;
-               goto error_ret3;
-       }
-
-       ret = gpio_request(ifx_dev->gpio.mrdy, "ifxModem");
-       if (ret < 0) {
-               dev_err(dev, "Unable to allocate GPIO%d (MRDY)",
-                       ifx_dev->gpio.mrdy);
-               goto error_ret3;
-       }
-       ret += gpio_export(ifx_dev->gpio.mrdy, 1);
-       ret += gpio_direction_output(ifx_dev->gpio.mrdy, 0);
-       if (ret) {
-               dev_err(dev, "Unable to configure GPIO%d (MRDY)",
-                       ifx_dev->gpio.mrdy);
-               ret = -EBUSY;
-               goto error_ret4;
+       gpiod_set_consumer_name(ifx_dev->gpio.reset, "ifxModem reset");
+       ifx_dev->gpio.po = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW);
+       if (IS_ERR(ifx_dev->gpio.po)) {
+               dev_err(dev, "could not obtain power GPIO\n");
+               ret = PTR_ERR(ifx_dev->gpio.po);
+               goto error_ret;
        }
-
-       ret = gpio_request(ifx_dev->gpio.srdy, "ifxModem");
-       if (ret < 0) {
-               dev_err(dev, "Unable to allocate GPIO%d (SRDY)",
-                       ifx_dev->gpio.srdy);
-               ret = -EBUSY;
-               goto error_ret4;
+       gpiod_set_consumer_name(ifx_dev->gpio.po, "ifxModem power");
+       ifx_dev->gpio.mrdy = devm_gpiod_get(dev, "mrdy", GPIOD_OUT_LOW);
+       if (IS_ERR(ifx_dev->gpio.mrdy)) {
+               dev_err(dev, "could not obtain mrdy GPIO\n");
+               ret = PTR_ERR(ifx_dev->gpio.mrdy);
+               goto error_ret;
        }
-       ret += gpio_export(ifx_dev->gpio.srdy, 1);
-       ret += gpio_direction_input(ifx_dev->gpio.srdy);
-       if (ret) {
-               dev_err(dev, "Unable to configure GPIO%d (SRDY)",
-                       ifx_dev->gpio.srdy);
-               ret = -EBUSY;
-               goto error_ret5;
+       gpiod_set_consumer_name(ifx_dev->gpio.mrdy, "ifxModem mrdy");
+       ifx_dev->gpio.srdy = devm_gpiod_get(dev, "srdy", GPIOD_IN);
+       if (IS_ERR(ifx_dev->gpio.srdy)) {
+               dev_err(dev, "could not obtain srdy GPIO\n");
+               ret = PTR_ERR(ifx_dev->gpio.srdy);
+               goto error_ret;
        }
-
-       ret = gpio_request(ifx_dev->gpio.reset_out, "ifxModem");
-       if (ret < 0) {
-               dev_err(dev, "Unable to allocate GPIO%d (RESET_OUT)",
-                       ifx_dev->gpio.reset_out);
-               goto error_ret5;
+       gpiod_set_consumer_name(ifx_dev->gpio.srdy, "ifxModem srdy");
+       ifx_dev->gpio.reset_out = devm_gpiod_get(dev, "rst_out", GPIOD_IN);
+       if (IS_ERR(ifx_dev->gpio.reset_out)) {
+               dev_err(dev, "could not obtain rst_out GPIO\n");
+               ret = PTR_ERR(ifx_dev->gpio.reset_out);
+               goto error_ret;
        }
-       ret += gpio_export(ifx_dev->gpio.reset_out, 1);
-       ret += gpio_direction_input(ifx_dev->gpio.reset_out);
-       if (ret) {
-               dev_err(dev, "Unable to configure GPIO%d (RESET_OUT)",
-                       ifx_dev->gpio.reset_out);
-               ret = -EBUSY;
-               goto error_ret6;
+       gpiod_set_consumer_name(ifx_dev->gpio.reset_out, "ifxModem reset out");
+       ifx_dev->gpio.pmu_reset = devm_gpiod_get(dev, "pmu_reset", GPIOD_ASIS);
+       if (IS_ERR(ifx_dev->gpio.pmu_reset)) {
+               dev_err(dev, "could not obtain pmu_reset GPIO\n");
+               ret = PTR_ERR(ifx_dev->gpio.pmu_reset);
+               goto error_ret;
        }
+       gpiod_set_consumer_name(ifx_dev->gpio.pmu_reset, "ifxModem PMU reset");
 
-       ret = request_irq(gpio_to_irq(ifx_dev->gpio.reset_out),
+       ret = request_irq(gpiod_to_irq(ifx_dev->gpio.reset_out),
                          ifx_spi_reset_interrupt,
                          IRQF_TRIGGER_RISING|IRQF_TRIGGER_FALLING, DRVNAME,
                          ifx_dev);
        if (ret) {
                dev_err(dev, "Unable to get irq %x\n",
-                       gpio_to_irq(ifx_dev->gpio.reset_out));
-               goto error_ret6;
+                       gpiod_to_irq(ifx_dev->gpio.reset_out));
+               goto error_ret;
        }
 
        ret = ifx_spi_reset(ifx_dev);
 
-       ret = request_irq(gpio_to_irq(ifx_dev->gpio.srdy),
+       ret = request_irq(gpiod_to_irq(ifx_dev->gpio.srdy),
                          ifx_spi_srdy_interrupt, IRQF_TRIGGER_RISING, DRVNAME,
                          ifx_dev);
        if (ret) {
                dev_err(dev, "Unable to get irq %x",
-                       gpio_to_irq(ifx_dev->gpio.srdy));
-               goto error_ret7;
+                       gpiod_to_irq(ifx_dev->gpio.srdy));
+               goto error_ret2;
        }
 
        /* set pm runtime power state and register with power system */
        /* no outgoing tty open at this point, this just satisfies the
         * modem's read and should reset communication properly
         */
-       srdy = gpio_get_value(ifx_dev->gpio.srdy);
+       srdy = gpiod_get_value(ifx_dev->gpio.srdy);
 
        if (srdy) {
                mrdy_assert(ifx_dev);
                mrdy_set_low(ifx_dev);
        return 0;
 
-error_ret7:
-       free_irq(gpio_to_irq(ifx_dev->gpio.reset_out), ifx_dev);
-error_ret6:
-       gpio_free(ifx_dev->gpio.srdy);
-error_ret5:
-       gpio_free(ifx_dev->gpio.mrdy);
-error_ret4:
-       gpio_free(ifx_dev->gpio.reset);
-error_ret3:
-       gpio_free(ifx_dev->gpio.po);
 error_ret2:
-       gpio_free(ifx_dev->gpio.reset_out);
+       free_irq(gpiod_to_irq(ifx_dev->gpio.reset_out), ifx_dev);
 error_ret:
        ifx_spi_free_device(ifx_dev);
        saved_ifx_dev = NULL;
        pm_runtime_disable(&spi->dev);
 
        /* free irq */
-       free_irq(gpio_to_irq(ifx_dev->gpio.reset_out), ifx_dev);
-       free_irq(gpio_to_irq(ifx_dev->gpio.srdy), ifx_dev);
-
-       gpio_free(ifx_dev->gpio.srdy);
-       gpio_free(ifx_dev->gpio.mrdy);
-       gpio_free(ifx_dev->gpio.reset);
-       gpio_free(ifx_dev->gpio.po);
-       gpio_free(ifx_dev->gpio.reset_out);
+       free_irq(gpiod_to_irq(ifx_dev->gpio.reset_out), ifx_dev);
+       free_irq(gpiod_to_irq(ifx_dev->gpio.srdy), ifx_dev);
 
        /* free allocations */
        ifx_spi_free_device(ifx_dev);