All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH RFT 0/5] gpiochip: add and use generic request/free
@ 2015-09-13 13:21 Jonas Gorski
  2015-09-13 13:21 ` [PATCH RFT 1/5] gpiolib: provide generic request/free implementations Jonas Gorski
                   ` (4 more replies)
  0 siblings, 5 replies; 23+ messages in thread
From: Jonas Gorski @ 2015-09-13 13:21 UTC (permalink / raw)
  To: linux-gpio
  Cc: Linus Walleij, Alexandre Courbot, Joachim Eastwood, Jonas Jensen,
	Gregory CLEMENT, Thomas Petazzoni, James Hogan, Stefan Agner,
	Jun Nie, Stephen Warren, Lee Jones, Eric Anholt, Mika Westerberg,
	Heikki Krogerus, Matthias Brugger, Alessandro Rubini, Sonic Zhang,
	Laxman Dewangan, Jean-Christophe Plagniol-Villard, Jonas Aaberg,
	Baruch Siach, Andrew

A lot of pinctrl aware gpio chip drivers use the following pattern:

int foo_request_gpio(struct gpio_chip *gc, unsigned gpio)
{
	return pinctrl_request_gpio(gc->base + gpio);
}

void foo_request_gpio(struct gpio_chip *gc, unsigned gpio)
{
	pinctrl_free_gpio(gc->base + gpio);
}

static struct gpio_chip foo_chip {
	...
	.request = foo_request_gpio;
	.free = foo_request_gpio;
	...
};

To prevent this from spreading any further, add and export generic
versions that gpio chip drivers can just use.

* Patch 1 adds the trivial implementations.
* Patch 2 replaces all identical (+/- debug output/comments) versions
  in gpio/
* Patch 3/4 modifies drivers that use a boolean for conditional calling
  request/free by just not populating the callbacks if the boolean is
  false (which is only set at probe)
* Patch 5 replaces all identical version in pinctrl/

Build tested as far as possible (which isn't much when only using
COMPILE_TEST, even when forcing PINCTRL to y).

I don't expect this to break anything, and I triple checked that I did
not introduce any typos, but I can't actually test most of the changed
drivers lacking hardware, therefore RFT.

Patches apply cleanly to 4.3-rc1 as well as linux-gpio/for-next.


Jonas Gorski (5):
  gpiolib: provide generic request/free implementations
  gpio: replace trivial implementations of request/free with generic one
  gpio: gpio-xz: use the generic request/free implementations
  gpio: gpio-pl061: use the generic request/free implementations
  pinctrl: replace trivial implementations of gpio_chip request/free

 drivers/gpio/gpio-lpc18xx.c                   | 14 ++----------
 drivers/gpio/gpio-moxart.c                    | 14 ++----------
 drivers/gpio/gpio-mvebu.c                     | 14 ++----------
 drivers/gpio/gpio-pl061.c                     | 32 ++++-----------------------
 drivers/gpio/gpio-tb10x.c                     | 14 ++----------
 drivers/gpio/gpio-tz1090-pdc.c                | 14 ++----------
 drivers/gpio/gpio-vf610.c                     | 14 ++----------
 drivers/gpio/gpio-zx.c                        | 28 ++++-------------------
 drivers/gpio/gpiolib.c                        | 23 +++++++++++++++++++
 drivers/pinctrl/bcm/pinctrl-bcm2835.c         | 14 ++----------
 drivers/pinctrl/intel/pinctrl-cherryview.c    | 14 ++----------
 drivers/pinctrl/intel/pinctrl-intel.c         | 14 ++----------
 drivers/pinctrl/mediatek/pinctrl-mtk-common.c | 14 ++----------
 drivers/pinctrl/nomadik/pinctrl-abx500.c      | 18 ++-------------
 drivers/pinctrl/nomadik/pinctrl-nomadik.c     | 22 ++----------------
 drivers/pinctrl/pinctrl-adi2.c                | 14 ++----------
 drivers/pinctrl/pinctrl-as3722.c              | 14 ++----------
 drivers/pinctrl/pinctrl-at91.c                | 26 ++--------------------
 drivers/pinctrl/pinctrl-coh901.c              | 22 ++----------------
 drivers/pinctrl/pinctrl-digicolor.c           | 14 ++----------
 drivers/pinctrl/pinctrl-pistachio.c           | 14 ++----------
 drivers/pinctrl/pinctrl-rockchip.c            | 14 ++----------
 drivers/pinctrl/pinctrl-st.c                  | 14 ++----------
 drivers/pinctrl/pinctrl-xway.c                | 18 ++-------------
 drivers/pinctrl/qcom/pinctrl-msm.c            | 16 ++------------
 drivers/pinctrl/qcom/pinctrl-spmi-gpio.c      | 14 ++----------
 drivers/pinctrl/qcom/pinctrl-spmi-mpp.c       | 14 ++----------
 drivers/pinctrl/samsung/pinctrl-samsung.c     | 14 ++----------
 drivers/pinctrl/sunxi/pinctrl-sunxi.c         | 14 ++----------
 drivers/pinctrl/vt8500/pinctrl-wmt.c          | 14 ++----------
 include/linux/gpio/driver.h                   |  3 +++
 31 files changed, 88 insertions(+), 414 deletions(-)

-- 
2.1.4

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

* [PATCH RFT 1/5] gpiolib: provide generic request/free implementations
  2015-09-13 13:21 [PATCH RFT 0/5] gpiochip: add and use generic request/free Jonas Gorski
@ 2015-09-13 13:21 ` Jonas Gorski
  2015-10-05  9:17   ` Linus Walleij
  2015-09-13 13:21 ` [PATCH RFT 2/5] gpio: replace trivial implementations of request/free with generic one Jonas Gorski
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 23+ messages in thread
From: Jonas Gorski @ 2015-09-13 13:21 UTC (permalink / raw)
  To: linux-gpio
  Cc: Linus Walleij, Alexandre Courbot, Joachim Eastwood, Jonas Jensen,
	Gregory CLEMENT, Thomas Petazzoni, James Hogan, Stefan Agner,
	Jun Nie, Stephen Warren, Lee Jones, Eric Anholt, Mika Westerberg,
	Heikki Krogerus, Matthias Brugger, Alessandro Rubini, Sonic Zhang,
	Laxman Dewangan, Jean-Christophe Plagniol-Villard, Jonas Aaberg,
	Baruch Siach, Andrew

Provide generic request/free implementations that pinctrl aware gpio
drivers can use instead of open coding if they use a 1:1 pin to gpio
signal mapping.

Signed-off-by: Jonas Gorski <jogo@openwrt.org>
---
 drivers/gpio/gpiolib.c      | 23 +++++++++++++++++++++++
 include/linux/gpio/driver.h |  3 +++
 2 files changed, 26 insertions(+)

diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 5db3445..e0853fb 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -15,6 +15,7 @@
 #include <linux/acpi.h>
 #include <linux/gpio/driver.h>
 #include <linux/gpio/machine.h>
+#include <linux/pinctrl/consumer.h>
 
 #include "gpiolib.h"
 
@@ -680,6 +681,28 @@ static void gpiochip_irqchip_remove(struct gpio_chip *gpiochip) {}
 
 #endif /* CONFIG_GPIOLIB_IRQCHIP */
 
+/**
+ * gpiochip_generic_request() - request the gpio function for a pin
+ * @chip: the gpiochip owning the GPIO
+ * @gpio: the GPIO signal to request for GPIO function
+ */
+int gpiochip_generic_request(struct gpio_chip *chip, unsigned gpio)
+{
+	return pinctrl_request_gpio(chip->base + gpio);
+}
+EXPORT_SYMBOL_GPL(gpiochip_generic_request);
+
+/**
+ * gpiochip_generic_free() - free the gpio function from a pin
+ * @chip: the gpiochip to request the gpio function for
+ * @gpio: the GPIO signal to free from GPIO
+ */
+void gpiochip_generic_free(struct gpio_chip *chip, unsigned gpio)
+{
+	pinctrl_free_gpio(chip->base + gpio);
+}
+EXPORT_SYMBOL_GPL(gpiochip_generic_free);
+
 #ifdef CONFIG_PINCTRL
 
 /**
diff --git a/include/linux/gpio/driver.h b/include/linux/gpio/driver.h
index 1aed31c..0857c28 100644
--- a/include/linux/gpio/driver.h
+++ b/include/linux/gpio/driver.h
@@ -206,6 +206,9 @@ int _gpiochip_irqchip_add(struct gpio_chip *gpiochip,
 
 #endif /* CONFIG_GPIOLIB_IRQCHIP */
 
+int gpiochip_generic_request(struct gpio_chip *chip, unsigned gpio);
+void gpiochip_generic_free(struct gpio_chip *chip, unsigned gpio);
+
 #ifdef CONFIG_PINCTRL
 
 /**
-- 
2.1.4

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

* [PATCH RFT 2/5] gpio: replace trivial implementations of request/free with generic one
  2015-09-13 13:21 [PATCH RFT 0/5] gpiochip: add and use generic request/free Jonas Gorski
  2015-09-13 13:21 ` [PATCH RFT 1/5] gpiolib: provide generic request/free implementations Jonas Gorski
@ 2015-09-13 13:21 ` Jonas Gorski
  2015-09-14 14:37   ` Thomas Petazzoni
                     ` (3 more replies)
  2015-09-13 13:21 ` [PATCH RFT 3/5] gpio: gpio-xz: use the generic request/free implementations Jonas Gorski
                   ` (2 subsequent siblings)
  4 siblings, 4 replies; 23+ messages in thread
From: Jonas Gorski @ 2015-09-13 13:21 UTC (permalink / raw)
  To: linux-gpio
  Cc: Linus Walleij, Alexandre Courbot, Joachim Eastwood, Jonas Jensen,
	Gregory CLEMENT, Thomas Petazzoni, James Hogan, Stefan Agner,
	Jun Nie, Stephen Warren, Lee Jones, Eric Anholt, Mika Westerberg,
	Heikki Krogerus, Matthias Brugger, Alessandro Rubini, Sonic Zhang,
	Laxman Dewangan, Jean-Christophe Plagniol-Villard, Jonas Aaberg,
	Baruch Siach, Andrew

Replace all trivial request/free callbacks that do nothing but call into
pinctrl code with the generic versions.

Signed-off-by: Jonas Gorski <jogo@openwrt.org>
---
 drivers/gpio/gpio-lpc18xx.c    | 14 ++------------
 drivers/gpio/gpio-moxart.c     | 14 ++------------
 drivers/gpio/gpio-mvebu.c      | 14 ++------------
 drivers/gpio/gpio-tb10x.c      | 14 ++------------
 drivers/gpio/gpio-tz1090-pdc.c | 14 ++------------
 drivers/gpio/gpio-vf610.c      | 14 ++------------
 6 files changed, 12 insertions(+), 72 deletions(-)

diff --git a/drivers/gpio/gpio-lpc18xx.c b/drivers/gpio/gpio-lpc18xx.c
index eb68603..e39dcb0 100644
--- a/drivers/gpio/gpio-lpc18xx.c
+++ b/drivers/gpio/gpio-lpc18xx.c
@@ -36,16 +36,6 @@ static inline struct lpc18xx_gpio_chip *to_lpc18xx_gpio(struct gpio_chip *chip)
 	return container_of(chip, struct lpc18xx_gpio_chip, gpio);
 }
 
-static int lpc18xx_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-	return pinctrl_request_gpio(offset);
-}
-
-static void lpc18xx_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-	pinctrl_free_gpio(offset);
-}
-
 static void lpc18xx_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
 {
 	struct lpc18xx_gpio_chip *gc = to_lpc18xx_gpio(chip);
@@ -95,8 +85,8 @@ static int lpc18xx_gpio_direction_output(struct gpio_chip *chip,
 
 static struct gpio_chip lpc18xx_chip = {
 	.label			= "lpc18xx/43xx-gpio",
-	.request		= lpc18xx_gpio_request,
-	.free			= lpc18xx_gpio_free,
+	.request		= gpiochip_generic_request,
+	.free			= gpiochip_generic_free,
 	.direction_input	= lpc18xx_gpio_direction_input,
 	.direction_output	= lpc18xx_gpio_direction_output,
 	.set			= lpc18xx_gpio_set,
diff --git a/drivers/gpio/gpio-moxart.c b/drivers/gpio/gpio-moxart.c
index abd8676..d3355a6 100644
--- a/drivers/gpio/gpio-moxart.c
+++ b/drivers/gpio/gpio-moxart.c
@@ -29,16 +29,6 @@
 #define GPIO_DATA_IN		0x04
 #define GPIO_PIN_DIRECTION	0x08
 
-static int moxart_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-	return pinctrl_request_gpio(offset);
-}
-
-static void moxart_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-	pinctrl_free_gpio(offset);
-}
-
 static int moxart_gpio_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
@@ -66,8 +56,8 @@ static int moxart_gpio_probe(struct platform_device *pdev)
 	}
 
 	bgc->gc.label = "moxart-gpio";
-	bgc->gc.request = moxart_gpio_request;
-	bgc->gc.free = moxart_gpio_free;
+	bgc->gc.request = gpiochip_generic_request;
+	bgc->gc.free = gpiochip_generic_free;
 	bgc->data = bgc->read_reg(bgc->reg_set);
 	bgc->gc.base = 0;
 	bgc->gc.ngpio = 32;
diff --git a/drivers/gpio/gpio-mvebu.c b/drivers/gpio/gpio-mvebu.c
index b396bf3..dba8997 100644
--- a/drivers/gpio/gpio-mvebu.c
+++ b/drivers/gpio/gpio-mvebu.c
@@ -185,16 +185,6 @@ static void __iomem *mvebu_gpioreg_level_mask(struct mvebu_gpio_chip *mvchip)
  * Functions implementing the gpio_chip methods
  */
 
-static int mvebu_gpio_request(struct gpio_chip *chip, unsigned pin)
-{
-	return pinctrl_request_gpio(chip->base + pin);
-}
-
-static void mvebu_gpio_free(struct gpio_chip *chip, unsigned pin)
-{
-	pinctrl_free_gpio(chip->base + pin);
-}
-
 static void mvebu_gpio_set(struct gpio_chip *chip, unsigned pin, int value)
 {
 	struct mvebu_gpio_chip *mvchip =
@@ -709,8 +699,8 @@ static int mvebu_gpio_probe(struct platform_device *pdev)
 	mvchip->soc_variant = soc_variant;
 	mvchip->chip.label = dev_name(&pdev->dev);
 	mvchip->chip.dev = &pdev->dev;
-	mvchip->chip.request = mvebu_gpio_request;
-	mvchip->chip.free = mvebu_gpio_free;
+	mvchip->chip.request = gpiochip_generic_request;
+	mvchip->chip.free = gpiochip_generic_free;
 	mvchip->chip.direction_input = mvebu_gpio_direction_input;
 	mvchip->chip.get = mvebu_gpio_get;
 	mvchip->chip.direction_output = mvebu_gpio_direction_output;
diff --git a/drivers/gpio/gpio-tb10x.c b/drivers/gpio/gpio-tb10x.c
index 12c99d9..4356e6c 100644
--- a/drivers/gpio/gpio-tb10x.c
+++ b/drivers/gpio/gpio-tb10x.c
@@ -138,16 +138,6 @@ static int tb10x_gpio_direction_out(struct gpio_chip *chip,
 	return 0;
 }
 
-static int tb10x_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-	return pinctrl_request_gpio(chip->base + offset);
-}
-
-static void tb10x_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-	pinctrl_free_gpio(chip->base + offset);
-}
-
 static int tb10x_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
 {
 	struct tb10x_gpio *tb10x_gpio = to_tb10x_gpio(chip);
@@ -213,8 +203,8 @@ static int tb10x_gpio_probe(struct platform_device *pdev)
 	tb10x_gpio->gc.get		= tb10x_gpio_get;
 	tb10x_gpio->gc.direction_output	= tb10x_gpio_direction_out;
 	tb10x_gpio->gc.set		= tb10x_gpio_set;
-	tb10x_gpio->gc.request		= tb10x_gpio_request;
-	tb10x_gpio->gc.free		= tb10x_gpio_free;
+	tb10x_gpio->gc.request		= gpiochip_generic_request;
+	tb10x_gpio->gc.free		= gpiochip_generic_free;
 	tb10x_gpio->gc.base		= -1;
 	tb10x_gpio->gc.ngpio		= ngpio;
 	tb10x_gpio->gc.can_sleep	= false;
diff --git a/drivers/gpio/gpio-tz1090-pdc.c b/drivers/gpio/gpio-tz1090-pdc.c
index ede7e40..3623d00 100644
--- a/drivers/gpio/gpio-tz1090-pdc.c
+++ b/drivers/gpio/gpio-tz1090-pdc.c
@@ -137,16 +137,6 @@ static void tz1090_pdc_gpio_set(struct gpio_chip *chip, unsigned int offset,
 	__global_unlock2(lstat);
 }
 
-static int tz1090_pdc_gpio_request(struct gpio_chip *chip, unsigned int offset)
-{
-	return pinctrl_request_gpio(chip->base + offset);
-}
-
-static void tz1090_pdc_gpio_free(struct gpio_chip *chip, unsigned int offset)
-{
-	pinctrl_free_gpio(chip->base + offset);
-}
-
 static int tz1090_pdc_gpio_to_irq(struct gpio_chip *chip, unsigned int offset)
 {
 	struct tz1090_pdc_gpio *priv = to_pdc(chip);
@@ -203,8 +193,8 @@ static int tz1090_pdc_gpio_probe(struct platform_device *pdev)
 	priv->chip.direction_output	= tz1090_pdc_gpio_direction_output;
 	priv->chip.get			= tz1090_pdc_gpio_get;
 	priv->chip.set			= tz1090_pdc_gpio_set;
-	priv->chip.free			= tz1090_pdc_gpio_free;
-	priv->chip.request		= tz1090_pdc_gpio_request;
+	priv->chip.free			= gpiochip_generic_free;
+	priv->chip.request		= gpiochip_generic_request;
 	priv->chip.to_irq		= tz1090_pdc_gpio_to_irq;
 	priv->chip.of_node		= np;
 
diff --git a/drivers/gpio/gpio-vf610.c b/drivers/gpio/gpio-vf610.c
index 3d5714d..cf39fb2 100644
--- a/drivers/gpio/gpio-vf610.c
+++ b/drivers/gpio/gpio-vf610.c
@@ -77,16 +77,6 @@ static inline u32 vf610_gpio_readl(void __iomem *reg)
 	return readl_relaxed(reg);
 }
 
-static int vf610_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-	return pinctrl_request_gpio(chip->base + offset);
-}
-
-static void vf610_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-	pinctrl_free_gpio(chip->base + offset);
-}
-
 static int vf610_gpio_get(struct gpio_chip *gc, unsigned int gpio)
 {
 	struct vf610_gpio_port *port =
@@ -255,8 +245,8 @@ static int vf610_gpio_probe(struct platform_device *pdev)
 	gc->ngpio = VF610_GPIO_PER_PORT;
 	gc->base = of_alias_get_id(np, "gpio") * VF610_GPIO_PER_PORT;
 
-	gc->request = vf610_gpio_request;
-	gc->free = vf610_gpio_free;
+	gc->request = gpiochip_generic_request;
+	gc->free = gpiochip_generic_free;
 	gc->direction_input = vf610_gpio_direction_input;
 	gc->get = vf610_gpio_get;
 	gc->direction_output = vf610_gpio_direction_output;
-- 
2.1.4

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

* [PATCH RFT 3/5] gpio: gpio-xz: use the generic request/free implementations
  2015-09-13 13:21 [PATCH RFT 0/5] gpiochip: add and use generic request/free Jonas Gorski
  2015-09-13 13:21 ` [PATCH RFT 1/5] gpiolib: provide generic request/free implementations Jonas Gorski
  2015-09-13 13:21 ` [PATCH RFT 2/5] gpio: replace trivial implementations of request/free with generic one Jonas Gorski
@ 2015-09-13 13:21 ` Jonas Gorski
  2015-09-13 13:21 ` [PATCH RFT 4/5] gpio: gpio-pl061: " Jonas Gorski
  2015-09-13 13:21 ` [PATCH RFT 5/5] pinctrl: replace trivial implementations of gpio_chip request/free Jonas Gorski
  4 siblings, 0 replies; 23+ messages in thread
From: Jonas Gorski @ 2015-09-13 13:21 UTC (permalink / raw)
  To: linux-gpio
  Cc: Linus Walleij, Alexandre Courbot, Joachim Eastwood, Jonas Jensen,
	Gregory CLEMENT, Thomas Petazzoni, James Hogan, Stefan Agner,
	Jun Nie, Stephen Warren, Lee Jones, Eric Anholt, Mika Westerberg,
	Heikki Krogerus, Matthias Brugger, Alessandro Rubini, Sonic Zhang,
	Laxman Dewangan, Jean-Christophe Plagniol-Villard, Jonas Aaberg,
	Baruch Siach, Andrew

Instead of storing in the chip data whether the chip uses pinctrl and
conditionally call pinctrl_{request,free}_gpio, just don't populate
request/free in that case.

This makes the implementations trivial and the same as the generic
implementations, thus we can just use them.

Signed-off-by: Jonas Gorski <jogo@openwrt.org>
---
 drivers/gpio/gpio-zx.c | 28 ++++------------------------
 1 file changed, 4 insertions(+), 24 deletions(-)

diff --git a/drivers/gpio/gpio-zx.c b/drivers/gpio/gpio-zx.c
index 12ee196..19f9be4 100644
--- a/drivers/gpio/gpio-zx.c
+++ b/drivers/gpio/gpio-zx.c
@@ -41,7 +41,6 @@ struct zx_gpio {
 
 	void __iomem		*base;
 	struct gpio_chip	gc;
-	bool			uses_pinctrl;
 };
 
 static inline struct zx_gpio *to_zx(struct gpio_chip *gc)
@@ -49,25 +48,6 @@ static inline struct zx_gpio *to_zx(struct gpio_chip *gc)
 	return container_of(gc, struct zx_gpio, gc);
 }
 
-static int zx_gpio_request(struct gpio_chip *gc, unsigned offset)
-{
-	struct zx_gpio *chip = to_zx(gc);
-	int gpio = gc->base + offset;
-
-	if (chip->uses_pinctrl)
-		return pinctrl_request_gpio(gpio);
-	return 0;
-}
-
-static void zx_gpio_free(struct gpio_chip *gc, unsigned offset)
-{
-	struct zx_gpio *chip = to_zx(gc);
-	int gpio = gc->base + offset;
-
-	if (chip->uses_pinctrl)
-		pinctrl_free_gpio(gpio);
-}
-
 static int zx_direction_input(struct gpio_chip *gc, unsigned offset)
 {
 	struct zx_gpio *chip = to_zx(gc);
@@ -252,12 +232,12 @@ static int zx_gpio_probe(struct platform_device *pdev)
 		return PTR_ERR(chip->base);
 
 	spin_lock_init(&chip->lock);
-	if (of_property_read_bool(dev->of_node, "gpio-ranges"))
-		chip->uses_pinctrl = true;
+	if (of_property_read_bool(dev->of_node, "gpio-ranges")) {
+		chip->gc.request = gpiochip_generic_request;
+		chip->gc.free = gpiochip_generic_free;
+	}
 
 	id = of_alias_get_id(dev->of_node, "gpio");
-	chip->gc.request = zx_gpio_request;
-	chip->gc.free = zx_gpio_free;
 	chip->gc.direction_input = zx_direction_input;
 	chip->gc.direction_output = zx_direction_output;
 	chip->gc.get = zx_get_value;
-- 
2.1.4

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

* [PATCH RFT 4/5] gpio: gpio-pl061: use the generic request/free implementations
  2015-09-13 13:21 [PATCH RFT 0/5] gpiochip: add and use generic request/free Jonas Gorski
                   ` (2 preceding siblings ...)
  2015-09-13 13:21 ` [PATCH RFT 3/5] gpio: gpio-xz: use the generic request/free implementations Jonas Gorski
@ 2015-09-13 13:21 ` Jonas Gorski
  2015-10-05  9:19   ` Linus Walleij
  2015-09-13 13:21 ` [PATCH RFT 5/5] pinctrl: replace trivial implementations of gpio_chip request/free Jonas Gorski
  4 siblings, 1 reply; 23+ messages in thread
From: Jonas Gorski @ 2015-09-13 13:21 UTC (permalink / raw)
  To: linux-gpio
  Cc: Linus Walleij, Alexandre Courbot, Joachim Eastwood, Jonas Jensen,
	Gregory CLEMENT, Thomas Petazzoni, James Hogan, Stefan Agner,
	Jun Nie, Stephen Warren, Lee Jones, Eric Anholt, Mika Westerberg,
	Heikki Krogerus, Matthias Brugger, Alessandro Rubini, Sonic Zhang,
	Laxman Dewangan, Jean-Christophe Plagniol-Villard, Jonas Aaberg,
	Baruch Siach, Andrew

Instead of storing in the chip data whether the chip uses pinctrl and
conditionally call pinctrl_{request,free}_gpio, just don't populate
request/free in that case.

This makes the implementations trivial and the same as the generic
implementations, thus we can just use them.

Signed-off-by: Jonas Gorski <jogo@openwrt.org>
---
 drivers/gpio/gpio-pl061.c | 32 ++++----------------------------
 1 file changed, 4 insertions(+), 28 deletions(-)

diff --git a/drivers/gpio/gpio-pl061.c b/drivers/gpio/gpio-pl061.c
index 0475613..92a52ff 100644
--- a/drivers/gpio/gpio-pl061.c
+++ b/drivers/gpio/gpio-pl061.c
@@ -52,36 +52,12 @@ struct pl061_gpio {
 
 	void __iomem		*base;
 	struct gpio_chip	gc;
-	bool			uses_pinctrl;
 
 #ifdef CONFIG_PM
 	struct pl061_context_save_regs csave_regs;
 #endif
 };
 
-static int pl061_gpio_request(struct gpio_chip *gc, unsigned offset)
-{
-	/*
-	 * Map back to global GPIO space and request muxing, the direction
-	 * parameter does not matter for this controller.
-	 */
-	struct pl061_gpio *chip = container_of(gc, struct pl061_gpio, gc);
-	int gpio = gc->base + offset;
-
-	if (chip->uses_pinctrl)
-		return pinctrl_request_gpio(gpio);
-	return 0;
-}
-
-static void pl061_gpio_free(struct gpio_chip *gc, unsigned offset)
-{
-	struct pl061_gpio *chip = container_of(gc, struct pl061_gpio, gc);
-	int gpio = gc->base + offset;
-
-	if (chip->uses_pinctrl)
-		pinctrl_free_gpio(gpio);
-}
-
 static int pl061_direction_input(struct gpio_chip *gc, unsigned offset)
 {
 	struct pl061_gpio *chip = container_of(gc, struct pl061_gpio, gc);
@@ -269,11 +245,11 @@ static int pl061_probe(struct amba_device *adev, const struct amba_id *id)
 		return PTR_ERR(chip->base);
 
 	spin_lock_init(&chip->lock);
-	if (of_property_read_bool(dev->of_node, "gpio-ranges"))
-		chip->uses_pinctrl = true;
+	if (of_property_read_bool(dev->of_node, "gpio-ranges")) {
+		chip->gc.request = gpiochip_generic_request;
+		chip->gc.free = gpiochip_generic_free;
+	}
 
-	chip->gc.request = pl061_gpio_request;
-	chip->gc.free = pl061_gpio_free;
 	chip->gc.direction_input = pl061_direction_input;
 	chip->gc.direction_output = pl061_direction_output;
 	chip->gc.get = pl061_get_value;
-- 
2.1.4

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

* [PATCH RFT 5/5] pinctrl: replace trivial implementations of gpio_chip request/free
  2015-09-13 13:21 [PATCH RFT 0/5] gpiochip: add and use generic request/free Jonas Gorski
                   ` (3 preceding siblings ...)
  2015-09-13 13:21 ` [PATCH RFT 4/5] gpio: gpio-pl061: " Jonas Gorski
@ 2015-09-13 13:21 ` Jonas Gorski
  2015-09-13 19:07   ` Bjorn Andersson
                     ` (8 more replies)
  4 siblings, 9 replies; 23+ messages in thread
From: Jonas Gorski @ 2015-09-13 13:21 UTC (permalink / raw)
  To: linux-gpio
  Cc: Linus Walleij, Alexandre Courbot, Joachim Eastwood, Jonas Jensen,
	Gregory CLEMENT, Thomas Petazzoni, James Hogan, Stefan Agner,
	Jun Nie, Stephen Warren, Lee Jones, Eric Anholt, Mika Westerberg,
	Heikki Krogerus, Matthias Brugger, Alessandro Rubini, Sonic Zhang,
	Laxman Dewangan, Jean-Christophe Plagniol-Villard, Jonas Aaberg,
	Baruch Siach, Andrew

Replace all trivial request/free callbacks that do nothing but call into
pinctrl code with the generic versions.

Signed-off-by: Jonas Gorski <jogo@openwrt.org>
---
 drivers/pinctrl/bcm/pinctrl-bcm2835.c         | 14 ++------------
 drivers/pinctrl/intel/pinctrl-cherryview.c    | 14 ++------------
 drivers/pinctrl/intel/pinctrl-intel.c         | 14 ++------------
 drivers/pinctrl/mediatek/pinctrl-mtk-common.c | 14 ++------------
 drivers/pinctrl/nomadik/pinctrl-abx500.c      | 18 ++----------------
 drivers/pinctrl/nomadik/pinctrl-nomadik.c     | 22 ++--------------------
 drivers/pinctrl/pinctrl-adi2.c                | 14 ++------------
 drivers/pinctrl/pinctrl-as3722.c              | 14 ++------------
 drivers/pinctrl/pinctrl-at91.c                | 26 ++------------------------
 drivers/pinctrl/pinctrl-coh901.c              | 22 ++--------------------
 drivers/pinctrl/pinctrl-digicolor.c           | 14 ++------------
 drivers/pinctrl/pinctrl-pistachio.c           | 14 ++------------
 drivers/pinctrl/pinctrl-rockchip.c            | 14 ++------------
 drivers/pinctrl/pinctrl-st.c                  | 14 ++------------
 drivers/pinctrl/pinctrl-xway.c                | 18 ++----------------
 drivers/pinctrl/qcom/pinctrl-msm.c            | 16 ++--------------
 drivers/pinctrl/qcom/pinctrl-spmi-gpio.c      | 14 ++------------
 drivers/pinctrl/qcom/pinctrl-spmi-mpp.c       | 14 ++------------
 drivers/pinctrl/samsung/pinctrl-samsung.c     | 14 ++------------
 drivers/pinctrl/sunxi/pinctrl-sunxi.c         | 14 ++------------
 drivers/pinctrl/vt8500/pinctrl-wmt.c          | 14 ++------------
 21 files changed, 42 insertions(+), 290 deletions(-)

diff --git a/drivers/pinctrl/bcm/pinctrl-bcm2835.c b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
index 8efa235..a1ea565 100644
--- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
+++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
@@ -330,16 +330,6 @@ static inline void bcm2835_pinctrl_fsel_set(
 	bcm2835_gpio_wr(pc, FSEL_REG(pin), val);
 }
 
-static int bcm2835_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-	return pinctrl_request_gpio(chip->base + offset);
-}
-
-static void bcm2835_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-	pinctrl_free_gpio(chip->base + offset);
-}
-
 static int bcm2835_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
 {
 	return pinctrl_gpio_direction_input(chip->base + offset);
@@ -375,8 +365,8 @@ static int bcm2835_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
 static struct gpio_chip bcm2835_gpio_chip = {
 	.label = MODULE_NAME,
 	.owner = THIS_MODULE,
-	.request = bcm2835_gpio_request,
-	.free = bcm2835_gpio_free,
+	.request = gpiochip_generic_request,
+	.free = gpiochip_generic_free,
 	.direction_input = bcm2835_gpio_direction_input,
 	.direction_output = bcm2835_gpio_direction_output,
 	.get = bcm2835_gpio_get,
diff --git a/drivers/pinctrl/intel/pinctrl-cherryview.c b/drivers/pinctrl/intel/pinctrl-cherryview.c
index 2d5d3dd..4270bfa 100644
--- a/drivers/pinctrl/intel/pinctrl-cherryview.c
+++ b/drivers/pinctrl/intel/pinctrl-cherryview.c
@@ -1149,16 +1149,6 @@ static struct pinctrl_desc chv_pinctrl_desc = {
 	.owner = THIS_MODULE,
 };
 
-static int chv_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-	return pinctrl_request_gpio(chip->base + offset);
-}
-
-static void chv_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-	pinctrl_free_gpio(chip->base + offset);
-}
-
 static unsigned chv_gpio_offset_to_pin(struct chv_pinctrl *pctrl,
 				       unsigned offset)
 {
@@ -1238,8 +1228,8 @@ static int chv_gpio_direction_output(struct gpio_chip *chip, unsigned offset,
 
 static const struct gpio_chip chv_gpio_chip = {
 	.owner = THIS_MODULE,
-	.request = chv_gpio_request,
-	.free = chv_gpio_free,
+	.request = gpiochip_generic_request,
+	.free = gpiochip_generic_free,
 	.get_direction = chv_gpio_get_direction,
 	.direction_input = chv_gpio_direction_input,
 	.direction_output = chv_gpio_direction_output,
diff --git a/drivers/pinctrl/intel/pinctrl-intel.c b/drivers/pinctrl/intel/pinctrl-intel.c
index bb377c1..3371820 100644
--- a/drivers/pinctrl/intel/pinctrl-intel.c
+++ b/drivers/pinctrl/intel/pinctrl-intel.c
@@ -597,16 +597,6 @@ static const struct pinctrl_desc intel_pinctrl_desc = {
 	.owner = THIS_MODULE,
 };
 
-static int intel_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-	return pinctrl_request_gpio(chip->base + offset);
-}
-
-static void intel_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-	pinctrl_free_gpio(chip->base + offset);
-}
-
 static int intel_gpio_get(struct gpio_chip *chip, unsigned offset)
 {
 	struct intel_pinctrl *pctrl = gpiochip_to_pinctrl(chip);
@@ -654,8 +644,8 @@ static int intel_gpio_direction_output(struct gpio_chip *chip, unsigned offset,
 
 static const struct gpio_chip intel_gpio_chip = {
 	.owner = THIS_MODULE,
-	.request = intel_gpio_request,
-	.free = intel_gpio_free,
+	.request = gpiochip_generic_request,
+	.free = gpiochip_generic_free,
 	.direction_input = intel_gpio_direction_input,
 	.direction_output = intel_gpio_direction_output,
 	.get = intel_gpio_get,
diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
index 7726c6c..6e75a3f 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
@@ -723,16 +723,6 @@ static const struct pinmux_ops mtk_pmx_ops = {
 	.gpio_set_direction	= mtk_pmx_gpio_set_direction,
 };
 
-static int mtk_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-	return pinctrl_request_gpio(chip->base + offset);
-}
-
-static void mtk_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-	pinctrl_free_gpio(chip->base + offset);
-}
-
 static int mtk_gpio_direction_input(struct gpio_chip *chip,
 					unsigned offset)
 {
@@ -1005,8 +995,8 @@ static int mtk_gpio_set_debounce(struct gpio_chip *chip, unsigned offset,
 
 static struct gpio_chip mtk_gpio_chip = {
 	.owner			= THIS_MODULE,
-	.request		= mtk_gpio_request,
-	.free			= mtk_gpio_free,
+	.request		= gpiochip_generic_request,
+	.free			= gpiochip_generic_free,
 	.direction_input	= mtk_gpio_direction_input,
 	.direction_output	= mtk_gpio_direction_output,
 	.get			= mtk_gpio_get,
diff --git a/drivers/pinctrl/nomadik/pinctrl-abx500.c b/drivers/pinctrl/nomadik/pinctrl-abx500.c
index 97681fa..b59fbb4 100644
--- a/drivers/pinctrl/nomadik/pinctrl-abx500.c
+++ b/drivers/pinctrl/nomadik/pinctrl-abx500.c
@@ -654,25 +654,11 @@ static inline void abx500_gpio_dbg_show_one(struct seq_file *s,
 #define abx500_gpio_dbg_show	NULL
 #endif
 
-static int abx500_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-	int gpio = chip->base + offset;
-
-	return pinctrl_request_gpio(gpio);
-}
-
-static void abx500_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-	int gpio = chip->base + offset;
-
-	pinctrl_free_gpio(gpio);
-}
-
 static struct gpio_chip abx500gpio_chip = {
 	.label			= "abx500-gpio",
 	.owner			= THIS_MODULE,
-	.request		= abx500_gpio_request,
-	.free			= abx500_gpio_free,
+	.request		= gpiochip_generic_request,
+	.free			= gpiochip_generic_free,
 	.direction_input	= abx500_gpio_direction_input,
 	.get			= abx500_gpio_get,
 	.direction_output	= abx500_gpio_direction_output,
diff --git a/drivers/pinctrl/nomadik/pinctrl-nomadik.c b/drivers/pinctrl/nomadik/pinctrl-nomadik.c
index 352ede1..6a25bd8 100644
--- a/drivers/pinctrl/nomadik/pinctrl-nomadik.c
+++ b/drivers/pinctrl/nomadik/pinctrl-nomadik.c
@@ -884,24 +884,6 @@ static void nmk_gpio_latent_irq_handler(unsigned int irq, struct irq_desc *desc)
 
 /* I/O Functions */
 
-static int nmk_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-	/*
-	 * Map back to global GPIO space and request muxing, the direction
-	 * parameter does not matter for this controller.
-	 */
-	int gpio = chip->base + offset;
-
-	return pinctrl_request_gpio(gpio);
-}
-
-static void nmk_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-	int gpio = chip->base + offset;
-
-	pinctrl_free_gpio(gpio);
-}
-
 static int nmk_gpio_make_input(struct gpio_chip *chip, unsigned offset)
 {
 	struct nmk_gpio_chip *nmk_chip =
@@ -1267,8 +1249,8 @@ static int nmk_gpio_probe(struct platform_device *dev)
 	spin_lock_init(&nmk_chip->lock);
 
 	chip = &nmk_chip->chip;
-	chip->request = nmk_gpio_request;
-	chip->free = nmk_gpio_free;
+	chip->request = gpiochip_generic_request;
+	chip->free = gpiochip_generic_free;
 	chip->direction_input = nmk_gpio_make_input;
 	chip->get = nmk_gpio_get_input;
 	chip->direction_output = nmk_gpio_make_output;
diff --git a/drivers/pinctrl/pinctrl-adi2.c b/drivers/pinctrl/pinctrl-adi2.c
index a5976eb..3d9af69 100644
--- a/drivers/pinctrl/pinctrl-adi2.c
+++ b/drivers/pinctrl/pinctrl-adi2.c
@@ -714,16 +714,6 @@ static struct pinctrl_desc adi_pinmux_desc = {
 	.owner = THIS_MODULE,
 };
 
-static int adi_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-	return pinctrl_request_gpio(chip->base + offset);
-}
-
-static void adi_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-	pinctrl_free_gpio(chip->base + offset);
-}
-
 static int adi_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
 {
 	struct gpio_port *port;
@@ -995,8 +985,8 @@ static int adi_gpio_probe(struct platform_device *pdev)
 	port->chip.get			= adi_gpio_get_value;
 	port->chip.direction_output	= adi_gpio_direction_output;
 	port->chip.set			= adi_gpio_set_value;
-	port->chip.request		= adi_gpio_request;
-	port->chip.free			= adi_gpio_free;
+	port->chip.request		= gpiochip_generic_request,
+	port->chip.free			= gpiochip_generic_free,
 	port->chip.to_irq		= adi_gpio_to_irq;
 	if (pdata->port_gpio_base > 0)
 		port->chip.base		= pdata->port_gpio_base;
diff --git a/drivers/pinctrl/pinctrl-as3722.c b/drivers/pinctrl/pinctrl-as3722.c
index 4747e08..56af28b 100644
--- a/drivers/pinctrl/pinctrl-as3722.c
+++ b/drivers/pinctrl/pinctrl-as3722.c
@@ -536,21 +536,11 @@ static int as3722_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
 	return as3722_irq_get_virq(as_pci->as3722, offset);
 }
 
-static int as3722_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-	return pinctrl_request_gpio(chip->base + offset);
-}
-
-static void as3722_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-	pinctrl_free_gpio(chip->base + offset);
-}
-
 static const struct gpio_chip as3722_gpio_chip = {
 	.label			= "as3722-gpio",
 	.owner			= THIS_MODULE,
-	.request		= as3722_gpio_request,
-	.free			= as3722_gpio_free,
+	.request		= gpiochip_generic_request,
+	.free			= gpiochip_generic_free,
 	.get			= as3722_gpio_get,
 	.set			= as3722_gpio_set,
 	.direction_input	= as3722_gpio_direction_input,
diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c
index bae0012..5d8aede 100644
--- a/drivers/pinctrl/pinctrl-at91.c
+++ b/drivers/pinctrl/pinctrl-at91.c
@@ -1277,28 +1277,6 @@ static int at91_pinctrl_remove(struct platform_device *pdev)
 	return 0;
 }
 
-static int at91_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-	/*
-	 * Map back to global GPIO space and request muxing, the direction
-	 * parameter does not matter for this controller.
-	 */
-	int gpio = chip->base + offset;
-	int bank = chip->base / chip->ngpio;
-
-	dev_dbg(chip->dev, "%s:%d pio%c%d(%d)\n", __func__, __LINE__,
-		 'A' + bank, offset, gpio);
-
-	return pinctrl_request_gpio(gpio);
-}
-
-static void at91_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-	int gpio = chip->base + offset;
-
-	pinctrl_free_gpio(gpio);
-}
-
 static int at91_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
 {
 	struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip);
@@ -1684,8 +1662,8 @@ static int at91_gpio_of_irq_setup(struct platform_device *pdev,
 
 /* This structure is replicated for each GPIO block allocated at probe time */
 static struct gpio_chip at91_gpio_template = {
-	.request		= at91_gpio_request,
-	.free			= at91_gpio_free,
+	.request		= gpiochip_generic_request,
+	.free			= gpiochip_generic_free,
 	.get_direction		= at91_gpio_get_direction,
 	.direction_input	= at91_gpio_direction_input,
 	.get			= at91_gpio_get,
diff --git a/drivers/pinctrl/pinctrl-coh901.c b/drivers/pinctrl/pinctrl-coh901.c
index 3731cc6..6db1788 100644
--- a/drivers/pinctrl/pinctrl-coh901.c
+++ b/drivers/pinctrl/pinctrl-coh901.c
@@ -217,24 +217,6 @@ static inline struct u300_gpio *to_u300_gpio(struct gpio_chip *chip)
 	return container_of(chip, struct u300_gpio, chip);
 }
 
-static int u300_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-	/*
-	 * Map back to global GPIO space and request muxing, the direction
-	 * parameter does not matter for this controller.
-	 */
-	int gpio = chip->base + offset;
-
-	return pinctrl_request_gpio(gpio);
-}
-
-static void u300_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-	int gpio = chip->base + offset;
-
-	pinctrl_free_gpio(gpio);
-}
-
 static int u300_gpio_get(struct gpio_chip *chip, unsigned offset)
 {
 	struct u300_gpio *gpio = to_u300_gpio(chip);
@@ -417,8 +399,8 @@ int u300_gpio_config_set(struct gpio_chip *chip, unsigned offset,
 static struct gpio_chip u300_gpio_chip = {
 	.label			= "u300-gpio-chip",
 	.owner			= THIS_MODULE,
-	.request		= u300_gpio_request,
-	.free			= u300_gpio_free,
+	.request		= gpiochip_generic_request,
+	.free			= gpiochip_generic_free,
 	.get			= u300_gpio_get,
 	.set			= u300_gpio_set,
 	.direction_input	= u300_gpio_direction_input,
diff --git a/drivers/pinctrl/pinctrl-digicolor.c b/drivers/pinctrl/pinctrl-digicolor.c
index 461fffc..df885958 100644
--- a/drivers/pinctrl/pinctrl-digicolor.c
+++ b/drivers/pinctrl/pinctrl-digicolor.c
@@ -169,16 +169,6 @@ static struct pinmux_ops dc_pmxops = {
 	.gpio_request_enable	= dc_pmx_request_gpio,
 };
 
-static int dc_gpio_request(struct gpio_chip *chip, unsigned gpio)
-{
-	return pinctrl_request_gpio(chip->base + gpio);
-}
-
-static void dc_gpio_free(struct gpio_chip *chip, unsigned gpio)
-{
-	pinctrl_free_gpio(chip->base + gpio);
-}
-
 static int dc_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)
 {
 	struct dc_pinmap *pmap = container_of(chip, struct dc_pinmap, chip);
@@ -255,8 +245,8 @@ static int dc_gpiochip_add(struct dc_pinmap *pmap, struct device_node *np)
 
 	chip->label		= DRIVER_NAME;
 	chip->dev		= pmap->dev;
-	chip->request		= dc_gpio_request;
-	chip->free		= dc_gpio_free;
+	chip->request		= gpiochip_generic_request;
+	chip->free		= gpiochip_generic_free;
 	chip->direction_input	= dc_gpio_direction_input;
 	chip->direction_output	= dc_gpio_direction_output;
 	chip->get		= dc_gpio_get;
diff --git a/drivers/pinctrl/pinctrl-pistachio.c b/drivers/pinctrl/pinctrl-pistachio.c
index 3dc2ae1..a599b5c 100644
--- a/drivers/pinctrl/pinctrl-pistachio.c
+++ b/drivers/pinctrl/pinctrl-pistachio.c
@@ -1171,16 +1171,6 @@ static struct pinctrl_desc pistachio_pinctrl_desc = {
 	.confops = &pistachio_pinconf_ops,
 };
 
-static int pistachio_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-	return pinctrl_request_gpio(chip->base + offset);
-}
-
-static void pistachio_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-	pinctrl_free_gpio(chip->base + offset);
-}
-
 static int pistachio_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
 {
 	struct pistachio_gpio_bank *bank = gc_to_bank(chip);
@@ -1334,8 +1324,8 @@ static void pistachio_gpio_irq_handler(unsigned int __irq,
 		.npins = _npins,					\
 		.gpio_chip = {						\
 			.label = "GPIO" #_bank,				\
-			.request = pistachio_gpio_request,		\
-			.free = pistachio_gpio_free,			\
+			.request = gpiochip_generic_request,		\
+			.free = gpiochip_generic_free,			\
 			.get_direction = pistachio_gpio_get_direction,	\
 			.direction_input = pistachio_gpio_direction_input, \
 			.direction_output = pistachio_gpio_direction_output, \
diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
index c5246c0..89a6ad8e 100644
--- a/drivers/pinctrl/pinctrl-rockchip.c
+++ b/drivers/pinctrl/pinctrl-rockchip.c
@@ -1374,16 +1374,6 @@ static int rockchip_pinctrl_register(struct platform_device *pdev,
  * GPIO handling
  */
 
-static int rockchip_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-	return pinctrl_request_gpio(chip->base + offset);
-}
-
-static void rockchip_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-	pinctrl_free_gpio(chip->base + offset);
-}
-
 static void rockchip_gpio_set(struct gpio_chip *gc, unsigned offset, int value)
 {
 	struct rockchip_pin_bank *bank = gc_to_pin_bank(gc);
@@ -1461,8 +1451,8 @@ static int rockchip_gpio_to_irq(struct gpio_chip *gc, unsigned offset)
 }
 
 static const struct gpio_chip rockchip_gpiolib_chip = {
-	.request = rockchip_gpio_request,
-	.free = rockchip_gpio_free,
+	.request = gpiochip_generic_request,
+	.free = gpiochip_generic_free,
 	.set = rockchip_gpio_set,
 	.get = rockchip_gpio_get,
 	.direction_input = rockchip_gpio_direction_input,
diff --git a/drivers/pinctrl/pinctrl-st.c b/drivers/pinctrl/pinctrl-st.c
index f8338d2..fa49e31 100644
--- a/drivers/pinctrl/pinctrl-st.c
+++ b/drivers/pinctrl/pinctrl-st.c
@@ -742,16 +742,6 @@ static void st_gpio_direction(struct st_gpio_bank *bank,
 	}
 }
 
-static int st_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-	return pinctrl_request_gpio(chip->base + offset);
-}
-
-static void st_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-	pinctrl_free_gpio(chip->base + offset);
-}
-
 static int st_gpio_get(struct gpio_chip *chip, unsigned offset)
 {
 	struct st_gpio_bank *bank = gpio_chip_to_bank(chip);
@@ -1490,8 +1480,8 @@ static void st_gpio_irqmux_handler(unsigned irq, struct irq_desc *desc)
 }
 
 static struct gpio_chip st_gpio_template = {
-	.request		= st_gpio_request,
-	.free			= st_gpio_free,
+	.request		= gpiochip_generic_request,
+	.free			= gpiochip_generic_free,
 	.get			= st_gpio_get,
 	.set			= st_gpio_set,
 	.direction_input	= st_gpio_direction_input,
diff --git a/drivers/pinctrl/pinctrl-xway.c b/drivers/pinctrl/pinctrl-xway.c
index 779950c..ae724bd 100644
--- a/drivers/pinctrl/pinctrl-xway.c
+++ b/drivers/pinctrl/pinctrl-xway.c
@@ -682,28 +682,14 @@ static int xway_gpio_dir_out(struct gpio_chip *chip, unsigned int pin, int val)
 	return 0;
 }
 
-static int xway_gpio_req(struct gpio_chip *chip, unsigned offset)
-{
-	int gpio = chip->base + offset;
-
-	return pinctrl_request_gpio(gpio);
-}
-
-static void xway_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-	int gpio = chip->base + offset;
-
-	pinctrl_free_gpio(gpio);
-}
-
 static struct gpio_chip xway_chip = {
 	.label = "gpio-xway",
 	.direction_input = xway_gpio_dir_in,
 	.direction_output = xway_gpio_dir_out,
 	.get = xway_gpio_get,
 	.set = xway_gpio_set,
-	.request = xway_gpio_req,
-	.free = xway_gpio_free,
+	.request = gpiochip_generic_request,
+	.free = gpiochip_generic_free,
 	.base = -1,
 };
 
diff --git a/drivers/pinctrl/qcom/pinctrl-msm.c b/drivers/pinctrl/qcom/pinctrl-msm.c
index 492cdd5..1d3dcb4 100644
--- a/drivers/pinctrl/qcom/pinctrl-msm.c
+++ b/drivers/pinctrl/qcom/pinctrl-msm.c
@@ -458,18 +458,6 @@ static void msm_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
 	spin_unlock_irqrestore(&pctrl->lock, flags);
 }
 
-static int msm_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-	int gpio = chip->base + offset;
-	return pinctrl_request_gpio(gpio);
-}
-
-static void msm_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-	int gpio = chip->base + offset;
-	return pinctrl_free_gpio(gpio);
-}
-
 #ifdef CONFIG_DEBUG_FS
 #include <linux/seq_file.h>
 
@@ -527,8 +515,8 @@ static struct gpio_chip msm_gpio_template = {
 	.direction_output = msm_gpio_direction_output,
 	.get              = msm_gpio_get,
 	.set              = msm_gpio_set,
-	.request          = msm_gpio_request,
-	.free             = msm_gpio_free,
+	.request          = gpiochip_generic_request,
+	.free             = gpiochip_generic_free,
 	.dbg_show         = msm_gpio_dbg_show,
 };
 
diff --git a/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c b/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c
index bd1e245..6c42ca1 100644
--- a/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c
+++ b/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c
@@ -546,16 +546,6 @@ static void pmic_gpio_set(struct gpio_chip *chip, unsigned pin, int value)
 	pmic_gpio_config_set(state->ctrl, pin, &config, 1);
 }
 
-static int pmic_gpio_request(struct gpio_chip *chip, unsigned base)
-{
-	return pinctrl_request_gpio(chip->base + base);
-}
-
-static void pmic_gpio_free(struct gpio_chip *chip, unsigned base)
-{
-	pinctrl_free_gpio(chip->base + base);
-}
-
 static int pmic_gpio_of_xlate(struct gpio_chip *chip,
 			      const struct of_phandle_args *gpio_desc,
 			      u32 *flags)
@@ -595,8 +585,8 @@ static const struct gpio_chip pmic_gpio_gpio_template = {
 	.direction_output	= pmic_gpio_direction_output,
 	.get			= pmic_gpio_get,
 	.set			= pmic_gpio_set,
-	.request		= pmic_gpio_request,
-	.free			= pmic_gpio_free,
+	.request		= gpiochip_generic_request,
+	.free			= gpiochip_generic_free,
 	.of_xlate		= pmic_gpio_of_xlate,
 	.to_irq			= pmic_gpio_to_irq,
 	.dbg_show		= pmic_gpio_dbg_show,
diff --git a/drivers/pinctrl/qcom/pinctrl-spmi-mpp.c b/drivers/pinctrl/qcom/pinctrl-spmi-mpp.c
index e3be3ce..9ce0e30 100644
--- a/drivers/pinctrl/qcom/pinctrl-spmi-mpp.c
+++ b/drivers/pinctrl/qcom/pinctrl-spmi-mpp.c
@@ -604,16 +604,6 @@ static void pmic_mpp_set(struct gpio_chip *chip, unsigned pin, int value)
 	pmic_mpp_config_set(state->ctrl, pin, &config, 1);
 }
 
-static int pmic_mpp_request(struct gpio_chip *chip, unsigned base)
-{
-	return pinctrl_request_gpio(chip->base + base);
-}
-
-static void pmic_mpp_free(struct gpio_chip *chip, unsigned base)
-{
-	pinctrl_free_gpio(chip->base + base);
-}
-
 static int pmic_mpp_of_xlate(struct gpio_chip *chip,
 			     const struct of_phandle_args *gpio_desc,
 			     u32 *flags)
@@ -653,8 +643,8 @@ static const struct gpio_chip pmic_mpp_gpio_template = {
 	.direction_output	= pmic_mpp_direction_output,
 	.get			= pmic_mpp_get,
 	.set			= pmic_mpp_set,
-	.request		= pmic_mpp_request,
-	.free			= pmic_mpp_free,
+	.request		= gpiochip_generic_request,
+	.free			= gpiochip_generic_free,
 	.of_xlate		= pmic_mpp_of_xlate,
 	.to_irq			= pmic_mpp_to_irq,
 	.dbg_show		= pmic_mpp_dbg_show,
diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.c b/drivers/pinctrl/samsung/pinctrl-samsung.c
index c760bf4..3f622cc 100644
--- a/drivers/pinctrl/samsung/pinctrl-samsung.c
+++ b/drivers/pinctrl/samsung/pinctrl-samsung.c
@@ -888,19 +888,9 @@ static int samsung_pinctrl_register(struct platform_device *pdev,
 	return 0;
 }
 
-static int samsung_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-	return pinctrl_request_gpio(chip->base + offset);
-}
-
-static void samsung_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-	pinctrl_free_gpio(chip->base + offset);
-}
-
 static const struct gpio_chip samsung_gpiolib_chip = {
-	.request = samsung_gpio_request,
-	.free = samsung_gpio_free,
+	.request = gpiochip_generic_request,
+	.free = gpiochip_generic_free,
 	.set = samsung_gpio_set,
 	.get = samsung_gpio_get,
 	.direction_input = samsung_gpio_direction_input,
diff --git a/drivers/pinctrl/sunxi/pinctrl-sunxi.c b/drivers/pinctrl/sunxi/pinctrl-sunxi.c
index fb4669c0..c98ae05 100644
--- a/drivers/pinctrl/sunxi/pinctrl-sunxi.c
+++ b/drivers/pinctrl/sunxi/pinctrl-sunxi.c
@@ -446,16 +446,6 @@ static const struct pinmux_ops sunxi_pmx_ops = {
 	.gpio_set_direction	= sunxi_pmx_gpio_set_direction,
 };
 
-static int sunxi_pinctrl_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-	return pinctrl_request_gpio(chip->base + offset);
-}
-
-static void sunxi_pinctrl_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-	pinctrl_free_gpio(chip->base + offset);
-}
-
 static int sunxi_pinctrl_gpio_direction_input(struct gpio_chip *chip,
 					unsigned offset)
 {
@@ -958,8 +948,8 @@ int sunxi_pinctrl_init(struct platform_device *pdev,
 
 	last_pin = pctl->desc->pins[pctl->desc->npins - 1].pin.number;
 	pctl->chip->owner = THIS_MODULE;
-	pctl->chip->request = sunxi_pinctrl_gpio_request,
-	pctl->chip->free = sunxi_pinctrl_gpio_free,
+	pctl->chip->request = gpiochip_generic_request,
+	pctl->chip->free = gpiochip_generic_free,
 	pctl->chip->direction_input = sunxi_pinctrl_gpio_direction_input,
 	pctl->chip->direction_output = sunxi_pinctrl_gpio_direction_output,
 	pctl->chip->get = sunxi_pinctrl_gpio_get,
diff --git a/drivers/pinctrl/vt8500/pinctrl-wmt.c b/drivers/pinctrl/vt8500/pinctrl-wmt.c
index c15316b..fb22d3f 100644
--- a/drivers/pinctrl/vt8500/pinctrl-wmt.c
+++ b/drivers/pinctrl/vt8500/pinctrl-wmt.c
@@ -486,16 +486,6 @@ static struct pinctrl_desc wmt_desc = {
 	.confops = &wmt_pinconf_ops,
 };
 
-static int wmt_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-	return pinctrl_request_gpio(chip->base + offset);
-}
-
-static void wmt_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-	pinctrl_free_gpio(chip->base + offset);
-}
-
 static int wmt_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
 {
 	struct wmt_pinctrl_data *data = dev_get_drvdata(chip->dev);
@@ -560,8 +550,8 @@ static int wmt_gpio_direction_output(struct gpio_chip *chip, unsigned offset,
 static struct gpio_chip wmt_gpio_chip = {
 	.label = "gpio-wmt",
 	.owner = THIS_MODULE,
-	.request = wmt_gpio_request,
-	.free = wmt_gpio_free,
+	.request = gpiochip_generic_request,
+	.free = gpiochip_generic_free,
 	.get_direction = wmt_gpio_get_direction,
 	.direction_input = wmt_gpio_direction_input,
 	.direction_output = wmt_gpio_direction_output,
-- 
2.1.4

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

* Re: [PATCH RFT 5/5] pinctrl: replace trivial implementations of gpio_chip request/free
  2015-09-13 13:21 ` [PATCH RFT 5/5] pinctrl: replace trivial implementations of gpio_chip request/free Jonas Gorski
@ 2015-09-13 19:07   ` Bjorn Andersson
  2015-09-13 19:20   ` Heiko Stübner
                     ` (7 subsequent siblings)
  8 siblings, 0 replies; 23+ messages in thread
From: Bjorn Andersson @ 2015-09-13 19:07 UTC (permalink / raw)
  To: Jonas Gorski
  Cc: linux-gpio, Linus Walleij, Alexandre Courbot, Joachim Eastwood,
	Jonas Jensen, Gregory CLEMENT, Thomas Petazzoni, James Hogan,
	Stefan Agner, Jun Nie, Stephen Warren, Lee Jones, Eric Anholt,
	Mika Westerberg, Heikki Krogerus, Matthias Brugger,
	Alessandro Rubini, Sonic Zhang, Laxman Dewangan,
	Jean-Christophe Plagniol-Villard, Jonas Aaberg,
	Baruch Siach <baruc>

On Sun 13 Sep 06:21 PDT 2015, Jonas Gorski wrote:

> Replace all trivial request/free callbacks that do nothing but call into
> pinctrl code with the generic versions.
> 
> Signed-off-by: Jonas Gorski <jogo@openwrt.org>

[..]

> diff --git a/drivers/pinctrl/qcom/pinctrl-msm.c b/drivers/pinctrl/qcom/pinctrl-msm.c
> index 492cdd5..1d3dcb4 100644
> --- a/drivers/pinctrl/qcom/pinctrl-msm.c
> +++ b/drivers/pinctrl/qcom/pinctrl-msm.c
> @@ -458,18 +458,6 @@ static void msm_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
>  	spin_unlock_irqrestore(&pctrl->lock, flags);
>  }
>  
> -static int msm_gpio_request(struct gpio_chip *chip, unsigned offset)
> -{
> -	int gpio = chip->base + offset;
> -	return pinctrl_request_gpio(gpio);
> -}
> -
> -static void msm_gpio_free(struct gpio_chip *chip, unsigned offset)
> -{
> -	int gpio = chip->base + offset;
> -	return pinctrl_free_gpio(gpio);
> -}
> -
>  #ifdef CONFIG_DEBUG_FS
>  #include <linux/seq_file.h>
>  
> @@ -527,8 +515,8 @@ static struct gpio_chip msm_gpio_template = {
>  	.direction_output = msm_gpio_direction_output,
>  	.get              = msm_gpio_get,
>  	.set              = msm_gpio_set,
> -	.request          = msm_gpio_request,
> -	.free             = msm_gpio_free,
> +	.request          = gpiochip_generic_request,
> +	.free             = gpiochip_generic_free,
>  	.dbg_show         = msm_gpio_dbg_show,
>  };
>  

For the msm-part:

Acked-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>

Regards,
Bjorn

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

* Re: [PATCH RFT 5/5] pinctrl: replace trivial implementations of gpio_chip request/free
  2015-09-13 13:21 ` [PATCH RFT 5/5] pinctrl: replace trivial implementations of gpio_chip request/free Jonas Gorski
  2015-09-13 19:07   ` Bjorn Andersson
@ 2015-09-13 19:20   ` Heiko Stübner
  2015-09-14 14:18   ` Eric Anholt
                     ` (6 subsequent siblings)
  8 siblings, 0 replies; 23+ messages in thread
From: Heiko Stübner @ 2015-09-13 19:20 UTC (permalink / raw)
  To: Jonas Gorski
  Cc: linux-gpio, Linus Walleij, Alexandre Courbot, Joachim Eastwood,
	Jonas Jensen, Gregory CLEMENT, Thomas Petazzoni, James Hogan,
	Stefan Agner, Jun Nie, Stephen Warren, Lee Jones, Eric Anholt,
	Mika Westerberg, Heikki Krogerus, Matthias Brugger,
	Alessandro Rubini, Sonic Zhang, Laxman Dewangan,
	Jean-Christophe Plagniol-Villard, Jonas Aaberg,
	Baruch Siach <baruch@

Hi Jonas,

Am Sonntag, 13. September 2015, 15:21:38 schrieb Jonas Gorski:
> diff --git a/drivers/pinctrl/pinctrl-rockchip.c
> b/drivers/pinctrl/pinctrl-rockchip.c index c5246c0..89a6ad8e 100644
> --- a/drivers/pinctrl/pinctrl-rockchip.c
> +++ b/drivers/pinctrl/pinctrl-rockchip.c
> @@ -1374,16 +1374,6 @@ static int rockchip_pinctrl_register(struct
> platform_device *pdev, * GPIO handling
>   */
>  
> -static int rockchip_gpio_request(struct gpio_chip *chip, unsigned offset)
> -{
> -       return pinctrl_request_gpio(chip->base + offset);
> -}
> -
> -static void rockchip_gpio_free(struct gpio_chip *chip, unsigned offset)
> -{
> -       pinctrl_free_gpio(chip->base + offset);
> -}
> -
>  static void rockchip_gpio_set(struct gpio_chip *gc, unsigned offset, int
> value) {
>         struct rockchip_pin_bank *bank = gc_to_pin_bank(gc);
> @@ -1461,8 +1451,8 @@ static int rockchip_gpio_to_irq(struct gpio_chip *gc,
> unsigned offset) }
>  
>  static const struct gpio_chip rockchip_gpiolib_chip = {
> -       .request = rockchip_gpio_request,
> -       .free = rockchip_gpio_free,
> +       .request = gpiochip_generic_request,
> +       .free = gpiochip_generic_free,
>         .set = rockchip_gpio_set,
>         .get = rockchip_gpio_get,
>         .direction_input = rockchip_gpio_direction_input,

for the Rockchip part

Acked-by: Heiko Stuebner <heiko@sntech.de>

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

* Re: [PATCH RFT 5/5] pinctrl: replace trivial implementations of gpio_chip request/free
  2015-09-13 13:21 ` [PATCH RFT 5/5] pinctrl: replace trivial implementations of gpio_chip request/free Jonas Gorski
  2015-09-13 19:07   ` Bjorn Andersson
  2015-09-13 19:20   ` Heiko Stübner
@ 2015-09-14 14:18   ` Eric Anholt
  2015-09-14 14:41   ` Mika Westerberg
                     ` (5 subsequent siblings)
  8 siblings, 0 replies; 23+ messages in thread
From: Eric Anholt @ 2015-09-14 14:18 UTC (permalink / raw)
  To: Jonas Gorski, linux-gpio
  Cc: Linus Walleij, Alexandre Courbot, Joachim Eastwood, Jonas Jensen,
	Gregory CLEMENT, Thomas Petazzoni, James Hogan, Stefan Agner,
	Jun Nie, Stephen Warren, Lee Jones, Mika Westerberg,
	Heikki Krogerus, Matthias Brugger, Alessandro Rubini, Sonic Zhang,
	Laxman Dewangan, Jean-Christophe Plagniol-Villard, Jonas Aaberg,
	Baruch Siach, Andrew Bresticker

[-- Attachment #1: Type: text/plain, Size: 1383 bytes --]

Jonas Gorski <jogo@openwrt.org> writes:
> diff --git a/drivers/pinctrl/bcm/pinctrl-bcm2835.c b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
> index 8efa235..a1ea565 100644
> --- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
> +++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
> @@ -330,16 +330,6 @@ static inline void bcm2835_pinctrl_fsel_set(
>  	bcm2835_gpio_wr(pc, FSEL_REG(pin), val);
>  }
>  
> -static int bcm2835_gpio_request(struct gpio_chip *chip, unsigned offset)
> -{
> -	return pinctrl_request_gpio(chip->base + offset);
> -}
> -
> -static void bcm2835_gpio_free(struct gpio_chip *chip, unsigned offset)
> -{
> -	pinctrl_free_gpio(chip->base + offset);
> -}
> -
>  static int bcm2835_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
>  {
>  	return pinctrl_gpio_direction_input(chip->base + offset);
> @@ -375,8 +365,8 @@ static int bcm2835_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
>  static struct gpio_chip bcm2835_gpio_chip = {
>  	.label = MODULE_NAME,
>  	.owner = THIS_MODULE,
> -	.request = bcm2835_gpio_request,
> -	.free = bcm2835_gpio_free,
> +	.request = gpiochip_generic_request,
> +	.free = gpiochip_generic_free,
>  	.direction_input = bcm2835_gpio_direction_input,
>  	.direction_output = bcm2835_gpio_direction_output,
>  	.get = bcm2835_gpio_get,

For the bcm2835 part,

Acked-by: Eric Anholt <eric@anholt.net>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 818 bytes --]

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

* Re: [PATCH RFT 2/5] gpio: replace trivial implementations of request/free with generic one
  2015-09-13 13:21 ` [PATCH RFT 2/5] gpio: replace trivial implementations of request/free with generic one Jonas Gorski
@ 2015-09-14 14:37   ` Thomas Petazzoni
  2015-09-14 17:14   ` James Hogan
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 23+ messages in thread
From: Thomas Petazzoni @ 2015-09-14 14:37 UTC (permalink / raw)
  To: Jonas Gorski
  Cc: linux-gpio, Linus Walleij, Alexandre Courbot, Joachim Eastwood,
	Jonas Jensen, Gregory CLEMENT, James Hogan, Stefan Agner, Jun Nie,
	Stephen Warren, Lee Jones, Eric Anholt, Mika Westerberg,
	Heikki Krogerus, Matthias Brugger, Alessandro Rubini, Sonic Zhang,
	Laxman Dewangan, Jean-Christophe Plagniol-Villard, Jonas Aaberg,
	Baruch Siach, Andrew Bresticker

Dear Jonas Gorski,

On Sun, 13 Sep 2015 15:21:35 +0200, Jonas Gorski wrote:

> diff --git a/drivers/gpio/gpio-mvebu.c b/drivers/gpio/gpio-mvebu.c
> index b396bf3..dba8997 100644
> --- a/drivers/gpio/gpio-mvebu.c
> +++ b/drivers/gpio/gpio-mvebu.c
> @@ -185,16 +185,6 @@ static void __iomem *mvebu_gpioreg_level_mask(struct mvebu_gpio_chip *mvchip)
>   * Functions implementing the gpio_chip methods
>   */
>  
> -static int mvebu_gpio_request(struct gpio_chip *chip, unsigned pin)
> -{
> -	return pinctrl_request_gpio(chip->base + pin);
> -}
> -
> -static void mvebu_gpio_free(struct gpio_chip *chip, unsigned pin)
> -{
> -	pinctrl_free_gpio(chip->base + pin);
> -}
> -
>  static void mvebu_gpio_set(struct gpio_chip *chip, unsigned pin, int value)
>  {
>  	struct mvebu_gpio_chip *mvchip =
> @@ -709,8 +699,8 @@ static int mvebu_gpio_probe(struct platform_device *pdev)
>  	mvchip->soc_variant = soc_variant;
>  	mvchip->chip.label = dev_name(&pdev->dev);
>  	mvchip->chip.dev = &pdev->dev;
> -	mvchip->chip.request = mvebu_gpio_request;
> -	mvchip->chip.free = mvebu_gpio_free;
> +	mvchip->chip.request = gpiochip_generic_request;
> +	mvchip->chip.free = gpiochip_generic_free;
>  	mvchip->chip.direction_input = mvebu_gpio_direction_input;
>  	mvchip->chip.get = mvebu_gpio_get;
>  	mvchip->chip.direction_output = mvebu_gpio_direction_output;

For the mvebu part:

Reviewed-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>

Thanks!

Thomas
-- 
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

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

* Re: [PATCH RFT 5/5] pinctrl: replace trivial implementations of gpio_chip request/free
  2015-09-13 13:21 ` [PATCH RFT 5/5] pinctrl: replace trivial implementations of gpio_chip request/free Jonas Gorski
                     ` (2 preceding siblings ...)
  2015-09-14 14:18   ` Eric Anholt
@ 2015-09-14 14:41   ` Mika Westerberg
  2015-09-14 16:53   ` Andrew Bresticker
                     ` (4 subsequent siblings)
  8 siblings, 0 replies; 23+ messages in thread
From: Mika Westerberg @ 2015-09-14 14:41 UTC (permalink / raw)
  To: Jonas Gorski
  Cc: linux-gpio, Linus Walleij, Alexandre Courbot, Joachim Eastwood,
	Jonas Jensen, Gregory CLEMENT, Thomas Petazzoni, James Hogan,
	Stefan Agner, Jun Nie, Stephen Warren, Lee Jones, Eric Anholt,
	Heikki Krogerus, Matthias Brugger, Alessandro Rubini, Sonic Zhang,
	Laxman Dewangan, Jean-Christophe Plagniol-Villard, Jonas Aaberg,
	Baruch Siach, Andrew Bresticker

On Sun, Sep 13, 2015 at 03:21:38PM +0200, Jonas Gorski wrote:
[..]
>  drivers/pinctrl/intel/pinctrl-cherryview.c    | 14 ++------------
>  drivers/pinctrl/intel/pinctrl-intel.c         | 14 ++------------

For the above two:

Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>

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

* Re: [PATCH RFT 5/5] pinctrl: replace trivial implementations of gpio_chip request/free
  2015-09-13 13:21 ` [PATCH RFT 5/5] pinctrl: replace trivial implementations of gpio_chip request/free Jonas Gorski
                     ` (3 preceding siblings ...)
  2015-09-14 14:41   ` Mika Westerberg
@ 2015-09-14 16:53   ` Andrew Bresticker
  2015-09-16 11:07   ` Baruch Siach
                     ` (3 subsequent siblings)
  8 siblings, 0 replies; 23+ messages in thread
From: Andrew Bresticker @ 2015-09-14 16:53 UTC (permalink / raw)
  To: Jonas Gorski
  Cc: linux-gpio@vger.kernel.org, Linus Walleij, Alexandre Courbot,
	Joachim Eastwood, Jonas Jensen, Gregory CLEMENT, Thomas Petazzoni,
	James Hogan, Stefan Agner, Jun Nie, Stephen Warren, Lee Jones,
	Eric Anholt, Mika Westerberg, Heikki Krogerus, Matthias Brugger,
	Alessandro Rubini, Sonic Zhang, Laxman Dewangan,
	Jean-Christophe Plagniol-Villard, Jonas Aaberg

On Sun, Sep 13, 2015 at 6:21 AM, Jonas Gorski <jogo@openwrt.org> wrote:
> Replace all trivial request/free callbacks that do nothing but call into
> pinctrl code with the generic versions.
>
> Signed-off-by: Jonas Gorski <jogo@openwrt.org>

>  drivers/pinctrl/pinctrl-pistachio.c           | 14 ++------------

For PIstachio,

Acked-by: Andrew Bresticker <abrestic@chromium.org>

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

* Re: [PATCH RFT 2/5] gpio: replace trivial implementations of request/free with generic one
  2015-09-13 13:21 ` [PATCH RFT 2/5] gpio: replace trivial implementations of request/free with generic one Jonas Gorski
  2015-09-14 14:37   ` Thomas Petazzoni
@ 2015-09-14 17:14   ` James Hogan
  2015-09-15  3:32   ` Stefan Agner
  2015-09-20 13:16   ` Joachim Eastwood
  3 siblings, 0 replies; 23+ messages in thread
From: James Hogan @ 2015-09-14 17:14 UTC (permalink / raw)
  To: Jonas Gorski
  Cc: linux-gpio, Linus Walleij, Alexandre Courbot, Joachim Eastwood,
	Jonas Jensen, Gregory CLEMENT, Thomas Petazzoni, Stefan Agner,
	Jun Nie, Stephen Warren, Lee Jones, Eric Anholt, Mika Westerberg,
	Heikki Krogerus, Matthias Brugger, Alessandro Rubini, Sonic Zhang,
	Laxman Dewangan, Jean-Christophe Plagniol-Villard, Jonas Aaberg,
	Baruch Siach

[-- Attachment #1: Type: text/plain, Size: 1697 bytes --]

On Sun, Sep 13, 2015 at 03:21:35PM +0200, Jonas Gorski wrote:
> Replace all trivial request/free callbacks that do nothing but call into
> pinctrl code with the generic versions.
> 
> Signed-off-by: Jonas Gorski <jogo@openwrt.org>
> ---
>  drivers/gpio/gpio-tz1090-pdc.c | 14 ++------------

For the tz1090-pdc bit:
Acked-by: James Hogan <james.hogan@imgtec.com>

Cheers
James

> diff --git a/drivers/gpio/gpio-tz1090-pdc.c b/drivers/gpio/gpio-tz1090-pdc.c
> index ede7e40..3623d00 100644
> --- a/drivers/gpio/gpio-tz1090-pdc.c
> +++ b/drivers/gpio/gpio-tz1090-pdc.c
> @@ -137,16 +137,6 @@ static void tz1090_pdc_gpio_set(struct gpio_chip *chip, unsigned int offset,
>  	__global_unlock2(lstat);
>  }
>  
> -static int tz1090_pdc_gpio_request(struct gpio_chip *chip, unsigned int offset)
> -{
> -	return pinctrl_request_gpio(chip->base + offset);
> -}
> -
> -static void tz1090_pdc_gpio_free(struct gpio_chip *chip, unsigned int offset)
> -{
> -	pinctrl_free_gpio(chip->base + offset);
> -}
> -
>  static int tz1090_pdc_gpio_to_irq(struct gpio_chip *chip, unsigned int offset)
>  {
>  	struct tz1090_pdc_gpio *priv = to_pdc(chip);
> @@ -203,8 +193,8 @@ static int tz1090_pdc_gpio_probe(struct platform_device *pdev)
>  	priv->chip.direction_output	= tz1090_pdc_gpio_direction_output;
>  	priv->chip.get			= tz1090_pdc_gpio_get;
>  	priv->chip.set			= tz1090_pdc_gpio_set;
> -	priv->chip.free			= tz1090_pdc_gpio_free;
> -	priv->chip.request		= tz1090_pdc_gpio_request;
> +	priv->chip.free			= gpiochip_generic_free;
> +	priv->chip.request		= gpiochip_generic_request;
>  	priv->chip.to_irq		= tz1090_pdc_gpio_to_irq;
>  	priv->chip.of_node		= np;
>  

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

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

* Re: [PATCH RFT 2/5] gpio: replace trivial implementations of request/free with generic one
  2015-09-13 13:21 ` [PATCH RFT 2/5] gpio: replace trivial implementations of request/free with generic one Jonas Gorski
  2015-09-14 14:37   ` Thomas Petazzoni
  2015-09-14 17:14   ` James Hogan
@ 2015-09-15  3:32   ` Stefan Agner
  2015-09-20 13:16   ` Joachim Eastwood
  3 siblings, 0 replies; 23+ messages in thread
From: Stefan Agner @ 2015-09-15  3:32 UTC (permalink / raw)
  To: Jonas Gorski
  Cc: linux-gpio, Linus Walleij, Alexandre Courbot, Joachim Eastwood,
	Jonas Jensen, Gregory CLEMENT, Thomas Petazzoni, James Hogan,
	Jun Nie, Stephen Warren, Lee Jones, Eric Anholt, Mika Westerberg,
	Heikki Krogerus, Matthias Brugger, Alessandro Rubini, Sonic Zhang,
	Laxman Dewangan, Jean-Christophe Plagniol-Villard, Jonas Aaberg,
	Baruch Siach, Andrew

On 2015-09-13 06:21, Jonas Gorski wrote:
> Replace all trivial request/free callbacks that do nothing but call into
> pinctrl code with the generic versions.
> 
> Signed-off-by: Jonas Gorski <jogo@openwrt.org>
> ---
>  drivers/gpio/gpio-lpc18xx.c    | 14 ++------------
>  drivers/gpio/gpio-moxart.c     | 14 ++------------
>  drivers/gpio/gpio-mvebu.c      | 14 ++------------
>  drivers/gpio/gpio-tb10x.c      | 14 ++------------
>  drivers/gpio/gpio-tz1090-pdc.c | 14 ++------------
>  drivers/gpio/gpio-vf610.c      | 14 ++------------
>  6 files changed, 12 insertions(+), 72 deletions(-)
<snip>
> diff --git a/drivers/gpio/gpio-vf610.c b/drivers/gpio/gpio-vf610.c
> index 3d5714d..cf39fb2 100644
> --- a/drivers/gpio/gpio-vf610.c
> +++ b/drivers/gpio/gpio-vf610.c
> @@ -77,16 +77,6 @@ static inline u32 vf610_gpio_readl(void __iomem *reg)
>  	return readl_relaxed(reg);
>  }
>  
> -static int vf610_gpio_request(struct gpio_chip *chip, unsigned offset)
> -{
> -	return pinctrl_request_gpio(chip->base + offset);
> -}
> -
> -static void vf610_gpio_free(struct gpio_chip *chip, unsigned offset)
> -{
> -	pinctrl_free_gpio(chip->base + offset);
> -}
> -
>  static int vf610_gpio_get(struct gpio_chip *gc, unsigned int gpio)
>  {
>  	struct vf610_gpio_port *port =
> @@ -255,8 +245,8 @@ static int vf610_gpio_probe(struct platform_device *pdev)
>  	gc->ngpio = VF610_GPIO_PER_PORT;
>  	gc->base = of_alias_get_id(np, "gpio") * VF610_GPIO_PER_PORT;
>  
> -	gc->request = vf610_gpio_request;
> -	gc->free = vf610_gpio_free;
> +	gc->request = gpiochip_generic_request;
> +	gc->free = gpiochip_generic_free;
>  	gc->direction_input = vf610_gpio_direction_input;
>  	gc->get = vf610_gpio_get;
>  	gc->direction_output = vf610_gpio_direction_output;

For the vf610 changes,
Acked-by: Stefan Agner <stefan@agner.ch>

--
Stefan

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

* Re: [PATCH RFT 5/5] pinctrl: replace trivial implementations of gpio_chip request/free
  2015-09-13 13:21 ` [PATCH RFT 5/5] pinctrl: replace trivial implementations of gpio_chip request/free Jonas Gorski
                     ` (4 preceding siblings ...)
  2015-09-14 16:53   ` Andrew Bresticker
@ 2015-09-16 11:07   ` Baruch Siach
  2015-09-20 13:40   ` Matthias Brugger
                     ` (2 subsequent siblings)
  8 siblings, 0 replies; 23+ messages in thread
From: Baruch Siach @ 2015-09-16 11:07 UTC (permalink / raw)
  To: Jonas Gorski
  Cc: linux-gpio, Linus Walleij, Alexandre Courbot, Joachim Eastwood,
	Jonas Jensen, Gregory CLEMENT, Thomas Petazzoni, James Hogan,
	Stefan Agner, Jun Nie, Stephen Warren, Lee Jones, Eric Anholt,
	Mika Westerberg, Heikki Krogerus, Matthias Brugger,
	Alessandro Rubini, Sonic Zhang, Laxman Dewangan,
	Jean-Christophe Plagniol-Villard, Jonas Aaberg

Hi Jonas,

On Sun, Sep 13, 2015 at 03:21:38PM +0200, Jonas Gorski wrote:
> Replace all trivial request/free callbacks that do nothing but call into
> pinctrl code with the generic versions.
> 
> Signed-off-by: Jonas Gorski <jogo@openwrt.org>
> ---

[...]

>  drivers/pinctrl/pinctrl-digicolor.c           | 14 ++------------

For Digicolor:

Acked-by: Baruch Siach <baruch@tkos.co.il>

Thanks,
baruch

-- 
     http://baruch.siach.name/blog/                  ~. .~   Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
   - baruch@tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -

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

* Re: [PATCH RFT 2/5] gpio: replace trivial implementations of request/free with generic one
  2015-09-13 13:21 ` [PATCH RFT 2/5] gpio: replace trivial implementations of request/free with generic one Jonas Gorski
                     ` (2 preceding siblings ...)
  2015-09-15  3:32   ` Stefan Agner
@ 2015-09-20 13:16   ` Joachim Eastwood
  3 siblings, 0 replies; 23+ messages in thread
From: Joachim Eastwood @ 2015-09-20 13:16 UTC (permalink / raw)
  To: Jonas Gorski
  Cc: linux-gpio, Linus Walleij, Alexandre Courbot, Jonas Jensen,
	Gregory CLEMENT, Thomas Petazzoni, James Hogan, Stefan Agner,
	Jun Nie, Stephen Warren, Lee Jones, Eric Anholt, Mika Westerberg,
	Heikki Krogerus, Matthias Brugger, Alessandro Rubini, Sonic Zhang,
	Laxman Dewangan, Jean-Christophe Plagniol-Villard, Jonas Aaberg,
	Baruch Siach, Andrew Bresticker <abresti>

Hi Jonas,

On 13 September 2015 at 15:21, Jonas Gorski <jogo@openwrt.org> wrote:
> Replace all trivial request/free callbacks that do nothing but call into
> pinctrl code with the generic versions.
>
> Signed-off-by: Jonas Gorski <jogo@openwrt.org>
> ---
>  drivers/gpio/gpio-lpc18xx.c    | 14 ++------------
>  drivers/gpio/gpio-moxart.c     | 14 ++------------
>  drivers/gpio/gpio-mvebu.c      | 14 ++------------
>  drivers/gpio/gpio-tb10x.c      | 14 ++------------
>  drivers/gpio/gpio-tz1090-pdc.c | 14 ++------------
>  drivers/gpio/gpio-vf610.c      | 14 ++------------
>  6 files changed, 12 insertions(+), 72 deletions(-)
>
> diff --git a/drivers/gpio/gpio-lpc18xx.c b/drivers/gpio/gpio-lpc18xx.c
> index eb68603..e39dcb0 100644
> --- a/drivers/gpio/gpio-lpc18xx.c
> +++ b/drivers/gpio/gpio-lpc18xx.c
> @@ -36,16 +36,6 @@ static inline struct lpc18xx_gpio_chip *to_lpc18xx_gpio(struct gpio_chip *chip)
>         return container_of(chip, struct lpc18xx_gpio_chip, gpio);
>  }
>
> -static int lpc18xx_gpio_request(struct gpio_chip *chip, unsigned offset)
> -{
> -       return pinctrl_request_gpio(offset);
> -}
> -
> -static void lpc18xx_gpio_free(struct gpio_chip *chip, unsigned offset)
> -{
> -       pinctrl_free_gpio(offset);
> -}
> -
>  static void lpc18xx_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
>  {
>         struct lpc18xx_gpio_chip *gc = to_lpc18xx_gpio(chip);
> @@ -95,8 +85,8 @@ static int lpc18xx_gpio_direction_output(struct gpio_chip *chip,
>
>  static struct gpio_chip lpc18xx_chip = {
>         .label                  = "lpc18xx/43xx-gpio",
> -       .request                = lpc18xx_gpio_request,
> -       .free                   = lpc18xx_gpio_free,
> +       .request                = gpiochip_generic_request,
> +       .free                   = gpiochip_generic_free,
>         .direction_input        = lpc18xx_gpio_direction_input,
>         .direction_output       = lpc18xx_gpio_direction_output,
>         .set                    = lpc18xx_gpio_set,

For lpc18xx part:
Acked-by: Joachim Eastwood <manabian@gmail.com>

regards,
Joachim Eastwood

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

* Re: [PATCH RFT 5/5] pinctrl: replace trivial implementations of gpio_chip request/free
  2015-09-13 13:21 ` [PATCH RFT 5/5] pinctrl: replace trivial implementations of gpio_chip request/free Jonas Gorski
                     ` (5 preceding siblings ...)
  2015-09-16 11:07   ` Baruch Siach
@ 2015-09-20 13:40   ` Matthias Brugger
  2015-10-01 12:32   ` Lee Jones
  2015-10-05 10:37   ` Laxman Dewangan
  8 siblings, 0 replies; 23+ messages in thread
From: Matthias Brugger @ 2015-09-20 13:40 UTC (permalink / raw)
  To: Jonas Gorski
  Cc: linux-gpio, Linus Walleij, Alexandre Courbot, Joachim Eastwood,
	Jonas Jensen, Gregory CLEMENT, Thomas Petazzoni, James Hogan,
	Stefan Agner, Jun Nie, Stephen Warren, Lee Jones, Eric Anholt,
	Mika Westerberg, Heikki Krogerus, Alessandro Rubini, Sonic Zhang,
	Laxman Dewangan, Jean-Christophe Plagniol-Villard, Jonas Aaberg,
	Baruch Siach, Andrew Bresticker

On Sunday, September 13, 2015 03:21:38 PM Jonas Gorski wrote:
> Replace all trivial request/free callbacks that do nothing but call into
> pinctrl code with the generic versions.
> 
> Signed-off-by: Jonas Gorski <jogo@openwrt.org>
> ---
[...]
>  drivers/pinctrl/mediatek/pinctrl-mtk-common.c | 14 ++------------

For the Mediatek part:
Acked-by: Matthias Brugger <matthias.bgg@gmail.com>

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

* Re: [PATCH RFT 5/5] pinctrl: replace trivial implementations of gpio_chip request/free
  2015-09-13 13:21 ` [PATCH RFT 5/5] pinctrl: replace trivial implementations of gpio_chip request/free Jonas Gorski
                     ` (6 preceding siblings ...)
  2015-09-20 13:40   ` Matthias Brugger
@ 2015-10-01 12:32   ` Lee Jones
  2015-10-05 10:37   ` Laxman Dewangan
  8 siblings, 0 replies; 23+ messages in thread
From: Lee Jones @ 2015-10-01 12:32 UTC (permalink / raw)
  To: Jonas Gorski
  Cc: linux-gpio, Linus Walleij, Alexandre Courbot, Joachim Eastwood,
	Jonas Jensen, Gregory CLEMENT, Thomas Petazzoni, James Hogan,
	Stefan Agner, Jun Nie, Stephen Warren, Eric Anholt,
	Mika Westerberg, Heikki Krogerus, Matthias Brugger,
	Alessandro Rubini, Sonic Zhang, Laxman Dewangan,
	Jean-Christophe Plagniol-Villard, Jonas Aaberg, Baruch Siach,
	Andrew

On Sun, 13 Sep 2015, Jonas Gorski wrote:

> Replace all trivial request/free callbacks that do nothing but call into
> pinctrl code with the generic versions.
> 
> Signed-off-by: Jonas Gorski <jogo@openwrt.org>
> ---
>  drivers/pinctrl/bcm/pinctrl-bcm2835.c         | 14 ++------------

Acked-by: Lee Jones <lee@kernel.org>

>  drivers/pinctrl/intel/pinctrl-cherryview.c    | 14 ++------------
>  drivers/pinctrl/intel/pinctrl-intel.c         | 14 ++------------
>  drivers/pinctrl/mediatek/pinctrl-mtk-common.c | 14 ++------------
>  drivers/pinctrl/nomadik/pinctrl-abx500.c      | 18 ++----------------
>  drivers/pinctrl/nomadik/pinctrl-nomadik.c     | 22 ++--------------------
>  drivers/pinctrl/pinctrl-adi2.c                | 14 ++------------
>  drivers/pinctrl/pinctrl-as3722.c              | 14 ++------------
>  drivers/pinctrl/pinctrl-at91.c                | 26 ++------------------------
>  drivers/pinctrl/pinctrl-coh901.c              | 22 ++--------------------
>  drivers/pinctrl/pinctrl-digicolor.c           | 14 ++------------
>  drivers/pinctrl/pinctrl-pistachio.c           | 14 ++------------
>  drivers/pinctrl/pinctrl-rockchip.c            | 14 ++------------
>  drivers/pinctrl/pinctrl-st.c                  | 14 ++------------
>  drivers/pinctrl/pinctrl-xway.c                | 18 ++----------------
>  drivers/pinctrl/qcom/pinctrl-msm.c            | 16 ++--------------
>  drivers/pinctrl/qcom/pinctrl-spmi-gpio.c      | 14 ++------------
>  drivers/pinctrl/qcom/pinctrl-spmi-mpp.c       | 14 ++------------
>  drivers/pinctrl/samsung/pinctrl-samsung.c     | 14 ++------------
>  drivers/pinctrl/sunxi/pinctrl-sunxi.c         | 14 ++------------
>  drivers/pinctrl/vt8500/pinctrl-wmt.c          | 14 ++------------
>  21 files changed, 42 insertions(+), 290 deletions(-)
> 
> diff --git a/drivers/pinctrl/bcm/pinctrl-bcm2835.c b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
> index 8efa235..a1ea565 100644
> --- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
> +++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
> @@ -330,16 +330,6 @@ static inline void bcm2835_pinctrl_fsel_set(
>  	bcm2835_gpio_wr(pc, FSEL_REG(pin), val);
>  }
>  
> -static int bcm2835_gpio_request(struct gpio_chip *chip, unsigned offset)
> -{
> -	return pinctrl_request_gpio(chip->base + offset);
> -}
> -
> -static void bcm2835_gpio_free(struct gpio_chip *chip, unsigned offset)
> -{
> -	pinctrl_free_gpio(chip->base + offset);
> -}
> -
>  static int bcm2835_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
>  {
>  	return pinctrl_gpio_direction_input(chip->base + offset);
> @@ -375,8 +365,8 @@ static int bcm2835_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
>  static struct gpio_chip bcm2835_gpio_chip = {
>  	.label = MODULE_NAME,
>  	.owner = THIS_MODULE,
> -	.request = bcm2835_gpio_request,
> -	.free = bcm2835_gpio_free,
> +	.request = gpiochip_generic_request,
> +	.free = gpiochip_generic_free,
>  	.direction_input = bcm2835_gpio_direction_input,
>  	.direction_output = bcm2835_gpio_direction_output,
>  	.get = bcm2835_gpio_get,
> diff --git a/drivers/pinctrl/intel/pinctrl-cherryview.c b/drivers/pinctrl/intel/pinctrl-cherryview.c
> index 2d5d3dd..4270bfa 100644
> --- a/drivers/pinctrl/intel/pinctrl-cherryview.c
> +++ b/drivers/pinctrl/intel/pinctrl-cherryview.c
> @@ -1149,16 +1149,6 @@ static struct pinctrl_desc chv_pinctrl_desc = {
>  	.owner = THIS_MODULE,
>  };
>  
> -static int chv_gpio_request(struct gpio_chip *chip, unsigned offset)
> -{
> -	return pinctrl_request_gpio(chip->base + offset);
> -}
> -
> -static void chv_gpio_free(struct gpio_chip *chip, unsigned offset)
> -{
> -	pinctrl_free_gpio(chip->base + offset);
> -}
> -
>  static unsigned chv_gpio_offset_to_pin(struct chv_pinctrl *pctrl,
>  				       unsigned offset)
>  {
> @@ -1238,8 +1228,8 @@ static int chv_gpio_direction_output(struct gpio_chip *chip, unsigned offset,
>  
>  static const struct gpio_chip chv_gpio_chip = {
>  	.owner = THIS_MODULE,
> -	.request = chv_gpio_request,
> -	.free = chv_gpio_free,
> +	.request = gpiochip_generic_request,
> +	.free = gpiochip_generic_free,
>  	.get_direction = chv_gpio_get_direction,
>  	.direction_input = chv_gpio_direction_input,
>  	.direction_output = chv_gpio_direction_output,
> diff --git a/drivers/pinctrl/intel/pinctrl-intel.c b/drivers/pinctrl/intel/pinctrl-intel.c
> index bb377c1..3371820 100644
> --- a/drivers/pinctrl/intel/pinctrl-intel.c
> +++ b/drivers/pinctrl/intel/pinctrl-intel.c
> @@ -597,16 +597,6 @@ static const struct pinctrl_desc intel_pinctrl_desc = {
>  	.owner = THIS_MODULE,
>  };
>  
> -static int intel_gpio_request(struct gpio_chip *chip, unsigned offset)
> -{
> -	return pinctrl_request_gpio(chip->base + offset);
> -}
> -
> -static void intel_gpio_free(struct gpio_chip *chip, unsigned offset)
> -{
> -	pinctrl_free_gpio(chip->base + offset);
> -}
> -
>  static int intel_gpio_get(struct gpio_chip *chip, unsigned offset)
>  {
>  	struct intel_pinctrl *pctrl = gpiochip_to_pinctrl(chip);
> @@ -654,8 +644,8 @@ static int intel_gpio_direction_output(struct gpio_chip *chip, unsigned offset,
>  
>  static const struct gpio_chip intel_gpio_chip = {
>  	.owner = THIS_MODULE,
> -	.request = intel_gpio_request,
> -	.free = intel_gpio_free,
> +	.request = gpiochip_generic_request,
> +	.free = gpiochip_generic_free,
>  	.direction_input = intel_gpio_direction_input,
>  	.direction_output = intel_gpio_direction_output,
>  	.get = intel_gpio_get,
> diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
> index 7726c6c..6e75a3f 100644
> --- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
> +++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
> @@ -723,16 +723,6 @@ static const struct pinmux_ops mtk_pmx_ops = {
>  	.gpio_set_direction	= mtk_pmx_gpio_set_direction,
>  };
>  
> -static int mtk_gpio_request(struct gpio_chip *chip, unsigned offset)
> -{
> -	return pinctrl_request_gpio(chip->base + offset);
> -}
> -
> -static void mtk_gpio_free(struct gpio_chip *chip, unsigned offset)
> -{
> -	pinctrl_free_gpio(chip->base + offset);
> -}
> -
>  static int mtk_gpio_direction_input(struct gpio_chip *chip,
>  					unsigned offset)
>  {
> @@ -1005,8 +995,8 @@ static int mtk_gpio_set_debounce(struct gpio_chip *chip, unsigned offset,
>  
>  static struct gpio_chip mtk_gpio_chip = {
>  	.owner			= THIS_MODULE,
> -	.request		= mtk_gpio_request,
> -	.free			= mtk_gpio_free,
> +	.request		= gpiochip_generic_request,
> +	.free			= gpiochip_generic_free,
>  	.direction_input	= mtk_gpio_direction_input,
>  	.direction_output	= mtk_gpio_direction_output,
>  	.get			= mtk_gpio_get,
> diff --git a/drivers/pinctrl/nomadik/pinctrl-abx500.c b/drivers/pinctrl/nomadik/pinctrl-abx500.c
> index 97681fa..b59fbb4 100644
> --- a/drivers/pinctrl/nomadik/pinctrl-abx500.c
> +++ b/drivers/pinctrl/nomadik/pinctrl-abx500.c
> @@ -654,25 +654,11 @@ static inline void abx500_gpio_dbg_show_one(struct seq_file *s,
>  #define abx500_gpio_dbg_show	NULL
>  #endif
>  
> -static int abx500_gpio_request(struct gpio_chip *chip, unsigned offset)
> -{
> -	int gpio = chip->base + offset;
> -
> -	return pinctrl_request_gpio(gpio);
> -}
> -
> -static void abx500_gpio_free(struct gpio_chip *chip, unsigned offset)
> -{
> -	int gpio = chip->base + offset;
> -
> -	pinctrl_free_gpio(gpio);
> -}
> -
>  static struct gpio_chip abx500gpio_chip = {
>  	.label			= "abx500-gpio",
>  	.owner			= THIS_MODULE,
> -	.request		= abx500_gpio_request,
> -	.free			= abx500_gpio_free,
> +	.request		= gpiochip_generic_request,
> +	.free			= gpiochip_generic_free,
>  	.direction_input	= abx500_gpio_direction_input,
>  	.get			= abx500_gpio_get,
>  	.direction_output	= abx500_gpio_direction_output,
> diff --git a/drivers/pinctrl/nomadik/pinctrl-nomadik.c b/drivers/pinctrl/nomadik/pinctrl-nomadik.c
> index 352ede1..6a25bd8 100644
> --- a/drivers/pinctrl/nomadik/pinctrl-nomadik.c
> +++ b/drivers/pinctrl/nomadik/pinctrl-nomadik.c
> @@ -884,24 +884,6 @@ static void nmk_gpio_latent_irq_handler(unsigned int irq, struct irq_desc *desc)
>  
>  /* I/O Functions */
>  
> -static int nmk_gpio_request(struct gpio_chip *chip, unsigned offset)
> -{
> -	/*
> -	 * Map back to global GPIO space and request muxing, the direction
> -	 * parameter does not matter for this controller.
> -	 */
> -	int gpio = chip->base + offset;
> -
> -	return pinctrl_request_gpio(gpio);
> -}
> -
> -static void nmk_gpio_free(struct gpio_chip *chip, unsigned offset)
> -{
> -	int gpio = chip->base + offset;
> -
> -	pinctrl_free_gpio(gpio);
> -}
> -
>  static int nmk_gpio_make_input(struct gpio_chip *chip, unsigned offset)
>  {
>  	struct nmk_gpio_chip *nmk_chip =
> @@ -1267,8 +1249,8 @@ static int nmk_gpio_probe(struct platform_device *dev)
>  	spin_lock_init(&nmk_chip->lock);
>  
>  	chip = &nmk_chip->chip;
> -	chip->request = nmk_gpio_request;
> -	chip->free = nmk_gpio_free;
> +	chip->request = gpiochip_generic_request;
> +	chip->free = gpiochip_generic_free;
>  	chip->direction_input = nmk_gpio_make_input;
>  	chip->get = nmk_gpio_get_input;
>  	chip->direction_output = nmk_gpio_make_output;
> diff --git a/drivers/pinctrl/pinctrl-adi2.c b/drivers/pinctrl/pinctrl-adi2.c
> index a5976eb..3d9af69 100644
> --- a/drivers/pinctrl/pinctrl-adi2.c
> +++ b/drivers/pinctrl/pinctrl-adi2.c
> @@ -714,16 +714,6 @@ static struct pinctrl_desc adi_pinmux_desc = {
>  	.owner = THIS_MODULE,
>  };
>  
> -static int adi_gpio_request(struct gpio_chip *chip, unsigned offset)
> -{
> -	return pinctrl_request_gpio(chip->base + offset);
> -}
> -
> -static void adi_gpio_free(struct gpio_chip *chip, unsigned offset)
> -{
> -	pinctrl_free_gpio(chip->base + offset);
> -}
> -
>  static int adi_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
>  {
>  	struct gpio_port *port;
> @@ -995,8 +985,8 @@ static int adi_gpio_probe(struct platform_device *pdev)
>  	port->chip.get			= adi_gpio_get_value;
>  	port->chip.direction_output	= adi_gpio_direction_output;
>  	port->chip.set			= adi_gpio_set_value;
> -	port->chip.request		= adi_gpio_request;
> -	port->chip.free			= adi_gpio_free;
> +	port->chip.request		= gpiochip_generic_request,
> +	port->chip.free			= gpiochip_generic_free,
>  	port->chip.to_irq		= adi_gpio_to_irq;
>  	if (pdata->port_gpio_base > 0)
>  		port->chip.base		= pdata->port_gpio_base;
> diff --git a/drivers/pinctrl/pinctrl-as3722.c b/drivers/pinctrl/pinctrl-as3722.c
> index 4747e08..56af28b 100644
> --- a/drivers/pinctrl/pinctrl-as3722.c
> +++ b/drivers/pinctrl/pinctrl-as3722.c
> @@ -536,21 +536,11 @@ static int as3722_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
>  	return as3722_irq_get_virq(as_pci->as3722, offset);
>  }
>  
> -static int as3722_gpio_request(struct gpio_chip *chip, unsigned offset)
> -{
> -	return pinctrl_request_gpio(chip->base + offset);
> -}
> -
> -static void as3722_gpio_free(struct gpio_chip *chip, unsigned offset)
> -{
> -	pinctrl_free_gpio(chip->base + offset);
> -}
> -
>  static const struct gpio_chip as3722_gpio_chip = {
>  	.label			= "as3722-gpio",
>  	.owner			= THIS_MODULE,
> -	.request		= as3722_gpio_request,
> -	.free			= as3722_gpio_free,
> +	.request		= gpiochip_generic_request,
> +	.free			= gpiochip_generic_free,
>  	.get			= as3722_gpio_get,
>  	.set			= as3722_gpio_set,
>  	.direction_input	= as3722_gpio_direction_input,
> diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c
> index bae0012..5d8aede 100644
> --- a/drivers/pinctrl/pinctrl-at91.c
> +++ b/drivers/pinctrl/pinctrl-at91.c
> @@ -1277,28 +1277,6 @@ static int at91_pinctrl_remove(struct platform_device *pdev)
>  	return 0;
>  }
>  
> -static int at91_gpio_request(struct gpio_chip *chip, unsigned offset)
> -{
> -	/*
> -	 * Map back to global GPIO space and request muxing, the direction
> -	 * parameter does not matter for this controller.
> -	 */
> -	int gpio = chip->base + offset;
> -	int bank = chip->base / chip->ngpio;
> -
> -	dev_dbg(chip->dev, "%s:%d pio%c%d(%d)\n", __func__, __LINE__,
> -		 'A' + bank, offset, gpio);
> -
> -	return pinctrl_request_gpio(gpio);
> -}
> -
> -static void at91_gpio_free(struct gpio_chip *chip, unsigned offset)
> -{
> -	int gpio = chip->base + offset;
> -
> -	pinctrl_free_gpio(gpio);
> -}
> -
>  static int at91_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
>  {
>  	struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip);
> @@ -1684,8 +1662,8 @@ static int at91_gpio_of_irq_setup(struct platform_device *pdev,
>  
>  /* This structure is replicated for each GPIO block allocated at probe time */
>  static struct gpio_chip at91_gpio_template = {
> -	.request		= at91_gpio_request,
> -	.free			= at91_gpio_free,
> +	.request		= gpiochip_generic_request,
> +	.free			= gpiochip_generic_free,
>  	.get_direction		= at91_gpio_get_direction,
>  	.direction_input	= at91_gpio_direction_input,
>  	.get			= at91_gpio_get,
> diff --git a/drivers/pinctrl/pinctrl-coh901.c b/drivers/pinctrl/pinctrl-coh901.c
> index 3731cc6..6db1788 100644
> --- a/drivers/pinctrl/pinctrl-coh901.c
> +++ b/drivers/pinctrl/pinctrl-coh901.c
> @@ -217,24 +217,6 @@ static inline struct u300_gpio *to_u300_gpio(struct gpio_chip *chip)
>  	return container_of(chip, struct u300_gpio, chip);
>  }
>  
> -static int u300_gpio_request(struct gpio_chip *chip, unsigned offset)
> -{
> -	/*
> -	 * Map back to global GPIO space and request muxing, the direction
> -	 * parameter does not matter for this controller.
> -	 */
> -	int gpio = chip->base + offset;
> -
> -	return pinctrl_request_gpio(gpio);
> -}
> -
> -static void u300_gpio_free(struct gpio_chip *chip, unsigned offset)
> -{
> -	int gpio = chip->base + offset;
> -
> -	pinctrl_free_gpio(gpio);
> -}
> -
>  static int u300_gpio_get(struct gpio_chip *chip, unsigned offset)
>  {
>  	struct u300_gpio *gpio = to_u300_gpio(chip);
> @@ -417,8 +399,8 @@ int u300_gpio_config_set(struct gpio_chip *chip, unsigned offset,
>  static struct gpio_chip u300_gpio_chip = {
>  	.label			= "u300-gpio-chip",
>  	.owner			= THIS_MODULE,
> -	.request		= u300_gpio_request,
> -	.free			= u300_gpio_free,
> +	.request		= gpiochip_generic_request,
> +	.free			= gpiochip_generic_free,
>  	.get			= u300_gpio_get,
>  	.set			= u300_gpio_set,
>  	.direction_input	= u300_gpio_direction_input,
> diff --git a/drivers/pinctrl/pinctrl-digicolor.c b/drivers/pinctrl/pinctrl-digicolor.c
> index 461fffc..df885958 100644
> --- a/drivers/pinctrl/pinctrl-digicolor.c
> +++ b/drivers/pinctrl/pinctrl-digicolor.c
> @@ -169,16 +169,6 @@ static struct pinmux_ops dc_pmxops = {
>  	.gpio_request_enable	= dc_pmx_request_gpio,
>  };
>  
> -static int dc_gpio_request(struct gpio_chip *chip, unsigned gpio)
> -{
> -	return pinctrl_request_gpio(chip->base + gpio);
> -}
> -
> -static void dc_gpio_free(struct gpio_chip *chip, unsigned gpio)
> -{
> -	pinctrl_free_gpio(chip->base + gpio);
> -}
> -
>  static int dc_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)
>  {
>  	struct dc_pinmap *pmap = container_of(chip, struct dc_pinmap, chip);
> @@ -255,8 +245,8 @@ static int dc_gpiochip_add(struct dc_pinmap *pmap, struct device_node *np)
>  
>  	chip->label		= DRIVER_NAME;
>  	chip->dev		= pmap->dev;
> -	chip->request		= dc_gpio_request;
> -	chip->free		= dc_gpio_free;
> +	chip->request		= gpiochip_generic_request;
> +	chip->free		= gpiochip_generic_free;
>  	chip->direction_input	= dc_gpio_direction_input;
>  	chip->direction_output	= dc_gpio_direction_output;
>  	chip->get		= dc_gpio_get;
> diff --git a/drivers/pinctrl/pinctrl-pistachio.c b/drivers/pinctrl/pinctrl-pistachio.c
> index 3dc2ae1..a599b5c 100644
> --- a/drivers/pinctrl/pinctrl-pistachio.c
> +++ b/drivers/pinctrl/pinctrl-pistachio.c
> @@ -1171,16 +1171,6 @@ static struct pinctrl_desc pistachio_pinctrl_desc = {
>  	.confops = &pistachio_pinconf_ops,
>  };
>  
> -static int pistachio_gpio_request(struct gpio_chip *chip, unsigned offset)
> -{
> -	return pinctrl_request_gpio(chip->base + offset);
> -}
> -
> -static void pistachio_gpio_free(struct gpio_chip *chip, unsigned offset)
> -{
> -	pinctrl_free_gpio(chip->base + offset);
> -}
> -
>  static int pistachio_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
>  {
>  	struct pistachio_gpio_bank *bank = gc_to_bank(chip);
> @@ -1334,8 +1324,8 @@ static void pistachio_gpio_irq_handler(unsigned int __irq,
>  		.npins = _npins,					\
>  		.gpio_chip = {						\
>  			.label = "GPIO" #_bank,				\
> -			.request = pistachio_gpio_request,		\
> -			.free = pistachio_gpio_free,			\
> +			.request = gpiochip_generic_request,		\
> +			.free = gpiochip_generic_free,			\
>  			.get_direction = pistachio_gpio_get_direction,	\
>  			.direction_input = pistachio_gpio_direction_input, \
>  			.direction_output = pistachio_gpio_direction_output, \
> diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
> index c5246c0..89a6ad8e 100644
> --- a/drivers/pinctrl/pinctrl-rockchip.c
> +++ b/drivers/pinctrl/pinctrl-rockchip.c
> @@ -1374,16 +1374,6 @@ static int rockchip_pinctrl_register(struct platform_device *pdev,
>   * GPIO handling
>   */
>  
> -static int rockchip_gpio_request(struct gpio_chip *chip, unsigned offset)
> -{
> -	return pinctrl_request_gpio(chip->base + offset);
> -}
> -
> -static void rockchip_gpio_free(struct gpio_chip *chip, unsigned offset)
> -{
> -	pinctrl_free_gpio(chip->base + offset);
> -}
> -
>  static void rockchip_gpio_set(struct gpio_chip *gc, unsigned offset, int value)
>  {
>  	struct rockchip_pin_bank *bank = gc_to_pin_bank(gc);
> @@ -1461,8 +1451,8 @@ static int rockchip_gpio_to_irq(struct gpio_chip *gc, unsigned offset)
>  }
>  
>  static const struct gpio_chip rockchip_gpiolib_chip = {
> -	.request = rockchip_gpio_request,
> -	.free = rockchip_gpio_free,
> +	.request = gpiochip_generic_request,
> +	.free = gpiochip_generic_free,
>  	.set = rockchip_gpio_set,
>  	.get = rockchip_gpio_get,
>  	.direction_input = rockchip_gpio_direction_input,
> diff --git a/drivers/pinctrl/pinctrl-st.c b/drivers/pinctrl/pinctrl-st.c
> index f8338d2..fa49e31 100644
> --- a/drivers/pinctrl/pinctrl-st.c
> +++ b/drivers/pinctrl/pinctrl-st.c
> @@ -742,16 +742,6 @@ static void st_gpio_direction(struct st_gpio_bank *bank,
>  	}
>  }
>  
> -static int st_gpio_request(struct gpio_chip *chip, unsigned offset)
> -{
> -	return pinctrl_request_gpio(chip->base + offset);
> -}
> -
> -static void st_gpio_free(struct gpio_chip *chip, unsigned offset)
> -{
> -	pinctrl_free_gpio(chip->base + offset);
> -}
> -
>  static int st_gpio_get(struct gpio_chip *chip, unsigned offset)
>  {
>  	struct st_gpio_bank *bank = gpio_chip_to_bank(chip);
> @@ -1490,8 +1480,8 @@ static void st_gpio_irqmux_handler(unsigned irq, struct irq_desc *desc)
>  }
>  
>  static struct gpio_chip st_gpio_template = {
> -	.request		= st_gpio_request,
> -	.free			= st_gpio_free,
> +	.request		= gpiochip_generic_request,
> +	.free			= gpiochip_generic_free,
>  	.get			= st_gpio_get,
>  	.set			= st_gpio_set,
>  	.direction_input	= st_gpio_direction_input,
> diff --git a/drivers/pinctrl/pinctrl-xway.c b/drivers/pinctrl/pinctrl-xway.c
> index 779950c..ae724bd 100644
> --- a/drivers/pinctrl/pinctrl-xway.c
> +++ b/drivers/pinctrl/pinctrl-xway.c
> @@ -682,28 +682,14 @@ static int xway_gpio_dir_out(struct gpio_chip *chip, unsigned int pin, int val)
>  	return 0;
>  }
>  
> -static int xway_gpio_req(struct gpio_chip *chip, unsigned offset)
> -{
> -	int gpio = chip->base + offset;
> -
> -	return pinctrl_request_gpio(gpio);
> -}
> -
> -static void xway_gpio_free(struct gpio_chip *chip, unsigned offset)
> -{
> -	int gpio = chip->base + offset;
> -
> -	pinctrl_free_gpio(gpio);
> -}
> -
>  static struct gpio_chip xway_chip = {
>  	.label = "gpio-xway",
>  	.direction_input = xway_gpio_dir_in,
>  	.direction_output = xway_gpio_dir_out,
>  	.get = xway_gpio_get,
>  	.set = xway_gpio_set,
> -	.request = xway_gpio_req,
> -	.free = xway_gpio_free,
> +	.request = gpiochip_generic_request,
> +	.free = gpiochip_generic_free,
>  	.base = -1,
>  };
>  
> diff --git a/drivers/pinctrl/qcom/pinctrl-msm.c b/drivers/pinctrl/qcom/pinctrl-msm.c
> index 492cdd5..1d3dcb4 100644
> --- a/drivers/pinctrl/qcom/pinctrl-msm.c
> +++ b/drivers/pinctrl/qcom/pinctrl-msm.c
> @@ -458,18 +458,6 @@ static void msm_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
>  	spin_unlock_irqrestore(&pctrl->lock, flags);
>  }
>  
> -static int msm_gpio_request(struct gpio_chip *chip, unsigned offset)
> -{
> -	int gpio = chip->base + offset;
> -	return pinctrl_request_gpio(gpio);
> -}
> -
> -static void msm_gpio_free(struct gpio_chip *chip, unsigned offset)
> -{
> -	int gpio = chip->base + offset;
> -	return pinctrl_free_gpio(gpio);
> -}
> -
>  #ifdef CONFIG_DEBUG_FS
>  #include <linux/seq_file.h>
>  
> @@ -527,8 +515,8 @@ static struct gpio_chip msm_gpio_template = {
>  	.direction_output = msm_gpio_direction_output,
>  	.get              = msm_gpio_get,
>  	.set              = msm_gpio_set,
> -	.request          = msm_gpio_request,
> -	.free             = msm_gpio_free,
> +	.request          = gpiochip_generic_request,
> +	.free             = gpiochip_generic_free,
>  	.dbg_show         = msm_gpio_dbg_show,
>  };
>  
> diff --git a/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c b/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c
> index bd1e245..6c42ca1 100644
> --- a/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c
> +++ b/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c
> @@ -546,16 +546,6 @@ static void pmic_gpio_set(struct gpio_chip *chip, unsigned pin, int value)
>  	pmic_gpio_config_set(state->ctrl, pin, &config, 1);
>  }
>  
> -static int pmic_gpio_request(struct gpio_chip *chip, unsigned base)
> -{
> -	return pinctrl_request_gpio(chip->base + base);
> -}
> -
> -static void pmic_gpio_free(struct gpio_chip *chip, unsigned base)
> -{
> -	pinctrl_free_gpio(chip->base + base);
> -}
> -
>  static int pmic_gpio_of_xlate(struct gpio_chip *chip,
>  			      const struct of_phandle_args *gpio_desc,
>  			      u32 *flags)
> @@ -595,8 +585,8 @@ static const struct gpio_chip pmic_gpio_gpio_template = {
>  	.direction_output	= pmic_gpio_direction_output,
>  	.get			= pmic_gpio_get,
>  	.set			= pmic_gpio_set,
> -	.request		= pmic_gpio_request,
> -	.free			= pmic_gpio_free,
> +	.request		= gpiochip_generic_request,
> +	.free			= gpiochip_generic_free,
>  	.of_xlate		= pmic_gpio_of_xlate,
>  	.to_irq			= pmic_gpio_to_irq,
>  	.dbg_show		= pmic_gpio_dbg_show,
> diff --git a/drivers/pinctrl/qcom/pinctrl-spmi-mpp.c b/drivers/pinctrl/qcom/pinctrl-spmi-mpp.c
> index e3be3ce..9ce0e30 100644
> --- a/drivers/pinctrl/qcom/pinctrl-spmi-mpp.c
> +++ b/drivers/pinctrl/qcom/pinctrl-spmi-mpp.c
> @@ -604,16 +604,6 @@ static void pmic_mpp_set(struct gpio_chip *chip, unsigned pin, int value)
>  	pmic_mpp_config_set(state->ctrl, pin, &config, 1);
>  }
>  
> -static int pmic_mpp_request(struct gpio_chip *chip, unsigned base)
> -{
> -	return pinctrl_request_gpio(chip->base + base);
> -}
> -
> -static void pmic_mpp_free(struct gpio_chip *chip, unsigned base)
> -{
> -	pinctrl_free_gpio(chip->base + base);
> -}
> -
>  static int pmic_mpp_of_xlate(struct gpio_chip *chip,
>  			     const struct of_phandle_args *gpio_desc,
>  			     u32 *flags)
> @@ -653,8 +643,8 @@ static const struct gpio_chip pmic_mpp_gpio_template = {
>  	.direction_output	= pmic_mpp_direction_output,
>  	.get			= pmic_mpp_get,
>  	.set			= pmic_mpp_set,
> -	.request		= pmic_mpp_request,
> -	.free			= pmic_mpp_free,
> +	.request		= gpiochip_generic_request,
> +	.free			= gpiochip_generic_free,
>  	.of_xlate		= pmic_mpp_of_xlate,
>  	.to_irq			= pmic_mpp_to_irq,
>  	.dbg_show		= pmic_mpp_dbg_show,
> diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.c b/drivers/pinctrl/samsung/pinctrl-samsung.c
> index c760bf4..3f622cc 100644
> --- a/drivers/pinctrl/samsung/pinctrl-samsung.c
> +++ b/drivers/pinctrl/samsung/pinctrl-samsung.c
> @@ -888,19 +888,9 @@ static int samsung_pinctrl_register(struct platform_device *pdev,
>  	return 0;
>  }
>  
> -static int samsung_gpio_request(struct gpio_chip *chip, unsigned offset)
> -{
> -	return pinctrl_request_gpio(chip->base + offset);
> -}
> -
> -static void samsung_gpio_free(struct gpio_chip *chip, unsigned offset)
> -{
> -	pinctrl_free_gpio(chip->base + offset);
> -}
> -
>  static const struct gpio_chip samsung_gpiolib_chip = {
> -	.request = samsung_gpio_request,
> -	.free = samsung_gpio_free,
> +	.request = gpiochip_generic_request,
> +	.free = gpiochip_generic_free,
>  	.set = samsung_gpio_set,
>  	.get = samsung_gpio_get,
>  	.direction_input = samsung_gpio_direction_input,
> diff --git a/drivers/pinctrl/sunxi/pinctrl-sunxi.c b/drivers/pinctrl/sunxi/pinctrl-sunxi.c
> index fb4669c0..c98ae05 100644
> --- a/drivers/pinctrl/sunxi/pinctrl-sunxi.c
> +++ b/drivers/pinctrl/sunxi/pinctrl-sunxi.c
> @@ -446,16 +446,6 @@ static const struct pinmux_ops sunxi_pmx_ops = {
>  	.gpio_set_direction	= sunxi_pmx_gpio_set_direction,
>  };
>  
> -static int sunxi_pinctrl_gpio_request(struct gpio_chip *chip, unsigned offset)
> -{
> -	return pinctrl_request_gpio(chip->base + offset);
> -}
> -
> -static void sunxi_pinctrl_gpio_free(struct gpio_chip *chip, unsigned offset)
> -{
> -	pinctrl_free_gpio(chip->base + offset);
> -}
> -
>  static int sunxi_pinctrl_gpio_direction_input(struct gpio_chip *chip,
>  					unsigned offset)
>  {
> @@ -958,8 +948,8 @@ int sunxi_pinctrl_init(struct platform_device *pdev,
>  
>  	last_pin = pctl->desc->pins[pctl->desc->npins - 1].pin.number;
>  	pctl->chip->owner = THIS_MODULE;
> -	pctl->chip->request = sunxi_pinctrl_gpio_request,
> -	pctl->chip->free = sunxi_pinctrl_gpio_free,
> +	pctl->chip->request = gpiochip_generic_request,
> +	pctl->chip->free = gpiochip_generic_free,
>  	pctl->chip->direction_input = sunxi_pinctrl_gpio_direction_input,
>  	pctl->chip->direction_output = sunxi_pinctrl_gpio_direction_output,
>  	pctl->chip->get = sunxi_pinctrl_gpio_get,
> diff --git a/drivers/pinctrl/vt8500/pinctrl-wmt.c b/drivers/pinctrl/vt8500/pinctrl-wmt.c
> index c15316b..fb22d3f 100644
> --- a/drivers/pinctrl/vt8500/pinctrl-wmt.c
> +++ b/drivers/pinctrl/vt8500/pinctrl-wmt.c
> @@ -486,16 +486,6 @@ static struct pinctrl_desc wmt_desc = {
>  	.confops = &wmt_pinconf_ops,
>  };
>  
> -static int wmt_gpio_request(struct gpio_chip *chip, unsigned offset)
> -{
> -	return pinctrl_request_gpio(chip->base + offset);
> -}
> -
> -static void wmt_gpio_free(struct gpio_chip *chip, unsigned offset)
> -{
> -	pinctrl_free_gpio(chip->base + offset);
> -}
> -
>  static int wmt_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
>  {
>  	struct wmt_pinctrl_data *data = dev_get_drvdata(chip->dev);
> @@ -560,8 +550,8 @@ static int wmt_gpio_direction_output(struct gpio_chip *chip, unsigned offset,
>  static struct gpio_chip wmt_gpio_chip = {
>  	.label = "gpio-wmt",
>  	.owner = THIS_MODULE,
> -	.request = wmt_gpio_request,
> -	.free = wmt_gpio_free,
> +	.request = gpiochip_generic_request,
> +	.free = gpiochip_generic_free,
>  	.get_direction = wmt_gpio_get_direction,
>  	.direction_input = wmt_gpio_direction_input,
>  	.direction_output = wmt_gpio_direction_output,

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

* Re: [PATCH RFT 1/5] gpiolib: provide generic request/free implementations
  2015-09-13 13:21 ` [PATCH RFT 1/5] gpiolib: provide generic request/free implementations Jonas Gorski
@ 2015-10-05  9:17   ` Linus Walleij
  0 siblings, 0 replies; 23+ messages in thread
From: Linus Walleij @ 2015-10-05  9:17 UTC (permalink / raw)
  To: Jonas Gorski
  Cc: linux-gpio@vger.kernel.org, Alexandre Courbot, Joachim Eastwood,
	Jonas Jensen, Gregory CLEMENT, Thomas Petazzoni, James Hogan,
	Stefan Agner, Jun Nie, Stephen Warren, Lee Jones, Eric Anholt,
	Mika Westerberg, Heikki Krogerus, Matthias Brugger,
	Alessandro Rubini, Sonic Zhang, Laxman Dewangan,
	Jean-Christophe Plagniol-Villard, Jonas Aaberg, Baruch Siach

On Sun, Sep 13, 2015 at 3:21 PM, Jonas Gorski <jogo@openwrt.org> wrote:

> Provide generic request/free implementations that pinctrl aware gpio
> drivers can use instead of open coding if they use a 1:1 pin to gpio
> signal mapping.
>
> Signed-off-by: Jonas Gorski <jogo@openwrt.org>

Hm. Is this really generic? Well I guess of more and more
SoC's get pin controllers in front of their GPIOs then yes. But
for an off-chip GPIO expander this is not really "generic".

> +/**
> + * gpiochip_generic_request() - request the gpio function for a pin
> + * @chip: the gpiochip owning the GPIO
> + * @gpio: the GPIO signal to request for GPIO function
> + */
> +int gpiochip_generic_request(struct gpio_chip *chip, unsigned gpio)

Second argument should be named "offset", "gpio" is ambigous
someone could think it's the global GPIO number.

Please collect the various ACKs and I will apply the patch series.

I have another comment which will be more of a discussion and
possible further improvement.

Yours,
Linus Walleij

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

* Re: [PATCH RFT 4/5] gpio: gpio-pl061: use the generic request/free implementations
  2015-09-13 13:21 ` [PATCH RFT 4/5] gpio: gpio-pl061: " Jonas Gorski
@ 2015-10-05  9:19   ` Linus Walleij
  2015-10-05 13:12     ` Jonas Gorski
  0 siblings, 1 reply; 23+ messages in thread
From: Linus Walleij @ 2015-10-05  9:19 UTC (permalink / raw)
  To: Jonas Gorski
  Cc: linux-gpio@vger.kernel.org, Alexandre Courbot, Joachim Eastwood,
	Jonas Jensen, Gregory CLEMENT, Thomas Petazzoni, James Hogan,
	Stefan Agner, Jun Nie, Stephen Warren, Lee Jones, Eric Anholt,
	Mika Westerberg, Heikki Krogerus, Matthias Brugger,
	Alessandro Rubini, Sonic Zhang, Laxman Dewangan,
	Jean-Christophe Plagniol-Villard, Jonas Aaberg, Baruch Siach

On Sun, Sep 13, 2015 at 3:21 PM, Jonas Gorski <jogo@openwrt.org> wrote:

>         spin_lock_init(&chip->lock);
> -       if (of_property_read_bool(dev->of_node, "gpio-ranges"))
> -               chip->uses_pinctrl = true;
> +       if (of_property_read_bool(dev->of_node, "gpio-ranges")) {
> +               chip->gc.request = gpiochip_generic_request;
> +               chip->gc.free = gpiochip_generic_free;
> +       }

This is way better.

But now this code is starting to multiply in drivers.

Can we think of a way to do this even more generic:
could gpiochip_generic_request() check if the range is
there instead?

Yours,
Linus Walleij

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

* Re: [PATCH RFT 5/5] pinctrl: replace trivial implementations of gpio_chip request/free
  2015-09-13 13:21 ` [PATCH RFT 5/5] pinctrl: replace trivial implementations of gpio_chip request/free Jonas Gorski
                     ` (7 preceding siblings ...)
  2015-10-01 12:32   ` Lee Jones
@ 2015-10-05 10:37   ` Laxman Dewangan
  8 siblings, 0 replies; 23+ messages in thread
From: Laxman Dewangan @ 2015-10-05 10:37 UTC (permalink / raw)
  To: Jonas Gorski, linux-gpio
  Cc: Linus Walleij, Alexandre Courbot, Joachim Eastwood, Jonas Jensen,
	Gregory CLEMENT, Thomas Petazzoni, James Hogan, Stefan Agner,
	Jun Nie, Stephen Warren, Lee Jones, Eric Anholt, Mika Westerberg,
	Heikki Krogerus, Matthias Brugger, Alessandro Rubini, Sonic Zhang,
	Jean-Christophe Plagniol-Villard, Jonas Aaberg, Baruch Siach,
	Andrew Bresticker, Heiko 


On Sunday 13 September 2015 06:51 PM, Jonas Gorski wrote:
> Replace all trivial request/free callbacks that do nothing but call into
> pinctrl code with the generic versions.
For drivers/pinctrl/pinctrl-as3722.c | 14 ++------------


Acked-by: Laxman Dewangan <ldewangan@nvidia.com>

-----------------------------------------------------------------------------------
This email message is for the sole use of the intended recipient(s) and may contain
confidential information.  Any unauthorized review, use, disclosure or distribution
is prohibited.  If you are not the intended recipient, please contact the sender by
reply email and destroy all copies of the original message.
-----------------------------------------------------------------------------------

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

* Re: [PATCH RFT 4/5] gpio: gpio-pl061: use the generic request/free implementations
  2015-10-05  9:19   ` Linus Walleij
@ 2015-10-05 13:12     ` Jonas Gorski
  2015-10-06  7:23       ` Linus Walleij
  0 siblings, 1 reply; 23+ messages in thread
From: Jonas Gorski @ 2015-10-05 13:12 UTC (permalink / raw)
  To: Linus Walleij
  Cc: linux-gpio@vger.kernel.org, Alexandre Courbot, Joachim Eastwood,
	Jonas Jensen, Gregory CLEMENT, Thomas Petazzoni, James Hogan,
	Stefan Agner, Jun Nie, Stephen Warren, Lee Jones, Eric Anholt,
	Mika Westerberg, Heikki Krogerus, Matthias Brugger,
	Alessandro Rubini, Sonic Zhang, Laxman Dewangan,
	Jean-Christophe Plagniol-Villard, Baruch Siach, Andrew Bresticker

On 05.10.2015 11:19, Linus Walleij wrote:
> On Sun, Sep 13, 2015 at 3:21 PM, Jonas Gorski <jogo@openwrt.org> wrote:
> 
>>         spin_lock_init(&chip->lock);
>> -       if (of_property_read_bool(dev->of_node, "gpio-ranges"))
>> -               chip->uses_pinctrl = true;
>> +       if (of_property_read_bool(dev->of_node, "gpio-ranges")) {
>> +               chip->gc.request = gpiochip_generic_request;
>> +               chip->gc.free = gpiochip_generic_free;
>> +       }
> 
> This is way better.
> 
> But now this code is starting to multiply in drivers.
> 
> Can we think of a way to do this even more generic:
> could gpiochip_generic_request() check if the range is
> there instead?

I thought about this, and AFAICT this would open a window in which gpio
requests could bypass the pinctrl subsystem, as ranges are only registered
after the gpio chip was registered.
pinctrl_request_gpio() -> pinctrl_get_device_gpio_range() returns -EPROBEDEFER if
it can't find a range for that reason.

To solve this we could introduce a gpiochip_add_with_range(), then we can assign
the generic _request/_free in gpiochip_add in case the callbacks aren't set yet
(and keep the way _request/_free are implemented).

If the gpio-ranges property is used, we could then check for its existence to
assign the callbacks.

So my idea is something like the following. The conversion would be then

chip->request = foo_request;
chip->free = foo_free;
gpiochip_add(chip);
gpiochip_add_pin_range(chip, "foo", 0, 0, npins);

=>

static const struct __initconst pinctrl_gpio_range foo_range = {
	.base = 0,
	.pinbase = 0,
	.npins = npins,
};

gpiochip_add_with_ranges(chip, "foo", &foo_range, 1);

which would be a bit more verbose, but for drivers like pinctrl-cygnus-gpio,
which registers 51(!) pinranges for the same gpio chip, it would mean quite a
bit of code reduction.

diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c
index fa6e3c8..b4c6119 100644
--- a/drivers/gpio/gpiolib-of.c
+++ b/drivers/gpio/gpiolib-of.c
@@ -415,6 +415,11 @@ static int of_gpiochip_add_pin_range(struct gpio_chip *chip)
 	return 0;
 }
 
+bool of_gpiochip_has_pin_range(struct gpio_chip *chip)
+{
+	return !!of_find_property(chip->of_node, "gpio-ranges", NULL);
+}
+
 #else
 static int of_gpiochip_add_pin_range(struct gpio_chip *chip) { return 0; }
 #endif
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index e0853fb..33f79b0 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -236,14 +236,23 @@ static int gpiochip_add_to_list(struct gpio_chip *chip)
  * If chip->base is negative, this requests dynamic assignment of
  * a range of valid GPIOs.
  */
-int gpiochip_add(struct gpio_chip *chip)
+int gpiochip_add_with_ranges(struct gpio_chip *chip, const char *pinctl_name,
+			     const struct pinctrl_gpio_range *ranges,
+			     unsigned int nranges)
 {
 	unsigned long	flags;
 	int		status = 0;
-	unsigned	id;
+	unsigned	id, i;
 	int		base = chip->base;
 	struct gpio_desc *descs;
 
+	if ((nranges > 0) || of_gpiochip_has_pin_range(chip)) {
+		if (!chip->request)
+			chip->request = gpiochip_generic_request;
+		if (!chip->free)
+			chip->free = gpiochip_generic_free;
+	}
+
 	descs = kcalloc(chip->ngpio, sizeof(descs[0]), GFP_KERNEL);
 	if (!descs)
 		return -ENOMEM;
@@ -295,6 +304,16 @@ int gpiochip_add(struct gpio_chip *chip)
 	if (status)
 		goto err_remove_chip;
 
+	for (i = 0; i < nranges; i++) {
+		const struct pinctrl_gpio_range *range = ranges[i];
+
+		status = gpiochip_add_pin_range(chip, pinctl_name,
+						chip->base + range->base,
+						range->pinbase, range->npins);
+		if (status)
+			goto err_remove_chip;
+	}
+
 	acpi_gpiochip_add(chip);
 
 	status = gpiochip_sysfs_register(chip);
@@ -309,6 +328,7 @@ int gpiochip_add(struct gpio_chip *chip)
 
 err_remove_chip:
 	acpi_gpiochip_remove(chip);
+	gpiochip_remove_pin_ranges(chip);
 	gpiochip_free_hogs(chip);
 	of_gpiochip_remove(chip);
 	spin_lock_irqsave(&gpio_lock, flags);
diff --git a/drivers/gpio/gpiolib.h b/drivers/gpio/gpiolib.h
index bf34300..05a71da 100644
--- a/drivers/gpio/gpiolib.h
+++ b/drivers/gpio/gpiolib.h
@@ -72,6 +72,15 @@ struct gpio_desc *of_get_named_gpiod_flags(struct device_node *np,
 
 struct gpio_desc *gpiochip_get_desc(struct gpio_chip *chip, u16 hwnum);
 
+#if defined(CONFIG_OF_GPIO) && defined(CONFIG_PINCTRL)
+bool of_gpiochip_has_pin_range(struct gpio_chip *chip);
+#else
+static inline bool of_gpiochip_has_pin_range(struct gpio_chip *chip)
+{
+	return false;
+}
+#endif
+
 extern struct spinlock gpio_lock;
 extern struct list_head gpio_chips;
 
diff --git a/include/linux/gpio/driver.h b/include/linux/gpio/driver.h
index 0857c28..ea8a630 100644
--- a/include/linux/gpio/driver.h
+++ b/include/linux/gpio/driver.h
@@ -166,7 +166,14 @@ extern const char *gpiochip_is_requested(struct gpio_chip *chip,
 			unsigned offset);
 
 /* add/remove chips */
-extern int gpiochip_add(struct gpio_chip *chip);
+static inline int gpiochip_add(struct gpio_chip *chip)
+{
+	return gpiochip_add_with_ranges(chip, NULL, NULL, 0);
+}
+
+int gpiochip_add_with_ranges(struct gpio_chip *chip, const char *pinctl_name,
+			     const struct pinctrl_gpio_range *ranges,
+			     unsigned int nranges);
 extern void gpiochip_remove(struct gpio_chip *chip);
 extern struct gpio_chip *gpiochip_find(void *data,
 			      int (*match)(struct gpio_chip *chip, void *data));

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

* Re: [PATCH RFT 4/5] gpio: gpio-pl061: use the generic request/free implementations
  2015-10-05 13:12     ` Jonas Gorski
@ 2015-10-06  7:23       ` Linus Walleij
  0 siblings, 0 replies; 23+ messages in thread
From: Linus Walleij @ 2015-10-06  7:23 UTC (permalink / raw)
  To: Jonas Gorski, Alexandre Courbot
  Cc: linux-gpio@vger.kernel.org, Joachim Eastwood, Jonas Jensen,
	Gregory CLEMENT, Thomas Petazzoni, James Hogan, Stefan Agner,
	Jun Nie, Stephen Warren, Lee Jones, Eric Anholt, Mika Westerberg,
	Heikki Krogerus, Matthias Brugger, Alessandro Rubini, Sonic Zhang,
	Laxman Dewangan, Jean-Christophe Plagniol-Villard, Baruch Siach,
	Andrew Bresticker, Heiko Stuebner, Sr

On Mon, Oct 5, 2015 at 3:12 PM, Jonas Gorski <jogo@openwrt.org> wrote:
> [Me]
>> Can we think of a way to do this even more generic:
>> could gpiochip_generic_request() check if the range is
>> there instead?
>
> I thought about this, and AFAICT this would open a window in which gpio
> requests could bypass the pinctrl subsystem, as ranges are only registered
> after the gpio chip was registered.
> pinctrl_request_gpio() -> pinctrl_get_device_gpio_range() returns -EPROBEDEFER if
> it can't find a range for that reason.
>
> To solve this we could introduce a gpiochip_add_with_range(), then we can assign
> the generic _request/_free in gpiochip_add in case the callbacks aren't set yet
> (and keep the way _request/_free are implemented).

Hm! That sounds like a good idea. Alexandre, what do you think?

> static const struct __initconst pinctrl_gpio_range foo_range = {
>         .base = 0,
>         .pinbase = 0,
>         .npins = npins,
> };
>
> gpiochip_add_with_ranges(chip, "foo", &foo_range, 1);

Neato.

> which would be a bit more verbose, but for drivers like pinctrl-cygnus-gpio,
> which registers 51(!) pinranges for the same gpio chip, it would mean quite a
> bit of code reduction.

Now we're talking.

Are you interested in doing this refactoring? It'd be awesome.

(Do it on top of this series though, so we can merge this first.)

Yours,
Linus Walleij

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

end of thread, other threads:[~2015-10-06  7:23 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-09-13 13:21 [PATCH RFT 0/5] gpiochip: add and use generic request/free Jonas Gorski
2015-09-13 13:21 ` [PATCH RFT 1/5] gpiolib: provide generic request/free implementations Jonas Gorski
2015-10-05  9:17   ` Linus Walleij
2015-09-13 13:21 ` [PATCH RFT 2/5] gpio: replace trivial implementations of request/free with generic one Jonas Gorski
2015-09-14 14:37   ` Thomas Petazzoni
2015-09-14 17:14   ` James Hogan
2015-09-15  3:32   ` Stefan Agner
2015-09-20 13:16   ` Joachim Eastwood
2015-09-13 13:21 ` [PATCH RFT 3/5] gpio: gpio-xz: use the generic request/free implementations Jonas Gorski
2015-09-13 13:21 ` [PATCH RFT 4/5] gpio: gpio-pl061: " Jonas Gorski
2015-10-05  9:19   ` Linus Walleij
2015-10-05 13:12     ` Jonas Gorski
2015-10-06  7:23       ` Linus Walleij
2015-09-13 13:21 ` [PATCH RFT 5/5] pinctrl: replace trivial implementations of gpio_chip request/free Jonas Gorski
2015-09-13 19:07   ` Bjorn Andersson
2015-09-13 19:20   ` Heiko Stübner
2015-09-14 14:18   ` Eric Anholt
2015-09-14 14:41   ` Mika Westerberg
2015-09-14 16:53   ` Andrew Bresticker
2015-09-16 11:07   ` Baruch Siach
2015-09-20 13:40   ` Matthias Brugger
2015-10-01 12:32   ` Lee Jones
2015-10-05 10:37   ` Laxman Dewangan

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.