@@ -22,6 +22,7 @@
#include <linux/io.h>
#include <linux/of.h>
#include <linux/of_device.h>
+#include <linux/pinctrl/consumer.h>
#include <linux/platform_device.h>
#include <linux/syscore_ops.h>
#include <linux/slab.h>
@@ -154,6 +155,23 @@ int pxa_irq_to_gpio(int irq)
return irq - irq_base;
}
+static int pxa_gpio_request(struct gpio_chip *gc, unsigned offset)
+{
+ /*
+ * Map back to global GPIO space and request muxing, the direction
+ * parameter does not matter for this controller.
+ */
+ int gpio = gc->base + offset;
+
+ /*
+ * Platforms in ARCH_PXA doesn't move to device tree yet,
+ * and PINCTRL_SINGLE is depend on device tree.
+ */
+ if (IS_ENABLED(CONFIG_PINCTRL_SINGLE))
+ return pinctrl_request_gpio(gpio);
+ return 0;
+}
+
static int pxa_gpio_direction_input(struct gpio_chip *gc, unsigned offset)
{
void __iomem *base = gpio_chip_base(gc);
@@ -258,6 +276,7 @@ static int pxa_init_gpio_chip(struct platform_device *pdev, int gpio_end)
gc->base = gpio;
gc->label = chips[i].label;
+ gc->request = pxa_gpio_request;
gc->direction_input = pxa_gpio_direction_input;
gc->direction_output = pxa_gpio_direction_output;
gc->get = pxa_gpio_get;