Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 758afe42 authored by Alexander Holler's avatar Alexander Holler Committed by Linus Walleij
Browse files

gpio: davinci: fix gpio selection for OF



The driver missed an of_xlate function to translate gpio numbers
as found in the DT to the correct chip and number.

While there I've set #gpio_cells to a fixed value of 2.

I've used gpio-pxa.c as template for those changes and tested my changes
successfully on a da850 board using entries for gpio-leds in a DT. So I didn't
reinvent the wheel but just copied and tested stuff.

Thanks to Grygorii Strashko for the hint to the existing code in gpio-pxa.

Signed-off-by: default avatarAlexander Holler <holler@ahsoftware.de>
Signed-off-by: default avatarGrygorii Strashko <grygorii.strashko@ti.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent d3e14453
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -174,6 +174,27 @@ of_err:
	return NULL;
}

#ifdef CONFIG_OF_GPIO
static int davinci_gpio_of_xlate(struct gpio_chip *gc,
			     const struct of_phandle_args *gpiospec,
			     u32 *flags)
{
	struct davinci_gpio_controller *chips = dev_get_drvdata(gc->dev);
	struct davinci_gpio_platform_data *pdata = dev_get_platdata(gc->dev);

	if (gpiospec->args[0] > pdata->ngpio)
		return -EINVAL;

	if (gc != &chips[gpiospec->args[0] / 32].chip)
		return -EINVAL;

	if (flags)
		*flags = gpiospec->args[1];

	return gpiospec->args[0] % 32;
}
#endif

static int davinci_gpio_probe(struct platform_device *pdev)
{
	int i, base;
@@ -238,6 +259,9 @@ static int davinci_gpio_probe(struct platform_device *pdev)
			chips[i].chip.ngpio = 32;

#ifdef CONFIG_OF_GPIO
		chips[i].chip.of_gpio_n_cells = 2;
		chips[i].chip.of_xlate = davinci_gpio_of_xlate;
		chips[i].chip.dev = dev;
		chips[i].chip.of_node = dev->of_node;
#endif
		spin_lock_init(&chips[i].lock);