Hi Charles! Thanks for finding this! On Tue, Nov 26, 2019 at 5:41 PM Charles Keepax <ckeepax@xxxxxxxxxxxxxxxxxxxxx> wrote: > To fix a regression on the Cadence SPI driver, this patch reverts > commit 6046f5407ff0 ("spi: cadence: Fix default polarity of native > chipselect"). > > This patch was not the correct fix for the issue. The SPI framework > calls the set_cs line with the logic level it desires on the chip select > line, as such the old is_high handling was correct. However, this was > broken by the fact that before commit 3e5ec1db8bfe ("spi: Fix SPI_CS_HIGH > setting when using native and GPIO CS") all controllers that offered > the use of a GPIO chip select had SPI_CS_HIGH applied, even for hardware > chip selects. This caused the value passed into the driver to be inverted. > Which unfortunately makes it look like a logical enable the chip select > value. > > Since the core was corrected to not unconditionally apply SPI_CS_HIGH, > the Cadence driver, whilst using the hardware chip select, will deselect > the chip select every time we attempt to communicate with the device, > which results in failed communications. > > Fixes: 3e5ec1db8bfe ("spi: Fix SPI_CS_HIGH setting when using native and GPIO CS") > Signed-off-by: Charles Keepax <ckeepax@xxxxxxxxxxxxxxxxxxxxx> I kind of get it... I think. I see it fixes a patch that I was not CC:ed on, which is a bit unfortunate as it tries to fix something I wrote, but such things happen. The original patch f3186dd87669 ("spi: Optionally use GPIO descriptors for CS GPIOs") came with the assumption that native chip select handler needed was to be converted to always expect a true (1) value to their ->set_cs() callbacks for asserting chip select, and this was one of the drivers augmented to expect that. As 3e5ec1db8bfe ("spi: Fix SPI_CS_HIGH setting when using native and GPIO CS") essentially undo that semantic change and switches back to the old semantic, all the drivers that were converted to expect a high input to their ->set_cs() callbacks for asserting CS need to be reverted back as well, but that didn't happen. So we need to fix not just cadence but also any other driver setting ->use_gpio_descriptors() and also supplying their own ->set_cs() callback and expecting this behaviour, or the fix will have fixed broken a bunch of drivers. But we are lucky: there aren't many of them. In addition to spi-cadence.c this seems to affect only spi-dw.c and I suppose that is what Gregory was using? Or something else? Yours, Linus Walleij