From: Grygorii Strashko <grygorii.strashko@ti.com>
To: Russell King <rmk@arm.linux.org.uk>,
Linus Walleij <linus.walleij@linaro.org>,
Tony Lindgren <tony@atomide.com>
Cc: Bartosz Golaszewski <bgolaszewski@baylibre.com>,
linux-omap@vger.kernel.org, linux-gpio@vger.kernel.org,
linux-kernel@vger.kernel.org,
Santosh Shilimkar <ssantosh@kernel.org>,
Russell King <rmk+kernel@armlinux.org.uk>,
Grygorii Strashko <grygorii.strashko@ti.com>
Subject: [PATCH-next 10/20] gpio: gpio-omap: simplify set_multiple()
Date: Mon, 10 Jun 2019 20:10:53 +0300 [thread overview]
Message-ID: <20190610171103.30903-11-grygorii.strashko@ti.com> (raw)
In-Reply-To: <20190610171103.30903-1-grygorii.strashko@ti.com>
From: Russell King <rmk+kernel@armlinux.org.uk>
One of the reasons for set_multiple() to exist is to allow multiple
GPIOs on the same chip to be changed simultaneously - see commit
5f42424354f5 ("gpiolib: allow simultaneous setting of multiple GPIO
outputs"):
- Simultaneous glitch-free setting of multiple pins on any kind of
parallel bus attached to GPIOs provided they all reside on the
same chip and bank.
In order for this to work, we should not use the atomic set/clear
registers, but instead read-modify-write the dataout register. We
already take the spinlock to ensure that happens atomically, so
move the code into the set_multiple() function and kill the two
helper functions.
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
---
drivers/gpio/gpio-omap.c | 45 +++++++---------------------------------
1 file changed, 7 insertions(+), 38 deletions(-)
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index a26decc5c611..8fdac6e4a929 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -74,8 +74,6 @@ struct gpio_bank {
int context_loss_count;
void (*set_dataout)(struct gpio_bank *bank, unsigned gpio, int enable);
- void (*set_dataout_multiple)(struct gpio_bank *bank,
- unsigned long *mask, unsigned long *bits);
int (*get_context_loss_count)(struct device *dev);
struct omap_gpio_reg_offs *regs;
@@ -146,35 +144,6 @@ static void omap_set_gpio_dataout_mask(struct gpio_bank *bank, unsigned offset,
bank->context.dataout = l;
}
-/* set multiple data out values using dedicate set/clear register */
-static void omap_set_gpio_dataout_reg_multiple(struct gpio_bank *bank,
- unsigned long *mask,
- unsigned long *bits)
-{
- void __iomem *reg = bank->base;
- u32 l;
-
- l = *bits & *mask;
- writel_relaxed(l, reg + bank->regs->set_dataout);
- bank->context.dataout |= l;
-
- l = ~*bits & *mask;
- writel_relaxed(l, reg + bank->regs->clr_dataout);
- bank->context.dataout &= ~l;
-}
-
-/* set multiple data out values using mask register */
-static void omap_set_gpio_dataout_mask_multiple(struct gpio_bank *bank,
- unsigned long *mask,
- unsigned long *bits)
-{
- void __iomem *reg = bank->base + bank->regs->dataout;
- u32 l = (readl_relaxed(reg) & ~*mask) | (*bits & *mask);
-
- writel_relaxed(l, reg);
- bank->context.dataout = l;
-}
-
static inline void omap_gpio_rmw(void __iomem *base, u32 reg, u32 mask, bool set)
{
int l = readl_relaxed(base + reg);
@@ -1037,10 +1006,14 @@ static void omap_gpio_set_multiple(struct gpio_chip *chip, unsigned long *mask,
unsigned long *bits)
{
struct gpio_bank *bank = gpiochip_get_data(chip);
+ void __iomem *reg = bank->base + bank->regs->dataout;
unsigned long flags;
+ u32 l;
raw_spin_lock_irqsave(&bank->lock, flags);
- bank->set_dataout_multiple(bank, mask, bits);
+ l = (readl_relaxed(reg) & ~*mask) | (*bits & *mask);
+ writel_relaxed(l, reg);
+ bank->context.dataout = l;
raw_spin_unlock_irqrestore(&bank->lock, flags);
}
@@ -1530,14 +1503,10 @@ static int omap_gpio_probe(struct platform_device *pdev)
pdata->get_context_loss_count;
}
- if (bank->regs->set_dataout && bank->regs->clr_dataout) {
+ if (bank->regs->set_dataout && bank->regs->clr_dataout)
bank->set_dataout = omap_set_gpio_dataout_reg;
- bank->set_dataout_multiple = omap_set_gpio_dataout_reg_multiple;
- } else {
+ else
bank->set_dataout = omap_set_gpio_dataout_mask;
- bank->set_dataout_multiple =
- omap_set_gpio_dataout_mask_multiple;
- }
raw_spin_lock_init(&bank->lock);
raw_spin_lock_init(&bank->wa_lock);
--
2.17.1
next prev parent reply other threads:[~2019-06-10 17:10 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-10 17:10 [PATCH-next 00/20] gpio: gpio-omap: set of fixes and big clean-up Grygorii Strashko
2019-06-10 17:10 ` [PATCH-next 01/20] gpio: gpio-omap: ensure irq is enabled before wakeup Grygorii Strashko
2019-06-12 7:54 ` Linus Walleij
2019-06-10 17:10 ` [PATCH-next 02/20] gpio: gpio-omap: fix lack of irqstatus_raw0 for OMAP4 Grygorii Strashko
2019-06-12 7:55 ` Linus Walleij
2019-06-10 17:10 ` [PATCH-next 03/20] gpio: gpio-omap: remove remainder of list management Grygorii Strashko
2019-06-12 7:56 ` Linus Walleij
2019-06-10 17:10 ` [PATCH-next 04/20] gpio: gpio-omap: clean up edge interrupt handling Grygorii Strashko
2019-06-12 7:57 ` Linus Walleij
2019-06-10 17:10 ` [PATCH-next 05/20] gpio: gpio-omap: remove irq_ack method Grygorii Strashko
2019-06-12 8:42 ` Linus Walleij
2019-06-10 17:10 ` [PATCH-next 06/20] gpio: gpio-omap: move omap_gpio_request() and omap_gpio_free() Grygorii Strashko
2019-06-12 8:43 ` Linus Walleij
2019-06-10 17:10 ` [PATCH-next 07/20] gpio: gpio-omap: simplify omap_gpio_get_direction() Grygorii Strashko
2019-06-12 8:47 ` Linus Walleij
2019-06-10 17:10 ` [PATCH-next 08/20] gpio: gpio-omap: simplify get() method Grygorii Strashko
2019-06-12 8:49 ` Linus Walleij
2019-06-10 17:10 ` [PATCH-next 09/20] gpio: gpio-omap: simplify get_multiple() Grygorii Strashko
2019-06-12 8:50 ` Linus Walleij
2019-06-10 17:10 ` Grygorii Strashko [this message]
2019-06-12 8:51 ` [PATCH-next 10/20] gpio: gpio-omap: simplify set_multiple() Linus Walleij
2019-06-10 17:10 ` [PATCH-next 11/20] gpio: gpio-omap: simplify bank->level_mask Grygorii Strashko
2019-06-10 17:10 ` [PATCH-next 12/20] gpio: gpio-omap: simplify read-modify-write Grygorii Strashko
2019-06-12 8:53 ` Linus Walleij
2019-06-10 17:10 ` [PATCH-next 13/20] gpio: gpio-omap: simplify omap_toggle_gpio_edge_triggering() Grygorii Strashko
2019-06-12 8:54 ` Linus Walleij
2019-06-10 17:10 ` [PATCH-next 14/20] gpio: gpio-omap: simplify omap_set_gpio_irqenable() Grygorii Strashko
2019-06-12 8:54 ` Linus Walleij
2019-06-10 17:10 ` [PATCH-next 15/20] gpio: gpio-omap: remove dataout variation in context handling Grygorii Strashko
2019-06-12 8:55 ` Linus Walleij
2019-06-10 17:10 ` [PATCH-next 16/20] gpio: gpio-omap: clean up omap_gpio_restore_context() Grygorii Strashko
2019-06-12 8:56 ` Linus Walleij
2019-06-10 17:11 ` [PATCH-next 17/20] gpio: gpio-omap: constify register tables Grygorii Strashko
2019-06-12 8:57 ` Linus Walleij
2019-06-10 17:11 ` [PATCH-next 18/20] gpio: gpio-omap: clean up wakeup handling Grygorii Strashko
2019-06-12 8:58 ` Linus Walleij
2019-06-10 17:11 ` [PATCH-next 19/20] gpio: gpio-omap: irq_startup() must not return error codes Grygorii Strashko
2019-06-12 8:59 ` Linus Walleij
2019-06-10 17:11 ` [PATCH-next 20/20] gpio: gpio-omap: clean up register access in omap2_set_gpio_debounce() Grygorii Strashko
2019-06-12 9:11 ` Linus Walleij
2019-06-17 18:57 ` grygorii
2019-06-18 11:28 ` Linus Walleij
2019-06-11 7:37 ` [PATCH-next 00/20] gpio: gpio-omap: set of fixes and big clean-up Tony Lindgren
2019-06-12 9:23 ` Linus Walleij
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=20190610171103.30903-11-grygorii.strashko@ti.com \
--to=grygorii.strashko@ti.com \
--cc=bgolaszewski@baylibre.com \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-omap@vger.kernel.org \
--cc=rmk+kernel@armlinux.org.uk \
--cc=rmk@arm.linux.org.uk \
--cc=ssantosh@kernel.org \
--cc=tony@atomide.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: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox