Unverified Commit aa0162dc authored by Janne Grunau's avatar Janne Grunau Committed by Mark Brown
Browse files

spi: Restore delays for non-GPIO chip select



SPI controller with integrated chip select handling still need to adhere
to SPI device's CS setup, hold and inactive delays. For controller
without set_cs_timing spi core shall handle the delays to avoid
duplicated delay handling in each controller driver.
Fixes a regression for the out of tree SPI controller and SPI HID
transport on Apple M1/M1 Pro/Max notebooks.

Fixes: 4d8ff6b0 ("spi: Add multi-cs memories support in SPI core")
Signed-off-by: default avatarJanne Grunau <j@jannau.net>
Link: https://msgid.link/r/20240311-spi-cs-delays-regression-v1-1-0075020a90b2@jannau.net


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 2ae0ab01
Loading
Loading
Loading
Loading
+14 −10
Original line number Diff line number Diff line
@@ -1063,10 +1063,14 @@ static void spi_set_cs(struct spi_device *spi, bool enable, bool force)
	if (spi->mode & SPI_CS_HIGH)
		enable = !enable;

	if (spi_is_csgpiod(spi)) {
		if (!spi->controller->set_cs_timing && !activate)
	/*
	 * Handle chip select delays for GPIO based CS or controllers without
	 * programmable chip select timing.
	 */
	if ((spi_is_csgpiod(spi) || !spi->controller->set_cs_timing) && !activate)
		spi_delay_exec(&spi->cs_hold, NULL);

	if (spi_is_csgpiod(spi)) {
		if (!(spi->mode & SPI_NO_CS)) {
			/*
			 * Historically ACPI has no means of the GPIO polarity and
@@ -1099,16 +1103,16 @@ static void spi_set_cs(struct spi_device *spi, bool enable, bool force)
		if ((spi->controller->flags & SPI_CONTROLLER_GPIO_SS) &&
		    spi->controller->set_cs)
			spi->controller->set_cs(spi, !enable);
	} else if (spi->controller->set_cs) {
		spi->controller->set_cs(spi, !enable);
	}

		if (!spi->controller->set_cs_timing) {
	if (spi_is_csgpiod(spi) || !spi->controller->set_cs_timing) {
		if (activate)
			spi_delay_exec(&spi->cs_setup, NULL);
		else
			spi_delay_exec(&spi->cs_inactive, NULL);
	}
	} else if (spi->controller->set_cs) {
		spi->controller->set_cs(spi, !enable);
	}
}

#ifdef CONFIG_HAS_DMA