]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
spi: bcm2835aux: warn in dmesg that native cs is not really supported
authorMartin Sperl <kernel@martin.sperl.org>
Sat, 30 Mar 2019 09:31:03 +0000 (09:31 +0000)
committerMark Brown <broonie@kernel.org>
Wed, 3 Apr 2019 04:31:51 +0000 (11:31 +0700)
From personal bad experience (even as the author of the original driver)
it shows that native-cs is "somewhat" supported by the spi bus driver
when using a buggy device tree.

So make sure that the driver is warning in dmesg about this fact
that we are running in a not supported mode that may have surprizing
limitations.

Fixes: 1ea29b39f4c812ec ("spi: bcm2835aux: add bcm2835 auxiliary spi device...")
Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
Acked-by: Stefan Wahren <stefan.wahren@i2se.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-bcm2835aux.c

index c8acde017b6aee1ce2a61976378bad518312ea8f..a105db37141765a3e59aa0d29b0e1a1c65450478 100644 (file)
@@ -396,6 +396,38 @@ static void bcm2835aux_spi_handle_err(struct spi_master *master,
        bcm2835aux_spi_reset_hw(bs);
 }
 
+static int bcm2835aux_spi_setup(struct spi_device *spi)
+{
+       int ret;
+
+       /* sanity check for native cs */
+       if (spi->mode & SPI_NO_CS)
+               return 0;
+       if (gpio_is_valid(spi->cs_gpio))
+               return 0;
+
+       /* for dt-backwards compatibility: only support native on CS0
+        * known things not supported with broken native CS:
+        * * multiple chip-selects: cs0-cs2 are all
+        *     simultaniously asserted whenever there is a transfer
+        *     this even includes SPI_NO_CS
+        * * SPI_CS_HIGH: cs are always asserted low
+        * * cs_change: cs is deasserted after each spi_transfer
+        * * cs_delay_usec: cs is always deasserted one SCK cycle
+        *     after the last transfer
+        * probably more...
+        */
+       dev_warn(&spi->dev,
+                "Native CS is not supported - please configure cs-gpio in device-tree\n");
+
+       if (spi->chip_select == 0)
+               return 0;
+
+       dev_warn(&spi->dev, "Native CS is not working for cs > 0\n");
+
+       return -EINVAL;
+}
+
 static int bcm2835aux_spi_probe(struct platform_device *pdev)
 {
        struct spi_master *master;
@@ -425,6 +457,7 @@ static int bcm2835aux_spi_probe(struct platform_device *pdev)
         *     a spi_transfer
         */
        master->num_chipselect = 1;
+       master->setup = bcm2835aux_spi_setup;
        master->transfer_one = bcm2835aux_spi_transfer_one;
        master->handle_err = bcm2835aux_spi_handle_err;
        master->prepare_message = bcm2835aux_spi_prepare_message;