Skip to content

Commit 145bb2a

Browse files
dlechbroonie
authored andcommitted
spi: axi-spi-engine: add support for cs_off
This adds support for the spi_transfer::cs_off flag to the AXI SPI Engine driver. The logic is copied from the generic spi_transfer_one_message() in spi.c. Signed-off-by: David Lechner <dlechner@baylibre.com> Link: https://lore.kernel.org/r/20231117-axi-spi-engine-series-1-v1-13-cc59db999b87@baylibre.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 4e99144 commit 145bb2a

1 file changed

Lines changed: 21 additions & 10 deletions

File tree

drivers/spi/spi-axi-spi-engine.c

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -216,14 +216,17 @@ static int spi_engine_compile_message(struct spi_engine *spi_engine,
216216
struct spi_device *spi = msg->spi;
217217
struct spi_transfer *xfer;
218218
int clk_div, new_clk_div;
219-
bool cs_change = true;
219+
bool keep_cs = false;
220220

221221
clk_div = -1;
222222

223223
spi_engine_program_add_cmd(p, dry,
224224
SPI_ENGINE_CMD_WRITE(SPI_ENGINE_CMD_REG_CONFIG,
225225
spi_engine_get_config(spi)));
226226

227+
xfer = list_first_entry(&msg->transfers, struct spi_transfer, transfer_list);
228+
spi_engine_gen_cs(p, dry, spi, !xfer->cs_off);
229+
227230
list_for_each_entry(xfer, &msg->transfers, transfer_list) {
228231
new_clk_div = spi_engine_get_clk_div(spi_engine, spi, xfer);
229232
if (new_clk_div != clk_div) {
@@ -233,20 +236,28 @@ static int spi_engine_compile_message(struct spi_engine *spi_engine,
233236
clk_div));
234237
}
235238

236-
if (cs_change)
237-
spi_engine_gen_cs(p, dry, spi, true);
238-
239239
spi_engine_gen_xfer(p, dry, xfer);
240240
spi_engine_gen_sleep(p, dry, spi_engine, clk_div, xfer);
241241

242-
cs_change = xfer->cs_change;
243-
if (list_is_last(&xfer->transfer_list, &msg->transfers))
244-
cs_change = !cs_change;
245-
246-
if (cs_change)
247-
spi_engine_gen_cs(p, dry, spi, false);
242+
if (xfer->cs_change) {
243+
if (list_is_last(&xfer->transfer_list, &msg->transfers)) {
244+
keep_cs = true;
245+
} else {
246+
if (!xfer->cs_off)
247+
spi_engine_gen_cs(p, dry, spi, false);
248+
249+
if (!list_next_entry(xfer, transfer_list)->cs_off)
250+
spi_engine_gen_cs(p, dry, spi, true);
251+
}
252+
} else if (!list_is_last(&xfer->transfer_list, &msg->transfers) &&
253+
xfer->cs_off != list_next_entry(xfer, transfer_list)->cs_off) {
254+
spi_engine_gen_cs(p, dry, spi, xfer->cs_off);
255+
}
248256
}
249257

258+
if (!keep_cs)
259+
spi_engine_gen_cs(p, dry, spi, false);
260+
250261
return 0;
251262
}
252263

0 commit comments

Comments
 (0)