All of lore.kernel.org
 help / color / mirror / Atom feed
From: Janusz Krzysztofik <jmkrzyszt@gmail.com>
To: Linus Walleij <linus.walleij@linaro.org>
Cc: Jonathan Corbet <corbet@lwn.net>,
	Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>,
	Peter Korsgaard <peter.korsgaard@barco.com>,
	Peter Rosin <peda@axentia.se>,
	Ulf Hansson <ulf.hansson@linaro.org>,
	Andrew Lunn <andrew@lunn.ch>,
	Florian Fainelli <f.fainelli@gmail.com>,
	"David S. Miller" <davem@davemloft.net>,
	Dominik Brodowski <linux@dominikbrodowski.net>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Kishon Vijay Abraham I <kishon@ti.com>,
	Lars-Peter Clausen <lars@metafoo.de>,
	Michael Hennerich <Michael.Hennerich@analog.com>,
	Jonathan Cameron <jic23@kernel.org>,
	Hartmut Knaack <knaack.h@gmx.de>,
	Peter Meerwald-Stadler <pmeerw@pmeerw.net>,
	Jiri Slaby <jslaby@suse.com>, Willy Tarreau <w@1wt.eu>,
	Geert Uytterhoeven <geert@linux-m68k.org>
Subject: [PATCH v8 4/4] gpiolib: Implement fast processing path in get/set array
Date: Wed,  5 Sep 2018 23:50:08 +0200	[thread overview]
Message-ID: <20180905215008.1649-5-jmkrzyszt@gmail.com> (raw)
In-Reply-To: <20180905215008.1649-1-jmkrzyszt@gmail.com>

Certain GPIO descriptor arrays returned by gpio_get_array() may contain
information on direct mapping of array members to pins of a single GPIO
chip in hardware order.  In such cases, bitmaps of values can be passed
directly from/to the chip's .get/set_multiple() callbacks without
wasting time on iterations.

Add respective code to gpiod_get/set_array_bitmap_complex() functions.
Pins not applicable for fast path are processed as before, skipping
over the 'fast' ones.

Cc: Jonathan Corbet <corbet@lwn.net>
Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
---
 Documentation/driver-api/gpio/board.rst    | 15 ++++++
 Documentation/driver-api/gpio/consumer.rst |  8 +++
 drivers/gpio/gpiolib.c                     | 87 ++++++++++++++++++++++++++++--
 3 files changed, 105 insertions(+), 5 deletions(-)

diff --git a/Documentation/driver-api/gpio/board.rst b/Documentation/driver-api/gpio/board.rst
index 2c112553df84..c66821e033c2 100644
--- a/Documentation/driver-api/gpio/board.rst
+++ b/Documentation/driver-api/gpio/board.rst
@@ -193,3 +193,18 @@ And the table can be added to the board code as follows::
 
 The line will be hogged as soon as the gpiochip is created or - in case the
 chip was created earlier - when the hog table is registered.
+
+Arrays of pins
+--------------
+In addition to requesting pins belonging to a function one by one, a device may
+also request an array of pins assigned to the function.  The way those pins are
+mapped to the device determines if the array qualifies for fast bitmap
+processing.  If yes, a bitmap is passed over get/set array functions directly
+between a caller and a respective .get/set_multiple() callback of a GPIO chip.
+
+In order to qualify for fast bitmap processing, the pin mapping must meet the
+following requirements:
+- it must belong to the same chip as other 'fast' pins of the function,
+- its index within the function must match its hardware number within the chip.
+
+Open drain and open source pins are excluded from fast bitmap output processing.
diff --git a/Documentation/driver-api/gpio/consumer.rst b/Documentation/driver-api/gpio/consumer.rst
index 0afd95a12b10..cf992e5ab976 100644
--- a/Documentation/driver-api/gpio/consumer.rst
+++ b/Documentation/driver-api/gpio/consumer.rst
@@ -388,6 +388,14 @@ array_info should be set to NULL.
 Note that for optimal performance GPIOs belonging to the same chip should be
 contiguous within the array of descriptors.
 
+Still better performance may be achieved if array indexes of the descriptors
+match hardware pin numbers of a single chip.  If an array passed to a get/set
+array function matches the one obtained from gpiod_get_array() and array_info
+associated with the array is also passed, the function may take a fast bitmap
+processing path, passing the value_bitmap argument directly to the respective
+.get/set_multiple() callback of the chip.  That allows for utilization of GPIO
+banks as data I/O ports without much loss of performance.
+
 The return value of gpiod_get_array_value() and its variants is 0 on success
 or negative on error. Note the difference to gpiod_get_value(), which returns
 0 or 1 on success to convey the GPIO value. With the array functions, the GPIO
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index cd7c1deed132..d7532aa6c0bc 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -2789,7 +2789,36 @@ int gpiod_get_array_value_complex(bool raw, bool can_sleep,
 				  struct gpio_array *array_info,
 				  unsigned long *value_bitmap)
 {
-	int i = 0;
+	int err, i = 0;
+
+	/*
+	 * Validate array_info against desc_array and its size.
+	 * It should immediately follow desc_array if both
+	 * have been obtained from the same gpiod_get_array() call.
+	 */
+	if (array_info && array_info->desc == desc_array &&
+	    array_size <= array_info->size &&
+	    (void *)array_info == desc_array + array_info->size) {
+		if (!can_sleep)
+			WARN_ON(array_info->chip->can_sleep);
+
+		err = gpio_chip_get_multiple(array_info->chip,
+					     array_info->get_mask,
+					     value_bitmap);
+		if (err)
+			return err;
+
+		if (!raw && !bitmap_empty(array_info->invert_mask, array_size))
+			bitmap_xor(value_bitmap, value_bitmap,
+				   array_info->invert_mask, array_size);
+
+		if (bitmap_full(array_info->get_mask, array_size))
+			return 0;
+
+		i = find_first_zero_bit(array_info->get_mask, array_size);
+	} else {
+		array_info = NULL;
+	}
 
 	while (i < array_size) {
 		struct gpio_chip *chip = desc_array[i]->gdev->chip;
@@ -2820,7 +2849,12 @@ int gpiod_get_array_value_complex(bool raw, bool can_sleep,
 			int hwgpio = gpio_chip_hwgpio(desc);
 
 			__set_bit(hwgpio, mask);
-			i++;
+
+			if (array_info)
+				find_next_zero_bit(array_info->get_mask,
+						   array_size, i);
+			else
+				i++;
 		} while ((i < array_size) &&
 			 (desc_array[i]->gdev->chip == chip));
 
@@ -2831,7 +2865,7 @@ int gpiod_get_array_value_complex(bool raw, bool can_sleep,
 			return ret;
 		}
 
-		for (j = first; j < i; j++) {
+		for (j = first; j < i; ) {
 			const struct gpio_desc *desc = desc_array[j];
 			int hwgpio = gpio_chip_hwgpio(desc);
 			int value = test_bit(hwgpio, bits);
@@ -2840,6 +2874,11 @@ int gpiod_get_array_value_complex(bool raw, bool can_sleep,
 				value = !value;
 			__assign_bit(j, value_bitmap, value);
 			trace_gpio_value(desc_to_gpio(desc), 1, value);
+
+			if (array_info)
+				find_next_zero_bit(array_info->get_mask, i, j);
+			else
+				j++;
 		}
 
 		if (mask != fastpath)
@@ -3043,6 +3082,32 @@ int gpiod_set_array_value_complex(bool raw, bool can_sleep,
 {
 	int i = 0;
 
+	/*
+	 * Validate array_info against desc_array and its size.
+	 * It should immediately follow desc_array if both
+	 * have been obtained from the same gpiod_get_array() call.
+	 */
+	if (array_info && array_info->desc == desc_array &&
+	    array_size <= array_info->size &&
+	    (void *)array_info == desc_array + array_info->size) {
+		if (!can_sleep)
+			WARN_ON(array_info->chip->can_sleep);
+
+		if (!raw && !bitmap_empty(array_info->invert_mask, array_size))
+			bitmap_xor(value_bitmap, value_bitmap,
+				   array_info->invert_mask, array_size);
+
+		gpio_chip_set_multiple(array_info->chip, array_info->set_mask,
+				       value_bitmap);
+
+		if (bitmap_full(array_info->set_mask, array_size))
+			return 0;
+
+		i = find_first_zero_bit(array_info->set_mask, array_size);
+	} else {
+		array_info = NULL;
+	}
+
 	while (i < array_size) {
 		struct gpio_chip *chip = desc_array[i]->gdev->chip;
 		unsigned long fastpath[2 * BITS_TO_LONGS(FASTPATH_NGPIO)];
@@ -3070,7 +3135,14 @@ int gpiod_set_array_value_complex(bool raw, bool can_sleep,
 			int hwgpio = gpio_chip_hwgpio(desc);
 			int value = test_bit(i, value_bitmap);
 
-			if (!raw && test_bit(FLAG_ACTIVE_LOW, &desc->flags))
+			/*
+			 * Pins applicable for fast input but not for
+			 * fast output processing may have been already
+			 * inverted inside the fast path, skip them.
+			 */
+			if (!raw && !(array_info &&
+			    test_bit(i, array_info->invert_mask)) &&
+			    test_bit(FLAG_ACTIVE_LOW, &desc->flags))
 				value = !value;
 			trace_gpio_value(desc_to_gpio(desc), 0, value);
 			/*
@@ -3089,7 +3161,12 @@ int gpiod_set_array_value_complex(bool raw, bool can_sleep,
 					__clear_bit(hwgpio, bits);
 				count++;
 			}
-			i++;
+
+			if (array_info)
+				find_next_zero_bit(array_info->set_mask,
+						   array_size, i);
+			else
+				i++;
 		} while ((i < array_size) &&
 			 (desc_array[i]->gdev->chip == chip));
 		/* push collected bits to outputs */
-- 
2.16.4

WARNING: multiple messages have this Message-ID (diff)
From: Janusz Krzysztofik <jmkrzyszt@gmail.com>
To: Linus Walleij <linus.walleij@linaro.org>
Cc: "Jonathan Corbet" <corbet@lwn.net>,
	"Miguel Ojeda Sandonis" <miguel.ojeda.sandonis@gmail.com>,
	"Peter Korsgaard" <peter.korsgaard@barco.com>,
	"Peter Rosin" <peda@axentia.se>,
	"Ulf Hansson" <ulf.hansson@linaro.org>,
	"Andrew Lunn" <andrew@lunn.ch>,
	"Florian Fainelli" <f.fainelli@gmail.com>,
	"David S. Miller" <davem@davemloft.net>,
	"Dominik Brodowski" <linux@dominikbrodowski.net>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"Kishon Vijay Abraham I" <kishon@ti.com>,
	"Lars-Peter Clausen" <lars@metafoo.de>,
	"Michael Hennerich" <Michael.Hennerich@analog.com>,
	"Jonathan Cameron" <jic23@kernel.org>,
	"Hartmut Knaack" <knaack.h@gmx.de>,
	"Peter Meerwald-Stadler" <pmeerw@pmeerw.net>,
	"Jiri Slaby" <jslaby@suse.com>, "Willy Tarreau" <w@1wt.eu>,
	"Geert Uytterhoeven" <geert@linux-m68k.org>,
	"Sebastien Bourdelin" <sebastien.bourdelin@savoirfairelinux.com>,
	"Lukas Wunner" <lukas@wunner.de>,
	"Rojhalat Ibrahim" <imr@rtschenk.de>,
	"Russell King" <rmk+kernel@armlinux.org.uk>,
	"Tony Lindgren" <tony@atomide.com>,
	"Yegor Yefremov" <yegorslists@googlemail.com>,
	"Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>,
	"Janusz Krzysztofik" <jmkrzyszt@gmail.com>,
	linux-doc@vger.kernel.org, linux-i2c@vger.kernel.org,
	linux-mmc@vger.kernel.org, netdev@vger.kernel.org,
	linux-iio@vger.kernel.org, devel@driverdev.osuosl.org,
	linux-serial@vger.kernel.org, linux-gpio@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: [PATCH v8 4/4] gpiolib: Implement fast processing path in get/set array
Date: Wed,  5 Sep 2018 23:50:08 +0200	[thread overview]
Message-ID: <20180905215008.1649-5-jmkrzyszt@gmail.com> (raw)
In-Reply-To: <20180905215008.1649-1-jmkrzyszt@gmail.com>

Certain GPIO descriptor arrays returned by gpio_get_array() may contain
information on direct mapping of array members to pins of a single GPIO
chip in hardware order.  In such cases, bitmaps of values can be passed
directly from/to the chip's .get/set_multiple() callbacks without
wasting time on iterations.

Add respective code to gpiod_get/set_array_bitmap_complex() functions.
Pins not applicable for fast path are processed as before, skipping
over the 'fast' ones.

Cc: Jonathan Corbet <corbet@lwn.net>
Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
---
 Documentation/driver-api/gpio/board.rst    | 15 ++++++
 Documentation/driver-api/gpio/consumer.rst |  8 +++
 drivers/gpio/gpiolib.c                     | 87 ++++++++++++++++++++++++++++--
 3 files changed, 105 insertions(+), 5 deletions(-)

diff --git a/Documentation/driver-api/gpio/board.rst b/Documentation/driver-api/gpio/board.rst
index 2c112553df84..c66821e033c2 100644
--- a/Documentation/driver-api/gpio/board.rst
+++ b/Documentation/driver-api/gpio/board.rst
@@ -193,3 +193,18 @@ And the table can be added to the board code as follows::
 
 The line will be hogged as soon as the gpiochip is created or - in case the
 chip was created earlier - when the hog table is registered.
+
+Arrays of pins
+--------------
+In addition to requesting pins belonging to a function one by one, a device may
+also request an array of pins assigned to the function.  The way those pins are
+mapped to the device determines if the array qualifies for fast bitmap
+processing.  If yes, a bitmap is passed over get/set array functions directly
+between a caller and a respective .get/set_multiple() callback of a GPIO chip.
+
+In order to qualify for fast bitmap processing, the pin mapping must meet the
+following requirements:
+- it must belong to the same chip as other 'fast' pins of the function,
+- its index within the function must match its hardware number within the chip.
+
+Open drain and open source pins are excluded from fast bitmap output processing.
diff --git a/Documentation/driver-api/gpio/consumer.rst b/Documentation/driver-api/gpio/consumer.rst
index 0afd95a12b10..cf992e5ab976 100644
--- a/Documentation/driver-api/gpio/consumer.rst
+++ b/Documentation/driver-api/gpio/consumer.rst
@@ -388,6 +388,14 @@ array_info should be set to NULL.
 Note that for optimal performance GPIOs belonging to the same chip should be
 contiguous within the array of descriptors.
 
+Still better performance may be achieved if array indexes of the descriptors
+match hardware pin numbers of a single chip.  If an array passed to a get/set
+array function matches the one obtained from gpiod_get_array() and array_info
+associated with the array is also passed, the function may take a fast bitmap
+processing path, passing the value_bitmap argument directly to the respective
+.get/set_multiple() callback of the chip.  That allows for utilization of GPIO
+banks as data I/O ports without much loss of performance.
+
 The return value of gpiod_get_array_value() and its variants is 0 on success
 or negative on error. Note the difference to gpiod_get_value(), which returns
 0 or 1 on success to convey the GPIO value. With the array functions, the GPIO
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index cd7c1deed132..d7532aa6c0bc 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -2789,7 +2789,36 @@ int gpiod_get_array_value_complex(bool raw, bool can_sleep,
 				  struct gpio_array *array_info,
 				  unsigned long *value_bitmap)
 {
-	int i = 0;
+	int err, i = 0;
+
+	/*
+	 * Validate array_info against desc_array and its size.
+	 * It should immediately follow desc_array if both
+	 * have been obtained from the same gpiod_get_array() call.
+	 */
+	if (array_info && array_info->desc == desc_array &&
+	    array_size <= array_info->size &&
+	    (void *)array_info == desc_array + array_info->size) {
+		if (!can_sleep)
+			WARN_ON(array_info->chip->can_sleep);
+
+		err = gpio_chip_get_multiple(array_info->chip,
+					     array_info->get_mask,
+					     value_bitmap);
+		if (err)
+			return err;
+
+		if (!raw && !bitmap_empty(array_info->invert_mask, array_size))
+			bitmap_xor(value_bitmap, value_bitmap,
+				   array_info->invert_mask, array_size);
+
+		if (bitmap_full(array_info->get_mask, array_size))
+			return 0;
+
+		i = find_first_zero_bit(array_info->get_mask, array_size);
+	} else {
+		array_info = NULL;
+	}
 
 	while (i < array_size) {
 		struct gpio_chip *chip = desc_array[i]->gdev->chip;
@@ -2820,7 +2849,12 @@ int gpiod_get_array_value_complex(bool raw, bool can_sleep,
 			int hwgpio = gpio_chip_hwgpio(desc);
 
 			__set_bit(hwgpio, mask);
-			i++;
+
+			if (array_info)
+				find_next_zero_bit(array_info->get_mask,
+						   array_size, i);
+			else
+				i++;
 		} while ((i < array_size) &&
 			 (desc_array[i]->gdev->chip == chip));
 
@@ -2831,7 +2865,7 @@ int gpiod_get_array_value_complex(bool raw, bool can_sleep,
 			return ret;
 		}
 
-		for (j = first; j < i; j++) {
+		for (j = first; j < i; ) {
 			const struct gpio_desc *desc = desc_array[j];
 			int hwgpio = gpio_chip_hwgpio(desc);
 			int value = test_bit(hwgpio, bits);
@@ -2840,6 +2874,11 @@ int gpiod_get_array_value_complex(bool raw, bool can_sleep,
 				value = !value;
 			__assign_bit(j, value_bitmap, value);
 			trace_gpio_value(desc_to_gpio(desc), 1, value);
+
+			if (array_info)
+				find_next_zero_bit(array_info->get_mask, i, j);
+			else
+				j++;
 		}
 
 		if (mask != fastpath)
@@ -3043,6 +3082,32 @@ int gpiod_set_array_value_complex(bool raw, bool can_sleep,
 {
 	int i = 0;
 
+	/*
+	 * Validate array_info against desc_array and its size.
+	 * It should immediately follow desc_array if both
+	 * have been obtained from the same gpiod_get_array() call.
+	 */
+	if (array_info && array_info->desc == desc_array &&
+	    array_size <= array_info->size &&
+	    (void *)array_info == desc_array + array_info->size) {
+		if (!can_sleep)
+			WARN_ON(array_info->chip->can_sleep);
+
+		if (!raw && !bitmap_empty(array_info->invert_mask, array_size))
+			bitmap_xor(value_bitmap, value_bitmap,
+				   array_info->invert_mask, array_size);
+
+		gpio_chip_set_multiple(array_info->chip, array_info->set_mask,
+				       value_bitmap);
+
+		if (bitmap_full(array_info->set_mask, array_size))
+			return 0;
+
+		i = find_first_zero_bit(array_info->set_mask, array_size);
+	} else {
+		array_info = NULL;
+	}
+
 	while (i < array_size) {
 		struct gpio_chip *chip = desc_array[i]->gdev->chip;
 		unsigned long fastpath[2 * BITS_TO_LONGS(FASTPATH_NGPIO)];
@@ -3070,7 +3135,14 @@ int gpiod_set_array_value_complex(bool raw, bool can_sleep,
 			int hwgpio = gpio_chip_hwgpio(desc);
 			int value = test_bit(i, value_bitmap);
 
-			if (!raw && test_bit(FLAG_ACTIVE_LOW, &desc->flags))
+			/*
+			 * Pins applicable for fast input but not for
+			 * fast output processing may have been already
+			 * inverted inside the fast path, skip them.
+			 */
+			if (!raw && !(array_info &&
+			    test_bit(i, array_info->invert_mask)) &&
+			    test_bit(FLAG_ACTIVE_LOW, &desc->flags))
 				value = !value;
 			trace_gpio_value(desc_to_gpio(desc), 0, value);
 			/*
@@ -3089,7 +3161,12 @@ int gpiod_set_array_value_complex(bool raw, bool can_sleep,
 					__clear_bit(hwgpio, bits);
 				count++;
 			}
-			i++;
+
+			if (array_info)
+				find_next_zero_bit(array_info->set_mask,
+						   array_size, i);
+			else
+				i++;
 		} while ((i < array_size) &&
 			 (desc_array[i]->gdev->chip == chip));
 		/* push collected bits to outputs */
-- 
2.16.4


WARNING: multiple messages have this Message-ID (diff)
From: Janusz Krzysztofik <jmkrzyszt@gmail.com>
To: Linus Walleij <linus.walleij@linaro.org>
Cc: Jonathan Corbet <corbet@lwn.net>,
	Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>,
	Peter Korsgaard <peter.korsgaard@barco.com>,
	Peter Rosin <peda@axentia.se>,
	Ulf Hansson <ulf.hansson@linaro.org>,
	Andrew Lunn <andrew@lunn.ch>,
	Florian Fainelli <f.fainelli@gmail.com>,
	"David S. Miller" <davem@davemloft.net>,
	Dominik Brodowski <linux@dominikbrodowski.net>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Kishon Vijay Abraham I <kishon@ti.com>,
	Lars-Peter Clausen <lars@metafoo.de>,
	Michael Hennerich <Michael.Hennerich@analog.com>,
	Jonathan Cameron <jic23@kernel.org>,
	Hartmut Knaack <knaack.h@gmx.de>,
	Peter Meerwald-Stadler <pmeerw@pmeerw.net>,
	Jiri Slaby <jslaby@suse.com>, Willy Tarreau <w@1wt.eu>,
	Geert Uytterhoeven <geert@linux-m68k.org>,
Subject: [PATCH v8 4/4] gpiolib: Implement fast processing path in get/set array
Date: Wed,  5 Sep 2018 23:50:08 +0200	[thread overview]
Message-ID: <20180905215008.1649-5-jmkrzyszt@gmail.com> (raw)
In-Reply-To: <20180905215008.1649-1-jmkrzyszt@gmail.com>

Certain GPIO descriptor arrays returned by gpio_get_array() may contain
information on direct mapping of array members to pins of a single GPIO
chip in hardware order.  In such cases, bitmaps of values can be passed
directly from/to the chip's .get/set_multiple() callbacks without
wasting time on iterations.

Add respective code to gpiod_get/set_array_bitmap_complex() functions.
Pins not applicable for fast path are processed as before, skipping
over the 'fast' ones.

Cc: Jonathan Corbet <corbet@lwn.net>
Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
---
 Documentation/driver-api/gpio/board.rst    | 15 ++++++
 Documentation/driver-api/gpio/consumer.rst |  8 +++
 drivers/gpio/gpiolib.c                     | 87 ++++++++++++++++++++++++++++--
 3 files changed, 105 insertions(+), 5 deletions(-)

diff --git a/Documentation/driver-api/gpio/board.rst b/Documentation/driver-api/gpio/board.rst
index 2c112553df84..c66821e033c2 100644
--- a/Documentation/driver-api/gpio/board.rst
+++ b/Documentation/driver-api/gpio/board.rst
@@ -193,3 +193,18 @@ And the table can be added to the board code as follows::
 
 The line will be hogged as soon as the gpiochip is created or - in case the
 chip was created earlier - when the hog table is registered.
+
+Arrays of pins
+--------------
+In addition to requesting pins belonging to a function one by one, a device may
+also request an array of pins assigned to the function.  The way those pins are
+mapped to the device determines if the array qualifies for fast bitmap
+processing.  If yes, a bitmap is passed over get/set array functions directly
+between a caller and a respective .get/set_multiple() callback of a GPIO chip.
+
+In order to qualify for fast bitmap processing, the pin mapping must meet the
+following requirements:
+- it must belong to the same chip as other 'fast' pins of the function,
+- its index within the function must match its hardware number within the chip.
+
+Open drain and open source pins are excluded from fast bitmap output processing.
diff --git a/Documentation/driver-api/gpio/consumer.rst b/Documentation/driver-api/gpio/consumer.rst
index 0afd95a12b10..cf992e5ab976 100644
--- a/Documentation/driver-api/gpio/consumer.rst
+++ b/Documentation/driver-api/gpio/consumer.rst
@@ -388,6 +388,14 @@ array_info should be set to NULL.
 Note that for optimal performance GPIOs belonging to the same chip should be
 contiguous within the array of descriptors.
 
+Still better performance may be achieved if array indexes of the descriptors
+match hardware pin numbers of a single chip.  If an array passed to a get/set
+array function matches the one obtained from gpiod_get_array() and array_info
+associated with the array is also passed, the function may take a fast bitmap
+processing path, passing the value_bitmap argument directly to the respective
+.get/set_multiple() callback of the chip.  That allows for utilization of GPIO
+banks as data I/O ports without much loss of performance.
+
 The return value of gpiod_get_array_value() and its variants is 0 on success
 or negative on error. Note the difference to gpiod_get_value(), which returns
 0 or 1 on success to convey the GPIO value. With the array functions, the GPIO
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index cd7c1deed132..d7532aa6c0bc 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -2789,7 +2789,36 @@ int gpiod_get_array_value_complex(bool raw, bool can_sleep,
 				  struct gpio_array *array_info,
 				  unsigned long *value_bitmap)
 {
-	int i = 0;
+	int err, i = 0;
+
+	/*
+	 * Validate array_info against desc_array and its size.
+	 * It should immediately follow desc_array if both
+	 * have been obtained from the same gpiod_get_array() call.
+	 */
+	if (array_info && array_info->desc == desc_array &&
+	    array_size <= array_info->size &&
+	    (void *)array_info == desc_array + array_info->size) {
+		if (!can_sleep)
+			WARN_ON(array_info->chip->can_sleep);
+
+		err = gpio_chip_get_multiple(array_info->chip,
+					     array_info->get_mask,
+					     value_bitmap);
+		if (err)
+			return err;
+
+		if (!raw && !bitmap_empty(array_info->invert_mask, array_size))
+			bitmap_xor(value_bitmap, value_bitmap,
+				   array_info->invert_mask, array_size);
+
+		if (bitmap_full(array_info->get_mask, array_size))
+			return 0;
+
+		i = find_first_zero_bit(array_info->get_mask, array_size);
+	} else {
+		array_info = NULL;
+	}
 
 	while (i < array_size) {
 		struct gpio_chip *chip = desc_array[i]->gdev->chip;
@@ -2820,7 +2849,12 @@ int gpiod_get_array_value_complex(bool raw, bool can_sleep,
 			int hwgpio = gpio_chip_hwgpio(desc);
 
 			__set_bit(hwgpio, mask);
-			i++;
+
+			if (array_info)
+				find_next_zero_bit(array_info->get_mask,
+						   array_size, i);
+			else
+				i++;
 		} while ((i < array_size) &&
 			 (desc_array[i]->gdev->chip == chip));
 
@@ -2831,7 +2865,7 @@ int gpiod_get_array_value_complex(bool raw, bool can_sleep,
 			return ret;
 		}
 
-		for (j = first; j < i; j++) {
+		for (j = first; j < i; ) {
 			const struct gpio_desc *desc = desc_array[j];
 			int hwgpio = gpio_chip_hwgpio(desc);
 			int value = test_bit(hwgpio, bits);
@@ -2840,6 +2874,11 @@ int gpiod_get_array_value_complex(bool raw, bool can_sleep,
 				value = !value;
 			__assign_bit(j, value_bitmap, value);
 			trace_gpio_value(desc_to_gpio(desc), 1, value);
+
+			if (array_info)
+				find_next_zero_bit(array_info->get_mask, i, j);
+			else
+				j++;
 		}
 
 		if (mask != fastpath)
@@ -3043,6 +3082,32 @@ int gpiod_set_array_value_complex(bool raw, bool can_sleep,
 {
 	int i = 0;
 
+	/*
+	 * Validate array_info against desc_array and its size.
+	 * It should immediately follow desc_array if both
+	 * have been obtained from the same gpiod_get_array() call.
+	 */
+	if (array_info && array_info->desc == desc_array &&
+	    array_size <= array_info->size &&
+	    (void *)array_info == desc_array + array_info->size) {
+		if (!can_sleep)
+			WARN_ON(array_info->chip->can_sleep);
+
+		if (!raw && !bitmap_empty(array_info->invert_mask, array_size))
+			bitmap_xor(value_bitmap, value_bitmap,
+				   array_info->invert_mask, array_size);
+
+		gpio_chip_set_multiple(array_info->chip, array_info->set_mask,
+				       value_bitmap);
+
+		if (bitmap_full(array_info->set_mask, array_size))
+			return 0;
+
+		i = find_first_zero_bit(array_info->set_mask, array_size);
+	} else {
+		array_info = NULL;
+	}
+
 	while (i < array_size) {
 		struct gpio_chip *chip = desc_array[i]->gdev->chip;
 		unsigned long fastpath[2 * BITS_TO_LONGS(FASTPATH_NGPIO)];
@@ -3070,7 +3135,14 @@ int gpiod_set_array_value_complex(bool raw, bool can_sleep,
 			int hwgpio = gpio_chip_hwgpio(desc);
 			int value = test_bit(i, value_bitmap);
 
-			if (!raw && test_bit(FLAG_ACTIVE_LOW, &desc->flags))
+			/*
+			 * Pins applicable for fast input but not for
+			 * fast output processing may have been already
+			 * inverted inside the fast path, skip them.
+			 */
+			if (!raw && !(array_info &&
+			    test_bit(i, array_info->invert_mask)) &&
+			    test_bit(FLAG_ACTIVE_LOW, &desc->flags))
 				value = !value;
 			trace_gpio_value(desc_to_gpio(desc), 0, value);
 			/*
@@ -3089,7 +3161,12 @@ int gpiod_set_array_value_complex(bool raw, bool can_sleep,
 					__clear_bit(hwgpio, bits);
 				count++;
 			}
-			i++;
+
+			if (array_info)
+				find_next_zero_bit(array_info->set_mask,
+						   array_size, i);
+			else
+				i++;
 		} while ((i < array_size) &&
 			 (desc_array[i]->gdev->chip == chip));
 		/* push collected bits to outputs */
-- 
2.16.4

  parent reply	other threads:[~2018-09-05 21:50 UTC|newest]

Thread overview: 477+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-18 23:57 [RFC PATCH 0/8] mtd: rawnand: ams-delta: Use gpio-omap accessors for data I/O Janusz Krzysztofik
2018-07-18 23:57 ` Janusz Krzysztofik
2018-07-18 23:57 ` [RFC PATCH 1/8] mtd: rawnand: ams-delta: Use private structure Janusz Krzysztofik
2018-07-18 23:57   ` Janusz Krzysztofik
2018-07-19  6:17   ` Boris Brezillon
2018-07-19  6:17     ` Boris Brezillon
2018-07-20 17:57     ` Janusz Krzysztofik
2018-07-20 17:57       ` Janusz Krzysztofik
2018-07-18 23:57 ` [RFC PATCH 2/8] mtd: rawnand: ams-delta: Write protect device during probe Janusz Krzysztofik
2018-07-18 23:57   ` Janusz Krzysztofik
2018-07-19  6:22   ` Boris Brezillon
2018-07-19  6:22     ` Boris Brezillon
2018-07-20 18:02     ` Janusz Krzysztofik
2018-07-20 18:02       ` Janusz Krzysztofik
2018-07-18 23:57 ` [RFC PATCH 3/8] mtd: rawnand: ams-delta: Set port direction once per transfer Janusz Krzysztofik
2018-07-18 23:57   ` Janusz Krzysztofik
2018-07-19  6:23   ` Boris Brezillon
2018-07-19  6:23     ` Boris Brezillon
2018-07-20 18:12     ` Janusz Krzysztofik
2018-07-20 18:12       ` Janusz Krzysztofik
2018-07-20 19:29       ` Boris Brezillon
2018-07-20 19:29         ` Boris Brezillon
2018-07-18 23:57 ` [RFC PATCH 4/8] mtd: rawnand: ams-delta: Optimize pointer resolution on read/write Janusz Krzysztofik
2018-07-18 23:57   ` Janusz Krzysztofik
2018-07-19  6:25   ` Boris Brezillon
2018-07-19  6:25     ` Boris Brezillon
2018-07-20 18:14     ` Janusz Krzysztofik
2018-07-20 18:14       ` Janusz Krzysztofik
2018-07-20 19:29       ` Boris Brezillon
2018-07-20 19:29         ` Boris Brezillon
2018-07-18 23:57 ` [RFC PATCH 5/8] mtd: rawnand: ams-delta: Request data port GPIO resource Janusz Krzysztofik
2018-07-18 23:57   ` Janusz Krzysztofik
2018-07-19  6:28   ` Boris Brezillon
2018-07-19  6:28     ` Boris Brezillon
2018-07-18 23:57 ` [RFC PATCH 6/8] gpio: omap: Add get/set_multiple() callbacks Janusz Krzysztofik
2018-07-18 23:57   ` Janusz Krzysztofik
2018-07-29 20:29   ` Linus Walleij
2018-07-29 20:29     ` Linus Walleij
2018-08-03  1:52     ` Grygorii Strashko
2018-08-03  1:52       ` Grygorii Strashko
2018-08-03  1:52       ` Grygorii Strashko
2018-08-03 16:47   ` Linus Walleij
2018-08-03 16:47     ` Linus Walleij
2018-07-18 23:57 ` [RFC PATCH 7/8] mtd: rawnand: ams-delta: Check sanity of data GPIO resource Janusz Krzysztofik
2018-07-18 23:57   ` Janusz Krzysztofik
2018-07-19  6:44   ` Boris Brezillon
2018-07-19  6:44     ` Boris Brezillon
2018-07-29 20:36     ` Linus Walleij
2018-07-29 20:36       ` Linus Walleij
2018-07-29 21:16       ` Boris Brezillon
2018-07-29 21:16         ` Boris Brezillon
2018-07-29 20:33   ` Linus Walleij
2018-07-29 20:33     ` Linus Walleij
2018-07-18 23:57 ` [RFC PATCH 8/8] mtd: rawnand: ams-delta: Use GPIO callbacks for data I/O Janusz Krzysztofik
2018-07-18 23:57   ` Janusz Krzysztofik
2018-07-19  6:47   ` Boris Brezillon
2018-07-19  6:47     ` Boris Brezillon
2018-07-20 18:38     ` Janusz Krzysztofik
2018-07-20 18:38       ` Janusz Krzysztofik
2018-07-20 19:48       ` Boris Brezillon
2018-07-20 19:48         ` Boris Brezillon
2018-07-19  6:15 ` [RFC PATCH 0/8] mtd: rawnand: ams-delta: Use gpio-omap accessors " Boris Brezillon
2018-07-19  6:15   ` Boris Brezillon
2018-07-20 17:55   ` Janusz Krzysztofik
2018-07-20 17:55     ` Janusz Krzysztofik
2018-07-20 19:25     ` Boris Brezillon
2018-07-20 19:25       ` Boris Brezillon
2018-10-03 12:00   ` [RFC PATCH] mtd: rawnand: ams-delta: use ->exec_op() Janusz Krzysztofik
2018-10-03 12:30     ` Boris Brezillon
2018-10-03 13:55       ` Janusz Krzysztofik
2018-10-03 14:06         ` Boris Brezillon
2018-10-04 13:52           ` Janusz Krzysztofik
2018-10-04 13:59             ` Boris Brezillon
2018-10-04 14:11               ` Janusz Krzysztofik
2018-10-04 14:22                 ` Boris Brezillon
2018-10-12 20:41     ` [PATCH v2 1/2] mtd: rawnand: Provide helper for polling GPIO R/B pin Janusz Krzysztofik
2018-10-12 20:41       ` [PATCH v2 2/2] mtd: rawnand: ams-delta: Use ->exec_op() Janusz Krzysztofik
2018-10-13  6:05         ` Boris Brezillon
2018-10-13  5:55       ` [PATCH v2 1/2] mtd: rawnand: Provide helper for polling GPIO R/B pin Boris Brezillon
2018-10-15 19:41       ` [PATCH v3 1/3] " Janusz Krzysztofik
2018-10-15 19:41         ` [PATCH v3 2/3] mtd: rawnand: ams-delta: Stop using legacy .IOADDR_R/W Janusz Krzysztofik
2018-10-15 19:41         ` [PATCH v3 3/3] mtd: rawnand: ams-delta: Convert the driver to ->exec_op() Janusz Krzysztofik
2018-11-11 20:53         ` [PATCH v3 1/3] mtd: rawnand: Provide helper for polling GPIO R/B pin Miquel Raynal
2018-08-06 22:29 ` [RFC PATCH v2] mtd: rawnand: ams-delta: Use GPIO API for data I/O Janusz Krzysztofik
2018-08-06 22:29   ` Janusz Krzysztofik
2018-08-06 22:29   ` Janusz Krzysztofik
2018-08-06 22:29   ` [RFC PATCH v2 01/12] mtd: rawnand: ams-delta: Assign mtd->dev.parent, not mtd->owner Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-06 23:54     ` Marek Vasut
2018-08-06 23:54       ` Marek Vasut
2018-08-06 23:54       ` Marek Vasut
2018-08-07 21:55       ` Janusz Krzysztofik
2018-08-07 21:55         ` Janusz Krzysztofik
2018-08-07 21:55         ` Janusz Krzysztofik
2018-08-07 16:57     ` Boris Brezillon
2018-08-07 16:57       ` Boris Brezillon
2018-08-07 16:57       ` Boris Brezillon
2018-08-06 22:29   ` [RFC PATCH v2 02/12] mtd: rawnand: ams-delta: Use private structure Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-07 16:59     ` Boris Brezillon
2018-08-07 16:59       ` Boris Brezillon
2018-08-07 16:59       ` Boris Brezillon
2018-08-06 22:29   ` [RFC PATCH v2 03/12] ARM: OMAP1: ams-delta: Provide GPIO lookup table for NAND data port Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-07 16:59     ` Boris Brezillon
2018-08-07 16:59       ` Boris Brezillon
2018-08-07 16:59       ` Boris Brezillon
2018-08-10 10:10     ` Linus Walleij
2018-08-10 10:10       ` Linus Walleij
2018-08-06 22:29   ` [RFC PATCH v2 04/12] mtd: rawnand: ams-delta: request data port GPIO resource Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-07 17:00     ` Boris Brezillon
2018-08-07 17:00       ` Boris Brezillon
2018-08-07 17:00       ` Boris Brezillon
2018-08-10 10:11     ` Linus Walleij
2018-08-10 10:11       ` Linus Walleij
2018-08-06 22:29   ` [RFC PATCH v2 05/12] mtd: rawnand: ams-delta: use GPIO API for data read/write Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-06 23:57     ` Marek Vasut
2018-08-06 23:57       ` Marek Vasut
2018-08-06 23:57       ` Marek Vasut
2018-08-07 17:06     ` Boris Brezillon
2018-08-07 17:06       ` Boris Brezillon
2018-08-07 17:06       ` Boris Brezillon
2018-08-07 17:11       ` Janusz Krzysztofik
2018-08-07 17:11         ` Janusz Krzysztofik
2018-08-07 17:11         ` Janusz Krzysztofik
2018-08-10 10:25     ` Linus Walleij
2018-08-10 10:25       ` Linus Walleij
2018-08-06 22:29   ` [RFC PATCH v2 06/12] ARM: OMAP1: ams-delta: drop obsolete NAND resources Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-06 22:29   ` [RFC PATCH v2 07/12] mtd: rawnand: ams-delta: Set port direction once per transfer Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-07 18:57     ` Boris Brezillon
2018-08-07 18:57       ` Boris Brezillon
2018-08-07 18:57       ` Boris Brezillon
2018-08-07 18:57       ` Boris Brezillon
2018-08-08 16:55       ` Janusz Krzysztofik
2018-08-08 16:55         ` Janusz Krzysztofik
2018-08-08 16:55         ` Janusz Krzysztofik
2018-08-08 17:42         ` Miquel Raynal
2018-08-08 17:42           ` Miquel Raynal
2018-08-08 17:42           ` Miquel Raynal
2018-08-06 22:29   ` [RFC PATCH v2 08/12] mtd: rawnand: ams-delta: Simplify pointer resolution on read/write Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-07 17:02     ` Boris Brezillon
2018-08-07 17:02       ` Boris Brezillon
2018-08-07 17:02       ` Boris Brezillon
2018-08-07 17:15       ` Janusz Krzysztofik
2018-08-07 17:15         ` Janusz Krzysztofik
2018-08-07 17:15         ` Janusz Krzysztofik
2018-08-06 22:29   ` [RFC PATCH v2 09/12] gpiolib: Identify GPIO descriptor arrays with direct mapping Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-06 23:29     ` Linus Walleij
2018-08-06 23:29       ` Linus Walleij
2018-08-06 23:29       ` Linus Walleij
2018-08-07 16:50       ` Janusz Krzysztofik
2018-08-07 16:50         ` Janusz Krzysztofik
2018-08-07 16:50         ` Janusz Krzysztofik
2018-08-07 17:10         ` Boris Brezillon
2018-08-07 17:10           ` Boris Brezillon
2018-08-07 17:10           ` Boris Brezillon
2018-08-07 17:14     ` Boris Brezillon
2018-08-07 17:14       ` Boris Brezillon
2018-08-07 17:14       ` Boris Brezillon
2018-08-07 17:19       ` Janusz Krzysztofik
2018-08-07 17:19         ` Janusz Krzysztofik
2018-08-07 17:19         ` Janusz Krzysztofik
2018-08-06 22:29   ` [RFC PATCH v2 10/12] gpiolib: Introduce bitmap get/set array API extension Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-06 22:29   ` [RFC PATCH v2 11/12] mtd: rawnand: ams-delta: Use GPIO API bitmap extension Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-06 22:29   ` [RFC PATCH v2 12/12] gpiolib: Add fast processing path to bitmap API functions Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-06 22:29     ` Janusz Krzysztofik
2018-08-06 23:43     ` Linus Walleij
2018-08-06 23:43       ` Linus Walleij
2018-08-06 23:43       ` Linus Walleij
2018-08-07 17:29       ` Janusz Krzysztofik
2018-08-07 17:29         ` Janusz Krzysztofik
2018-08-07 17:29         ` Janusz Krzysztofik
2018-08-07 17:47         ` Boris Brezillon
2018-08-07 17:47           ` Boris Brezillon
2018-08-07 17:47           ` Boris Brezillon
2018-08-10 10:55           ` Linus Walleij
2018-08-10 10:55             ` Linus Walleij
2018-08-13 22:34   ` [PATCH v3 0/7] mtd: rawnand: ams-delta: Use GPIO API for data I/O Janusz Krzysztofik
2018-08-13 22:34     ` Janusz Krzysztofik
2018-08-13 22:34     ` [PATCH v3 1/7] mtd: rawnand: ams-delta: show parent device in sysfs Janusz Krzysztofik
2018-08-13 22:34       ` Janusz Krzysztofik
2018-08-13 22:34     ` [PATCH v3 2/7] mtd: rawnand: ams-delta: Use private structure Janusz Krzysztofik
2018-08-13 22:34       ` Janusz Krzysztofik
2018-08-13 22:34     ` [PATCH v3 3/7] ARM: OMAP1: ams-delta: Provide GPIO lookup table for NAND data port Janusz Krzysztofik
2018-08-13 22:34       ` Janusz Krzysztofik
2018-08-13 22:34     ` [PATCH v3 4/7] mtd: rawnand: ams-delta: request data port GPIO resource Janusz Krzysztofik
2018-08-13 22:34       ` Janusz Krzysztofik
2018-08-13 22:34     ` [PATCH v3 5/7] mtd: rawnand: ams-delta: Set port direction when needed Janusz Krzysztofik
2018-08-13 22:34       ` Janusz Krzysztofik
2018-08-16  7:30       ` Boris Brezillon
2018-08-16  7:30         ` Boris Brezillon
2018-08-13 22:34     ` [PATCH v3 6/7] mtd: rawnand: ams-delta: Simplify pointer resolution on read/write Janusz Krzysztofik
2018-08-13 22:34       ` Janusz Krzysztofik
2018-08-13 22:34     ` [PATCH v3 7/7] mtd: rawnand: ams-delta: use GPIO API for data I/O Janusz Krzysztofik
2018-08-13 22:34       ` Janusz Krzysztofik
2018-08-16  7:39       ` Boris Brezillon
2018-08-16  7:39         ` Boris Brezillon
2018-08-20 21:39     ` [PATCH v4 0/3] mtd: rawnand: ams-delta: Cleanups and optimizations Janusz Krzysztofik
2018-08-20 21:39       ` [PATCH v4 1/3] mtd: rawnand: ams-delta: show parent device in sysfs Janusz Krzysztofik
2018-08-20 21:39       ` [PATCH v4 2/3] mtd: rawnand: ams-delta: Use private structure Janusz Krzysztofik
2018-08-20 21:39       ` [PATCH v4 3/3] mtd: rawnand: ams-delta: Set port direction when needed Janusz Krzysztofik
2018-08-24 12:57         ` Boris Brezillon
2018-09-05  6:47       ` [PATCH v4 0/3] mtd: rawnand: ams-delta: Cleanups and optimizations Miquel Raynal
2018-09-05 20:53         ` Janusz Krzysztofik
2018-09-07 16:45           ` Tony Lindgren
2018-09-19  8:46             ` Miquel Raynal
2018-09-19 22:52       ` [PATCH v5 " Janusz Krzysztofik
2018-09-19 22:52         ` [PATCH v5 1/3] mtd: rawnand: ams-delta: show parent device in sysfs Janusz Krzysztofik
2018-09-19 22:52         ` [PATCH v5 2/3] mtd: rawnand: ams-delta: Use private structure Janusz Krzysztofik
2018-09-19 22:52         ` [PATCH v5 3/3] mtd: rawnand: ams-delta: Set port direction when needed Janusz Krzysztofik
2018-09-23 11:35         ` [PATCH v5 0/3] mtd: rawnand: ams-delta: Cleanups and optimizations Miquel Raynal
2018-08-20 23:43     ` [RFC RFT PATCH 0/4] gpiolib: speed up GPIO array processing Janusz Krzysztofik
2018-08-20 23:43       ` Janusz Krzysztofik
2018-08-20 23:43       ` Janusz Krzysztofik
2018-08-20 23:43       ` [RFC RFT PATCH v4 1/4] gpiolib: Pass bitmaps, not integer arrays, to get/set array Janusz Krzysztofik
2018-08-20 23:43         ` Janusz Krzysztofik
2018-08-21  6:49         ` Peter Rosin
2018-08-21  6:49           ` Peter Rosin
2018-08-21  6:52           ` Peter Rosin
2018-08-21  6:52             ` Peter Rosin
2018-08-29 12:03         ` Miguel Ojeda
2018-08-29 12:03           ` Miguel Ojeda
2018-08-29 12:03           ` Miguel Ojeda
2018-08-29 18:01           ` Janusz Krzysztofik
2018-08-29 18:01             ` Janusz Krzysztofik
2018-08-29 18:01             ` Janusz Krzysztofik
2018-08-20 23:43       ` [RFC RFT PATCH v4 2/4] gpiolib: Identify arrays matching GPIO hardware Janusz Krzysztofik
2018-08-20 23:43         ` Janusz Krzysztofik
2018-08-20 23:43         ` Janusz Krzysztofik
2018-08-20 23:43       ` [RFC RFT PATCH v4 3/4] gpiolib: Pass array info to get/set array functions Janusz Krzysztofik
2018-08-20 23:43         ` Janusz Krzysztofik
2018-08-20 23:43         ` Janusz Krzysztofik
2018-08-20 23:43       ` [RFC RFT PATCH v4 4/4] gpiolib: Implement fast processing path in get/set array Janusz Krzysztofik
2018-08-20 23:43         ` Janusz Krzysztofik
2018-08-29  9:06       ` [RFC RFT PATCH 0/4] gpiolib: speed up GPIO array processing Linus Walleij
2018-08-29  9:06         ` Linus Walleij
2018-08-29  9:06         ` Linus Walleij
2018-08-29 18:16         ` Janusz Krzysztofik
2018-08-29 18:16           ` Janusz Krzysztofik
2018-08-29 18:16           ` Janusz Krzysztofik
2018-08-29 10:19       ` Ulf Hansson
2018-08-29 10:19         ` Ulf Hansson
2018-08-29 20:48       ` [PATH v5 " Janusz Krzysztofik
2018-08-29 20:48         ` Janusz Krzysztofik
2018-08-29 20:48         ` Janusz Krzysztofik
2018-08-29 20:48         ` [PATCH v5 1/4] gpiolib: Pass bitmaps, not integer arrays, to get/set array Janusz Krzysztofik
2018-08-29 20:48           ` Janusz Krzysztofik
2018-08-29 20:48           ` Janusz Krzysztofik
2018-08-30  4:30           ` Peter Rosin
2018-08-30  4:30             ` Peter Rosin
2018-08-30  7:40           ` Geert Uytterhoeven
2018-08-30  7:40             ` Geert Uytterhoeven
2018-08-30  7:40             ` Geert Uytterhoeven
2018-08-30 11:10           ` Miguel Ojeda
2018-08-30 11:10             ` Miguel Ojeda
2018-08-30 11:10             ` Miguel Ojeda
2018-08-30 15:35             ` David Laight
2018-08-30 15:35               ` David Laight
2018-08-30 15:35               ` David Laight
2018-09-02 10:19             ` Janusz Krzysztofik
2018-09-02 10:19               ` Janusz Krzysztofik
2018-09-02 10:19               ` Janusz Krzysztofik
2018-08-31  9:14           ` Linus Walleij
2018-08-31  9:14             ` Linus Walleij
2018-08-29 20:48         ` [PATCH v5 2/4] gpiolib: Identify arrays matching GPIO hardware Janusz Krzysztofik
2018-08-29 20:48           ` Janusz Krzysztofik
2018-08-29 20:48           ` Janusz Krzysztofik
2018-08-29 20:48         ` [PATCH v5 3/4] gpiolib: Pass array info to get/set array functions Janusz Krzysztofik
2018-08-29 20:48           ` Janusz Krzysztofik
2018-08-29 20:48           ` Janusz Krzysztofik
2018-08-29 20:49         ` [PATCH v5 4/4] gpiolib: Implement fast processing path in get/set array Janusz Krzysztofik
2018-08-29 20:49           ` Janusz Krzysztofik
2018-08-29 20:49           ` Janusz Krzysztofik
2018-08-31 22:56         ` [PATH v6 0/4] gpiolib: speed up GPIO array processing Janusz Krzysztofik
2018-08-31 22:56           ` Janusz Krzysztofik
2018-08-31 22:56           ` Janusz Krzysztofik
2018-08-31 22:56           ` [PATCH v6 1/4] gpiolib: Pass bitmaps, not integer arrays, to get/set array Janusz Krzysztofik
2018-08-31 22:56             ` Janusz Krzysztofik
2018-08-31 22:56             ` Janusz Krzysztofik
2018-09-01  0:23             ` Peter Rosin
2018-09-01  0:23               ` Peter Rosin
2018-09-04 15:28             ` kbuild test robot
2018-09-04 15:28               ` kbuild test robot
2018-09-04 15:28               ` kbuild test robot
2018-09-04 15:28             ` kbuild test robot
2018-09-04 15:28               ` kbuild test robot
2018-09-04 15:28               ` kbuild test robot
2018-08-31 22:56           ` [PATCH v6 2/4] gpiolib: Identify arrays matching GPIO hardware Janusz Krzysztofik
2018-08-31 22:56             ` Janusz Krzysztofik
2018-08-31 22:56             ` Janusz Krzysztofik
2018-08-31 22:56           ` [PATCH v6 3/4] gpiolib: Pass array info to get/set array functions Janusz Krzysztofik
2018-08-31 22:56             ` Janusz Krzysztofik
2018-08-31 22:56             ` Janusz Krzysztofik
2018-09-04 15:27             ` kbuild test robot
2018-09-04 15:27               ` kbuild test robot
2018-09-04 15:27               ` kbuild test robot
2018-08-31 22:56           ` [PATCH v6 4/4] gpiolib: Implement fast processing path in get/set array Janusz Krzysztofik
2018-08-31 22:56             ` Janusz Krzysztofik
2018-08-31 22:56             ` Janusz Krzysztofik
2018-09-02 12:01           ` [PATCH v7 0/4] gpiolib: speed up GPIO array processing Janusz Krzysztofik
2018-09-02 12:01             ` Janusz Krzysztofik
2018-09-02 12:01             ` [PATCH v7 1/4] gpiolib: Pass bitmaps, not integer arrays, to get/set array Janusz Krzysztofik
2018-09-02 12:01               ` Janusz Krzysztofik
2018-09-02 13:21               ` Lukas Wunner
2018-09-02 13:21                 ` Lukas Wunner
2018-09-02 13:21                 ` Lukas Wunner
2018-09-03  4:31               ` Matthew Wilcox
2018-09-03  4:31                 ` Matthew Wilcox
2018-09-03  4:31                 ` Matthew Wilcox
2018-09-03 14:24                 ` Geert Uytterhoeven
2018-09-03 14:24                   ` Geert Uytterhoeven
2018-09-03 14:24                   ` Geert Uytterhoeven
2018-09-03 15:07               ` Geert Uytterhoeven
2018-09-03 15:07                 ` Geert Uytterhoeven
2018-09-03 15:07                 ` Geert Uytterhoeven
2018-09-04 15:29               ` kbuild test robot
2018-09-04 15:29                 ` kbuild test robot
2018-09-04 15:29                 ` kbuild test robot
2018-09-05  6:46               ` kbuild test robot
2018-09-05  6:46                 ` kbuild test robot
2018-09-05  6:46                 ` kbuild test robot
2018-09-02 12:01             ` [PATCH v7 2/4] gpiolib: Identify arrays matching GPIO hardware Janusz Krzysztofik
2018-09-02 12:01               ` Janusz Krzysztofik
2018-09-02 12:01               ` Janusz Krzysztofik
2018-09-02 12:01             ` [PATCH v7 3/4] gpiolib: Pass array info to get/set array functions Janusz Krzysztofik
2018-09-02 12:01               ` Janusz Krzysztofik
2018-09-03 14:21               ` Geert Uytterhoeven
2018-09-03 14:21                 ` Geert Uytterhoeven
2018-09-03 14:21                 ` Geert Uytterhoeven
2018-09-04 15:23               ` kbuild test robot
2018-09-04 15:23                 ` kbuild test robot
2018-09-04 15:23                 ` kbuild test robot
2018-09-05  7:11               ` kbuild test robot
2018-09-05  7:11                 ` kbuild test robot
2018-09-05  7:11                 ` kbuild test robot
2018-09-02 12:01             ` [PATCH v7 4/4] gpiolib: Implement fast processing path in get/set array Janusz Krzysztofik
2018-09-02 12:01               ` Janusz Krzysztofik
     [not found]               ` <CGME20180920101151eucas1p221f5a1715b8556bb9d99bf08fe09ce6f@eucas1p2.samsung.com>
2018-09-20 10:11                 ` Marek Szyprowski
2018-09-20 10:11                   ` Marek Szyprowski
2018-09-20 10:11                   ` Marek Szyprowski
2018-09-20 15:48                   ` Janusz Krzysztofik
2018-09-20 15:48                     ` Janusz Krzysztofik
2018-09-20 15:48                     ` Janusz Krzysztofik
2018-09-20 15:48                     ` Janusz Krzysztofik
2018-09-20 16:21                     ` Janusz Krzysztofik
2018-09-20 16:21                       ` Janusz Krzysztofik
2018-09-20 16:21                       ` Janusz Krzysztofik
2018-09-21  8:18                       ` Marek Szyprowski
2018-09-21  8:18                         ` Marek Szyprowski
2018-09-21 10:51                         ` Janusz Krzysztofik
2018-09-21 10:51                           ` Janusz Krzysztofik
2018-09-21 11:26                           ` Janusz Krzysztofik
2018-09-21 11:26                             ` Janusz Krzysztofik
2018-09-21 11:26                             ` Janusz Krzysztofik
2018-09-21 14:14                           ` Marek Szyprowski
2018-09-21 14:14                             ` Marek Szyprowski
2018-09-21 14:14                             ` Marek Szyprowski
2018-09-23 10:43                             ` Janusz Krzysztofik
2018-09-23 10:43                               ` Janusz Krzysztofik
2018-09-23 23:53                               ` [PATCH 0/2] gpiolib: Fix issues introduced by fast bitmap processing path Janusz Krzysztofik
2018-09-23 23:53                                 ` Janusz Krzysztofik
2018-09-23 23:53                                 ` [PATCH 1/2] gpiolib: Fix missing updates of bitmap index Janusz Krzysztofik
2018-09-23 23:53                                   ` Janusz Krzysztofik
2018-09-23 23:53                                   ` Janusz Krzysztofik
2018-09-24  8:11                                   ` Linus Walleij
2018-09-24  8:11                                     ` Linus Walleij
2018-09-24  8:11                                     ` Linus Walleij
2018-09-29 12:20                                   ` [PATCH] gpiolib: Fix incorrect use of find_next_zero_bit() Janusz Krzysztofik
2018-09-29 12:20                                     ` Janusz Krzysztofik
2018-10-01  6:46                                     ` Marek Szyprowski
2018-10-01  6:46                                       ` Marek Szyprowski
2018-10-01  9:37                                     ` Linus Walleij
2018-10-01  9:37                                       ` Linus Walleij
2018-10-01  9:37                                       ` Linus Walleij
2018-09-23 23:53                                 ` [PATCH 2/2] gpiolib: Fix array members of same chip processed separately Janusz Krzysztofik
2018-09-23 23:53                                   ` Janusz Krzysztofik
2018-09-23 23:53                                   ` Janusz Krzysztofik
2018-09-24  8:13                                   ` Linus Walleij
2018-09-24  8:13                                     ` Linus Walleij
2018-09-24  8:13                                     ` Linus Walleij
2018-09-24  9:43                                 ` [PATCH 0/2] gpiolib: Fix issues introduced by fast bitmap processing path Marek Szyprowski
2018-09-24  9:43                                   ` Marek Szyprowski
2018-09-24  9:43                                   ` Marek Szyprowski
2018-09-24 11:08                                   ` Janusz Krzysztofik
2018-09-24 11:08                                     ` Janusz Krzysztofik
2018-09-24 11:38                                     ` Marek Szyprowski
2018-09-24 11:38                                       ` Marek Szyprowski
2018-09-24 11:38                                       ` Marek Szyprowski
2018-09-24 14:18                                       ` Janusz Krzysztofik
2018-09-24 14:18                                         ` Janusz Krzysztofik
2018-09-24 14:18                                         ` Janusz Krzysztofik
2018-09-25 19:24                                         ` [PATCH] mmc: pwrseq_simple: Fix incorrect handling of GPIO bitmap Janusz Krzysztofik
2018-09-26  7:50                                           ` Linus Walleij
2018-09-26  8:14                                           ` Marek Szyprowski
     [not found]                                           ` <7a4906d9-ffb1-f2af-07e7-d5815dcd0d8c@samsung.com>
2018-09-26  8:27                                             ` Marek Szyprowski
2018-10-12 19:09                                           ` [RFT PATCH] " Janusz Krzysztofik
2018-10-12 19:09                                             ` Janusz Krzysztofik
2018-10-12 19:09                                             ` Janusz Krzysztofik
2018-10-12 19:09                                             ` Janusz Krzysztofik
2018-10-15  8:32                                             ` Marek Szyprowski
2018-10-15  8:32                                               ` Marek Szyprowski
2018-10-15  8:32                                               ` Marek Szyprowski
2018-10-15  8:32                                               ` Marek Szyprowski
2018-10-15 10:29                                             ` Ulf Hansson
2018-10-15 10:29                                               ` Ulf Hansson
2018-10-15 10:29                                               ` Ulf Hansson
2018-10-15 10:29                                               ` Ulf Hansson
2018-10-15 14:27                                             ` Linus Walleij
2018-10-15 14:27                                               ` Linus Walleij
2018-10-15 14:27                                               ` Linus Walleij
2018-10-15 14:27                                               ` Linus Walleij
2018-09-20 18:05                     ` [PATCH v7 4/4] gpiolib: Implement fast processing path in get/set array Dan Carpenter
2018-09-20 18:05                       ` Dan Carpenter
2018-09-20 15:49                   ` Linus Walleij
2018-09-20 15:49                     ` Linus Walleij
2018-09-20 15:49                     ` Linus Walleij
2018-09-05 21:50             ` [PATCH v8 0/4] gpiolib: speed up GPIO array processing Janusz Krzysztofik
2018-09-05 21:50               ` Janusz Krzysztofik
2018-09-05 21:50               ` Janusz Krzysztofik
2018-09-05 21:50               ` [PATCH v8 1/4] gpiolib: Pass bitmaps, not integer arrays, to get/set array Janusz Krzysztofik
2018-09-05 21:50                 ` Janusz Krzysztofik
2018-09-05 21:50               ` [PATCH v8 2/4] gpiolib: Identify arrays matching GPIO hardware Janusz Krzysztofik
2018-09-05 21:50                 ` Janusz Krzysztofik
2018-09-05 21:50               ` [PATCH v8 3/4] gpiolib: Pass array info to get/set array functions Janusz Krzysztofik
2018-09-05 21:50                 ` Janusz Krzysztofik
2018-09-05 21:50                 ` Janusz Krzysztofik
2018-09-05 21:50               ` Janusz Krzysztofik [this message]
2018-09-05 21:50                 ` [PATCH v8 4/4] gpiolib: Implement fast processing path in get/set array Janusz Krzysztofik
2018-09-05 21:50                 ` Janusz Krzysztofik
2018-09-13  9:22               ` [PATCH v8 0/4] gpiolib: speed up GPIO array processing Linus Walleij
2018-09-13  9:22                 ` Linus Walleij
2018-09-13  9:22                 ` Linus Walleij
2018-09-19 18:08                 ` Linus Walleij
2018-09-19 18:08                   ` Linus Walleij
2018-09-19 18:08                   ` Linus Walleij
2018-11-21 11:08     ` Subject: [PATCH v4 0/4] mtd: rawnand: ams-delta: Use GPIO API for data I/O Janusz Krzysztofik
2018-11-21 11:08       ` Janusz Krzysztofik
2018-11-21 11:08       ` [PATCH v4 1/4] ARM: OMAP1: ams-delta: Provide GPIO lookup table for NAND data port Janusz Krzysztofik
2018-11-21 11:08         ` Janusz Krzysztofik
2018-11-23 17:02         ` Tony Lindgren
2018-11-23 17:02           ` Tony Lindgren
2018-11-21 11:08       ` [PATCH v4 2/4] mtd: rawnand: ams-delta: Request data port GPIO resource Janusz Krzysztofik
2018-11-21 11:08         ` Janusz Krzysztofik
2018-11-21 11:08       ` [PATCH v4 3/4] mtd: rawnand: ams-delta: Use GPIO API for data I/O Janusz Krzysztofik
2018-11-21 11:08         ` Janusz Krzysztofik
2018-11-21 14:53         ` Boris Brezillon
2018-11-21 14:53           ` Boris Brezillon
2018-11-21 11:08       ` [PATCH v4 4/4] ARM: OMAP1: ams-delta: Drop obsolete NAND resources Janusz Krzysztofik
2018-11-21 11:08         ` Janusz Krzysztofik
2018-11-21 14:56       ` Subject: [PATCH v4 0/4] mtd: rawnand: ams-delta: Use GPIO API for data I/O Boris Brezillon
2018-11-21 14:56         ` Boris Brezillon
2018-11-23 17:03         ` Tony Lindgren
2018-11-23 17:03           ` Tony Lindgren
2018-12-07  8:04           ` Miquel Raynal
2018-12-07  8:04             ` Miquel Raynal
2018-12-07 16:10             ` Tony Lindgren
2018-12-07 16:10               ` Tony Lindgren

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=20180905215008.1649-5-jmkrzyszt@gmail.com \
    --to=jmkrzyszt@gmail.com \
    --cc=Michael.Hennerich@analog.com \
    --cc=andrew@lunn.ch \
    --cc=corbet@lwn.net \
    --cc=davem@davemloft.net \
    --cc=f.fainelli@gmail.com \
    --cc=geert@linux-m68k.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=jic23@kernel.org \
    --cc=jslaby@suse.com \
    --cc=kishon@ti.com \
    --cc=knaack.h@gmx.de \
    --cc=lars@metafoo.de \
    --cc=linus.walleij@linaro.org \
    --cc=linux@dominikbrodowski.net \
    --cc=miguel.ojeda.sandonis@gmail.com \
    --cc=peda@axentia.se \
    --cc=peter.korsgaard@barco.com \
    --cc=pmeerw@pmeerw.net \
    --cc=ulf.hansson@linaro.org \
    --cc=w@1wt.eu \
    /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 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.