#include <linux/ioport.h>
 #include <linux/platform_device.h>
 #include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/gpio_keys.h>
 #include <linux/of.h>
 #include <linux/of_platform.h>
        int state;
 
        if (bdata->can_sleep)
-               state = !!gpio_get_value_cansleep(button->gpio);
+               state = !!gpiod_get_value_cansleep(button->gpiod);
        else
-               state = !!gpio_get_value(button->gpio);
+               state = !!gpiod_get_value(button->gpiod);
 
        if (state != bdata->last_state) {
                unsigned int type = button->type ?: EV_KEY;
 
-               input_event(input, type, button->code,
-                           !!(state ^ button->active_low));
+               input_event(input, type, button->code, state);
                input_sync(input);
                bdata->count = 0;
                bdata->last_state = state;
        for (i = 0; i < pdata->nbuttons; i++) {
                struct gpio_keys_button *button = &pdata->buttons[i];
                struct gpio_keys_button_data *bdata = &bdev->data[i];
-               unsigned int gpio = button->gpio;
                unsigned int type = button->type ?: EV_KEY;
 
                if (button->wakeup) {
                        return -EINVAL;
                }
 
-               error = devm_gpio_request_one(&pdev->dev, gpio, GPIOF_IN,
-                                             button->desc ? : DRV_NAME);
-               if (error) {
-                       dev_err(dev, "unable to claim gpio %u, err=%d\n",
-                               gpio, error);
-                       return error;
+               /*
+                * Legacy GPIO number so request the GPIO here and
+                * convert it to descriptor.
+                */
+               if (!button->gpiod && gpio_is_valid(button->gpio)) {
+                       unsigned flags = 0;
+
+                       if (button->active_low)
+                               flags |= GPIOF_ACTIVE_LOW;
+
+                       error = devm_gpio_request_one(&pdev->dev, button->gpio,
+                                       flags, button->desc ? : DRV_NAME);
+                       if (error) {
+                               dev_err(dev, "unable to claim gpio %u, err=%d\n",
+                                       button->gpio, error);
+                               return error;
+                       }
+
+                       button->gpiod = gpio_to_desc(button->gpio);
                }
 
-               bdata->can_sleep = gpio_cansleep(gpio);
+               if (IS_ERR(button->gpiod))
+                       return PTR_ERR(button->gpiod);
+
+               bdata->can_sleep = gpiod_cansleep(button->gpiod);
                bdata->last_state = -1;
                bdata->threshold = DIV_ROUND_UP(button->debounce_interval,
                                                pdata->poll_interval);