lkml.org 
[lkml]   [2013]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
SubjectRe: [PATCH 6/6 v14] gpio: Add block gpio to several gpio drivers
From
On Tue, Jan 22, 2013 at 1:06 PM, Roland Stigge <stigge@antcom.de> wrote:
> This patch adds block GPIO support to several gpio drivers.
>
> This implements block GPIO only for some selected drivers since block GPIO is
> an optional feature which may not be suitable for every GPIO hardware. (With
> automatic fallback to the single GPIO functions if not available in a driver.)
>
> Signed-off-by: Roland Stigge <stigge@antcom.de>
>
> For pinctrl-at91.c:
> Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com>
>
> ---
>
> +static void lpc32xx_gpio_set_block_p3(struct gpio_chip *chip,
> + unsigned long mask,
> + unsigned long values)
> +{
> + struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip);
> + u32 set_bits = values & mask;
> + u32 clr_bits = ~values & mask;
> +
> + /* States of GPIO 0-5 start at bit 25 */
> + set_bits <<= 25;
> + clr_bits <<= 25;
> +
> + /* Note: On LPC32xx, GPOs can only be set at once or cleared at once,
> + * but not set and cleared at once
> + */
> + if (set_bits)
> + __raw_writel(set_bits, group->gpio_grp->outp_set);
> + if (clr_bits)
> + __raw_writel(clr_bits, group->gpio_grp->outp_clr);
> +}
> +

In my patch, I go out of the way of this kind of thing for a simple reason:
You may generate incorrect timing by doing this.

As a fictive example, consider the i2c-bitbang driver, which you could optimize
by using block-gpio with sda/scl in a single block. By offering the
block-gpio API
even when you cannot set all bits at once, you could cause timing issues.
You might be toggling the clock line before pushing out data, for example.

The same holds below, for a driver that has separate hi/lo bits.

Regards,
Stijn


\
 
 \ /
  Last update: 2013-01-24 13:43    [W:1.868 / U:0.008 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site