* [PATCH RESEND v9 1/2] gpio: Adjust of_xlate API to support multiple GPIO chips
@ 2012-05-16 20:40 Roland Stigge
2012-05-16 20:40 ` [PATCH RESEND v9 2/2] gpio: Device tree support for LPC32xx Roland Stigge
[not found] ` <1337200832-26630-1-git-send-email-stigge-uj/7R2tJ6VmzQB+pC5nmwQ@public.gmane.org>
0 siblings, 2 replies; 4+ messages in thread
From: Roland Stigge @ 2012-05-16 20:40 UTC (permalink / raw)
To: glikely, arm, linux-kernel, linux-arm-kernel, linus.walleij,
kevin.wells, srinivas.bakki, devicetree-discuss, rob.herring
Cc: Roland Stigge
This patch changes the of_xlate API to make it possible to manipulate the
actual used gc. This way, multiple GPIO banks can be supported with the same DT
registered GPIO controller.
The issue was discussed upon the integration of LPC32xx's DT support for its
GPIO (see separate patch).
Signed-off-by: Roland Stigge <stigge@antcom.de>
---
Applies to v3.4-rc7
Changes since last version:
* Added this patch to the series
Thanks to Grant Likely for reviewing and advice!
drivers/gpio/gpio-samsung.c | 10 +++++-----
drivers/of/gpio.c | 14 ++++++++------
include/asm-generic/gpio.h | 2 +-
include/linux/of_gpio.h | 2 +-
4 files changed, 15 insertions(+), 13 deletions(-)
--- linux-2.6.orig/drivers/gpio/gpio-samsung.c
+++ linux-2.6/drivers/gpio/gpio-samsung.c
@@ -2657,21 +2657,21 @@ static struct samsung_gpio_chip exynos5_
#if defined(CONFIG_ARCH_EXYNOS) && defined(CONFIG_OF)
-static int exynos_gpio_xlate(struct gpio_chip *gc,
+static int exynos_gpio_xlate(struct gpio_chip **gc,
const struct of_phandle_args *gpiospec, u32 *flags)
{
unsigned int pin;
- if (WARN_ON(gc->of_gpio_n_cells < 4))
+ if (WARN_ON((*gc)->of_gpio_n_cells < 4))
return -EINVAL;
- if (WARN_ON(gpiospec->args_count < gc->of_gpio_n_cells))
+ if (WARN_ON(gpiospec->args_count < (*gc)->of_gpio_n_cells))
return -EINVAL;
- if (gpiospec->args[0] > gc->ngpio)
+ if (gpiospec->args[0] > (*gc)->ngpio)
return -EINVAL;
- pin = gc->base + gpiospec->args[0];
+ pin = (*gc)->base + gpiospec->args[0];
if (s3c_gpio_cfgpin(pin, S3C_GPIO_SFN(gpiospec->args[1])))
pr_warn("gpio_xlate: failed to set pin function\n");
--- linux-2.6.orig/drivers/of/gpio.c
+++ linux-2.6/drivers/of/gpio.c
@@ -64,7 +64,7 @@ int of_get_named_gpio_flags(struct devic
if (flags)
*flags = 0;
- ret = gc->of_xlate(gc, &gpiospec, flags);
+ ret = gc->of_xlate(&gc, &gpiospec, flags);
if (ret < 0)
goto err1;
@@ -114,7 +114,9 @@ EXPORT_SYMBOL(of_gpio_named_count);
/**
* of_gpio_simple_xlate - translate gpio_spec to the GPIO number and flags
- * @gc: pointer to the gpio_chip structure
+ * @gc: pointer to pointer to the gpio_chip structure: the xlate
+ * function can alter *gc itself to make GPIO distribution to
+ * multiple gpio_chips possible
* @np: device node of the GPIO chip
* @gpio_spec: gpio specifier as found in the device tree
* @flags: a flags pointer to fill in
@@ -123,7 +125,7 @@ EXPORT_SYMBOL(of_gpio_named_count);
* gpio chips. This function performs only one sanity check: whether gpio
* is less than ngpios (that is specified in the gpio_chip).
*/
-int of_gpio_simple_xlate(struct gpio_chip *gc,
+int of_gpio_simple_xlate(struct gpio_chip **gc,
const struct of_phandle_args *gpiospec, u32 *flags)
{
/*
@@ -132,15 +134,15 @@ int of_gpio_simple_xlate(struct gpio_chi
* number and the flags from a single gpio cell -- this is possible,
* but not recommended).
*/
- if (gc->of_gpio_n_cells < 2) {
+ if ((*gc)->of_gpio_n_cells < 2) {
WARN_ON(1);
return -EINVAL;
}
- if (WARN_ON(gpiospec->args_count < gc->of_gpio_n_cells))
+ if (WARN_ON(gpiospec->args_count < (*gc)->of_gpio_n_cells))
return -EINVAL;
- if (gpiospec->args[0] >= gc->ngpio)
+ if (gpiospec->args[0] >= (*gc)->ngpio)
return -EINVAL;
if (flags)
--- linux-2.6.orig/include/asm-generic/gpio.h
+++ linux-2.6/include/asm-generic/gpio.h
@@ -129,7 +129,7 @@ struct gpio_chip {
*/
struct device_node *of_node;
int of_gpio_n_cells;
- int (*of_xlate)(struct gpio_chip *gc,
+ int (*of_xlate)(struct gpio_chip **gc,
const struct of_phandle_args *gpiospec, u32 *flags);
#endif
};
--- linux-2.6.orig/include/linux/of_gpio.h
+++ linux-2.6/include/linux/of_gpio.h
@@ -59,7 +59,7 @@ extern int of_mm_gpiochip_add(struct dev
extern void of_gpiochip_add(struct gpio_chip *gc);
extern void of_gpiochip_remove(struct gpio_chip *gc);
extern struct gpio_chip *of_node_to_gpiochip(struct device_node *np);
-extern int of_gpio_simple_xlate(struct gpio_chip *gc,
+extern int of_gpio_simple_xlate(struct gpio_chip **gc,
const struct of_phandle_args *gpiospec,
u32 *flags);
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH RESEND v9 2/2] gpio: Device tree support for LPC32xx
2012-05-16 20:40 [PATCH RESEND v9 1/2] gpio: Adjust of_xlate API to support multiple GPIO chips Roland Stigge
@ 2012-05-16 20:40 ` Roland Stigge
[not found] ` <1337200832-26630-1-git-send-email-stigge-uj/7R2tJ6VmzQB+pC5nmwQ@public.gmane.org>
1 sibling, 0 replies; 4+ messages in thread
From: Roland Stigge @ 2012-05-16 20:40 UTC (permalink / raw)
To: glikely, arm, linux-kernel, linux-arm-kernel, linus.walleij,
kevin.wells, srinivas.bakki, devicetree-discuss, rob.herring
Cc: Roland Stigge
This patch adds device tree support for gpio-lpc32xx.c.
To register the various GPIO banks as (struct) gpio_chips via the same DT
gpio-controller, we utilize the adjusted of_xlate API to manipulate the
actually used struct gpio_chip.
Signed-off-by: Roland Stigge <stigge@antcom.de>
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
---
Applies to v3.4-rc7
Changes since last version:
* Use new of_xlate API: Register all GPIO banks at once via the
same GPIO controller DT entry by manipulating the actually used struct
gpio_chip.
* Updated devicetree binding documentation
Thanks to Jean-Christophe PLAGNIOL-VILLARD, Grant Likely, Arnd Bergmann, Jon
Smirl, Mark Brown for reviewing!
You can also pull from:
git://git.antcom.de/linux-2.6.git dt/gpio
http://git.antcom.de/linux-2.6.git dt/gpio
http://git.antcom.de/?p=linux-2.6.git;a=shortlog;h=refs/heads/dt/gpio
Documentation/devicetree/bindings/gpio/gpio_lpc32xx.txt | 43 ++++++++++++
arch/arm/mach-lpc32xx/include/mach/gpio.h | 9 ++
drivers/gpio/gpio-lpc32xx.c | 55 +++++++++++++++-
3 files changed, 105 insertions(+), 2 deletions(-)
--- /dev/null
+++ linux-2.6/Documentation/devicetree/bindings/gpio/gpio_lpc32xx.txt
@@ -0,0 +1,43 @@
+NXP LPC32xx SoC GPIO controller
+
+Required properties:
+- compatible: must be "nxp,lpc3220-gpio"
+- reg: Physical base address and length of the controller's registers.
+- gpio-controller: Marks the device node as a GPIO controller.
+- #gpio-cells: Should be 3:
+ 1) bank:
+ 0: GPIO P0
+ 1: GPIO P1
+ 2: GPIO P2
+ 3: GPIO P3
+ 4: GPI P3
+ 5: GPO P3
+ 2) pin number
+ 3) optional parameters:
+ - bit 0 specifies polarity (0 for normal, 1 for inverted)
+- reg: Index of the GPIO group
+
+Example:
+
+ gpio: gpio@40028000 {
+ compatible = "nxp,lpc3220-gpio";
+ reg = <0x40028000 0x1000>;
+ gpio-controller;
+ #gpio-cells = <3>; /* bank, pin, flags */
+ };
+
+ leds {
+ compatible = "gpio-leds";
+
+ led0 {
+ gpios = <&gpio 5 1 1>; /* GPO_P3 1, active low */
+ linux,default-trigger = "heartbeat";
+ default-state = "off";
+ };
+
+ led1 {
+ gpios = <&gpio 5 14 1>; /* GPO_P3 14, active low */
+ linux,default-trigger = "timer";
+ default-state = "off";
+ };
+ };
--- linux-2.6.orig/arch/arm/mach-lpc32xx/include/mach/gpio.h
+++ linux-2.6/arch/arm/mach-lpc32xx/include/mach/gpio.h
@@ -1 +1,8 @@
-/* empty */
+#ifndef __MACH_GPIO_H
+#define __MACH_GPIO_H
+
+#include "gpio-lpc32xx.h"
+
+#define ARCH_NR_GPIOS (LPC32XX_GPO_P3_GRP + LPC32XX_GPO_P3_MAX)
+
+#endif /* __MACH_GPIO_H */
--- linux-2.6.orig/drivers/gpio/gpio-lpc32xx.c
+++ linux-2.6/drivers/gpio/gpio-lpc32xx.c
@@ -21,6 +21,9 @@
#include <linux/io.h>
#include <linux/errno.h>
#include <linux/gpio.h>
+#include <linux/of_gpio.h>
+#include <linux/platform_device.h>
+#include <linux/module.h>
#include <mach/hardware.h>
#include <mach/platform.h>
@@ -454,10 +457,60 @@ static struct lpc32xx_gpio_chip lpc32xx_
},
};
+/* Empty now, can be removed later when mach-lpc32xx is finally switched over
+ * to DT support
+ */
void __init lpc32xx_gpio_init(void)
{
+}
+
+static int lpc32xx_of_xlate(struct gpio_chip **gc,
+ const struct of_phandle_args *gpiospec, u32 *flags)
+{
+ u32 bank;
+ if (WARN_ON(gpiospec->args_count < 3))
+ return -EINVAL;
+
+ bank = gpiospec->args[0];
+ if (WARN_ON(bank > 5))
+ return -EINVAL;
+
+ *gc = &lpc32xx_gpiochip[bank].chip;
+ if (flags)
+ *flags = gpiospec->args[2];
+ return gpiospec->args[1];
+}
+
+static int __devinit lpc32xx_gpio_probe(struct platform_device *pdev)
+{
int i;
- for (i = 0; i < ARRAY_SIZE(lpc32xx_gpiochip); i++)
+ for (i = 0; i < ARRAY_SIZE(lpc32xx_gpiochip); i++) {
+ if (pdev->dev.of_node) {
+ lpc32xx_gpiochip[i].chip.of_xlate = lpc32xx_of_xlate;
+ lpc32xx_gpiochip[i].chip.of_gpio_n_cells = 3;
+ lpc32xx_gpiochip[i].chip.of_node = pdev->dev.of_node;
+ }
gpiochip_add(&lpc32xx_gpiochip[i].chip);
+ }
+
+ return 0;
}
+
+#ifdef CONFIG_OF
+static struct of_device_id lpc32xx_gpio_of_match[] __devinitdata = {
+ { .compatible = "nxp,lpc3220-gpio", },
+ { },
+};
+#endif
+
+static struct platform_driver lpc32xx_gpio_driver = {
+ .driver = {
+ .name = "lpc32xx-gpio",
+ .owner = THIS_MODULE,
+ .of_match_table = of_match_ptr(lpc32xx_gpio_of_match),
+ },
+ .probe = lpc32xx_gpio_probe,
+};
+
+module_platform_driver(lpc32xx_gpio_driver);
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH RESEND v9 1/2] gpio: Adjust of_xlate API to support multiple GPIO chips
[not found] ` <1337200832-26630-1-git-send-email-stigge-uj/7R2tJ6VmzQB+pC5nmwQ@public.gmane.org>
@ 2012-05-17 20:37 ` Grant Likely
2012-05-18 8:03 ` Roland Stigge
0 siblings, 1 reply; 4+ messages in thread
From: Grant Likely @ 2012-05-17 20:37 UTC (permalink / raw)
To: glikely-s3s/WqlpOiPyB63q8FvJNQ, arm-DgEjT+Ai2ygdnm+yROfE0A,
linux-kernel-u79uwXL29TY76Z2rM5mHXA,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
linus.walleij-0IS4wlFg1OjSUeElwK9/Pw, kevin.wells-3arQi8VN3Tc,
srinivas.bakki-3arQi8VN3Tc,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
rob.herring-bsGFqQB8/DxBDgjK7y7TUQ
Cc: Roland Stigge
On Wed, 16 May 2012 22:40:31 +0200, Roland Stigge <stigge-uj/7R2tJ6VmzQB+pC5nmwQ@public.gmane.org> wrote:
> This patch changes the of_xlate API to make it possible to manipulate the
> actual used gc. This way, multiple GPIO banks can be supported with the same DT
> registered GPIO controller.
>
> The issue was discussed upon the integration of LPC32xx's DT support for its
> GPIO (see separate patch).
>
> Signed-off-by: Roland Stigge <stigge-uj/7R2tJ6VmzQB+pC5nmwQ@public.gmane.org>
I still wasn't happy with this approach, so I bugged Arnd and we
discussed some options. So, I think I've got a better solution that
doesn't change the signature of of_xlate. Instead it allows of_xlate
to return an error code and still have multiple banks referring to the
same gpio_chip.
I've just posted the series. Can you try it out and make sure it
works for you?
g.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH RESEND v9 1/2] gpio: Adjust of_xlate API to support multiple GPIO chips
2012-05-17 20:37 ` [PATCH RESEND v9 1/2] gpio: Adjust of_xlate API to support multiple GPIO chips Grant Likely
@ 2012-05-18 8:03 ` Roland Stigge
0 siblings, 0 replies; 4+ messages in thread
From: Roland Stigge @ 2012-05-18 8:03 UTC (permalink / raw)
To: Grant Likely
Cc: glikely, arm, linux-kernel, linux-arm-kernel, linus.walleij,
kevin.wells, srinivas.bakki, devicetree-discuss, rob.herring
Hi Grant,
On 05/17/2012 10:37 PM, Grant Likely wrote:
> On Wed, 16 May 2012 22:40:31 +0200, Roland Stigge <stigge@antcom.de> wrote:
>> This patch changes the of_xlate API to make it possible to manipulate the
>> actual used gc. This way, multiple GPIO banks can be supported with the same DT
>> registered GPIO controller.
>>
>> The issue was discussed upon the integration of LPC32xx's DT support for its
>> GPIO (see separate patch).
>>
>> Signed-off-by: Roland Stigge <stigge@antcom.de>
>
> I still wasn't happy with this approach, so I bugged Arnd and we
> discussed some options. So, I think I've got a better solution that
> doesn't change the signature of of_xlate. Instead it allows of_xlate
> to return an error code and still have multiple banks referring to the
> same gpio_chip.
>
> I've just posted the series. Can you try it out and make sure it
> works for you?
Works fine, just consider the little compile error bugfix, see next mail.
Thanks,
Roland
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2012-05-18 8:03 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-05-16 20:40 [PATCH RESEND v9 1/2] gpio: Adjust of_xlate API to support multiple GPIO chips Roland Stigge
2012-05-16 20:40 ` [PATCH RESEND v9 2/2] gpio: Device tree support for LPC32xx Roland Stigge
[not found] ` <1337200832-26630-1-git-send-email-stigge-uj/7R2tJ6VmzQB+pC5nmwQ@public.gmane.org>
2012-05-17 20:37 ` [PATCH RESEND v9 1/2] gpio: Adjust of_xlate API to support multiple GPIO chips Grant Likely
2012-05-18 8:03 ` Roland Stigge
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).