[U-Boot] [PATCH] gpio: generalize for all generic gpio providers
Andreas Pretzsch
apr at cn-eng.de
Mon Apr 11 21:34:17 CEST 2011
Am Sonntag, den 03.04.2011, 04:43 -0400 schrieb Mike Frysinger:
> The Blackfin gpio command isn't terribly Blackfin-specific. So generalize
> the few pieces into two new optional helpers:
> name_to_gpio() - turn a string name into a GPIO #
> gpio_status() - display current pin bindings (think /proc/gpio)
>
> Once these pieces are pulled out, we can relocate the cmd_gpio.c into the
> common directory.
>
> Signed-off-by: Mike Frysinger <vapier at gentoo.org>
Tested-by: Andreas Pretzsch <apr at cn-eng.de>
Verified on Blackfin BF561 with full port range.
> --- a/arch/blackfin/include/asm/gpio.h
> +++ b/arch/blackfin/include/asm/gpio.h
> @@ -196,6 +196,59 @@ static inline int gpio_is_valid(int number)
> return number >= 0 && number < MAX_BLACKFIN_GPIOS;
> }
>
> +#include <linux/ctype.h>
> +
> +static inline int name_to_gpio(const char *name)
> +{
> + int port_base;
> +
> + if (tolower(*name) == 'p') {
> + ++name;
> +
> + switch (tolower(*name)) {
> +#ifdef GPIO_PA0
> + case 'a': port_base = GPIO_PA0; break;
> +#endif
> +#ifdef GPIO_PB0
> + case 'b': port_base = GPIO_PB0; break;
> +#endif
> +#ifdef GPIO_PC0
> + case 'c': port_base = GPIO_PC0; break;
> +#endif
> +#ifdef GPIO_PD0
> + case 'd': port_base = GPIO_PD0; break;
> +#endif
> +#ifdef GPIO_PE0
> + case 'e': port_base = GPIO_PE0; break;
> +#endif
> +#ifdef GPIO_PF0
> + case 'f': port_base = GPIO_PF0; break;
> +#endif
> +#ifdef GPIO_PG0
> + case 'g': port_base = GPIO_PG0; break;
> +#endif
> +#ifdef GPIO_PH0
> + case 'h': port_base = GPIO_PH0; break;
> +#endif
> +#ifdef GPIO_PI0
> + case 'i': port_base = GPIO_PI0; break;
> +#endif
> +#ifdef GPIO_PJ
> + case 'j': port_base = GPIO_PJ0; break;
> +#endif
> + default: return -1;
> + }
> +
> + ++name;
> + } else
> + port_base = 0;
> +
> + return port_base + simple_strtoul(name, NULL, 10);
Remark: Leads to an oom access when exceeding the processor number of
GPIOs, e.g. PF48 on a BF561. IMHO, no problem but only a cosmetic issue,
not worth adding an additional per-cpu check.
In the end, no difference to other user errors like an invalid memory
address.
--
carpe noctem engineering
Ingenieurbuero fuer Hard- & Software-Entwicklung Andreas Pretzsch
Dipl.-Ing. (FH) Andreas Pretzsch Tel. +49-(0)731-5521572
Hahnengasse 3 Fax: +49-(0)731-5521573
89073 Ulm, Germany email: apr at cn-eng.de
More information about the U-Boot
mailing list