Skip to content

Commit 0c74de5

Browse files
dlechbroonie
authored andcommitted
spi: axi-spi-engine: use message_prepare/unprepare
This modifies the AXI SPI Engine driver to make use of the message_prepare and message_unprepare callbacks. This separates the concerns of allocating and freeing the message state from the transfer_one_message callback. The main benfit of this is so that future callers of spi_finalize_current_message() will not have to do manual cleanup of the state. Signed-off-by: David Lechner <dlechner@baylibre.com> Link: https://lore.kernel.org/r/20231117-axi-spi-engine-series-1-v1-10-cc59db999b87@baylibre.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 7f970ec commit 0c74de5

1 file changed

Lines changed: 34 additions & 12 deletions

File tree

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

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -412,11 +412,7 @@ static irqreturn_t spi_engine_irq(int irq, void *devid)
412412

413413
if (spi_engine->completed_id == st->sync_id) {
414414
struct spi_message *msg = spi_engine->msg;
415-
struct spi_engine_message_state *st = msg->state;
416415

417-
ida_free(&spi_engine->sync_ida, st->sync_id);
418-
kfree(st->p);
419-
kfree(st);
420416
msg->status = 0;
421417
msg->actual_length = msg->frame_length;
422418
spi_engine->msg = NULL;
@@ -436,14 +432,12 @@ static irqreturn_t spi_engine_irq(int irq, void *devid)
436432
return IRQ_HANDLED;
437433
}
438434

439-
static int spi_engine_transfer_one_message(struct spi_controller *host,
440-
struct spi_message *msg)
435+
static int spi_engine_prepare_message(struct spi_controller *host,
436+
struct spi_message *msg)
441437
{
442438
struct spi_engine_program p_dry, *p;
443439
struct spi_engine *spi_engine = spi_controller_get_devdata(host);
444440
struct spi_engine_message_state *st;
445-
unsigned int int_enable = 0;
446-
unsigned long flags;
447441
size_t size;
448442
int ret;
449443

@@ -472,15 +466,41 @@ static int spi_engine_transfer_one_message(struct spi_controller *host,
472466

473467
spi_engine_compile_message(spi_engine, msg, false, p);
474468

475-
spin_lock_irqsave(&spi_engine->lock, flags);
476469
spi_engine_program_add_cmd(p, false, SPI_ENGINE_CMD_SYNC(st->sync_id));
477470

478-
msg->state = st;
479-
spi_engine->msg = msg;
480471
st->p = p;
481-
482472
st->cmd_buf = p->instructions;
483473
st->cmd_length = p->length;
474+
msg->state = st;
475+
476+
return 0;
477+
}
478+
479+
static int spi_engine_unprepare_message(struct spi_controller *host,
480+
struct spi_message *msg)
481+
{
482+
struct spi_engine *spi_engine = spi_controller_get_devdata(host);
483+
struct spi_engine_message_state *st = msg->state;
484+
485+
ida_free(&spi_engine->sync_ida, st->sync_id);
486+
kfree(st->p);
487+
kfree(st);
488+
489+
return 0;
490+
}
491+
492+
static int spi_engine_transfer_one_message(struct spi_controller *host,
493+
struct spi_message *msg)
494+
{
495+
struct spi_engine *spi_engine = spi_controller_get_devdata(host);
496+
struct spi_engine_message_state *st = msg->state;
497+
unsigned int int_enable = 0;
498+
unsigned long flags;
499+
500+
spin_lock_irqsave(&spi_engine->lock, flags);
501+
502+
spi_engine->msg = msg;
503+
484504
if (spi_engine_write_cmd_fifo(spi_engine))
485505
int_enable |= SPI_ENGINE_INT_CMD_ALMOST_EMPTY;
486506

@@ -572,6 +592,8 @@ static int spi_engine_probe(struct platform_device *pdev)
572592
host->bits_per_word_mask = SPI_BPW_MASK(8);
573593
host->max_speed_hz = clk_get_rate(spi_engine->ref_clk) / 2;
574594
host->transfer_one_message = spi_engine_transfer_one_message;
595+
host->prepare_message = spi_engine_prepare_message;
596+
host->unprepare_message = spi_engine_unprepare_message;
575597
host->num_chipselect = 8;
576598

577599
if (host->max_speed_hz == 0)

0 commit comments

Comments
 (0)