From: Alexander Stein <alexanders83@web.de> To: Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com>, Linus Walleij <linus.walleij@linaro.org> Cc: Alexander Stein <alexanders83@web.de>, linux-arm-kernel@lists.infradead.org, linux-gpio@vger.kernel.org Subject: [PATCH 1/2] pinctrl: at91: Add set_multiple GPIO chip feature Date: Fri, 20 Mar 2015 20:12:00 +0100 [thread overview] Message-ID: <1426878721-2618-1-git-send-email-alexanders83@web.de> (raw) This adds the callback for set_multiple. As this controller has a separate set and clear register, we can't write directly to PIO_ODSR as this would required a cached variable and would race with at91_gpio_set. So build masks for the PIO_SODR and PIO_CODR registers and write them together. Signed-off-by: Alexander Stein <alexanders83@web.de> --- This was tested by using an own test driver which uses gpiod_set_array_cansleep to set multiple GPIOs at once. drivers/pinctrl/pinctrl-at91.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c index f4cd0b9..a882523 100644 --- a/drivers/pinctrl/pinctrl-at91.c +++ b/drivers/pinctrl/pinctrl-at91.c @@ -1330,6 +1330,33 @@ static void at91_gpio_set(struct gpio_chip *chip, unsigned offset, writel_relaxed(mask, pio + (val ? PIO_SODR : PIO_CODR)); } +static void at91_gpio_set_multiple(struct gpio_chip *chip, + unsigned long *mask, unsigned long *bits) +{ + struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip); + void __iomem *pio = at91_gpio->regbase; + unsigned long set_mask; + unsigned long clear_mask; + size_t i; + + set_mask = 0; + clear_mask = 0; + + for (i = 0; i < chip->ngpio; i++) { + if (*mask == 0) + break; + if (__test_and_clear_bit(i, mask)) { + if (test_bit(i, bits)) + set_mask |= BIT(i); + else + clear_mask |= BIT(i); + } + } + + writel_relaxed(set_mask, pio + PIO_SODR); + writel_relaxed(clear_mask, pio + PIO_CODR); +} + static int at91_gpio_direction_output(struct gpio_chip *chip, unsigned offset, int val) { @@ -1692,6 +1719,7 @@ static struct gpio_chip at91_gpio_template = { .get = at91_gpio_get, .direction_output = at91_gpio_direction_output, .set = at91_gpio_set, + .set_multiple = at91_gpio_set_multiple, .dbg_show = at91_gpio_dbg_show, .can_sleep = false, .ngpio = MAX_NB_GPIO_PER_BANK, -- 2.3.3
WARNING: multiple messages have this Message-ID (diff)
From: alexanders83@web.de (Alexander Stein) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH 1/2] pinctrl: at91: Add set_multiple GPIO chip feature Date: Fri, 20 Mar 2015 20:12:00 +0100 [thread overview] Message-ID: <1426878721-2618-1-git-send-email-alexanders83@web.de> (raw) This adds the callback for set_multiple. As this controller has a separate set and clear register, we can't write directly to PIO_ODSR as this would required a cached variable and would race with at91_gpio_set. So build masks for the PIO_SODR and PIO_CODR registers and write them together. Signed-off-by: Alexander Stein <alexanders83@web.de> --- This was tested by using an own test driver which uses gpiod_set_array_cansleep to set multiple GPIOs at once. drivers/pinctrl/pinctrl-at91.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c index f4cd0b9..a882523 100644 --- a/drivers/pinctrl/pinctrl-at91.c +++ b/drivers/pinctrl/pinctrl-at91.c @@ -1330,6 +1330,33 @@ static void at91_gpio_set(struct gpio_chip *chip, unsigned offset, writel_relaxed(mask, pio + (val ? PIO_SODR : PIO_CODR)); } +static void at91_gpio_set_multiple(struct gpio_chip *chip, + unsigned long *mask, unsigned long *bits) +{ + struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip); + void __iomem *pio = at91_gpio->regbase; + unsigned long set_mask; + unsigned long clear_mask; + size_t i; + + set_mask = 0; + clear_mask = 0; + + for (i = 0; i < chip->ngpio; i++) { + if (*mask == 0) + break; + if (__test_and_clear_bit(i, mask)) { + if (test_bit(i, bits)) + set_mask |= BIT(i); + else + clear_mask |= BIT(i); + } + } + + writel_relaxed(set_mask, pio + PIO_SODR); + writel_relaxed(clear_mask, pio + PIO_CODR); +} + static int at91_gpio_direction_output(struct gpio_chip *chip, unsigned offset, int val) { @@ -1692,6 +1719,7 @@ static struct gpio_chip at91_gpio_template = { .get = at91_gpio_get, .direction_output = at91_gpio_direction_output, .set = at91_gpio_set, + .set_multiple = at91_gpio_set_multiple, .dbg_show = at91_gpio_dbg_show, .can_sleep = false, .ngpio = MAX_NB_GPIO_PER_BANK, -- 2.3.3
next reply other threads:[~2015-03-20 19:12 UTC|newest] Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-03-20 19:12 Alexander Stein [this message] 2015-03-20 19:12 ` [PATCH 1/2] pinctrl: at91: Add set_multiple GPIO chip feature Alexander Stein 2015-03-20 19:12 ` [PATCH 2/2] pinctrl: at91: Add missing include Alexander Stein 2015-03-20 19:12 ` Alexander Stein 2015-04-02 8:19 ` Jean-Christophe PLAGNIOL-VILLARD 2015-04-02 8:19 ` Jean-Christophe PLAGNIOL-VILLARD 2015-04-02 9:39 ` Alexander Stein 2015-04-02 9:39 ` Alexander Stein 2015-03-27 9:07 ` [PATCH 1/2] pinctrl: at91: Add set_multiple GPIO chip feature Linus Walleij 2015-03-27 9:07 ` Linus Walleij 2015-04-01 7:45 ` Jean-Christophe PLAGNIOL-VILLARD 2015-04-01 7:45 ` Jean-Christophe PLAGNIOL-VILLARD 2015-03-27 10:11 ` Ludovic Desroches 2015-03-27 10:11 ` Ludovic Desroches 2015-03-27 11:54 ` Alexander Stein 2015-03-27 11:54 ` Alexander Stein 2015-04-02 8:30 ` Jean-Christophe PLAGNIOL-VILLARD 2015-04-02 8:30 ` 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=1426878721-2618-1-git-send-email-alexanders83@web.de \ --to=alexanders83@web.de \ --cc=linus.walleij@linaro.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-gpio@vger.kernel.org \ --cc=plagnioj@jcrosoft.com \ /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: linkBe 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.