From: florian@openwrt.org (Florian Fainelli)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 5/7] gpio: 74x164: Add support for the daisy-chaining
Date: Fri, 07 Sep 2012 16:03:11 +0200 [thread overview]
Message-ID: <2796775.6HPOQgPOKV@flexo> (raw)
In-Reply-To: <1347020296-18796-6-git-send-email-maxime.ripard@free-electrons.com>
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
next prev parent reply other threads:[~2012-09-07 14:03 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
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 [this message]
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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2796775.6HPOQgPOKV@flexo \
--to=florian@openwrt.org \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.