| From f5dae6cd3d6f933bd1d57e6965ae7cec716403bb Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 30 Mar 2019 09:31:02 +0000 |
| Subject: spi: bcm2835aux: fix driver to not allow 65535 (=-1) cs-gpios |
| |
| From: Martin Sperl <kernel@martin.sperl.org> |
| |
| [ Upstream commit 509c583620e9053e43d611bf1614fc3d3abafa96 ] |
| |
| The original driver by default defines num_chipselects as -1. |
| This actually allicates an array of 65535 entries in |
| of_spi_register_master. |
| |
| There is a side-effect for buggy device trees that (contrary to |
| dt-binding documentation) have no cs-gpio defined. |
| |
| This mode was never supported by the driver due to limitations |
| of native cs and additional code complexity and is explicitly |
| not stated to be implemented. |
| |
| To keep backwards compatibility with such buggy DTs we limit |
| the number of chip_selects to 1, as for all practical purposes |
| it is only ever realistic to use a single chip select in |
| native cs mode without negative side-effects. |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/spi/spi-bcm2835aux.c | 13 ++++++++++++- |
| 1 file changed, 12 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/spi/spi-bcm2835aux.c b/drivers/spi/spi-bcm2835aux.c |
| index 5c89bbb05441b..e075712c501e8 100644 |
| --- a/drivers/spi/spi-bcm2835aux.c |
| +++ b/drivers/spi/spi-bcm2835aux.c |
| @@ -416,7 +416,18 @@ static int bcm2835aux_spi_probe(struct platform_device *pdev) |
| platform_set_drvdata(pdev, master); |
| master->mode_bits = (SPI_CPOL | SPI_CS_HIGH | SPI_NO_CS); |
| master->bits_per_word_mask = SPI_BPW_MASK(8); |
| - master->num_chipselect = -1; |
| + /* even though the driver never officially supported native CS |
| + * allow a single native CS for legacy DT support purposes when |
| + * no cs-gpio is configured. |
| + * Known limitations for native cs are: |
| + * * multiple chip-selects: cs0-cs2 are all simultaniously asserted |
| + * whenever there is a transfer - this even includes SPI_NO_CS |
| + * * SPI_CS_HIGH: is ignores - 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 |
| + * a spi_transfer |
| + */ |
| + master->num_chipselect = 1; |
| master->transfer_one = bcm2835aux_spi_transfer_one; |
| master->handle_err = bcm2835aux_spi_handle_err; |
| master->prepare_message = bcm2835aux_spi_prepare_message; |
| -- |
| 2.20.1 |
| |