]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
spi: soft_spi: Parse cs-gpios only if num-chipselects is not <0>
authorMichael Polyntsov <michael.polyntsov@iopsys.eu>
Wed, 31 Jul 2024 04:11:29 +0000 (08:11 +0400)
committerTom Rini <trini@konsulko.com>
Thu, 15 Aug 2024 17:28:47 +0000 (11:28 -0600)
Some boards don't have chipselect lines for leds so cs-gpios is not
specified in the dts leading to probing error. Fix it by making
behavior similar to the one in Linux, parse num-chipselects and
if it is zero, ignore cs-gpios.

Signed-off-by: Michael Polyntsov <michael.polyntsov@iopsys.eu>
Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
doc/device-tree-bindings/spi/soft-spi.txt
drivers/spi/soft_spi.c

index bdf7e86befb9893221f5f654a8f3564f967d70ff..77b01b2fd9a8c78475a0309cecabf62edc884514 100644 (file)
@@ -8,14 +8,15 @@ The soft SPI node requires the following properties:
 
 Mandatory properties:
 compatible: "spi-gpio"
-cs-gpios: GPIOs to use for SPI chip select (output)
+cs-gpios: GPIOs to use for SPI chip select (output), not required if num-chipselects = <0>
 sck-gpios: GPIO to use for SPI clock (output)
 And at least one of:
 mosi-gpios: GPIO to use for SPI MOSI line (output)
 miso-gpios: GPIO to use for SPI MISO line (input)
 
-Optional propertie:
+Optional properties:
 spi-delay-us: Number of microseconds of delay between each CS transition
+num-chipselects: Number of chipselect lines
 
 The GPIOs should be specified as required by the GPIO controller referenced.
 The first cell holds the phandle of the controller and the second cell
index 04691d3a3ba36727f81bcc10f0f5d87e5eda12f2..a8ec2f4f7b4531b5698cd231e214e4e639186d18 100644 (file)
@@ -237,6 +237,18 @@ static int soft_spi_of_to_plat(struct udevice *dev)
        return 0;
 }
 
+static int retrieve_num_chipselects(struct udevice *dev)
+{
+       int chipselects;
+       int ret;
+
+       ret = ofnode_read_u32(dev_ofnode(dev), "num-chipselects", &chipselects);
+       if (ret)
+               return ret;
+
+       return chipselects;
+}
+
 static int soft_spi_probe(struct udevice *dev)
 {
        struct spi_slave *slave = dev_get_parent_priv(dev);
@@ -249,7 +261,15 @@ static int soft_spi_probe(struct udevice *dev)
 
        ret = gpio_request_by_name(dev, "cs-gpios", 0, &plat->cs,
                                   GPIOD_IS_OUT | cs_flags);
-       if (ret)
+       /*
+        * If num-chipselects is zero we're ignoring absence of cs-gpios. This
+        * code relies on the fact that `gpio_request_by_name` call above
+        * initiailizes plat->cs to correct value with invalid GPIO even when
+        * there is no cs-gpios node in dts. All other functions which work
+        * with plat->cs verify it via `dm_gpio_is_valid` before using it, so
+        * such value doesn't cause any problems.
+        */
+       if (ret && retrieve_num_chipselects(dev) != 0)
                return -EINVAL;
 
        ret = gpio_request_by_name(dev, "gpio-sck", 0, &plat->sclk,