From: wg@grandegger.com (Wolfgang Grandegger)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH RESEND 0/6 v10] gpio: Add block GPIO
Date: Tue, 18 Dec 2012 07:58:10 +0100 [thread overview]
Message-ID: <50D01402.9090301@grandegger.com> (raw)
In-Reply-To: <20121218055525.GJ23971@game.jcrosoft.org>
On 12/18/2012 06:55 AM, Jean-Christophe PLAGNIOL-VILLARD wrote:
> On 20:47 Mon 17 Dec , Wolfgang Grandegger wrote:
>> On 12/17/2012 07:02 PM, Roland Stigge wrote:
>>> On 12/17/2012 06:37 PM, Wolfgang Grandegger wrote:
>>>> /* Do synchronous data output with a single write access */
>>>> __raw_writel(~mask, pio + PIO_OWDR);
>>>> __raw_writel(mask, pio + PIO_OWER);
>>>> __raw_writel(val, pio + PIO_ODSR);
>>>>
>>>> For caching we would need a storage. Not sure if it's worth compared to
>>>> a context switch into the kernel.
>>>
>>> Block GPIO is not only for you in userspace. ;-) You can also implement
>>> efficient n-bit bus I/O in kernel drivers, n-bit-banging. :-) So not
>>> always context switches involved.
>>
>> OK, what do you think about the following untested patch:
>>
>> From b44cad16cbbca84715dffd4cb5268497216add25 Mon Sep 17 00:00:00 2001
>> From: Wolfgang Grandegger <wg@grandegger.com>
>> Date: Mon, 3 Dec 2012 08:31:55 +0100
>> Subject: [PATCH 1/2] gpio: add GPIO block callback functions for AT91
>>
>> Signed-off-by: Wolfgang Grandegger <wg@grandegger.com>
>> ---
>> arch/arm/mach-at91/gpio.c | 29 +++++++++++++++++++++++++++++
>> 1 file changed, 29 insertions(+)
>>
>> diff --git a/arch/arm/mach-at91/gpio.c b/arch/arm/mach-at91/gpio.c
>> index be42cf0..cf6bd45 100644
>> --- a/arch/arm/mach-at91/gpio.c
>> +++ b/arch/arm/mach-at91/gpio.c
>> @@ -42,13 +42,16 @@ struct at91_gpio_chip {
>> void __iomem *regbase; /* PIO bank virtual address */
>> struct clk *clock; /* associated clock */
>> struct irq_domain *domain; /* associated irq domain */
>> + unsigned long mask_shadow; /* synchronous data output */
>> };
>>
>> #define to_at91_gpio_chip(c) container_of(c, struct at91_gpio_chip, chip)
>>
>> static void at91_gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip);
>> static void at91_gpiolib_set(struct gpio_chip *chip, unsigned offset, int val);
>> +static void at91_gpiolib_set_block(struct gpio_chip *chip, unsigned long mask, unsigned long val);
>> static int at91_gpiolib_get(struct gpio_chip *chip, unsigned offset);
>> +static unsigned long at91_gpiolib_get_block(struct gpio_chip *chip, unsigned long mask);
>> static int at91_gpiolib_direction_output(struct gpio_chip *chip,
>> unsigned offset, int val);
>> static int at91_gpiolib_direction_input(struct gpio_chip *chip,
>> @@ -62,7 +65,9 @@ static int at91_gpiolib_to_irq(struct gpio_chip *chip, unsigned offset);
>> .direction_input = at91_gpiolib_direction_input, \
>> .direction_output = at91_gpiolib_direction_output, \
>> .get = at91_gpiolib_get, \
>> + .get_block = at91_gpiolib_get_block, \
>> .set = at91_gpiolib_set, \
>> + .set_block = at91_gpiolib_set_block, \
>> .dbg_show = at91_gpiolib_dbg_show, \
>> .to_irq = at91_gpiolib_to_irq, \
>> .ngpio = nr_gpio, \
>> @@ -896,6 +901,16 @@ static int at91_gpiolib_get(struct gpio_chip *chip, unsigned offset)
>> return (pdsr & mask) != 0;
>> }
>>
>> +static unsigned long at91_gpiolib_get_block(struct gpio_chip *chip, unsigned long mask)
>> +{
>> + struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip);
>> + void __iomem *pio = at91_gpio->regbase;
>> + u32 pdsr;
>> +
>> + pdsr = __raw_readl(pio + PIO_PDSR);
>> + return pdsr & mask;
>> +}
>> +
>> static void at91_gpiolib_set(struct gpio_chip *chip, unsigned offset, int val)
>> {
>> struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip);
>> @@ -905,6 +920,20 @@ static void at91_gpiolib_set(struct gpio_chip *chip, unsigned offset, int val)
>> __raw_writel(mask, pio + (val ? PIO_SODR : PIO_CODR));
>> }
>>
>> +static void at91_gpiolib_set_block(struct gpio_chip *chip, unsigned long mask, unsigned long val)
>> +{
>> + struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip);
>> + void __iomem *pio = at91_gpio->regbase;
>> +
>> + /* Do synchronous data output with a single write access */
>> + if (mask != at91_gpio->mask_shadow) {
>> + at91_gpio->mask_shadow = mask;
>> + __raw_writel(~mask, pio + PIO_OWDR);
>> + __raw_writel(mask, pio + PIO_OWER);
>> + }
>> + __raw_writel(val, pio + PIO_ODSR);
>> +}
> this driver is only for old at91 platfrom if you touch at91 you need to update
> the pinctrl too
Well, the patch is for the hardware I have at hand and I can test. There
are many other GPIO hardware interfaces which could be enhanced with
block gpio. Roland only did it for the interfaces in driver/gpio. Also,
I think, an ACK for this patch series would be nice before we continue.
Wolfgang.
WARNING: multiple messages have this Message-ID (diff)
From: Wolfgang Grandegger <wg@grandegger.com>
To: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Cc: Roland Stigge <stigge@antcom.de>,
rmallon@gmail.com, gregkh@linuxfoundation.org,
linus.walleij@linaro.org, broonie@opensource.wolfsonmicro.com,
w.sang@pengutronix.de, linux-kernel@vger.kernel.org,
grant.likely@secretlab.ca, daniel-gl@gmx.net, sr@denx.de,
linux-arm-kernel@lists.infradead.org, highguy@gmail.com
Subject: Re: [PATCH RESEND 0/6 v10] gpio: Add block GPIO
Date: Tue, 18 Dec 2012 07:58:10 +0100 [thread overview]
Message-ID: <50D01402.9090301@grandegger.com> (raw)
In-Reply-To: <20121218055525.GJ23971@game.jcrosoft.org>
On 12/18/2012 06:55 AM, Jean-Christophe PLAGNIOL-VILLARD wrote:
> On 20:47 Mon 17 Dec , Wolfgang Grandegger wrote:
>> On 12/17/2012 07:02 PM, Roland Stigge wrote:
>>> On 12/17/2012 06:37 PM, Wolfgang Grandegger wrote:
>>>> /* Do synchronous data output with a single write access */
>>>> __raw_writel(~mask, pio + PIO_OWDR);
>>>> __raw_writel(mask, pio + PIO_OWER);
>>>> __raw_writel(val, pio + PIO_ODSR);
>>>>
>>>> For caching we would need a storage. Not sure if it's worth compared to
>>>> a context switch into the kernel.
>>>
>>> Block GPIO is not only for you in userspace. ;-) You can also implement
>>> efficient n-bit bus I/O in kernel drivers, n-bit-banging. :-) So not
>>> always context switches involved.
>>
>> OK, what do you think about the following untested patch:
>>
>> From b44cad16cbbca84715dffd4cb5268497216add25 Mon Sep 17 00:00:00 2001
>> From: Wolfgang Grandegger <wg@grandegger.com>
>> Date: Mon, 3 Dec 2012 08:31:55 +0100
>> Subject: [PATCH 1/2] gpio: add GPIO block callback functions for AT91
>>
>> Signed-off-by: Wolfgang Grandegger <wg@grandegger.com>
>> ---
>> arch/arm/mach-at91/gpio.c | 29 +++++++++++++++++++++++++++++
>> 1 file changed, 29 insertions(+)
>>
>> diff --git a/arch/arm/mach-at91/gpio.c b/arch/arm/mach-at91/gpio.c
>> index be42cf0..cf6bd45 100644
>> --- a/arch/arm/mach-at91/gpio.c
>> +++ b/arch/arm/mach-at91/gpio.c
>> @@ -42,13 +42,16 @@ struct at91_gpio_chip {
>> void __iomem *regbase; /* PIO bank virtual address */
>> struct clk *clock; /* associated clock */
>> struct irq_domain *domain; /* associated irq domain */
>> + unsigned long mask_shadow; /* synchronous data output */
>> };
>>
>> #define to_at91_gpio_chip(c) container_of(c, struct at91_gpio_chip, chip)
>>
>> static void at91_gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip);
>> static void at91_gpiolib_set(struct gpio_chip *chip, unsigned offset, int val);
>> +static void at91_gpiolib_set_block(struct gpio_chip *chip, unsigned long mask, unsigned long val);
>> static int at91_gpiolib_get(struct gpio_chip *chip, unsigned offset);
>> +static unsigned long at91_gpiolib_get_block(struct gpio_chip *chip, unsigned long mask);
>> static int at91_gpiolib_direction_output(struct gpio_chip *chip,
>> unsigned offset, int val);
>> static int at91_gpiolib_direction_input(struct gpio_chip *chip,
>> @@ -62,7 +65,9 @@ static int at91_gpiolib_to_irq(struct gpio_chip *chip, unsigned offset);
>> .direction_input = at91_gpiolib_direction_input, \
>> .direction_output = at91_gpiolib_direction_output, \
>> .get = at91_gpiolib_get, \
>> + .get_block = at91_gpiolib_get_block, \
>> .set = at91_gpiolib_set, \
>> + .set_block = at91_gpiolib_set_block, \
>> .dbg_show = at91_gpiolib_dbg_show, \
>> .to_irq = at91_gpiolib_to_irq, \
>> .ngpio = nr_gpio, \
>> @@ -896,6 +901,16 @@ static int at91_gpiolib_get(struct gpio_chip *chip, unsigned offset)
>> return (pdsr & mask) != 0;
>> }
>>
>> +static unsigned long at91_gpiolib_get_block(struct gpio_chip *chip, unsigned long mask)
>> +{
>> + struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip);
>> + void __iomem *pio = at91_gpio->regbase;
>> + u32 pdsr;
>> +
>> + pdsr = __raw_readl(pio + PIO_PDSR);
>> + return pdsr & mask;
>> +}
>> +
>> static void at91_gpiolib_set(struct gpio_chip *chip, unsigned offset, int val)
>> {
>> struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip);
>> @@ -905,6 +920,20 @@ static void at91_gpiolib_set(struct gpio_chip *chip, unsigned offset, int val)
>> __raw_writel(mask, pio + (val ? PIO_SODR : PIO_CODR));
>> }
>>
>> +static void at91_gpiolib_set_block(struct gpio_chip *chip, unsigned long mask, unsigned long val)
>> +{
>> + struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip);
>> + void __iomem *pio = at91_gpio->regbase;
>> +
>> + /* Do synchronous data output with a single write access */
>> + if (mask != at91_gpio->mask_shadow) {
>> + at91_gpio->mask_shadow = mask;
>> + __raw_writel(~mask, pio + PIO_OWDR);
>> + __raw_writel(mask, pio + PIO_OWER);
>> + }
>> + __raw_writel(val, pio + PIO_ODSR);
>> +}
> this driver is only for old at91 platfrom if you touch at91 you need to update
> the pinctrl too
Well, the patch is for the hardware I have at hand and I can test. There
are many other GPIO hardware interfaces which could be enhanced with
block gpio. Roland only did it for the interfaces in driver/gpio. Also,
I think, an ACK for this patch series would be nice before we continue.
Wolfgang.
next prev parent reply other threads:[~2012-12-18 6:58 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-14 14:26 [PATCH RESEND 0/6 v10] gpio: Add block GPIO Roland Stigge
2012-12-14 14:26 ` Roland Stigge
2012-12-14 14:26 ` [PATCH RESEND 1/6 v10] gpio: Add a block GPIO API to gpiolib Roland Stigge
2012-12-14 14:26 ` Roland Stigge
2012-12-14 14:26 ` [PATCH RESEND 2/6 v10] gpio: Add sysfs support to block GPIO API Roland Stigge
2012-12-14 14:26 ` Roland Stigge
2012-12-14 14:26 ` [PATCH RESEND 3/6 v10] gpio: Add userland device interface to block GPIO Roland Stigge
2012-12-14 14:26 ` Roland Stigge
2012-12-14 14:26 ` [PATCH RESEND 4/6 v10] gpiolib: Fix default attributes for class Roland Stigge
2012-12-14 14:26 ` Roland Stigge
2012-12-14 14:26 ` [PATCH RESEND 5/6 v10] gpio: Add device tree support to block GPIO API Roland Stigge
2012-12-14 14:26 ` Roland Stigge
2012-12-17 15:51 ` Mark Rutland
2012-12-17 15:51 ` Mark Rutland
2012-12-18 14:30 ` Roland Stigge
2012-12-18 14:30 ` Roland Stigge
2012-12-18 16:35 ` Mark Rutland
2012-12-18 16:35 ` Mark Rutland
2012-12-14 14:26 ` [PATCH RESEND 6/6 v10] gpio: Add block gpio to several gpio drivers Roland Stigge
2012-12-14 14:26 ` Roland Stigge
2012-12-14 17:58 ` [PATCH RESEND 0/6 v10] gpio: Add block GPIO Wolfgang Grandegger
2012-12-14 17:58 ` Wolfgang Grandegger
2012-12-14 23:49 ` Roland Stigge
2012-12-14 23:49 ` Roland Stigge
2012-12-15 10:51 ` Russell King - ARM Linux
2012-12-15 10:51 ` Russell King - ARM Linux
2012-12-17 11:37 ` Wolfgang Grandegger
2012-12-17 11:37 ` Wolfgang Grandegger
2012-12-17 11:51 ` Wolfgang Grandegger
2012-12-17 11:51 ` Wolfgang Grandegger
2012-12-17 12:10 ` Russell King - ARM Linux
2012-12-17 12:10 ` Russell King - ARM Linux
2012-12-17 14:57 ` Wolfgang Grandegger
2012-12-17 14:57 ` Wolfgang Grandegger
2012-12-17 13:32 ` Roland Stigge
2012-12-17 13:32 ` Roland Stigge
2012-12-17 13:51 ` Roland Stigge
2012-12-17 13:51 ` Roland Stigge
2012-12-17 16:28 ` Wolfgang Grandegger
2012-12-17 16:28 ` Wolfgang Grandegger
2012-12-17 17:15 ` Roland Stigge
2012-12-17 17:15 ` Roland Stigge
2012-12-17 17:37 ` Wolfgang Grandegger
2012-12-17 17:37 ` Wolfgang Grandegger
2012-12-17 18:02 ` Roland Stigge
2012-12-17 18:02 ` Roland Stigge
2012-12-17 19:47 ` Wolfgang Grandegger
2012-12-17 19:47 ` Wolfgang Grandegger
2012-12-17 21:33 ` Roland Stigge
2012-12-17 21:33 ` Roland Stigge
2012-12-18 6:51 ` Wolfgang Grandegger
2012-12-18 6:51 ` Wolfgang Grandegger
2012-12-18 5:55 ` Jean-Christophe PLAGNIOL-VILLARD
2012-12-18 5:55 ` Jean-Christophe PLAGNIOL-VILLARD
2012-12-18 6:58 ` Wolfgang Grandegger [this message]
2012-12-18 6:58 ` Wolfgang Grandegger
2012-12-18 7:54 ` Jean-Christophe PLAGNIOL-VILLARD
2012-12-18 7:54 ` Jean-Christophe PLAGNIOL-VILLARD
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=50D01402.9090301@grandegger.com \
--to=wg@grandegger.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.