|
@@ -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);
|
|
|
|
|
@@ -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;
|