2022-11-24 10:09:25

by Ricardo Ribalda

[permalink] [raw]
Subject: [PATCH v2 2/2] earlycon: Let users set the clock frequency

Some platforms, namely AMD Picasso, use non standard uart clocks (48M),
witch makes it impossible to use with earlycon.

Let the user select its own frequency.

Signed-off-by: Ricardo Ribalda <[email protected]>

diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index a465d5242774..9efb6c3b0486 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -1182,10 +1182,10 @@
specified, the serial port must already be setup and
configured.

- uart[8250],io,<addr>[,options]
- uart[8250],mmio,<addr>[,options]
- uart[8250],mmio32,<addr>[,options]
- uart[8250],mmio32be,<addr>[,options]
+ uart[8250],io,<addr>[,options[,uartclk]]
+ uart[8250],mmio,<addr>[,options[,uartclk]]
+ uart[8250],mmio32,<addr>[,options[,uartclk]]
+ uart[8250],mmio32be,<addr>[,options[,uartclk]]
uart[8250],0x<addr>[,options]
Start an early, polled-mode console on the 8250/16550
UART at the specified I/O port or MMIO address.
@@ -1194,7 +1194,9 @@
If none of [io|mmio|mmio32|mmio32be], <addr> is assumed
to be equivalent to 'mmio'. 'options' are specified
in the same format described for "console=ttyS<n>"; if
- unspecified, the h/w is not initialized.
+ unspecified, the h/w is not initialized. 'uartclk' is
+ the uart clock frequency; if unspecified, it is set
+ to 'BASE_BAUD' * 16.

pl011,<addr>
pl011,mmio32,<addr>
diff --git a/drivers/tty/serial/earlycon.c b/drivers/tty/serial/earlycon.c
index 5b73da9487b1..2db92d36351b 100644
--- a/drivers/tty/serial/earlycon.c
+++ b/drivers/tty/serial/earlycon.c
@@ -120,9 +120,15 @@ static int __init parse_options(struct earlycon_device *device, char *options)
}

if (options) {
+ char *uartclk;
+
if (kstrtouint(options, 0, &device->baud) < 0)
pr_warn("[%s] unsupported earlycon baud rate option\n",
options);
+ uartclk = strchr(options, ',');
+ if (uartclk && kstrtouint(uartclk, 0, &port->uartclk) < 0)
+ pr_warn("[%s] unsupported earlycon uart clkrate option\n",
+ options);
length = min(strcspn(options, " ") + 1,
(size_t)(sizeof(device->options)));
strscpy(device->options, options, length);
@@ -141,7 +147,8 @@ static int __init register_earlycon(char *buf, const struct earlycon_id *match)
buf = NULL;

spin_lock_init(&port->lock);
- port->uartclk = BASE_BAUD * 16;
+ if (!port->uartclk)
+ port->uartclk = BASE_BAUD * 16;
if (port->mapbase)
port->membase = earlycon_map(port->mapbase, 64);


--
b4 0.11.0-dev-d93f8


2022-11-24 12:06:32

by Jiri Slaby

[permalink] [raw]
Subject: Re: [PATCH v2 2/2] earlycon: Let users set the clock frequency

Hi,

On 24. 11. 22, 11:02, Ricardo Ribalda wrote:
...
> --- a/drivers/tty/serial/earlycon.c
> +++ b/drivers/tty/serial/earlycon.c
> @@ -120,9 +120,15 @@ static int __init parse_options(struct earlycon_device *device, char *options)
> }
>
> if (options) {
> + char *uartclk;
> +
> if (kstrtouint(options, 0, &device->baud) < 0)
> pr_warn("[%s] unsupported earlycon baud rate option\n",
> options);

IMO this won't work if there is a comma in options (i.e. your new
clkrate param). kstrtouint will return -EINVAL in that case.

> + uartclk = strchr(options, ',');
> + if (uartclk && kstrtouint(uartclk, 0, &port->uartclk) < 0)

You are giving ",number" to kstrtouint, right? That won't work either ;).

regards,
--
js

2022-11-24 12:39:40

by Ricardo Ribalda

[permalink] [raw]
Subject: Re: [PATCH v2 2/2] earlycon: Let users set the clock frequency

On Thu, 24 Nov 2022 at 12:19, Jiri Slaby <[email protected]> wrote:
>
> Hi,
>
> On 24. 11. 22, 11:02, Ricardo Ribalda wrote:
> ...
> > --- a/drivers/tty/serial/earlycon.c
> > +++ b/drivers/tty/serial/earlycon.c
> > @@ -120,9 +120,15 @@ static int __init parse_options(struct earlycon_device *device, char *options)
> > }
> >
> > if (options) {
> > + char *uartclk;
> > +
> > if (kstrtouint(options, 0, &device->baud) < 0)
> > pr_warn("[%s] unsupported earlycon baud rate option\n",
> > options);
>
> IMO this won't work if there is a comma in options (i.e. your new
> clkrate param). kstrtouint will return -EINVAL in that case.
>
> > + uartclk = strchr(options, ',');
> > + if (uartclk && kstrtouint(uartclk, 0, &port->uartclk) < 0)
>
> You are giving ",number" to kstrtouint, right? That won't work either ;).


The fun thing is that it worked because it fell back to the acpi
parameters :). Will send a v3

Thanks!
>
> regards,
> --
> js
>


--
Ricardo Ribalda