On Thu, Mar 4, 2021 at 12:48 AM Linus Walleij <linus.walleij@xxxxxxxxxx> wrote: > On Thu, Mar 4, 2021 at 4:42 AM Brad Larson <brad@xxxxxxxxxxx> wrote: > > > The Pensando Elba SoC uses a GPIO based chip select > > for two DW SPI busses with each bus having two > > chip selects. > > > > Signed-off-by: Brad Larson <brad@xxxxxxxxxxx> > > I agree with Serge's comments here: the existing cs callback should > work for your SoC, you should only need the new compatible string. > > I see why you need the special GPIO driver for this now, as that > is obviously driven by totally different hardware. > > Yours, > Linus Walleij Thanks Serge and Linus for the review. In the SPI driver, the reason we need our own set_cs function is that our DW SPI controller only supports intrinsic 2 chip-select pins. This is the standard DW set_cs function: void dw_spi_set_cs(struct spi_device *spi, bool enable) { struct dw_spi *dws = spi_controller_get_devdata(spi->controller); bool cs_high = !!(spi->mode & SPI_CS_HIGH); /* * DW SPI controller demands any native CS being set in order to * proceed with data transfer. So in order to activate the SPI * communications we must set a corresponding bit in the Slave * Enable register no matter whether the SPI core is configured to * support active-high or active-low CS level. */ if (cs_high == enable) dw_writel(dws, DW_SPI_SER, BIT(spi->chip_select)); else dw_writel(dws, DW_SPI_SER, 0); } The dw_writel function argument DW_SPI_SER, BIT(spi->chip_select) works for chip-select 0 & 1, but not for 2 & 3, as the IP only implements bits [1:0] in the DW_SPI_SER register. In the Elba SoC we require GPIO-style chip-selects, our own set_cs function, and we always use bit 0 of DW_SPI_SER to start the serial machine, not as a chip-select control. In the dw_spi_set_cs() function the below else clause is never taken and leads to confusion. } else { /* * Using the intrinsic DW chip-select; set the * appropriate CS. */ dw_writel(dws, DW_SPI_SER, BIT(spi->chip_select)); } This else clause will be removed in patch set V2. I tried the generic dw_spi_set_cs() thinking it would just start the serial machine while the Elba spics drives the gpio chip select, that didn't work. I will take another look at it as I work on V2 of the patchset to see exactly what breaks during spi init. Best, Brad