From: tony@atomide.com (Tony Lindgren)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 13/14] omap: serial: fix non-empty uart fifo read abort
Date: Fri, 11 Dec 2009 16:09:19 -0800 [thread overview]
Message-ID: <20091212000919.GF24013@atomide.com> (raw)
In-Reply-To: <20091211234919.3189.95607.stgit@localhost>
From: vikram pandita <vikram.pandita@ti.com>
Date: Tue, 8 Dec 2009 10:17:28 -0800
Subject: [PATCH] omap: serial: fix non-empty uart fifo read abort
OMAP3xxx and OMAP4430 UART IP blocks have a restriction wrt RX FIFO.
Empty RX fifo read causes an abort.
OMAP3xxx:
UART IP revision >= 0x52 have this issue
MVR register format is:
Bits Field Name Description Type Reset
31:8 RESERVED RO 0x0
7:4 MAJOR Major revision number of the module. RO 0x--
3:0 MINOR Minor revision number of the module. RO 0x--
OMAP4xxx:
All revisions have this issue
Revision id check is not used as the format of MVR resigster has changed
For omap4 MVR register reads as: 0x50410602 => Revision id = 0x0602
Format of MVR register on omap4 is: (Courtesy: Cousson, Benoit)
Bits Field Name Description Type Reset
31:30 SCHEME Scheme revision number of module RO 0x1
29:28 RESERVED RO 0x1
27:16 FUNC Function revision number of module RO 0x041
15:11 RTL Rtl revision number of module RO 0x00
10:8 MAJOR Major revision number of the module. RO 0x6
7:6 CUSTOM Custom revision number of the module. RO 0x0
5:0 MINOR Minor revision number of the module. RO 0x02
Override the default 8250 read handler: mem_serial_in()
by a custom handler: serial_in_8250()
which makes sure that RX fifo is not read when empty
tested on zoom3(3630) board
Cc: Benoit Cousson <b-cousson@ti.com>
Signed-off-by: Vikram Pandita <vikram.pandita@ti.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c
index 6278fe5..39b797b 100644
--- a/arch/arm/mach-omap2/serial.c
+++ b/arch/arm/mach-omap2/serial.c
@@ -33,6 +33,7 @@
#include "pm.h"
#include "prm-regbits-34xx.h"
+#define UART_OMAP_NO_EMPTY_FIFO_READ_IP_REV 0x52
#define UART_OMAP_WER 0x17 /* Wake-up enable register */
#define DEFAULT_TIMEOUT (5 * HZ)
@@ -572,6 +573,23 @@ static struct omap_uart_state omap_uart[] = {
#endif
};
+/*
+ * Override the default 8250 read handler: mem_serial_in()
+ * Empty RX fifo read causes an abort on omap3630 and omap4
+ * This function makes sure that an empty rx fifo is not read on these silicons
+ * (OMAP1/2/3430 are not affected)
+ */
+static unsigned int serial_in_override(struct uart_port *up, int offset)
+{
+ if (UART_RX == offset) {
+ unsigned int lsr;
+ lsr = serial_read_reg(omap_uart[up->line].p, UART_LSR);
+ if (!(lsr & UART_LSR_DR))
+ return -EPERM;
+ }
+ return serial_read_reg(omap_uart[up->line].p, offset);
+}
+
void __init omap_serial_early_init(void)
{
int i;
@@ -667,15 +685,15 @@ void __init omap_serial_init_port(int port)
DEV_CREATE_FILE(dev, &dev_attr_sleep_timeout);
}
- /* omap44xx: Never read empty UART fifo
- * omap3xxx: Never read empty UART fifo on UARTs
- * with IP rev >=0x52
- */
- if (cpu_is_omap44xx())
- uart->p->serial_in = serial_in_override;
- else if ((serial_read_reg(uart->p, UART_OMAP_MVER) & 0xFF)
- >= UART_OMAP_NO_EMPTY_FIFO_READ_IP_REV)
- uart->p->serial_in = serial_in_override;
+ /* omap44xx: Never read empty UART fifo
+ * omap3xxx: Never read empty UART fifo on UARTs
+ * with IP rev >=0x52
+ */
+ if (cpu_is_omap44xx())
+ uart->p->serial_in = serial_in_override;
+ else if ((serial_read_reg(uart->p, UART_OMAP_MVER) & 0xFF)
+ >= UART_OMAP_NO_EMPTY_FIFO_READ_IP_REV)
+ uart->p->serial_in = serial_in_override;
}
/**
next prev parent reply other threads:[~2009-12-12 0:09 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-12-11 23:52 [PATCH 00/14] Mostly fixes for 2.6.33 Tony Lindgren
2009-12-11 23:52 ` [PATCH 01/14] omap3: cm-t35: add mux initialization Tony Lindgren
2009-12-11 23:52 ` [PATCH 02/14] OMAP3: serial - allow platforms specify which UARTs to initialize Tony Lindgren
2009-12-11 23:52 ` [PATCH 03/14] omap: Correcting GPMC_CONFIG1_DEVICETYPE_NAND Tony Lindgren
2009-12-11 23:53 ` [PATCH 04/14] omap: arch/arm/plat-omap/devices.c - sort alphabetically Tony Lindgren
2009-12-11 23:53 ` [PATCH 05/14] omap: header: remove unused data-type Tony Lindgren
2009-12-11 23:53 ` [PATCH 06/14] omap1: LCD_DMA: Use some define rather than a hexadecimal Tony Lindgren
2009-12-11 23:53 ` [PATCH 07/14] omap1: htcherald: Update defconfig to include mux support Tony Lindgren
2009-12-11 23:53 ` [PATCH 08/14] omap3: zoom2/3: make MMC slot work again Tony Lindgren
2009-12-11 23:54 ` [PATCH 09/14] omap3: rx51: Use wl1251 in SPI mode 3 Tony Lindgren
2009-12-11 23:54 ` [PATCH 10/14] omap3: id code detection 3525 vs 3515 Tony Lindgren
2009-12-11 23:54 ` [PATCH 11/14] omap3 : Enable TWL4030 Keypad for Zoom2 and Zoom3 boards Tony Lindgren
2009-12-11 23:54 ` [PATCH 12/14] omap3: Zoom2/3: Update hsmmc board config params Tony Lindgren
2009-12-12 0:09 ` Tony Lindgren [this message]
2009-12-12 0:10 ` [PATCH 14/14] omap3: Fix OMAP35XX_REV macros Tony Lindgren
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20091212000919.GF24013@atomide.com \
--to=tony@atomide.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).