Commit 72121572 authored by Daniel Mack's avatar Daniel Mack Committed by Linus Walleij

GPIO: gpio-pxa: fix devicetree functions

Provide an of_xlate function for the PXA GPIO chips and make it work for
devicetree environments.

Successfully tested on a PXA3xx board.
Signed-off-by: default avatarDaniel Mack <zonque@gmail.com>
Acked-by: default avatarHaojian Zhuang <haojian.zhuang@gmail.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent f7da0bdb
...@@ -62,6 +62,7 @@ int pxa_last_gpio; ...@@ -62,6 +62,7 @@ int pxa_last_gpio;
#ifdef CONFIG_OF #ifdef CONFIG_OF
static struct irq_domain *domain; static struct irq_domain *domain;
static struct device_node *pxa_gpio_of_node;
#endif #endif
struct pxa_gpio_chip { struct pxa_gpio_chip {
...@@ -277,6 +278,24 @@ static void pxa_gpio_set(struct gpio_chip *chip, unsigned offset, int value) ...@@ -277,6 +278,24 @@ static void pxa_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
(value ? GPSR_OFFSET : GPCR_OFFSET)); (value ? GPSR_OFFSET : GPCR_OFFSET));
} }
#ifdef CONFIG_OF_GPIO
static int pxa_gpio_of_xlate(struct gpio_chip *gc,
const struct of_phandle_args *gpiospec,
u32 *flags)
{
if (gpiospec->args[0] > pxa_last_gpio)
return -EINVAL;
if (gc != &pxa_gpio_chips[gpiospec->args[0] / 32].chip)
return -EINVAL;
if (flags)
*flags = gpiospec->args[1];
return gpiospec->args[0] % 32;
}
#endif
static int __devinit pxa_init_gpio_chip(int gpio_end, static int __devinit pxa_init_gpio_chip(int gpio_end,
int (*set_wake)(unsigned int, unsigned int)) int (*set_wake)(unsigned int, unsigned int))
{ {
...@@ -304,6 +323,11 @@ static int __devinit pxa_init_gpio_chip(int gpio_end, ...@@ -304,6 +323,11 @@ static int __devinit pxa_init_gpio_chip(int gpio_end,
c->get = pxa_gpio_get; c->get = pxa_gpio_get;
c->set = pxa_gpio_set; c->set = pxa_gpio_set;
c->to_irq = pxa_gpio_to_irq; c->to_irq = pxa_gpio_to_irq;
#ifdef CONFIG_OF_GPIO
c->of_node = pxa_gpio_of_node;
c->of_xlate = pxa_gpio_of_xlate;
c->of_gpio_n_cells = 2;
#endif
/* number of GPIOs on last bank may be less than 32 */ /* number of GPIOs on last bank may be less than 32 */
c->ngpio = (gpio + 31 > gpio_end) ? (gpio_end - gpio + 1) : 32; c->ngpio = (gpio + 31 > gpio_end) ? (gpio_end - gpio + 1) : 32;
...@@ -505,6 +529,7 @@ static int pxa_irq_domain_map(struct irq_domain *d, unsigned int irq, ...@@ -505,6 +529,7 @@ static int pxa_irq_domain_map(struct irq_domain *d, unsigned int irq,
const struct irq_domain_ops pxa_irq_domain_ops = { const struct irq_domain_ops pxa_irq_domain_ops = {
.map = pxa_irq_domain_map, .map = pxa_irq_domain_map,
.xlate = irq_domain_xlate_twocell,
}; };
#ifdef CONFIG_OF #ifdef CONFIG_OF
...@@ -545,6 +570,7 @@ static int __devinit pxa_gpio_probe_dt(struct platform_device *pdev) ...@@ -545,6 +570,7 @@ static int __devinit pxa_gpio_probe_dt(struct platform_device *pdev)
} }
domain = irq_domain_add_legacy(np, nr_gpios, irq_base, 0, domain = irq_domain_add_legacy(np, nr_gpios, irq_base, 0,
&pxa_irq_domain_ops, NULL); &pxa_irq_domain_ops, NULL);
pxa_gpio_of_node = np;
return 0; return 0;
err: err:
iounmap(gpio_reg_base); iounmap(gpio_reg_base);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment