aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/omap_hsi
diff options
context:
space:
mode:
authorDjamil Elaidi <d-elaidi@ti.com>2011-09-15 17:12:11 +0200
committerZiyann <jaraidaniel@gmail.com>2014-10-01 12:59:29 +0200
commit2a9e7d0c4375d69ca1dd7dc29632a7f7d6b92b94 (patch)
tree16c62052eacb68873733eafbb2c93753fe409823 /drivers/omap_hsi
parent11c9373bfdda87137e8a4025a628aabd409d30c1 (diff)
downloadkernel_samsung_tuna-2a9e7d0c4375d69ca1dd7dc29632a7f7d6b92b94.zip
kernel_samsung_tuna-2a9e7d0c4375d69ca1dd7dc29632a7f7d6b92b94.tar.gz
kernel_samsung_tuna-2a9e7d0c4375d69ca1dd7dc29632a7f7d6b92b94.tar.bz2
OMAP3+: xSI: Add FIFO flush after R/W cancel
When hsi_read_cancel is called, it simply cancels the DMA or acknowledge the RX interrupt. But data in the FIFO remains present, which can cause next hsi_read to contain up to 8 garbage (old) frames (as FIFO size is 8 frames) in the beginning of the reception. Same for TX side. Change-Id: I946d05120815def27fe401677e24c37ca8a6532e Signed-off-by: Djamil Elaidi <d-elaidi@ti.com>
Diffstat (limited to 'drivers/omap_hsi')
-rw-r--r--drivers/omap_hsi/hsi_driver_if.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/drivers/omap_hsi/hsi_driver_if.c b/drivers/omap_hsi/hsi_driver_if.c
index dff1119..98159bc 100644
--- a/drivers/omap_hsi/hsi_driver_if.c
+++ b/drivers/omap_hsi/hsi_driver_if.c
@@ -516,9 +516,16 @@ int __hsi_write_cancel(struct hsi_channel *ch)
err = hsi_driver_cancel_write_dma(ch);
else
dev_dbg(ch->dev->device.parent, "%s : Nothing to cancel %d\n",
- __func__, ch->write_data.size);
- dev_err(ch->dev->device.parent, "%s : %d\n", __func__, err);
- return err;
+ __func__, ch->write_data.size);
+
+ /* Trash any frame still in the FIFO */
+ hsi_hst_fifo_flush_channel(ch->hsi_port->hsi_controller,
+ ch->hsi_port->port_number,
+ ch->channel_number);
+
+ dev_dbg(ch->dev->device.parent, "%s : %d\n", __func__, err);
+
+ return err;
}
/**
@@ -572,7 +579,13 @@ int __hsi_read_cancel(struct hsi_channel *ch)
dev_dbg(ch->dev->device.parent, "%s : Nothing to cancel %d\n",
__func__, ch->read_data.size);
- dev_err(ch->dev->device.parent, "%s : %d\n", __func__, err);
+ /* Trash any frame still in the FIFO */
+ hsi_hsr_fifo_flush_channel(ch->hsi_port->hsi_controller,
+ ch->hsi_port->port_number,
+ ch->channel_number);
+
+ dev_dbg(ch->dev->device.parent, "%s : %d\n", __func__, err);
+
return err;
}