Skip to content

Commit

Permalink
Blackfin SPI Driver: add timeout while waiting for SPIF in dma irq ha…
Browse files Browse the repository at this point in the history
…ndler

The "while" endless loop will cause the system hang if hardware error, so
we add timeout control to make the system alive.

Signed-off-by: Mike Frysinger <vapier.adi@gmail.com>
Signed-off-by: Bryan Wu <cooloney@kernel.org>
Cc: David Brownell <david-b@pacbell.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Mike Frysinger authored and Linus Torvalds committed Apr 7, 2009
1 parent 11d6f59 commit aaaf939
Showing 1 changed file with 11 additions and 1 deletion.
12 changes: 11 additions & 1 deletion drivers/spi/spi_bfin5xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -557,6 +557,7 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id)
struct driver_data *drv_data = dev_id;
struct chip_data *chip = drv_data->cur_chip;
struct spi_message *msg = drv_data->cur_msg;
unsigned long timeout;
unsigned short dmastat = get_dma_curr_irqstat(drv_data->dma_channel);
u16 spistat = read_STAT(drv_data);

Expand All @@ -582,8 +583,17 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id)
cpu_relax();
}

dev_dbg(&drv_data->pdev->dev,
"in dma_irq_handler dmastat:0x%x spistat:0x%x\n",
dmastat, read_STAT(drv_data));

timeout = jiffies + HZ;
while (!(read_STAT(drv_data) & SPIF))
cpu_relax();
if (!time_before(jiffies, timeout)) {
dev_warn(&drv_data->pdev->dev, "timeout waiting for SPIF");
break;
} else
cpu_relax();

if ((dmastat & DMA_ERR) && (spistat & RBSY)) {
msg->state = ERROR_STATE;
Expand Down

0 comments on commit aaaf939

Please sign in to comment.