Skip to content

Commit

Permalink
spi/spi-atmel: status information passed through controller data
Browse files Browse the repository at this point in the history
The status of transfer is stored in controller data structure
so that it can be used not only by atmel_spi_msg_done() function.
This will be useful for upcoming dmaengine enabled driver.

Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
  • Loading branch information
Nicolas Ferre authored and Mark Brown committed Apr 1, 2013
1 parent 1888e8f commit 823cd04
Showing 1 changed file with 8 additions and 5 deletions.
13 changes: 8 additions & 5 deletions drivers/spi/spi-atmel.c
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,7 @@ struct atmel_spi {
unsigned long current_remaining_bytes;
struct spi_transfer *next_transfer;
unsigned long next_remaining_bytes;
int done_status;

void *buffer;
dma_addr_t buffer_dma;
Expand Down Expand Up @@ -553,15 +554,15 @@ static void atmel_spi_dma_unmap_xfer(struct spi_master *master,

static void
atmel_spi_msg_done(struct spi_master *master, struct atmel_spi *as,
struct spi_message *msg, int status, int stay)
struct spi_message *msg, int stay)
{
if (!stay || status < 0)
if (!stay || as->done_status < 0)
cs_deactivate(as, msg->spi);
else
as->stay = msg->spi;

list_del(&msg->queue);
msg->status = status;
msg->status = as->done_status;

dev_dbg(master->dev.parent,
"xfer complete: %u bytes transferred\n",
Expand All @@ -573,6 +574,7 @@ atmel_spi_msg_done(struct spi_master *master, struct atmel_spi *as,

as->current_transfer = NULL;
as->next_transfer = NULL;
as->done_status = 0;

/* continue if needed */
if (list_empty(&as->queue) || as->stopping)
Expand Down Expand Up @@ -650,7 +652,8 @@ atmel_spi_interrupt(int irq, void *dev_id)
/* Clear any overrun happening while cleaning up */
spi_readl(as, SR);

atmel_spi_msg_done(master, as, msg, -EIO, 0);
as->done_status = -EIO;
atmel_spi_msg_done(master, as, msg, 0);
} else if (pending & (SPI_BIT(RXBUFF) | SPI_BIT(ENDRX))) {
ret = IRQ_HANDLED;

Expand All @@ -668,7 +671,7 @@ atmel_spi_interrupt(int irq, void *dev_id)

if (atmel_spi_xfer_is_last(msg, xfer)) {
/* report completed message */
atmel_spi_msg_done(master, as, msg, 0,
atmel_spi_msg_done(master, as, msg,
xfer->cs_change);
} else {
if (xfer->cs_change) {
Expand Down

0 comments on commit 823cd04

Please sign in to comment.