[PATCH] spi: bcm2835: transform native-cs to gpio-cs on first spi_setup
Stephen Warren
swarren at wwwdotorg.org
Mon Apr 6 20:01:15 PDT 2015
On 04/06/2015 11:16 AM, kernel at martin.sperl.org wrote:
> From: Martin Sperl <kernel at martin.sperl.org>
>
> Transforms the bcm-2835 native SPI-chip select to their gpio-cs equivalent.
>
> This allows for some support of some optimizations that are not
> possible due to HW-gliches on the CS line - especially filling
> the FIFO before enabling SPI interrupts (by writing to CS register)
> while the transfer is already in progress (See commit: e3a2be3030e2)
>
> This patch also works arround some issues in bcm2835-pinctrl which does not
> set the value when setting the GPIO as output - it just sets up output and
> (typically) leaves the GPIO as low. When a fix for this is merged then this
> gpio_set_value can get removed from bcm2835_spi_setup.
> diff --git a/drivers/spi/spi-bcm2835.c b/drivers/spi/spi-bcm2835.c
> @@ -360,13 +367,45 @@ static int bcm2835_spi_setup(struct spi_device *spi)
> return 0;
> if (gpio_is_valid(spi->cs_gpio))
> return 0;
> - if (spi->chip_select < 3)
> + if (spi->chip_select > 1) {
> + /* error in the case of native CS requested with CS > 1
> + * officially there is a CS2, but it is not documented
> + * which GPIO is connected with that...
> + */
> + dev_err(&spi->dev,
> + "setup: only two native chip-selects are supported\n");
I believe the bcm283x have 2 types of SPI controller. There is 1
instance of the HW that this driver controls (SPI0), and that has CS0,
CS1. There are two instances of a different SPI HW block (SPI1, SPI2),
and those each have CS0, CS1, CS2. At least, that's my interpretation of
the table that shows the pinctrl module's per-pin alternate function values.
> + return -EINVAL;
> + }
> + /* now translate native cs to GPIO */
> +
> + /* get the gpio chip for the base */
> + chip = gpiochip_find("pinctrl-bcm2835", chip_match_name);
> + if (!chip)
> return 0;
Should that be an error? Not being able to find the gpiochip implies the
code can't manipulate the CS lines at all, I think?
More information about the linux-rpi-kernel
mailing list