diff options
Diffstat (limited to 'target/linux/bcm27xx/patches-5.4/950-0789-Revert-spi-spi-bcm2835-Disable-forced-software-CS.patch')
-rw-r--r-- | target/linux/bcm27xx/patches-5.4/950-0789-Revert-spi-spi-bcm2835-Disable-forced-software-CS.patch | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.4/950-0789-Revert-spi-spi-bcm2835-Disable-forced-software-CS.patch b/target/linux/bcm27xx/patches-5.4/950-0789-Revert-spi-spi-bcm2835-Disable-forced-software-CS.patch new file mode 100644 index 0000000000..1479335217 --- /dev/null +++ b/target/linux/bcm27xx/patches-5.4/950-0789-Revert-spi-spi-bcm2835-Disable-forced-software-CS.patch @@ -0,0 +1,59 @@ +From 1d78f72cb5a387922870e2a54228be25f84f95f6 Mon Sep 17 00:00:00 2001 +From: Phil Elwell <phil@raspberrypi.com> +Date: Tue, 16 Jun 2020 10:23:29 +0100 +Subject: [PATCH] Revert "spi: spi-bcm2835: Disable forced software + CS" + +This reverts commit 2697f0186db346176832b8eb79adaf5c874681e8. + +See: https://github.com/raspberrypi/linux/pull/3687 +--- + drivers/spi/spi-bcm2835.c | 37 +++++++++++++++++++++++++++++++++++++ + 1 file changed, 37 insertions(+) + +--- a/drivers/spi/spi-bcm2835.c ++++ b/drivers/spi/spi-bcm2835.c +@@ -1235,6 +1235,43 @@ static int bcm2835_spi_setup(struct 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; + } + |