Subject: [PATCH v2] serial: 8250_dw: Improve unwritable LCR workaround

From: [email-masked] (Ezequiel Garcia)
Date: Thu, 28 Nov 2013 16:53:38 -0300

On Thu, Nov 28, 2013 at 04:47:20PM -0300, Ezequiel Garcia wrote:
> Hi Thomas, Tim:
> 
> On Thu, Nov 28, 2013 at 09:30:34AM +0100, Thomas Petazzoni wrote:
> > Dear Ezequiel Garcia,
> > 
> > On Wed, 27 Nov 2013 15:54:49 -0300, Ezequiel Garcia wrote:
> > 
> > > > An external device may be keeping the UART busy and preventing LCR
> > > > from being written.
> > > > 
> > > > What device is attached to ttyS1?
> > > 
> > > There's no device attached at ttyS1. I've just tested this in another
> > > box and it seems the same error is obtained on each unused port:
> > 
> > Are you sure about this? I suppose you're testing on the Armada XP GP
> > board, and this board has a 4 ports FTDI chip, and according to the
> > board schematics the four UARTs are all connected to the FTDI chip. So
> > from the SoC perspective, ttyS1 is connected to something, as far as I
> > can understand. Or maybe you also tested Armada XP DB ?
> > 
> 
> Yeah, sorry about that. I missed the FTDI chip. As Thomas says the XP GP
> board I'm testing this on, has its four UARTs connected to a FTDI chip.
> 
> Changing the console port by setting "console=ttyS1,115200" gives this:
> 
> [..]
> Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
> dw-apb-uart d0012000.serial: Couldn't set LCR to 191
> dw-apb-uart d0012000.serial: Couldn't set LCR to 191
> dw-apb-uart d0012000.serial: Couldn't set LCR to 224
> dw-apb-uart d0012000.serial: Couldn't set LCR to 224
> d0012000.serial: ttyS0 at MMIO 0xd0012000 (irq = 17, base_baud = 15625000) is a 16550A
> dw-apb-uart d0012100.serial: Couldn't set LCR to 191
> dw-apb-uart d0012100.serial: Couldn't set LCR to 191
> dw-apb-uart d0012100.serial: Couldn't set LCR to 224
> dw-apb-uart d0012100.serial: Couldn't set LCR to 224
> d0012100.serial: ttyS1 at MMIO 0xd0012100 (irq = 18, base_baud = 15625000) is a 16550A
> console [ttyS1] enabled
> dw-apb-uart d0012200.serial: Couldn't set LCR to 191
> dw-apb-uart d0012200.serial: Couldn't set LCR to 191
> dw-apb-uart d0012200.serial: Couldn't set LCR to 224
> dw-apb-uart d0012200.serial: Couldn't set LCR to 224
> d0012200.serial: ttyS2 at MMIO 0xd0012200 (irq = 31, base_baud = 15625000) is a 16550A
> dw-apb-uart d0012300.serial: Couldn't set LCR to 191
> dw-apb-uart d0012300.serial: Couldn't set LCR to 191
> dw-apb-uart d0012300.serial: Couldn't set LCR to 224
> dw-apb-uart d0012300.serial: Couldn't set LCR to 224
> d0012300.serial: ttyS3 at MMIO 0xd0012300 (irq = 32, base_baud = 15625000) is a 16550A
> 
> So we get the "Couldn't set" message in all four ports.
> 
> Tim: Any ideas?

And another thing: the weird output on the console looks related to the
early boot console. If I enable 'earlyprintk' on ttyS0 but set the console
on ttyS1, this is what I get on ttyS0:

bootconsole [earlycon0] enabled
[..]
Kernel command line: earlyprintk console=ttyS1,115200 root=/dev/nfs rw nfsroot=192.168.0.45:/opt/buildrootfs,v3, ip=192.168.0.159:192.168.0.45:192.168.0.1:255.255.255.0:develboard:eth0:on rootwait
[..]
Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
???????????????????????????????????????????????
Welcome to Buildroot
buildroot login: 

Hope this helps you understand what's going on...
-- 
Ezequiel Garc?a, Free Electrons
Embedded Linux, Kernel and Android Engineering
http://free-electrons.com