Revert "spi: spi-bcm2835: Disable forced software CS"
authorPhil Elwell <phil@raspberrypi.com>
Tue, 16 Jun 2020 09:23:29 +0000 (10:23 +0100)
committerpopcornmix <popcornmix@gmail.com>
Wed, 1 Jul 2020 15:34:12 +0000 (16:34 +0100)
This reverts commit 2697f0186db346176832b8eb79adaf5c874681e8.

See: https://github.com/raspberrypi/linux/pull/3687

drivers/spi/spi-bcm2835.c

index c2e7a2d..9dccfba 100644 (file)
@@ -1283,6 +1283,43 @@ static int bcm2835_spi_setup(struct spi_device *spi)
                return -EINVAL;
        }
 
+       /*
+        * Translate native CS to GPIO
+        *
+        * FIXME: poking around in the gpiolib internals like this is
+        * not very good practice. Find a way to locate the real problem
+        * and fix it. Why is the GPIO descriptor in spi->cs_gpiod
+        * sometimes not assigned correctly? Erroneous device trees?
+        */
+
+       /* get the gpio chip for the base */
+       chip = gpiochip_find("pinctrl-bcm2835", chip_match_name);
+       if (!chip)
+               return 0;
+
+       /*
+        * Retrieve the corresponding GPIO line used for CS.
+        * The inversion semantics will be handled by the GPIO core
+        * code, so we pass GPIOS_OUT_LOW for "unasserted" and
+        * the correct flag for inversion semantics. The SPI_CS_HIGH
+        * on spi->mode cannot be checked for polarity in this case
+        * as the flag use_gpio_descriptors enforces SPI_CS_HIGH.
+        */
+       if (of_property_read_bool(spi->dev.of_node, "spi-cs-high"))
+               lflags = GPIO_ACTIVE_HIGH;
+       else
+               lflags = GPIO_ACTIVE_LOW;
+       spi->cs_gpiod = gpiochip_request_own_desc(chip, 8 - spi->chip_select,
+                                                 DRV_NAME,
+                                                 lflags,
+                                                 GPIOD_OUT_LOW);
+       if (IS_ERR(spi->cs_gpiod))
+               return PTR_ERR(spi->cs_gpiod);
+
+       /* and set up the "mode" and level */
+       dev_info(&spi->dev, "setting up native-CS%i to use GPIO\n",
+                spi->chip_select);
+
        return 0;
 }