linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCHv2 0/7] gpios: Add daisy-chaining and dt support to 74x164
@ 2012-09-07 12:18 Maxime Ripard
  2012-09-07 12:18 ` [PATCH 1/7] gpio: 74x164: Use module_spi_driver boiler plate function Maxime Ripard
                   ` (6 more replies)
  0 siblings, 7 replies; 19+ messages in thread
From: Maxime Ripard @ 2012-09-07 12:18 UTC (permalink / raw)
  To: linux-arm-kernel

Hi all,

This is the second attempt at adding the support for chained 8 bit
shift registers that are present in the cfa-10049.

This patchset also adds dt support to the 74x164 gpio driver.

Thanks,
Maxime

Changes since v1:
  * Added back the possibility to set the gpio base from the platform
    data
  * Removed the output-latch-gpios dt property to use the regular spi
    chip select mechanism that works in the same way.
  * Moved from multiple spi_write to a single spi_sync call because the
    chip select must be enabled during the whole transfer in our case,
    and not disabled after sending every byte.

Maxime Ripard (7):
  gpio: 74x164: Use module_spi_driver boiler plate function
  gpio: 74x164: Use devm_kzalloc
  gpio: 74x164: Use dynamic gpio number assignment if no pdata is
    present
  gpio: 74x164: Add device tree support
  gpio: 74x164: Add support for the daisy-chaining
  gpio: 74x164: dts: Add documentation for the dt binding
  ARM: dts: cfa10049: Add the 74HC595 gpio expanders

 .../devicetree/bindings/gpio/gpio-74x164.txt       |   22 ++++
 arch/arm/boot/dts/imx28-cfa10049.dts               |   21 ++++
 drivers/gpio/gpio-74x164.c                         |  105 ++++++++++++++------
 3 files changed, 120 insertions(+), 28 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/gpio/gpio-74x164.txt

-- 
1.7.9.5

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

* [PATCH 1/7] gpio: 74x164: Use module_spi_driver boiler plate function
  2012-09-07 12:18 [PATCHv2 0/7] gpios: Add daisy-chaining and dt support to 74x164 Maxime Ripard
@ 2012-09-07 12:18 ` Maxime Ripard
  2012-09-07 12:18 ` [PATCH 2/7] gpio: 74x164: Use devm_kzalloc Maxime Ripard
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 19+ messages in thread
From: Maxime Ripard @ 2012-09-07 12:18 UTC (permalink / raw)
  To: linux-arm-kernel

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Acked-by: Florian Fainelli <florian@openwrt.org>
Acked-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
---
 drivers/gpio/gpio-74x164.c |   13 +------------
 1 file changed, 1 insertion(+), 12 deletions(-)

diff --git a/drivers/gpio/gpio-74x164.c b/drivers/gpio/gpio-74x164.c
index a31ad6f..2975036 100644
--- a/drivers/gpio/gpio-74x164.c
+++ b/drivers/gpio/gpio-74x164.c
@@ -159,18 +159,7 @@ static struct spi_driver gen_74x164_driver = {
 	.probe		= gen_74x164_probe,
 	.remove		= __devexit_p(gen_74x164_remove),
 };
-
-static int __init gen_74x164_init(void)
-{
-	return spi_register_driver(&gen_74x164_driver);
-}
-subsys_initcall(gen_74x164_init);
-
-static void __exit gen_74x164_exit(void)
-{
-	spi_unregister_driver(&gen_74x164_driver);
-}
-module_exit(gen_74x164_exit);
+module_spi_driver(gen_74x164_driver);
 
 MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
 MODULE_AUTHOR("Miguel Gaio <miguel.gaio@efixo.com>");
-- 
1.7.9.5

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

* [PATCH 2/7] gpio: 74x164: Use devm_kzalloc
  2012-09-07 12:18 [PATCHv2 0/7] gpios: Add daisy-chaining and dt support to 74x164 Maxime Ripard
  2012-09-07 12:18 ` [PATCH 1/7] gpio: 74x164: Use module_spi_driver boiler plate function Maxime Ripard
@ 2012-09-07 12:18 ` Maxime Ripard
  2012-09-07 12:18 ` [PATCH 3/7] gpio: 74x164: Use dynamic gpio number assignment if no pdata is present Maxime Ripard
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 19+ messages in thread
From: Maxime Ripard @ 2012-09-07 12:18 UTC (permalink / raw)
  To: linux-arm-kernel

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Acked-by: Florian Fainelli <florian@openwrt.org>
Acked-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
---
 drivers/gpio/gpio-74x164.c |    8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/gpio/gpio-74x164.c b/drivers/gpio/gpio-74x164.c
index 2975036..604b998 100644
--- a/drivers/gpio/gpio-74x164.c
+++ b/drivers/gpio/gpio-74x164.c
@@ -90,7 +90,7 @@ static int __devinit gen_74x164_probe(struct spi_device *spi)
 	if (ret < 0)
 		return ret;
 
-	chip = kzalloc(sizeof(*chip), GFP_KERNEL);
+	chip = devm_kzalloc(&spi->dev, sizeof(*chip), GFP_KERNEL);
 	if (!chip)
 		return -ENOMEM;
 
@@ -125,7 +125,6 @@ static int __devinit gen_74x164_probe(struct spi_device *spi)
 exit_destroy:
 	dev_set_drvdata(&spi->dev, NULL);
 	mutex_destroy(&chip->lock);
-	kfree(chip);
 	return ret;
 }
 
@@ -141,10 +140,9 @@ static int __devexit gen_74x164_remove(struct spi_device *spi)
 	dev_set_drvdata(&spi->dev, NULL);
 
 	ret = gpiochip_remove(&chip->gpio_chip);
-	if (!ret) {
+	if (!ret)
 		mutex_destroy(&chip->lock);
-		kfree(chip);
-	} else
+	else
 		dev_err(&spi->dev, "Failed to remove the GPIO controller: %d\n",
 				ret);
 
-- 
1.7.9.5

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

* [PATCH 3/7] gpio: 74x164: Use dynamic gpio number assignment if no pdata is present
  2012-09-07 12:18 [PATCHv2 0/7] gpios: Add daisy-chaining and dt support to 74x164 Maxime Ripard
  2012-09-07 12:18 ` [PATCH 1/7] gpio: 74x164: Use module_spi_driver boiler plate function Maxime Ripard
  2012-09-07 12:18 ` [PATCH 2/7] gpio: 74x164: Use devm_kzalloc Maxime Ripard
@ 2012-09-07 12:18 ` Maxime Ripard
  2012-09-07 14:01   ` Florian Fainelli
  2012-09-07 21:04   ` Linus Walleij
  2012-09-07 12:18 ` [PATCH 4/7] gpio: 74x164: Add device tree support Maxime Ripard
                   ` (3 subsequent siblings)
  6 siblings, 2 replies; 19+ messages in thread
From: Maxime Ripard @ 2012-09-07 12:18 UTC (permalink / raw)
  To: linux-arm-kernel

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
---
 drivers/gpio/gpio-74x164.c |   13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/drivers/gpio/gpio-74x164.c b/drivers/gpio/gpio-74x164.c
index 604b998..ef8baac 100644
--- a/drivers/gpio/gpio-74x164.c
+++ b/drivers/gpio/gpio-74x164.c
@@ -75,12 +75,6 @@ static int __devinit gen_74x164_probe(struct spi_device *spi)
 	struct gen_74x164_chip_platform_data *pdata;
 	int ret;
 
-	pdata = spi->dev.platform_data;
-	if (!pdata || !pdata->base) {
-		dev_dbg(&spi->dev, "incorrect or missing platform data\n");
-		return -EINVAL;
-	}
-
 	/*
 	 * bits_per_word cannot be configured in platform data
 	 */
@@ -94,6 +88,12 @@ static int __devinit gen_74x164_probe(struct spi_device *spi)
 	if (!chip)
 		return -ENOMEM;
 
+	pdata = spi->dev.platform_data;
+	if (pdata && pdata->base)
+		chip->gpio_chip.base = pdata->base;
+	else
+		chip->gpio_chip.base = -1;
+
 	mutex_init(&chip->lock);
 
 	dev_set_drvdata(&spi->dev, chip);
@@ -104,7 +104,6 @@ static int __devinit gen_74x164_probe(struct spi_device *spi)
 	chip->gpio_chip.direction_output = gen_74x164_direction_output;
 	chip->gpio_chip.get = gen_74x164_get_value;
 	chip->gpio_chip.set = gen_74x164_set_value;
-	chip->gpio_chip.base = pdata->base;
 	chip->gpio_chip.ngpio = 8;
 	chip->gpio_chip.can_sleep = 1;
 	chip->gpio_chip.dev = &spi->dev;
-- 
1.7.9.5

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

* [PATCH 4/7] gpio: 74x164: Add device tree support
  2012-09-07 12:18 [PATCHv2 0/7] gpios: Add daisy-chaining and dt support to 74x164 Maxime Ripard
                   ` (2 preceding siblings ...)
  2012-09-07 12:18 ` [PATCH 3/7] gpio: 74x164: Use dynamic gpio number assignment if no pdata is present Maxime Ripard
@ 2012-09-07 12:18 ` Maxime Ripard
  2012-09-07 21:05   ` Linus Walleij
  2012-09-07 12:18 ` [PATCH 5/7] gpio: 74x164: Add support for the daisy-chaining Maxime Ripard
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 19+ messages in thread
From: Maxime Ripard @ 2012-09-07 12:18 UTC (permalink / raw)
  To: linux-arm-kernel

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Acked-by: Florian Fainelli <florian@openwrt.org>
Acked-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
---
 drivers/gpio/gpio-74x164.c |    7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/gpio/gpio-74x164.c b/drivers/gpio/gpio-74x164.c
index ef8baac..2e31bd3 100644
--- a/drivers/gpio/gpio-74x164.c
+++ b/drivers/gpio/gpio-74x164.c
@@ -148,10 +148,17 @@ static int __devexit gen_74x164_remove(struct spi_device *spi)
 	return ret;
 }
 
+static const struct of_device_id gen_74x164_dt_ids[] = {
+	{ .compatible = "fairchild,74hc595" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, gen_74x164_dt_ids);
+
 static struct spi_driver gen_74x164_driver = {
 	.driver = {
 		.name		= "74x164",
 		.owner		= THIS_MODULE,
+		.of_match_table	= of_match_ptr(gen_74x164_dt_ids),
 	},
 	.probe		= gen_74x164_probe,
 	.remove		= __devexit_p(gen_74x164_remove),
-- 
1.7.9.5

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

* [PATCH 5/7] gpio: 74x164: Add support for the daisy-chaining
  2012-09-07 12:18 [PATCHv2 0/7] gpios: Add daisy-chaining and dt support to 74x164 Maxime Ripard
                   ` (3 preceding siblings ...)
  2012-09-07 12:18 ` [PATCH 4/7] gpio: 74x164: Add device tree support Maxime Ripard
@ 2012-09-07 12:18 ` Maxime Ripard
  2012-09-07 14:03   ` Florian Fainelli
  2012-09-07 21:07   ` Linus Walleij
  2012-09-07 12:18 ` [PATCH 6/7] gpio: 74x164: dts: Add documentation for the dt binding Maxime Ripard
  2012-09-07 12:18 ` [PATCH 7/7] ARM: dts: cfa10049: Add the 74HC595 gpio expanders Maxime Ripard
  6 siblings, 2 replies; 19+ messages in thread
From: Maxime Ripard @ 2012-09-07 12:18 UTC (permalink / raw)
  To: linux-arm-kernel

The shift registers have an output pin that, when enabled, propagates
the values of its internal register to the pins. If another value comes
to the register while the output pin is disabled, this new value will
makae the older shift into the next register in the chain.

This patch adds support for daisy-chaining the registers, using the
regular SPI chip select mechanism to manage the output pin, and the
registers-number dt property to set the number of chained registers.

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
---
 drivers/gpio/gpio-74x164.c |   70 +++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 63 insertions(+), 7 deletions(-)

diff --git a/drivers/gpio/gpio-74x164.c b/drivers/gpio/gpio-74x164.c
index 2e31bd3..1831d0f 100644
--- a/drivers/gpio/gpio-74x164.c
+++ b/drivers/gpio/gpio-74x164.c
@@ -14,14 +14,18 @@
 #include <linux/spi/spi.h>
 #include <linux/spi/74x164.h>
 #include <linux/gpio.h>
+#include <linux/of_gpio.h>
 #include <linux/slab.h>
 #include <linux/module.h>
 
+#define GEN_74X164_NUMBER_GPIOS	8
+
 struct gen_74x164_chip {
 	struct spi_device	*spi;
+	u8			*buffer;
 	struct gpio_chip	gpio_chip;
 	struct mutex		lock;
-	u8			port_config;
+	u32			registers;
 };
 
 static struct gen_74x164_chip *gpio_to_74x164_chip(struct gpio_chip *gc)
@@ -31,17 +35,49 @@ static struct gen_74x164_chip *gpio_to_74x164_chip(struct gpio_chip *gc)
 
 static int __gen_74x164_write_config(struct gen_74x164_chip *chip)
 {
-	return spi_write(chip->spi,
-			 &chip->port_config, sizeof(chip->port_config));
+	struct spi_message message;
+	struct spi_transfer *msg_buf;
+	int i, ret;
+
+	msg_buf = kzalloc(chip->registers * sizeof(struct spi_transfer),
+			GFP_KERNEL);
+	if (!msg_buf)
+		return -ENOMEM;
+
+	spi_message_init(&message);
+
+	/*
+	 * Since the registers are chained, every byte sent will make
+	 * the previous byte shift to the next register in the
+	 * chain. Thus, the first byte send will end up in the last
+	 * register at the end of the transfer. So, to have a logical
+	 * numbering, send the bytes in reverse order so that the last
+	 * byte of the buffer will end up in the last register.
+	 */
+	for (i = chip->registers - 1; i >= 0; i--) {
+		msg_buf[i].tx_buf = chip->buffer +i;
+		msg_buf[i].len = sizeof(u8);
+		spi_message_add_tail(msg_buf + i, &message);
+	}
+
+	ret = spi_sync(chip->spi, &message);
+	if (ret)
+		return ret;
+
+	kfree(msg_buf);
+
+	return 0;
 }
 
 static int gen_74x164_get_value(struct gpio_chip *gc, unsigned offset)
 {
 	struct gen_74x164_chip *chip = gpio_to_74x164_chip(gc);
+	u8 bank = offset / 8;
+	u8 pin = offset % 8;
 	int ret;
 
 	mutex_lock(&chip->lock);
-	ret = (chip->port_config >> offset) & 0x1;
+	ret = (chip->buffer[bank] >> pin) & 0x1;
 	mutex_unlock(&chip->lock);
 
 	return ret;
@@ -51,12 +87,14 @@ static void gen_74x164_set_value(struct gpio_chip *gc,
 		unsigned offset, int val)
 {
 	struct gen_74x164_chip *chip = gpio_to_74x164_chip(gc);
+	u8 bank = offset / 8;
+	u8 pin = offset % 8;
 
 	mutex_lock(&chip->lock);
 	if (val)
-		chip->port_config |= (1 << offset);
+		chip->buffer[bank] |= (1 << pin);
 	else
-		chip->port_config &= ~(1 << offset);
+		chip->buffer[bank] &= ~(1 << pin);
 
 	__gen_74x164_write_config(chip);
 	mutex_unlock(&chip->lock);
@@ -75,6 +113,11 @@ static int __devinit gen_74x164_probe(struct spi_device *spi)
 	struct gen_74x164_chip_platform_data *pdata;
 	int ret;
 
+	if (!spi->dev.of_node) {
+		dev_err(&spi->dev, "No device tree data available.\n");
+		return -EINVAL;
+	}
+
 	/*
 	 * bits_per_word cannot be configured in platform data
 	 */
@@ -104,7 +147,20 @@ static int __devinit gen_74x164_probe(struct spi_device *spi)
 	chip->gpio_chip.direction_output = gen_74x164_direction_output;
 	chip->gpio_chip.get = gen_74x164_get_value;
 	chip->gpio_chip.set = gen_74x164_set_value;
-	chip->gpio_chip.ngpio = 8;
+
+	if (of_property_read_u32(spi->dev.of_node, "registers-number", &chip->registers)) {
+		dev_err(&spi->dev, "Missing registers-number property in the DT.\n");
+		ret = -EINVAL;
+		goto exit_destroy;
+	}
+
+	chip->gpio_chip.ngpio = GEN_74X164_NUMBER_GPIOS * chip->registers;
+	chip->buffer = devm_kzalloc(&spi->dev, chip->gpio_chip.ngpio, GFP_KERNEL);
+	if (!chip->buffer) {
+		ret = -ENOMEM;
+		goto exit_destroy;
+	}
+
 	chip->gpio_chip.can_sleep = 1;
 	chip->gpio_chip.dev = &spi->dev;
 	chip->gpio_chip.owner = THIS_MODULE;
-- 
1.7.9.5

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

* [PATCH 6/7] gpio: 74x164: dts: Add documentation for the dt binding
  2012-09-07 12:18 [PATCHv2 0/7] gpios: Add daisy-chaining and dt support to 74x164 Maxime Ripard
                   ` (4 preceding siblings ...)
  2012-09-07 12:18 ` [PATCH 5/7] gpio: 74x164: Add support for the daisy-chaining Maxime Ripard
@ 2012-09-07 12:18 ` Maxime Ripard
  2012-09-07 12:18 ` [PATCH 7/7] ARM: dts: cfa10049: Add the 74HC595 gpio expanders Maxime Ripard
  6 siblings, 0 replies; 19+ messages in thread
From: Maxime Ripard @ 2012-09-07 12:18 UTC (permalink / raw)
  To: linux-arm-kernel

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
---
 .../devicetree/bindings/gpio/gpio-74x164.txt       |   22 ++++++++++++++++++++
 1 file changed, 22 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/gpio/gpio-74x164.txt

diff --git a/Documentation/devicetree/bindings/gpio/gpio-74x164.txt b/Documentation/devicetree/bindings/gpio/gpio-74x164.txt
new file mode 100644
index 0000000..cc26080
--- /dev/null
+++ b/Documentation/devicetree/bindings/gpio/gpio-74x164.txt
@@ -0,0 +1,22 @@
+* Generic 8-bits shift register GPIO driver
+
+Required properties:
+- compatible : Should be "fairchild,74hc595"
+- reg : chip select number
+- gpio-controller : Marks the device node as a gpio controller.
+- #gpio-cells : Should be two.  The first cell is the pin number and
+  the second cell is used to specify the gpio polarity:
+      0 = active high
+      1 = active low
+- registers-number: Number of daisy-chained shift registers
+
+Example:
+
+gpio5: gpio5 at 0 {
+	compatible = "fairchild,74hc595";
+	reg = <0>;
+	gpio-controller;
+	#gpio-cells = <2>;
+	registers-number = <4>;
+	spi-max-frequency = <100000>;
+};
-- 
1.7.9.5

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

* [PATCH 7/7] ARM: dts: cfa10049: Add the 74HC595 gpio expanders
  2012-09-07 12:18 [PATCHv2 0/7] gpios: Add daisy-chaining and dt support to 74x164 Maxime Ripard
                   ` (5 preceding siblings ...)
  2012-09-07 12:18 ` [PATCH 6/7] gpio: 74x164: dts: Add documentation for the dt binding Maxime Ripard
@ 2012-09-07 12:18 ` Maxime Ripard
  2012-09-10  2:23   ` Shawn Guo
  6 siblings, 1 reply; 19+ messages in thread
From: Maxime Ripard @ 2012-09-07 12:18 UTC (permalink / raw)
  To: linux-arm-kernel

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
---
 arch/arm/boot/dts/imx28-cfa10049.dts |   21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/arch/arm/boot/dts/imx28-cfa10049.dts b/arch/arm/boot/dts/imx28-cfa10049.dts
index 1f7fa50..05c892e 100644
--- a/arch/arm/boot/dts/imx28-cfa10049.dts
+++ b/arch/arm/boot/dts/imx28-cfa10049.dts
@@ -27,6 +27,8 @@
 					fsl,pinmux-ids = <
 						0x0181 /* MX28_PAD_GPMI_RDN__SSP3_SCK */
 						0x01c1 /* MX28_PAD_GPMI_RESETN__SSP3_CMD */
+						0x0111 /* MX28_PAD_GPMI_CE1N__SSP3_D3 */
+						0x01a2 /* MX28_PAD_GPMI_ALE__SSP3_D4 */
 					>;
 					fsl,drive-strength = <1>;
 					fsl,voltage = <1>;
@@ -39,6 +41,25 @@
 				pinctrl-names = "default";
 				pinctrl-0 = <&spi3_pins_cfa10049>;
 				status = "okay";
+
+				gpio5: gpio5 at 0 {
+					compatible = "fairchild,74hc595";
+					gpio-controller;
+					#gpio-cells = <2>;
+					reg = <0>;
+					registers-number = <2>;
+					spi-max-frequency = <100000>;
+				};
+
+				gpio6: gpio6 at 1 {
+					compatible = "fairchild,74hc595";
+					gpio-controller;
+					#gpio-cells = <2>;
+					reg = <1>;
+					registers-number = <4>;
+					spi-max-frequency = <100000>;
+				};
+
 			};
 		};
 
-- 
1.7.9.5

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

* [PATCH 3/7] gpio: 74x164: Use dynamic gpio number assignment if no pdata is present
  2012-09-07 12:18 ` [PATCH 3/7] gpio: 74x164: Use dynamic gpio number assignment if no pdata is present Maxime Ripard
@ 2012-09-07 14:01   ` Florian Fainelli
  2012-09-07 21:04   ` Linus Walleij
  1 sibling, 0 replies; 19+ messages in thread
From: Florian Fainelli @ 2012-09-07 14:01 UTC (permalink / raw)
  To: linux-arm-kernel

On Friday 07 September 2012 14:18:12 Maxime Ripard wrote:
> Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>

Acked-by: Florian Fainelli <florian@openwrt.org>

Thank you Maxime!

> ---
>  drivers/gpio/gpio-74x164.c |   13 ++++++-------
>  1 file changed, 6 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/gpio/gpio-74x164.c b/drivers/gpio/gpio-74x164.c
> index 604b998..ef8baac 100644
> --- a/drivers/gpio/gpio-74x164.c
> +++ b/drivers/gpio/gpio-74x164.c
> @@ -75,12 +75,6 @@ static int __devinit gen_74x164_probe(struct spi_device 
*spi)
>  	struct gen_74x164_chip_platform_data *pdata;
>  	int ret;
>  
> -	pdata = spi->dev.platform_data;
> -	if (!pdata || !pdata->base) {
> -		dev_dbg(&spi->dev, "incorrect or missing platform data\n");
> -		return -EINVAL;
> -	}
> -
>  	/*
>  	 * bits_per_word cannot be configured in platform data
>  	 */
> @@ -94,6 +88,12 @@ static int __devinit gen_74x164_probe(struct spi_device 
*spi)
>  	if (!chip)
>  		return -ENOMEM;
>  
> +	pdata = spi->dev.platform_data;
> +	if (pdata && pdata->base)
> +		chip->gpio_chip.base = pdata->base;
> +	else
> +		chip->gpio_chip.base = -1;
> +
>  	mutex_init(&chip->lock);
>  
>  	dev_set_drvdata(&spi->dev, chip);
> @@ -104,7 +104,6 @@ static int __devinit gen_74x164_probe(struct spi_device 
*spi)
>  	chip->gpio_chip.direction_output = gen_74x164_direction_output;
>  	chip->gpio_chip.get = gen_74x164_get_value;
>  	chip->gpio_chip.set = gen_74x164_set_value;
> -	chip->gpio_chip.base = pdata->base;
>  	chip->gpio_chip.ngpio = 8;
>  	chip->gpio_chip.can_sleep = 1;
>  	chip->gpio_chip.dev = &spi->dev;
> -- 
> 1.7.9.5
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* [PATCH 5/7] gpio: 74x164: Add support for the daisy-chaining
  2012-09-07 12:18 ` [PATCH 5/7] gpio: 74x164: Add support for the daisy-chaining Maxime Ripard
@ 2012-09-07 14:03   ` Florian Fainelli
  2012-09-07 21:08     ` Linus Walleij
  2012-09-07 21:07   ` Linus Walleij
  1 sibling, 1 reply; 19+ messages in thread
From: Florian Fainelli @ 2012-09-07 14:03 UTC (permalink / raw)
  To: linux-arm-kernel

Hello Maxime,

On Friday 07 September 2012 14:18:14 Maxime Ripard wrote:
> The shift registers have an output pin that, when enabled, propagates
> the values of its internal register to the pins. If another value comes
> to the register while the output pin is disabled, this new value will
> makae the older shift into the next register in the chain.
> 
> This patch adds support for daisy-chaining the registers, using the
> regular SPI chip select mechanism to manage the output pin, and the
> registers-number dt property to set the number of chained registers.
> 
> Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
> ---

[snip]

>  static int __gen_74x164_write_config(struct gen_74x164_chip *chip)
>  {
> -	return spi_write(chip->spi,
> -			 &chip->port_config, sizeof(chip->port_config));
> +	struct spi_message message;
> +	struct spi_transfer *msg_buf;
> +	int i, ret;
> +
> +	msg_buf = kzalloc(chip->registers * sizeof(struct spi_transfer),
> +			GFP_KERNEL);
> +	if (!msg_buf)
> +		return -ENOMEM;
> +
> +	spi_message_init(&message);
> +
> +	/*
> +	 * Since the registers are chained, every byte sent will make
> +	 * the previous byte shift to the next register in the
> +	 * chain. Thus, the first byte send will end up in the last
> +	 * register at the end of the transfer. So, to have a logical
> +	 * numbering, send the bytes in reverse order so that the last
> +	 * byte of the buffer will end up in the last register.
> +	 */
> +	for (i = chip->registers - 1; i >= 0; i--) {
> +		msg_buf[i].tx_buf = chip->buffer +i;
> +		msg_buf[i].len = sizeof(u8);
> +		spi_message_add_tail(msg_buf + i, &message);
> +	}
> +
> +	ret = spi_sync(chip->spi, &message);
> +	if (ret)
> +		return ret;

You are leaking msg_buf here in case of error.

> +
> +	kfree(msg_buf);
> +
> +	return 0;
>  }
>  
>  static int gen_74x164_get_value(struct gpio_chip *gc, unsigned offset)
>  {
>  	struct gen_74x164_chip *chip = gpio_to_74x164_chip(gc);
> +	u8 bank = offset / 8;
> +	u8 pin = offset % 8;
>  	int ret;
>  
>  	mutex_lock(&chip->lock);
> -	ret = (chip->port_config >> offset) & 0x1;
> +	ret = (chip->buffer[bank] >> pin) & 0x1;
>  	mutex_unlock(&chip->lock);
>  
>  	return ret;
> @@ -51,12 +87,14 @@ static void gen_74x164_set_value(struct gpio_chip *gc,
>  		unsigned offset, int val)
>  {
>  	struct gen_74x164_chip *chip = gpio_to_74x164_chip(gc);
> +	u8 bank = offset / 8;
> +	u8 pin = offset % 8;
>  
>  	mutex_lock(&chip->lock);
>  	if (val)
> -		chip->port_config |= (1 << offset);
> +		chip->buffer[bank] |= (1 << pin);
>  	else
> -		chip->port_config &= ~(1 << offset);
> +		chip->buffer[bank] &= ~(1 << pin);
>  
>  	__gen_74x164_write_config(chip);
>  	mutex_unlock(&chip->lock);
> @@ -75,6 +113,11 @@ static int __devinit gen_74x164_probe(struct spi_device 
*spi)
>  	struct gen_74x164_chip_platform_data *pdata;
>  	int ret;
>  
> +	if (!spi->dev.of_node) {
> +		dev_err(&spi->dev, "No device tree data available.\n");
> +		return -EINVAL;
> +	}

Should not this be folded in your previous patch?

> +
>  	/*
>  	 * bits_per_word cannot be configured in platform data
>  	 */
> @@ -104,7 +147,20 @@ static int __devinit gen_74x164_probe(struct spi_device 
*spi)
>  	chip->gpio_chip.direction_output = gen_74x164_direction_output;
>  	chip->gpio_chip.get = gen_74x164_get_value;
>  	chip->gpio_chip.set = gen_74x164_set_value;
> -	chip->gpio_chip.ngpio = 8;
> +
> +	if (of_property_read_u32(spi->dev.of_node, "registers-number", &chip-
>registers)) {
> +		dev_err(&spi->dev, "Missing registers-number property in the DT.
\n");
> +		ret = -EINVAL;
> +		goto exit_destroy;
> +	}
> +
> +	chip->gpio_chip.ngpio = GEN_74X164_NUMBER_GPIOS * chip->registers;
> +	chip->buffer = devm_kzalloc(&spi->dev, chip->gpio_chip.ngpio, GFP_KERNEL);
> +	if (!chip->buffer) {
> +		ret = -ENOMEM;
> +		goto exit_destroy;
> +	}
> +
>  	chip->gpio_chip.can_sleep = 1;
>  	chip->gpio_chip.dev = &spi->dev;
>  	chip->gpio_chip.owner = THIS_MODULE;
> -- 
> 1.7.9.5
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* [PATCH 3/7] gpio: 74x164: Use dynamic gpio number assignment if no pdata is present
  2012-09-07 12:18 ` [PATCH 3/7] gpio: 74x164: Use dynamic gpio number assignment if no pdata is present Maxime Ripard
  2012-09-07 14:01   ` Florian Fainelli
@ 2012-09-07 21:04   ` Linus Walleij
  1 sibling, 0 replies; 19+ messages in thread
From: Linus Walleij @ 2012-09-07 21:04 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Sep 7, 2012 at 2:18 PM, Maxime Ripard
<maxime.ripard@free-electrons.com> wrote:

> Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>

Applied, thanks.
Linus Walleij

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

* [PATCH 4/7] gpio: 74x164: Add device tree support
  2012-09-07 12:18 ` [PATCH 4/7] gpio: 74x164: Add device tree support Maxime Ripard
@ 2012-09-07 21:05   ` Linus Walleij
  0 siblings, 0 replies; 19+ messages in thread
From: Linus Walleij @ 2012-09-07 21:05 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Sep 7, 2012 at 2:18 PM, Maxime Ripard
<maxime.ripard@free-electrons.com> wrote:

> Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
> Acked-by: Florian Fainelli <florian@openwrt.org>
> Acked-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
> Acked-by: Linus Walleij <linus.walleij@linaro.org>

Applied, thanks.

Yours,
Linus Walleij

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

* [PATCH 5/7] gpio: 74x164: Add support for the daisy-chaining
  2012-09-07 12:18 ` [PATCH 5/7] gpio: 74x164: Add support for the daisy-chaining Maxime Ripard
  2012-09-07 14:03   ` Florian Fainelli
@ 2012-09-07 21:07   ` Linus Walleij
  2012-09-10  1:51     ` Shawn Guo
  1 sibling, 1 reply; 19+ messages in thread
From: Linus Walleij @ 2012-09-07 21:07 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Sep 7, 2012 at 2:18 PM, Maxime Ripard
<maxime.ripard@free-electrons.com> wrote:

> The shift registers have an output pin that, when enabled, propagates
> the values of its internal register to the pins. If another value comes
> to the register while the output pin is disabled, this new value will
> makae the older shift into the next register in the chain.
>
> This patch adds support for daisy-chaining the registers, using the
> regular SPI chip select mechanism to manage the output pin, and the
> registers-number dt property to set the number of chained registers.
>
> Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>

I'm stalling 5 thru 7 waiting for Florians comments to be addressed.

Yours,
Linus Walleij

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

* [PATCH 5/7] gpio: 74x164: Add support for the daisy-chaining
  2012-09-07 14:03   ` Florian Fainelli
@ 2012-09-07 21:08     ` Linus Walleij
  0 siblings, 0 replies; 19+ messages in thread
From: Linus Walleij @ 2012-09-07 21:08 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Sep 7, 2012 at 4:03 PM, Florian Fainelli <florian@openwrt.org> wrote:

>> +     if (!spi->dev.of_node) {
>> +             dev_err(&spi->dev, "No device tree data available.\n");
>> +             return -EINVAL;
>> +     }
>
> Should not this be folded in your previous patch?

True, but I've applied it, keep it here or split off as a separate
fix.

Yours,
Linus Walleij

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

* [PATCH 5/7] gpio: 74x164: Add support for the daisy-chaining
  2012-09-07 21:07   ` Linus Walleij
@ 2012-09-10  1:51     ` Shawn Guo
  2012-09-11 16:57       ` Linus Walleij
  0 siblings, 1 reply; 19+ messages in thread
From: Shawn Guo @ 2012-09-10  1:51 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Sep 07, 2012 at 11:07:33PM +0200, Linus Walleij wrote:
> I'm stalling 5 thru 7 waiting for Florians comments to be addressed.
> 
I expect that patch #7 does not apply on your tree at all, so I will
take it via mxs/dt branch to ease the process.

-- 
Regards,
Shawn

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

* [PATCH 7/7] ARM: dts: cfa10049: Add the 74HC595 gpio expanders
  2012-09-07 12:18 ` [PATCH 7/7] ARM: dts: cfa10049: Add the 74HC595 gpio expanders Maxime Ripard
@ 2012-09-10  2:23   ` Shawn Guo
  2012-09-10  9:27     ` Maxime Ripard
  0 siblings, 1 reply; 19+ messages in thread
From: Shawn Guo @ 2012-09-10  2:23 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Sep 07, 2012 at 02:18:16PM +0200, Maxime Ripard wrote:
> Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>

Empty commit message is never a good start.

> ---
>  arch/arm/boot/dts/imx28-cfa10049.dts |   21 +++++++++++++++++++++
>  1 file changed, 21 insertions(+)
> 
> diff --git a/arch/arm/boot/dts/imx28-cfa10049.dts b/arch/arm/boot/dts/imx28-cfa10049.dts
> index 1f7fa50..05c892e 100644
> --- a/arch/arm/boot/dts/imx28-cfa10049.dts
> +++ b/arch/arm/boot/dts/imx28-cfa10049.dts
> @@ -27,6 +27,8 @@
>  					fsl,pinmux-ids = <
>  						0x0181 /* MX28_PAD_GPMI_RDN__SSP3_SCK */
>  						0x01c1 /* MX28_PAD_GPMI_RESETN__SSP3_CMD */
> +						0x0111 /* MX28_PAD_GPMI_CE1N__SSP3_D3 */
> +						0x01a2 /* MX28_PAD_GPMI_ALE__SSP3_D4 */

What are these two pins used for?

Regards,
Shawn

>  					>;
>  					fsl,drive-strength = <1>;
>  					fsl,voltage = <1>;
> @@ -39,6 +41,25 @@
>  				pinctrl-names = "default";
>  				pinctrl-0 = <&spi3_pins_cfa10049>;
>  				status = "okay";
> +
> +				gpio5: gpio5 at 0 {
> +					compatible = "fairchild,74hc595";
> +					gpio-controller;
> +					#gpio-cells = <2>;
> +					reg = <0>;
> +					registers-number = <2>;
> +					spi-max-frequency = <100000>;
> +				};
> +
> +				gpio6: gpio6 at 1 {
> +					compatible = "fairchild,74hc595";
> +					gpio-controller;
> +					#gpio-cells = <2>;
> +					reg = <1>;
> +					registers-number = <4>;
> +					spi-max-frequency = <100000>;
> +				};
> +
>  			};
>  		};
>  
> -- 
> 1.7.9.5
> 

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

* [PATCH 7/7] ARM: dts: cfa10049: Add the 74HC595 gpio expanders
  2012-09-10  2:23   ` Shawn Guo
@ 2012-09-10  9:27     ` Maxime Ripard
  0 siblings, 0 replies; 19+ messages in thread
From: Maxime Ripard @ 2012-09-10  9:27 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Shawn,

Le 10/09/2012 04:23, Shawn Guo a ?crit :
> On Fri, Sep 07, 2012 at 02:18:16PM +0200, Maxime Ripard wrote:
>> ---
>>  arch/arm/boot/dts/imx28-cfa10049.dts |   21 +++++++++++++++++++++
>>  1 file changed, 21 insertions(+)
>>
>> diff --git a/arch/arm/boot/dts/imx28-cfa10049.dts b/arch/arm/boot/dts/imx28-cfa10049.dts
>> index 1f7fa50..05c892e 100644
>> --- a/arch/arm/boot/dts/imx28-cfa10049.dts
>> +++ b/arch/arm/boot/dts/imx28-cfa10049.dts
>> @@ -27,6 +27,8 @@
>>  					fsl,pinmux-ids = <
>>  						0x0181 /* MX28_PAD_GPMI_RDN__SSP3_SCK */
>>  						0x01c1 /* MX28_PAD_GPMI_RESETN__SSP3_CMD */
>> +						0x0111 /* MX28_PAD_GPMI_CE1N__SSP3_D3 */
>> +						0x01a2 /* MX28_PAD_GPMI_ALE__SSP3_D4 */
> 
> What are these two pins used for?

The SSP_D3, D4 and D5 are used as chip select 0, 1 and 2 by the SSP
controller when it runs in the two SPI (motorola and Winbond) modes.
Thus, here, I'm using them as chip selects.

Maxime

-- 
Maxime Ripard, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com

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

* [PATCH 5/7] gpio: 74x164: Add support for the daisy-chaining
  2012-09-10  1:51     ` Shawn Guo
@ 2012-09-11 16:57       ` Linus Walleij
  2012-09-12  2:07         ` Shawn Guo
  0 siblings, 1 reply; 19+ messages in thread
From: Linus Walleij @ 2012-09-11 16:57 UTC (permalink / raw)
  To: linux-arm-kernel

On Mon, Sep 10, 2012 at 3:51 AM, Shawn Guo <shawn.guo@linaro.org> wrote:
> On Fri, Sep 07, 2012 at 11:07:33PM +0200, Linus Walleij wrote:
>> I'm stalling 5 thru 7 waiting for Florians comments to be addressed.
>>
> I expect that patch #7 does not apply on your tree at all, so I will
> take it via mxs/dt branch to ease the process.

Just that one patch? Or do you mean you want to take all of them?
I really would prefer not have to rebase the GPIO tree...

Yours,
Linus Walleij

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

* [PATCH 5/7] gpio: 74x164: Add support for the daisy-chaining
  2012-09-11 16:57       ` Linus Walleij
@ 2012-09-12  2:07         ` Shawn Guo
  0 siblings, 0 replies; 19+ messages in thread
From: Shawn Guo @ 2012-09-12  2:07 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Sep 11, 2012 at 06:57:15PM +0200, Linus Walleij wrote:
> On Mon, Sep 10, 2012 at 3:51 AM, Shawn Guo <shawn.guo@linaro.org> wrote:
> > On Fri, Sep 07, 2012 at 11:07:33PM +0200, Linus Walleij wrote:
> >> I'm stalling 5 thru 7 waiting for Florians comments to be addressed.
> >>
> > I expect that patch #7 does not apply on your tree at all, so I will
> > take it via mxs/dt branch to ease the process.
> 
> Just that one patch? Or do you mean you want to take all of them?
> I really would prefer not have to rebase the GPIO tree...
> 
Just that one.

Regards,
Shawn

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

end of thread, other threads:[~2012-09-12  2:07 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-09-07 12:18 [PATCHv2 0/7] gpios: Add daisy-chaining and dt support to 74x164 Maxime Ripard
2012-09-07 12:18 ` [PATCH 1/7] gpio: 74x164: Use module_spi_driver boiler plate function Maxime Ripard
2012-09-07 12:18 ` [PATCH 2/7] gpio: 74x164: Use devm_kzalloc Maxime Ripard
2012-09-07 12:18 ` [PATCH 3/7] gpio: 74x164: Use dynamic gpio number assignment if no pdata is present Maxime Ripard
2012-09-07 14:01   ` Florian Fainelli
2012-09-07 21:04   ` Linus Walleij
2012-09-07 12:18 ` [PATCH 4/7] gpio: 74x164: Add device tree support Maxime Ripard
2012-09-07 21:05   ` Linus Walleij
2012-09-07 12:18 ` [PATCH 5/7] gpio: 74x164: Add support for the daisy-chaining Maxime Ripard
2012-09-07 14:03   ` Florian Fainelli
2012-09-07 21:08     ` Linus Walleij
2012-09-07 21:07   ` Linus Walleij
2012-09-10  1:51     ` Shawn Guo
2012-09-11 16:57       ` Linus Walleij
2012-09-12  2:07         ` Shawn Guo
2012-09-07 12:18 ` [PATCH 6/7] gpio: 74x164: dts: Add documentation for the dt binding Maxime Ripard
2012-09-07 12:18 ` [PATCH 7/7] ARM: dts: cfa10049: Add the 74HC595 gpio expanders Maxime Ripard
2012-09-10  2:23   ` Shawn Guo
2012-09-10  9:27     ` Maxime Ripard

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).