Unverified Commit 351007b0 authored by Mark Brown's avatar Mark Brown
Browse files

spi: More refacroings after multi-CS support

Merge series from Andy Shevchenko <andriy.shevchenko@linux.intel.com>:

A couple of additional refactorings on top of the multi-CS support.
One is to make sure that the comment and the code are not disrupted
if additional changes come in the future and second one is f or the
sake of deduplication. In both cases it also makes indentation level
smaller in the affected pieces of the code.

No functional changes intended.
parents bb409962 d707530b
Loading
Loading
Loading
Loading
+33 −30
Original line number Diff line number Diff line
@@ -1018,20 +1018,45 @@ static void spi_res_release(struct spi_controller *ctlr, struct spi_message *mes
}

/*-------------------------------------------------------------------------*/
#define spi_for_each_valid_cs(spi, idx)				\
	for (idx = 0; idx < SPI_CS_CNT_MAX; idx++)		\
		if (!(spi->cs_index_mask & BIT(idx))) {} else

static inline bool spi_is_last_cs(struct spi_device *spi)
{
	u8 idx;
	bool last = false;

	for (idx = 0; idx < SPI_CS_CNT_MAX; idx++) {
		if (spi->cs_index_mask & BIT(idx)) {
	spi_for_each_valid_cs(spi, idx) {
		if (spi->controller->last_cs[idx] == spi_get_chipselect(spi, idx))
			last = true;
	}
	}
	return last;
}

static void spi_toggle_csgpiod(struct spi_device *spi, u8 idx, bool enable, bool activate)
{
	/*
	 * Historically ACPI has no means of the GPIO polarity and
	 * thus the SPISerialBus() resource defines it on the per-chip
	 * basis. In order to avoid a chain of negations, the GPIO
	 * polarity is considered being Active High. Even for the cases
	 * when _DSD() is involved (in the updated versions of ACPI)
	 * the GPIO CS polarity must be defined Active High to avoid
	 * ambiguity. That's why we use enable, that takes SPI_CS_HIGH
	 * into account.
	 */
	if (has_acpi_companion(&spi->dev))
		gpiod_set_value_cansleep(spi_get_csgpiod(spi, idx), !enable);
	else
		/* Polarity handled by GPIO library */
		gpiod_set_value_cansleep(spi_get_csgpiod(spi, idx), activate);

	if (activate)
		spi_delay_exec(&spi->cs_setup, NULL);
	else
		spi_delay_exec(&spi->cs_inactive, NULL);
}

static void spi_set_cs(struct spi_device *spi, bool enable, bool force)
{
@@ -1068,31 +1093,9 @@ static void spi_set_cs(struct spi_device *spi, bool enable, bool force)

	if (spi_is_csgpiod(spi)) {
		if (!(spi->mode & SPI_NO_CS)) {
			/*
			 * Historically ACPI has no means of the GPIO polarity and
			 * thus the SPISerialBus() resource defines it on the per-chip
			 * basis. In order to avoid a chain of negations, the GPIO
			 * polarity is considered being Active High. Even for the cases
			 * when _DSD() is involved (in the updated versions of ACPI)
			 * the GPIO CS polarity must be defined Active High to avoid
			 * ambiguity. That's why we use enable, that takes SPI_CS_HIGH
			 * into account.
			 */
			for (idx = 0; idx < SPI_CS_CNT_MAX; idx++) {
				if ((spi->cs_index_mask & BIT(idx)) && spi_get_csgpiod(spi, idx)) {
					if (has_acpi_companion(&spi->dev))
						gpiod_set_value_cansleep(spi_get_csgpiod(spi, idx),
									 !enable);
					else
						/* Polarity handled by GPIO library */
						gpiod_set_value_cansleep(spi_get_csgpiod(spi, idx),
									 activate);

					if (activate)
						spi_delay_exec(&spi->cs_setup, NULL);
					else
						spi_delay_exec(&spi->cs_inactive, NULL);
				}
			spi_for_each_valid_cs(spi, idx) {
				if (spi_get_csgpiod(spi, idx))
					spi_toggle_csgpiod(spi, idx, enable, activate);
			}
		}
		/* Some SPI masters need both GPIO CS & slave_select */