Skip to content

Commit 1a5db1b

Browse files
committed
spi: tegra: handle cs_change in modes sw_based_cs & cs_gpios
Software based chip-select and cs_gpios have this issue. Hardware based chip-select not. Bug: current transfer will de-assert chip-select for rest transfers of current message if cs_change be set. Signed-off-by: turmary <turmary@126.com>
1 parent 49a1656 commit 1a5db1b

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

modules/CAN-HAT/spi-tegra114.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1483,10 +1483,23 @@ static int tegra_spi_transfer_one_message(struct spi_master *master,
14831483
tegra_spi_transfer_delay(xfer->delay_usecs);
14841484
}
14851485
} else if (xfer->cs_change) {
1486+
/*
1487+
* CS should de-asserted
1488+
* at the end of current transfer
1489+
*/
14861490
if (cstate && cstate->cs_gpio_valid)
14871491
gpio_set_value(spi->cs_gpio, gval);
1488-
tegra_spi_writel(tspi, cmd1, SPI_COMMAND1);
1492+
if (!tspi->is_hw_based_cs) {
1493+
u32 cmd1_ncs = (cmd1 & SPI_CS_SS_VAL)
1494+
? cmd1 & ~SPI_CS_SS_VAL
1495+
: cmd1 | SPI_CS_SS_VAL;
1496+
tegra_spi_writel(tspi, cmd1_ncs, SPI_COMMAND1);
1497+
}
14891498
tegra_spi_transfer_delay(xfer->delay_usecs);
1499+
/* CS should asserted again for the next transfer */
1500+
tegra_spi_writel(tspi, cmd1, SPI_COMMAND1);
1501+
if (cstate && cstate->cs_gpio_valid)
1502+
gpio_set_value(spi->cs_gpio, !gval);
14901503
}
14911504

14921505
}

0 commit comments

Comments
 (0)