diff options
author | Djamil Elaidi <d-elaidi@ti.com> | 2011-09-15 17:12:11 +0200 |
---|---|---|
committer | Ziyann <jaraidaniel@gmail.com> | 2014-10-01 12:59:29 +0200 |
commit | 2a9e7d0c4375d69ca1dd7dc29632a7f7d6b92b94 (patch) | |
tree | 16c62052eacb68873733eafbb2c93753fe409823 /drivers/omap_hsi | |
parent | 11c9373bfdda87137e8a4025a628aabd409d30c1 (diff) | |
download | kernel_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.c | 21 |
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; } |