tty: serial: 8250_core: read only RX if there is something in the FIFO
The serial8250_do_startup() function unconditionally clears the
interrupts and for that it reads from the RX-FIFO without checking if
there is a byte in the FIFO or not. This works fine on OMAP4+ HW like
AM335x or DRA7.
OMAP3630 ES1.1 (which means probably all OMAP3 and earlier) does not like
this:
|Unhandled fault: external abort on non-linefetch (0x1028) at 0xfb020000
|Internal error: : 1028 [#1] ARM
|Modules linked in:
|CPU: 0 PID: 1 Comm: swapper Not tainted
3.16.0-00022-g7edcb57-dirty #1213
|task:
de0572c0 ti:
de058000 task.ti:
de058000
|PC is at mem32_serial_in+0xc/0x1c
|LR is at serial8250_do_startup+0x220/0x85c
|Flags: nzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel
|Control:
10c5387d Table:
80004019 DAC:
00000015
|[<
c03051d4>] (mem32_serial_in) from [<
c0307fe8>] (serial8250_do_startup+0x220/0x85c)
|[<
c0307fe8>] (serial8250_do_startup) from [<
c0309e00>] (omap_8250_startup+0x5c/0xe0)
|[<
c0309e00>] (omap_8250_startup) from [<
c030863c>] (serial8250_startup+0x18/0x2c)
|[<
c030863c>] (serial8250_startup) from [<
c030394c>] (uart_startup+0x78/0x1d8)
|[<
c030394c>] (uart_startup) from [<
c0304678>] (uart_open+0xe8/0x114)
|[<
c0304678>] (uart_open) from [<
c02e9e10>] (tty_open+0x1a8/0x5a4)
Reviewed-by: Tony Lindgren <tony@atomide.com>
Tested-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>