linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Roland Stigge <stigge@antcom.de>
To: grant.likely@secretlab.ca, linus.walleij@linaro.org,
	linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org, w.sang@pengutronix.de,
	jbe@pengutronix.de
Cc: Roland Stigge <stigge@antcom.de>
Subject: [PATCH RFC 2/2] gpio-max730x: Add block GPIO API
Date: Thu, 27 Sep 2012 23:22:03 +0200	[thread overview]
Message-ID: <1348780923-27428-2-git-send-email-stigge@antcom.de> (raw)
In-Reply-To: <1348780923-27428-1-git-send-email-stigge@antcom.de>

This patch adds block GPIO API support to the MAX730x driver.

Due to hardware constraints in this chip, simultaneous access to GPIO lines can
only be done in groups of 8: GPIOs 0-7, 8-15, 16-23, 24-27. However, setting
and clearing will be done at once.

Signed-off-by: Roland Stigge <stigge@antcom.de>

---
 drivers/gpio/gpio-max730x.c |   53 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 53 insertions(+)

--- linux-2.6.orig/drivers/gpio/gpio-max730x.c
+++ linux-2.6/drivers/gpio/gpio-max730x.c
@@ -146,6 +146,37 @@ static int max7301_get(struct gpio_chip
 	return level;
 }
 
+static void max7301_get_block(struct gpio_chip *chip, u8 *values, size_t size)
+{
+	struct max7301 *ts = container_of(chip, struct max7301, chip);
+	int i, j;
+
+	for (i = 0; i < size; i++) {
+		u8 in_level = ts->read(ts->dev, 0x44 + i * 8);
+		u8 in_mask = 0;
+		u8 out_level = (ts->out_level >> (i * 8 + 4)) & 0xFF;
+		u8 out_mask = 0;
+
+		for (j = 0; j < 8; j++) {
+			int offset = 4 + i * 8 + j;
+			int config = (ts->port_config[offset >> 2] >>
+				      ((offset & 3) << 1)) &
+				     PIN_CONFIG_MASK;
+
+			switch (config) {
+			case PIN_CONFIG_OUT:
+				out_mask |= BIT(j);
+				break;
+			case PIN_CONFIG_IN_WO_PULLUP:
+			case PIN_CONFIG_IN_PULLUP:
+				in_mask |= BIT(j);
+			}
+		}
+
+		values[i] = (in_level & in_mask) | (out_level & out_mask);
+	}
+}
+
 static void max7301_set(struct gpio_chip *chip, unsigned offset, int value)
 {
 	struct max7301 *ts = container_of(chip, struct max7301, chip);
@@ -160,6 +191,26 @@ static void max7301_set(struct gpio_chip
 	mutex_unlock(&ts->lock);
 }
 
+static
+void max7301_set_block(struct gpio_chip *chip, u8 *set, u8 *clr, size_t size)
+{
+	struct max7301 *ts = container_of(chip, struct max7301, chip);
+	int i;
+
+	mutex_lock(&ts->lock);
+
+	for (i = 0; i < size; i++) {
+		if (set[i] | clr[i]) { /* only on change */
+			ts->out_level |= (u32)set[i] << (i * 8 + 4);
+			ts->out_level &= ~((u32)clr[i] << (i * 8 + 4));
+			ts->write(ts->dev, 0x44 + i * 8,
+				  (ts->out_level >> (i * 8 + 4)) & 0xFF);
+		}
+	}
+
+	mutex_unlock(&ts->lock);
+}
+
 int __devinit __max730x_probe(struct max7301 *ts)
 {
 	struct device *dev = ts->dev;
@@ -183,8 +234,10 @@ int __devinit __max730x_probe(struct max
 
 	ts->chip.direction_input = max7301_direction_input;
 	ts->chip.get = max7301_get;
+	ts->chip.get_block = max7301_get_block;
 	ts->chip.direction_output = max7301_direction_output;
 	ts->chip.set = max7301_set;
+	ts->chip.set_block = max7301_set_block;
 
 	ts->chip.base = pdata->base;
 	ts->chip.ngpio = PIN_NUMBER;

  reply	other threads:[~2012-09-27 21:22 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-27 21:22 [PATCH RFC 1/2] gpio: Add a block GPIO API to gpiolib Roland Stigge
2012-09-27 21:22 ` Roland Stigge [this message]
2012-09-28  2:47 ` Jean-Christophe PLAGNIOL-VILLARD
2012-09-28  7:14   ` Roland Stigge
2012-09-28  7:51     ` Jean-Christophe PLAGNIOL-VILLARD
2012-09-28  8:51       ` Roland Stigge
2012-09-28  9:08         ` Jean-Christophe PLAGNIOL-VILLARD
2012-09-28  9:23           ` Roland Stigge
2012-09-28 10:28           ` Jean-Christophe PLAGNIOL-VILLARD
2012-09-28 11:32             ` Roland Stigge
2012-09-28 16:01               ` Jean-Christophe PLAGNIOL-VILLARD
2012-09-28 18:32                 ` Roland Stigge
2012-09-29 19:57                   ` Jean-Christophe PLAGNIOL-VILLARD
2012-09-30 10:34                     ` Roland Stigge
2012-09-30 15:11                       ` Stijn Devriendt
2012-09-28  9:14 ` Linus Walleij
2012-09-28  9:52   ` Roland Stigge
2012-09-28 11:34     ` Linus Walleij
2012-09-28 12:35       ` Roland Stigge
     [not found] ` <CAOY=C6GG6jqqEAAGJjmDG-BFT2eq=9+ck+F_EOcthRgDCDv8=Q@mail.gmail.com>
2012-09-30  9:39   ` Stijn Devriendt
2012-09-30 10:50   ` Roland Stigge
2012-09-30 14:52     ` Stijn Devriendt
2012-09-30 15:09       ` Roland Stigge
2012-09-30 15:19         ` Stijn Devriendt
2012-09-30 15:46           ` Roland Stigge
2012-10-03 23:11             ` Linus Walleij
2012-10-03 23:07     ` Linus Walleij
2012-10-04 20:25       ` Roland Stigge
2012-10-03 19:08 ` Mark Brown

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=1348780923-27428-2-git-send-email-stigge@antcom.de \
    --to=stigge@antcom.de \
    --cc=grant.likely@secretlab.ca \
    --cc=jbe@pengutronix.de \
    --cc=linus.walleij@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=w.sang@pengutronix.de \
    /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;
as well as URLs for NNTP newsgroup(s).