Philby, I was able to re-produce the "serial8250: too much work for irq40" error without this patch on 2.6.28-rc4. tack command can be run without any arguments to see these messages.
Regards, Sudhakar ________________________________________ From: Philby John [EMAIL PROTECTED] Sent: Friday, November 14, 2008 4:57 PM To: Rajashekhara, Sudhakar Cc: Kevin Hilman; Steve Chen; [email protected] Subject: RE: [PATCH v5 09/10] ARM: DaVinci: serial mis-behavior on dm646x Sudhakar, I could not verify the error message "too much work for irq xx" when running "tack" on a DM6467. Could you please specify the exact command line parameters/test to run, inorder to reproduce this error. Thanks and Regards, Philby On Fri, 2008-11-14 at 09:57 +0530, Rajashekhara, Sudhakar wrote: > Kevin, > > It's true that this behavior is seen across all DM6467 EVMs. If this > fix is not present then the terminal shows up error messages like "too > much work for irq xx". After the EVM boots up, you can run the "tack" > command to test this. > > I am not in office today. I can work on the patch on Monday to change the > hardcoded value of 0x8. > > Regards, Sudhakar > > ________________________________________ > From: [EMAIL PROTECTED] [EMAIL PROTECTED] On Behalf Of Kevin Hilman [EMAIL > PROTECTED] > Sent: Friday, November 14, 2008 6:10 AM > To: Steve Chen > Cc: [email protected] > Subject: Re: [PATCH v5 09/10] ARM: DaVinci: serial mis-behavior on dm646x > > Steve Chen <[EMAIL PROTECTED]> writes: > > > Kevin, > > > > I noticed the following code in your patch > > + > > + if (cpu_is_davinci_dm646x()) > > + davinci_serial_outb(p, UART_DM646X_SCR, 0x8); > > > > You want to use writel. Less than 32bit Writes to the UART controller > > locks up the ARM core. > > > > Thanks for the check! With that info, I reworked the patch (see > below) and just make all the serial writes at init time use 32-bit > writes. Then there's a single reset function which works for all > chips, with a special case for dm6467. > > Any objectsions? > > Kevin > > > > > > On Thursday 13 November 2008 16:15:36 Kevin Hilman wrote: > >> Steve Chen <[EMAIL PROTECTED]> writes: > >> > >> > Kevin, > >> > > >> > On Thursday 13 November 2008 13:17:39 Kevin Hilman wrote: > >> >> Is this misbehavior specific to the DM6467 EVM or common to any DM6467 > >> >> board? The patch description could be a bit more descriptive in the > >> >> future. > >> > Last month, someone posted on the mailing list about UART2 not working > >> > his > >> > custom board. As it turns out, he needed this same fix for UART2, so > >> > this is > >> > a generic dm6467 issue. > >> > >> OK, thanks for the clarification. That's what I was expecting. Then > >> doing this in board init code is definitely wrong. > >> > >> > Also, this patch only fixes UART0. Do we want to consider something more > >> > generic that addresses all three UARTs. > >> > >> Yes, I'd like to see something more generic. > >> > >> The 2nd patch I sent is an attempt at doing something more generic, > >> but it doesn't boot. Since the initial mis-behavior was not well > >> described in the initial patch, I'm hoping someone (like you :) might > >> be able to shed some light on why my solution doesn't work. > >> > >> Kevin > >> > > > >From 45ab9e55aecb73472bd5f682cc68768df172bf11 Mon Sep 17 00:00:00 2001 > From: Kevin Hilman <[EMAIL PROTECTED]> > Date: Thu, 13 Nov 2008 11:10:04 -0800 > Subject: [PATCH] DaVinci: DM646x: move serial reset from board code to chip > code > > Signed-off-by: Kevin Hilman <[EMAIL PROTECTED]> > --- > arch/arm/mach-davinci/board-dm646x-evm.c | 14 ----------- > arch/arm/mach-davinci/serial.c | 36 ++++++++++++++--------------- > 2 files changed, 17 insertions(+), 33 deletions(-) > > diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c > b/arch/arm/mach-davinci/board-dm646x-evm.c > index b6a2b22..f311f52 100644 > --- a/arch/arm/mach-davinci/board-dm646x-evm.c > +++ b/arch/arm/mach-davinci/board-dm646x-evm.c > @@ -117,20 +117,6 @@ static void __init evm_init_i2c(void) > i2c_register_board_info(1, i2c_info, ARRAY_SIZE(i2c_info)); > } > > -#define UART_DM646X_SCR (DAVINCI_UART0_BASE + 0x40) > -/* > - * Internal UARTs need to be initialized for the 8250 autoconfig to work > - * properly. Note that the TX watermark initialization may not be needed > - * once the 8250.c watermark handling code is merged. > - */ > -static int __init dm646x_serial_reset(void) > -{ > - davinci_writel(0x08, UART_DM646X_SCR); > - > - return 0; > -} > -late_initcall(dm646x_serial_reset); > - > static void board_init(void) > { > davinci_psc_config(DAVINCI_GPSC_ARMDOMAIN, DM646X_LPSC_AEMIF, 1); > diff --git a/arch/arm/mach-davinci/serial.c b/arch/arm/mach-davinci/serial.c > index 1a08ef5..9198978 100644 > --- a/arch/arm/mach-davinci/serial.c > +++ b/arch/arm/mach-davinci/serial.c > @@ -37,27 +37,22 @@ > #include "clock.h" > > #define UART_DAVINCI_PWREMU 0x0c > +#define UART_DM646X_SCR 0x10 > + > #define DM355_UART2_BASE (0x01E06000) > > -static inline unsigned int davinci_serial_in(struct plat_serial8250_port *up, > - int offset) > +static inline unsigned int serial_read_reg(struct plat_serial8250_port *up, > + int offset) > { > offset <<= up->regshift; > - return (unsigned int)__raw_readb(up->membase + offset); > -} > - > -static inline void davinci_serial_outb(struct plat_serial8250_port *p, > - int offset, int value) > -{ > - offset <<= p->regshift; > - __raw_writeb(value, p->membase + offset); > + return (unsigned int)__raw_readl(up->membase + offset); > } > > -static inline void davinci_serial_outs(struct plat_serial8250_port *p, > - int offset, int value) > +static inline void serial_write_reg(struct plat_serial8250_port *p, int > offset, > + int value) > { > offset <<= p->regshift; > - __raw_writew(value, p->membase + offset); > + __raw_writel(value, p->membase + offset); > } > > static struct plat_serial8250_port serial_platform_data[] = { > @@ -103,17 +98,21 @@ static struct platform_device serial_device = { > > static void __init davinci_serial_reset(struct plat_serial8250_port *p) > { > - /* reset both transmitter and receiver: bits 14,13 = UTRST, URRST */ > unsigned int pwremu = 0; > > - davinci_serial_outb(p, UART_IER, 0); /* disable all interrupts */ > + serial_write_reg(p, UART_IER, 0); /* disable all interrupts */ > > - davinci_serial_outs(p, UART_DAVINCI_PWREMU, pwremu); > + /* reset both transmitter and receiver: bits 14,13 = UTRST, URRST */ > + serial_write_reg(p, UART_DAVINCI_PWREMU, pwremu); > mdelay(10); > > pwremu |= (0x3 << 13); > pwremu |= 0x1; > - davinci_serial_outs(p, UART_DAVINCI_PWREMU, pwremu); > + serial_write_reg(p, UART_DAVINCI_PWREMU, pwremu); > + > + if (cpu_is_davinci_dm646x()) { > + serial_write_reg(p, UART_DM646X_SCR, 0x08); > + } > } > > void __init davinci_serial_init(void) > @@ -166,8 +165,7 @@ void __init davinci_serial_init(void) > __func__, __LINE__, i); > else { > clk_enable(uart_clk); > - if (cpu_is_davinci_dm644x() || cpu_is_davinci_dm355()) > - davinci_serial_reset(p); > + davinci_serial_reset(p); > } > } > } > -- > 1.6.0.3 > > > _______________________________________________ > Davinci-linux-open-source mailing list > [email protected] > http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source_______________________________________________ > Davinci-linux-open-source mailing list > [email protected] > http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source_______________________________________________ Davinci-linux-open-source mailing list [email protected] http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
