All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [PATCH 2/2] gpio-pca953x: Add set_multiple to allow multiple bits to be set in one write.
       [not found] ` <1449215550-61730-3-git-send-email-preid@electromag.com.au>
@ 2015-12-10 22:58   ` Linus Walleij
  0 siblings, 0 replies; 2+ messages in thread
From: Linus Walleij @ 2015-12-10 22:58 UTC (permalink / raw)
  To: Phil Reid; +Cc: linus.walleij@linaro.org gnurou@gmail.com

On Fri, Dec 4, 2015 at 8:52 AM, Phil Reid <preid@electromag.com.au> wrote:

> Tested with TCA6408 / TCA6416 devices.
>
> Signed-off-by: Phil Reid <preid@electromag.com.au>

Nice stuff! Patch applied. I'll have to fix up my refactoring patch but
I can do that.

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 2+ messages in thread

* [PATCH 2/2] gpio-pca953x: Add set_multiple to allow multiple bits to be set in one write.
  2015-12-04  9:06 [PATCH 0/2] fdsfsd Phil Reid
@ 2015-12-04  9:06 ` Phil Reid
  0 siblings, 0 replies; 2+ messages in thread
From: Phil Reid @ 2015-12-04  9:06 UTC (permalink / raw)
  To: gnurou, linux-gpio; +Cc: Phil Reid

Tested with TCA6408 / TCA6416 devices.

Signed-off-by: Phil Reid <preid@electromag.com.au>
---
 drivers/gpio/gpio-pca953x.c | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
index 2d4892c..7c7229c 100644
--- a/drivers/gpio/gpio-pca953x.c
+++ b/drivers/gpio/gpio-pca953x.c
@@ -352,6 +352,43 @@ exit:
 	mutex_unlock(&chip->i2c_lock);
 }
 
+
+static void pca953x_gpio_set_multiple(struct gpio_chip *gc,
+		unsigned long *mask, unsigned long *bits)
+{
+	struct pca953x_chip *chip = to_pca(gc);
+	u8 reg_val[MAX_BANK];
+	int ret, offset = 0;
+	int bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ);
+	int bank;
+
+	switch (chip->chip_type) {
+	case PCA953X_TYPE:
+		offset = PCA953X_OUTPUT;
+		break;
+	case PCA957X_TYPE:
+		offset = PCA957X_OUT;
+		break;
+	}
+
+	memcpy(reg_val, chip->reg_output, NBANK(chip));
+	mutex_lock(&chip->i2c_lock);
+	for(bank=0; bank<NBANK(chip); bank++) {
+		unsigned bankmask = mask[bank/4] >> ((bank % 4) * 8);
+		if(bankmask) {
+			unsigned bankval  = bits[bank/4] >> ((bank % 4) * 8);
+			reg_val[bank] = (reg_val[bank] & ~bankmask) | bankval;
+		}
+	}
+	ret = i2c_smbus_write_i2c_block_data(chip->client, offset << bank_shift, NBANK(chip), reg_val);
+	if (ret)
+		goto exit;
+
+	memcpy(chip->reg_output, reg_val, NBANK(chip));
+exit:
+	mutex_unlock(&chip->i2c_lock);
+}
+
 static void pca953x_setup_gpio(struct pca953x_chip *chip, int gpios)
 {
 	struct gpio_chip *gc;
@@ -362,6 +399,7 @@ static void pca953x_setup_gpio(struct pca953x_chip *chip, int gpios)
 	gc->direction_output = pca953x_gpio_direction_output;
 	gc->get = pca953x_gpio_get_value;
 	gc->set = pca953x_gpio_set_value;
+	gc->set_multiple = pca953x_gpio_set_multiple;
 	gc->can_sleep = true;
 
 	gc->base = chip->gpio_start;
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2015-12-10 22:58 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <1449215550-61730-1-git-send-email-preid@electromag.com.au>
     [not found] ` <1449215550-61730-3-git-send-email-preid@electromag.com.au>
2015-12-10 22:58   ` [PATCH 2/2] gpio-pca953x: Add set_multiple to allow multiple bits to be set in one write Linus Walleij
2015-12-04  9:06 [PATCH 0/2] fdsfsd Phil Reid
2015-12-04  9:06 ` [PATCH 2/2] gpio-pca953x: Add set_multiple to allow multiple bits to be set in one write Phil Reid

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.