]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
gpio: 74x164: support lines-initial-states for boot-time output state
authorChanhong Jung <happycpu@gmail.com>
Wed, 29 Apr 2026 03:51:34 +0000 (12:51 +0900)
committerBartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Wed, 6 May 2026 08:08:11 +0000 (10:08 +0200)
74HC595 and 74LVC594 chains retain their output state from the first
serial write onwards. Today the driver always kicks that first write
from a zero-initialised buffer, so every output comes up low until user
space issues a write. Boards that rely on the chain to drive signals
whose power-on state matters (active-low indicators, reset lines, etc.)
have no way to express the desired initial pattern via DT.

Read the optional lines-initial-states bitmask, recently documented for
this binding, into chip->buffer before the first
__gen_74x164_write_config() so the chain comes up in a known state on
the very first SPI transaction. Bit N maps to GPIO line N (matching the
nxp,pcf8575 convention); on this output-only device, bit=0 drives the
line low and bit=1 drives it high. Property absence keeps the existing
zeroing behaviour intact.

Suggested-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Chanhong Jung <happycpu@gmail.com>
Reviewed-by: Linus Walleij <linusw@kernel.org>
Link: https://patch.msgid.link/20260429035134.1023330-3-happycpu@gmail.com
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
drivers/gpio/gpio-74x164.c

index c226524efebabd596d2fdb0f162ec5d2f2a423d6..5ca61cf5206aa4ee1a33f2cee841e5c65768bc18 100644 (file)
@@ -112,7 +112,7 @@ static int gen_74x164_probe(struct spi_device *spi)
 {
        struct device *dev = &spi->dev;
        struct gen_74x164_chip *chip;
-       u32 nregs;
+       u32 nregs, init_state;
        int ret;
 
        /*
@@ -134,6 +134,21 @@ static int gen_74x164_probe(struct spi_device *spi)
 
        chip->registers = nregs;
 
+       /*
+        * Optionally seed the chain with a board-specified pattern so the
+        * outputs come up in a known state on the first SPI write. The
+        * property follows the nxp,pcf8575 convention where bit N maps to
+        * GPIO line N. On this output-only device, bit=0 drives the line
+        * low and bit=1 drives it high. The bitmask covers up to 32 lines;
+        * any further outputs come up zeroed by devm_kzalloc().
+        */
+       if (!device_property_read_u32(dev, "lines-initial-states", &init_state)) {
+               unsigned int i;
+
+               for (i = 0; i < min(nregs, 4U); i++)
+                       chip->buffer[nregs - 1 - i] = (init_state >> (i * 8)) & 0xff;
+       }
+
        chip->gpiod_oe = devm_gpiod_get_optional(dev, "enable", GPIOD_OUT_LOW);
        if (IS_ERR(chip->gpiod_oe))
                return PTR_ERR(chip->gpiod_oe);