From: Tony Lindgren <tony@atomide.com>
To: Vikram Pandita <vikram.pandita@ti.com>
Cc: linux-omap@vger.kernel.org, "Shilimkar,
Santosh" <santosh.shilimkar@ti.com>
Subject: Re: [PATCH 1/2] serial: 8250: add UPF_NO_EMPTY_FIFO_READ flag
Date: Tue, 17 Nov 2009 09:06:23 -0800 [thread overview]
Message-ID: <20091117170622.GC29266@atomide.com> (raw)
In-Reply-To: <1258412020-31946-1-git-send-email-vikram.pandita@ti.com>
* Vikram Pandita <vikram.pandita@ti.com> [091116 15:00]:
> OMAP3630 and OMAP4430 UART IP blocks have a restriction wrt RX FIFO.
> Empty RX fifo read causes an abort. OMAP1/2/3 do not have this restriction.
>
> So interoduce a flag in 8250 driver: UPF_NO_EMPTY_FIFO_READ
>
> If this flag is specified for an 8250 port, then first check if rx fifo has
> contents, and only then proceed to read the fifo.
>
> The change affects only boards passing this flag in port data and hence is
> non-disruptive for other boards.
>
> First reported/fixed on omap4430 by Shilimkar, Santosh
This should go to linux-serial@vger.kernel.org and Alan Cox.
Regards,
Tony
> Signed-off-by: Vikram Pandita <vikram.pandita@ti.com>
> Cc: Shilimkar, Santosh <santosh.shilimkar@ti.com>
> ---
> drivers/serial/8250.c | 30 +++++++++++++++++++++++++-----
> include/linux/serial_core.h | 1 +
> 2 files changed, 26 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
> index 737b4c9..03c890e 100644
> --- a/drivers/serial/8250.c
> +++ b/drivers/serial/8250.c
> @@ -1245,7 +1245,11 @@ static void autoconfig(struct uart_8250_port *up, unsigned int probeflags)
> #endif
> serial_outp(up, UART_MCR, save_mcr);
> serial8250_clear_fifos(up);
> - serial_in(up, UART_RX);
> + if (up->port.flags & UPF_NO_EMPTY_FIFO_READ) {
> + if (serial_inp(up, UART_LSR) & UART_LSR_DR)
> + serial_in(up, UART_RX);
> + } else
> + serial_in(up, UART_RX);
> if (up->capabilities & UART_CAP_UUE)
> serial_outp(up, UART_IER, UART_IER_UUE);
> else
> @@ -1289,7 +1293,11 @@ static void autoconfig_irq(struct uart_8250_port *up)
> }
> serial_outp(up, UART_IER, 0x0f); /* enable all intrs */
> (void)serial_inp(up, UART_LSR);
> - (void)serial_inp(up, UART_RX);
> + if (up->port.flags & UPF_NO_EMPTY_FIFO_READ) {
> + if (serial_inp(up, UART_LSR) & UART_LSR_DR)
> + (void)serial_inp(up, UART_RX);
> + } else
> + (void)serial_inp(up, UART_RX);
> (void)serial_inp(up, UART_IIR);
> (void)serial_inp(up, UART_MSR);
> serial_outp(up, UART_TX, 0xFF);
> @@ -1984,7 +1992,11 @@ static int serial8250_startup(struct uart_port *port)
> * Clear the interrupt registers.
> */
> (void) serial_inp(up, UART_LSR);
> - (void) serial_inp(up, UART_RX);
> + if (up->port.flags & UPF_NO_EMPTY_FIFO_READ) {
> + if (serial_inp(up, UART_LSR) & UART_LSR_DR)
> + (void) serial_inp(up, UART_RX);
> + } else
> + (void) serial_inp(up, UART_RX);
> (void) serial_inp(up, UART_IIR);
> (void) serial_inp(up, UART_MSR);
>
> @@ -2141,7 +2153,11 @@ dont_test_tx_en:
> * routines or the previous session.
> */
> serial_inp(up, UART_LSR);
> - serial_inp(up, UART_RX);
> + if (up->port.flags & UPF_NO_EMPTY_FIFO_READ) {
> + if (serial_inp(up, UART_LSR) & UART_LSR_DR)
> + serial_inp(up, UART_RX);
> + } else
> + serial_inp(up, UART_RX);
> serial_inp(up, UART_IIR);
> serial_inp(up, UART_MSR);
> up->lsr_saved_flags = 0;
> @@ -2207,7 +2223,11 @@ static void serial8250_shutdown(struct uart_port *port)
> * Read data port to reset things, and then unlink from
> * the IRQ chain.
> */
> - (void) serial_in(up, UART_RX);
> + if (up->port.flags & UPF_NO_EMPTY_FIFO_READ) {
> + if (serial_inp(up, UART_LSR) & UART_LSR_DR)
> + (void) serial_inp(up, UART_RX);
> + } else
> + (void) serial_in(up, UART_RX);
>
> del_timer_sync(&up->timer);
> up->timer.function = serial8250_timeout;
> diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
> index db532ce..0d65bb3 100644
> --- a/include/linux/serial_core.h
> +++ b/include/linux/serial_core.h
> @@ -308,6 +308,7 @@ struct uart_port {
> #define UPF_SPD_WARP ((__force upf_t) (0x1010))
> #define UPF_SKIP_TEST ((__force upf_t) (1 << 6))
> #define UPF_AUTO_IRQ ((__force upf_t) (1 << 7))
> +#define UPF_NO_EMPTY_FIFO_READ ((__force upf_t) (1 << 8))
> #define UPF_HARDPPS_CD ((__force upf_t) (1 << 11))
> #define UPF_LOW_LATENCY ((__force upf_t) (1 << 13))
> #define UPF_BUGGY_UART ((__force upf_t) (1 << 14))
> --
> 1.6.5.1.69.g36942
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2009-11-17 17:06 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-11-16 22:53 [PATCH 1/2] serial: 8250: add UPF_NO_EMPTY_FIFO_READ flag Vikram Pandita
2009-11-17 17:06 ` Tony Lindgren [this message]
2009-11-17 17:39 ` Pandita, Vikram
2009-11-17 17:46 ` Tony Lindgren
-- strict thread matches above, loose matches on Subject: below --
2009-11-17 21:16 Vikram Pandita
2009-11-17 21:25 ` Alan Cox
2009-11-17 21:38 ` Pandita, Vikram
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=20091117170622.GC29266@atomide.com \
--to=tony@atomide.com \
--cc=linux-omap@vger.kernel.org \
--cc=santosh.shilimkar@ti.com \
--cc=vikram.pandita@ti.com \
/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