diff options
author | Shreshtha Kumar Sahu <shreshthakumar.sahu@stericsson.com> | 2011-06-13 04:11:33 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-06-16 15:01:57 -0400 |
commit | c16d51a32bbb61ac8fd96f78b5ce2fccfe0fb4c3 (patch) | |
tree | 3899f24f4b1cc06e24055952f1d9114dc493caf0 /include/linux/amba | |
parent | 57f2104f39995bac332ddc492fbf60aa28e0c35e (diff) |
amba pl011: workaround for uart registers lockup
This workaround aims to break the deadlock situation
which raises during continuous transfer of data for long
duration over uart with hardware flow control. It is
observed that CTS interrupt cannot be cleared in uart
interrupt register (ICR). Hence further transfer over
uart gets blocked.
It is seen that during such deadlock condition ICR
don't get cleared even on multiple write. This leads
pass_counter to decrease and finally reach zero. This
can be taken as trigger point to run this UART_BT_WA.
Workaround backups the register configuration, does soft
reset of UART using BIT-0 of PRCC_K_SOFTRST_SET/CLEAR
registers and restores the registers.
This patch also provides support for uart init and exit
function calls if present.
Signed-off-by: Shreshtha Kumar Sahu <shreshthakumar.sahu@stericsson.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'include/linux/amba')
-rw-r--r-- | include/linux/amba/serial.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/include/linux/amba/serial.h b/include/linux/amba/serial.h index 5479fdc849e9..514ed45c462e 100644 --- a/include/linux/amba/serial.h +++ b/include/linux/amba/serial.h | |||
@@ -201,6 +201,9 @@ struct amba_pl011_data { | |||
201 | bool (*dma_filter)(struct dma_chan *chan, void *filter_param); | 201 | bool (*dma_filter)(struct dma_chan *chan, void *filter_param); |
202 | void *dma_rx_param; | 202 | void *dma_rx_param; |
203 | void *dma_tx_param; | 203 | void *dma_tx_param; |
204 | void (*init) (void); | ||
205 | void (*exit) (void); | ||
206 | void (*reset) (void); | ||
204 | }; | 207 | }; |
205 | #endif | 208 | #endif |
206 | 209 | ||