* [PATCH RFT] gpio: tpic2810: Make sure cached buffer has consistent status with h/w status
@ 2016-03-23 11:49 Axel Lin
2016-03-28 3:30 ` Alexandre Courbot
2016-03-31 13:14 ` Linus Walleij
0 siblings, 2 replies; 3+ messages in thread
From: Axel Lin @ 2016-03-23 11:49 UTC (permalink / raw)
To: Linus Walleij; +Cc: Andrew F. Davis, Alexandre Courbot, linux-gpio
i2c_smbus_write_byte_data() can fail. To ensure the cached buffer has
consistent status with h/w status, don't update the cached gpio->buffer
if write fails.
Also refactor the code a bit by adding a tpic2810_set_mask_bits() helper
and use it to simplify the code.
Signed-off-by: Axel Lin <axel.lin@ingics.com>
---
drivers/gpio/gpio-tpic2810.c | 35 +++++++++++++++--------------------
1 file changed, 15 insertions(+), 20 deletions(-)
diff --git a/drivers/gpio/gpio-tpic2810.c b/drivers/gpio/gpio-tpic2810.c
index 9f020aa..cace79c 100644
--- a/drivers/gpio/gpio-tpic2810.c
+++ b/drivers/gpio/gpio-tpic2810.c
@@ -57,39 +57,34 @@ static int tpic2810_direction_output(struct gpio_chip *chip,
return 0;
}
-static void tpic2810_set(struct gpio_chip *chip, unsigned offset, int value)
+static void tpic2810_set_mask_bits(struct gpio_chip *chip, u8 mask, u8 bits)
{
struct tpic2810 *gpio = gpiochip_get_data(chip);
+ u8 buffer;
+ int err;
mutex_lock(&gpio->lock);
- if (value)
- gpio->buffer |= BIT(offset);
- else
- gpio->buffer &= ~BIT(offset);
+ buffer = gpio->buffer & ~mask;
+ buffer |= (mask & bits);
- i2c_smbus_write_byte_data(gpio->client, TPIC2810_WS_COMMAND,
- gpio->buffer);
+ err = i2c_smbus_write_byte_data(gpio->client, TPIC2810_WS_COMMAND,
+ buffer);
+ if (!err)
+ gpio->buffer = buffer;
mutex_unlock(&gpio->lock);
}
+static void tpic2810_set(struct gpio_chip *chip, unsigned offset, int value)
+{
+ tpic2810_set_mask_bits(chip, BIT(offset), value ? BIT(offset) : 0);
+}
+
static void tpic2810_set_multiple(struct gpio_chip *chip, unsigned long *mask,
unsigned long *bits)
{
- struct tpic2810 *gpio = gpiochip_get_data(chip);
-
- mutex_lock(&gpio->lock);
-
- /* clear bits under mask */
- gpio->buffer &= ~(*mask);
- /* set bits under mask */
- gpio->buffer |= ((*mask) & (*bits));
-
- i2c_smbus_write_byte_data(gpio->client, TPIC2810_WS_COMMAND,
- gpio->buffer);
-
- mutex_unlock(&gpio->lock);
+ tpic2810_set_mask_bits(chip, *mask, *bits);
}
static struct gpio_chip template_chip = {
--
2.1.4
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH RFT] gpio: tpic2810: Make sure cached buffer has consistent status with h/w status
2016-03-23 11:49 [PATCH RFT] gpio: tpic2810: Make sure cached buffer has consistent status with h/w status Axel Lin
@ 2016-03-28 3:30 ` Alexandre Courbot
2016-03-31 13:14 ` Linus Walleij
1 sibling, 0 replies; 3+ messages in thread
From: Alexandre Courbot @ 2016-03-28 3:30 UTC (permalink / raw)
To: Axel Lin; +Cc: Linus Walleij, Andrew F. Davis, linux-gpio@vger.kernel.org
On Wed, Mar 23, 2016 at 8:49 PM, Axel Lin <axel.lin@ingics.com> wrote:
> i2c_smbus_write_byte_data() can fail. To ensure the cached buffer has
> consistent status with h/w status, don't update the cached gpio->buffer
> if write fails.
> Also refactor the code a bit by adding a tpic2810_set_mask_bits() helper
> and use it to simplify the code.
Looks pretty good!
Reviewed-by: Alexandre Courbot <acourbot@nvidia.com>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH RFT] gpio: tpic2810: Make sure cached buffer has consistent status with h/w status
2016-03-23 11:49 [PATCH RFT] gpio: tpic2810: Make sure cached buffer has consistent status with h/w status Axel Lin
2016-03-28 3:30 ` Alexandre Courbot
@ 2016-03-31 13:14 ` Linus Walleij
1 sibling, 0 replies; 3+ messages in thread
From: Linus Walleij @ 2016-03-31 13:14 UTC (permalink / raw)
To: Axel Lin; +Cc: Andrew F. Davis, Alexandre Courbot, linux-gpio@vger.kernel.org
On Wed, Mar 23, 2016 at 12:49 PM, Axel Lin <axel.lin@ingics.com> wrote:
> i2c_smbus_write_byte_data() can fail. To ensure the cached buffer has
> consistent status with h/w status, don't update the cached gpio->buffer
> if write fails.
> Also refactor the code a bit by adding a tpic2810_set_mask_bits() helper
> and use it to simplify the code.
>
> Signed-off-by: Axel Lin <axel.lin@ingics.com>
Patch applied with Alexandre's review tag.
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2016-03-31 13:14 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-03-23 11:49 [PATCH RFT] gpio: tpic2810: Make sure cached buffer has consistent status with h/w status Axel Lin
2016-03-28 3:30 ` Alexandre Courbot
2016-03-31 13:14 ` Linus Walleij
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.