diff mbox

[v2,3/7] tty/serial: convert 8250 to generic earlycon

Message ID 539898C3.8090903@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Rob Herring June 11, 2014, 5:58 p.m. UTC
On 06/10/2014 03:52 PM, Tony Luck wrote:
> On Mon, Jun 9, 2014 at 4:18 PM, Rob Herring <robherring2@gmail.com> wrote:
>> It should do auto detect of the baud-rate if it is not specified which
>> for 8250 is just reading the baud-rate divider and calculating the
>> baud-rate using the uart clock. It should just reprogram the divider
>> with the same divider value. I don't see anything obvious why this
>> would have broken.
> 
> Something very weird is happening.  Output is good so long as I put the
> trailing ",115200" on the command line.
> 
> But I made early_serial8250_setup() printk() the return value it got
> from probe_baud() - in case is was somehow getting 115201 or some
> other silly value ... nope. Exactly 115200.
> 
> I also can't explain why the "noise" comes and goes a dozen
> times during boot,
> 
> Does some other place in the kernel look at the "uart..." command
> line argument?

I think I figured it out. The function 
serial8250_find_port_for_earlycon is failing to match 'uart' console to 
'ttyS' console and transfer the options. It was also failing to create 
an option string when the baud rate is probed. Can you try out the 
below patch?

Rob

8<-------------------------------------------------------------------

Comments

Tony Luck June 11, 2014, 10:20 p.m. UTC | #1
On Wed, Jun 11, 2014 at 10:58 AM, Rob Herring <robherring2@gmail.com> wrote:
> I think I figured it out. The function
> serial8250_find_port_for_earlycon is failing to match 'uart' console to
> 'ttyS' console and transfer the options. It was also failing to create
> an option string when the baud rate is probed. Can you try out the
> below patch?

Rob,

That works.  Thanks for digging deeper into this.

Here's a tag for when you push that patch:

Reported-and-tested-by: Tony Luck <tony.luck@intel.com>

-Tony
Yinghai Lu June 11, 2014, 11:44 p.m. UTC | #2
On Wed, Jun 11, 2014 at 10:58 AM, Rob Herring <robherring2@gmail.com> wrote:
> On 06/10/2014 03:52 PM, Tony Luck wrote:
> I think I figured it out. The function
> serial8250_find_port_for_earlycon is failing to match 'uart' console to
> 'ttyS' console and transfer the options. It was also failing to create
> an option string when the baud rate is probed. Can you try out the
> below patch?
>
> Rob
>
> 8<-------------------------------------------------------------------
> diff --git a/drivers/tty/serial/8250/8250_early.c b/drivers/tty/serial/8250/8250_early.c
> index cfef801..4858b8a 100644
> --- a/drivers/tty/serial/8250/8250_early.c
> +++ b/drivers/tty/serial/8250/8250_early.c
> @@ -144,8 +144,11 @@ static int __init early_serial8250_setup(struct earlycon_device *device,
>         if (!(device->port.membase || device->port.iobase))
>                 return 0;
>
> -       if (!device->baud)
> +       if (!device->baud) {
>                 device->baud = probe_baud(&device->port);
> +               snprintf(device->options, sizeof(device->options), "%u",
> +                        device->baud);
> +       }
>
>         init_port(device);
>
> diff --git a/drivers/tty/serial/earlycon.c b/drivers/tty/serial/earlycon.c
> index 5131b5e..d20e6d8 100644
> --- a/drivers/tty/serial/earlycon.c
> +++ b/drivers/tty/serial/earlycon.c
> @@ -25,7 +25,7 @@
>  #include <asm/serial.h>
>
>  static struct console early_con = {
> -       .name =         "earlycon",
> +       .name =         "uart",
>         .flags =        CON_PRINTBUFFER | CON_BOOT,
>         .index =        -1,
>  };
>

Yes, that is right fix.

For the name in early_con with "uart", please add some comments that
serial8250_find_port_for_earlycon() will look for "uart"...

Thanks

Yinghai
diff mbox

Patch

diff --git a/drivers/tty/serial/8250/8250_early.c b/drivers/tty/serial/8250/8250_early.c
index cfef801..4858b8a 100644
--- a/drivers/tty/serial/8250/8250_early.c
+++ b/drivers/tty/serial/8250/8250_early.c
@@ -144,8 +144,11 @@  static int __init early_serial8250_setup(struct earlycon_device *device,
 	if (!(device->port.membase || device->port.iobase))
 		return 0;
 
-	if (!device->baud)
+	if (!device->baud) {
 		device->baud = probe_baud(&device->port);
+		snprintf(device->options, sizeof(device->options), "%u",
+			 device->baud);
+	}
 
 	init_port(device);
 
diff --git a/drivers/tty/serial/earlycon.c b/drivers/tty/serial/earlycon.c
index 5131b5e..d20e6d8 100644
--- a/drivers/tty/serial/earlycon.c
+++ b/drivers/tty/serial/earlycon.c
@@ -25,7 +25,7 @@ 
 #include <asm/serial.h>
 
 static struct console early_con = {
-	.name =		"earlycon",
+	.name =		"uart",
 	.flags =	CON_PRINTBUFFER | CON_BOOT,
 	.index =	-1,
 };