Re: [PATCH v3 2/6] spi: support simultaneous assertion of multiple CS
From: Andy Shevchenko
Date: Tue Aug 18 2026 - 02:40:20 EST
On Mon, Aug 17, 2026 at 08:32:43PM -0300, Jonathan Santos wrote:
> Some SPI controllers allow multiple CS lines to be toggled at the same
> time. The existing code always used CS index 0 when tracking the last
> active CS in spi_set_cs(), and unconditionally set cs_index_mask to
> BIT(0) when parsing DT, both forcing the single CS usage.
>
> Modify spi_set_cs() to iterate last_cs[] using each logical CS index
> instead of always reading index 0. Modify of_spi_parse_dt() to build
> cs_index_mask from all parsed CS entries rather than hardcoding BIT(0),
> so the controller correctly identifies which CS lines belong to a device
> when asserting them simultaneously.
>
> Board info, ACPI, and ancillary device paths are not updated here.
> Board info would require an API change to accept an array of CS values
> and is left for a follow-up when we have a use case for this. Ancillary
> devices are by design single-CS, so multi-CS is not a current use case for
> them. ACPI represents the CS as a 64-bit integer with no established
> convention for encoding multiple CS indices yet, so any extension there
> would require a separate specification effort.
...
> /*
> - * By default spi->chip_select[0] will hold the physical CS number,
> - * so set bit 0 in spi->cs_index_mask.
> + * Set cs_index_mask to indicate which logical CS indices are active.
> + * Each bit corresponds to a logical CS index in the spi->chip_select array.
> */
> - spi->cs_index_mask = BIT(0);
> + for (idx = 0; idx < rc; idx++)
> + spi->cs_index_mask |= BIT(idx);
Maybe I'm missing something, but isn't it a simple mask, and for-loop is not
required?
spi->cs_index_mask = BIT(rc + 1) - 1;
OR
spi->cs_index_mask = GENMASK(rc, 0); // This is better as it supports rc to be 32 or 64
--
With Best Regards,
Andy Shevchenko