aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi_bfin5xx.c
diff options
context:
space:
mode:
authorMike Frysinger <vapier.adi@gmail.com>2009-04-06 22:00:42 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2009-04-07 11:31:05 -0400
commitaaaf939c573b783398b6af863576322256352f64 (patch)
tree41784ef46eca1e51db79b82877ad9ca173361e76 /drivers/spi/spi_bfin5xx.c
parent11d6f5995137ba4dc49e9337185ac0a8753f8f69 (diff)
Blackfin SPI Driver: add timeout while waiting for SPIF in dma irq handler
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>
Diffstat (limited to 'drivers/spi/spi_bfin5xx.c')
-rw-r--r--drivers/spi/spi_bfin5xx.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/spi/spi_bfin5xx.c b/drivers/spi/spi_bfin5xx.c
index 88dee87fc420..e706de1d10c8 100644
--- a/drivers/spi/spi_bfin5xx.c
+++ b/drivers/spi/spi_bfin5xx.c
@@ -557,6 +557,7 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id)
557 struct driver_data *drv_data = dev_id; 557 struct driver_data *drv_data = dev_id;
558 struct chip_data *chip = drv_data->cur_chip; 558 struct chip_data *chip = drv_data->cur_chip;
559 struct spi_message *msg = drv_data->cur_msg; 559 struct spi_message *msg = drv_data->cur_msg;
560 unsigned long timeout;
560 unsigned short dmastat = get_dma_curr_irqstat(drv_data->dma_channel); 561 unsigned short dmastat = get_dma_curr_irqstat(drv_data->dma_channel);
561 u16 spistat = read_STAT(drv_data); 562 u16 spistat = read_STAT(drv_data);
562 563
@@ -582,8 +583,17 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id)
582 cpu_relax(); 583 cpu_relax();
583 } 584 }
584 585
586 dev_dbg(&drv_data->pdev->dev,
587 "in dma_irq_handler dmastat:0x%x spistat:0x%x\n",
588 dmastat, read_STAT(drv_data));
589
590 timeout = jiffies + HZ;
585 while (!(read_STAT(drv_data) & SPIF)) 591 while (!(read_STAT(drv_data) & SPIF))
586 cpu_relax(); 592 if (!time_before(jiffies, timeout)) {
593 dev_warn(&drv_data->pdev->dev, "timeout waiting for SPIF");
594 break;
595 } else
596 cpu_relax();
587 597
588 if ((dmastat & DMA_ERR) && (spistat & RBSY)) { 598 if ((dmastat & DMA_ERR) && (spistat & RBSY)) {
589 msg->state = ERROR_STATE; 599 msg->state = ERROR_STATE;