Re: [PATCH 1/2] tty: serial: 8250_mtk: Add earlycon

Rob Herring
2014-12-29T14:54:02Z

On Sun, Dec 28, 2014 at 10:24 PM, Eddie Huang <eddie.huang-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org> wrote:
> Hi Rob,
>
> On Fri, 2014-12-26 at 15:24 -0600, Rob Herring wrote:
>> On Thu, Dec 18, 2014 at 2:33 AM, Eddie Huang <eddie.huang-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org> wrote:
>> > Mediatek UART has highspeed register, but 8250_early.c doesn't
>> > support this, so add earlycon in 8250_mtk.c
>>
>> I don't see any highspeed register setup here. More generically,
>> aren't you just skipping any UART setup? That may be useful on other
>> platforms with 8250s, too. With the kernel command line version, you
>> could perhaps add a "noinit" flag. The DT case is harder, and I'm not
>> sure how we should handle that. We could perhaps add a
>> "stdout-path-initialized" flag to chosen.
>>
>
> Yes, I skipped UART setup same as msm_serial.c and amba-pl011.c
> (although they are standalone serial driver). Just like earlyprintk, I
> think earlycon should reuse UART setting in loader. Since some other
> platforms with 8250 already depend on this, it's ok to add flags to
> distinguish whether 8250 earlycon driver should init hw or not. As you
> said, add "noinit" flag is simple, but "stdout-path-initialized" need
> more discussion.
>
>> >
>> > Signed-off-by: Eddie Huang <eddie.huang-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>
>> > ---
>> > drivers/tty/serial/8250/8250_mtk.c | 33 +++++++++++++++++++++++++++++++++
>> > 1 file changed, 33 insertions(+)
>> >
>> > diff --git a/drivers/tty/serial/8250/8250_mtk.c b/drivers/tty/serial/8250/8250_mtk.c
>> > index de7aae5..65dd569 100644
>> > --- a/drivers/tty/serial/8250/8250_mtk.c
>> > +++ b/drivers/tty/serial/8250/8250_mtk.c
>> > @@ -23,6 +23,7 @@
>> > #include <linux/pm_runtime.h>
>> > #include <linux/serial_8250.h>
>> > #include <linux/serial_reg.h>
>> > +#include <linux/console.h>
>> >
>> > #include "8250.h"
>> >
>> > @@ -289,6 +290,38 @@ static struct platform_driver mtk8250_platform_driver = {
>> > };
>> > module_platform_driver(mtk8250_platform_driver);
>> >
>> > +#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
>> > +
>> > +static void __init mtk8250_serial_putc(struct uart_port *port, int c)
>> > +{
>> > + while ((readl(port->membase + (UART_LSR << 2)) & BOTH_EMPTY) !=
>> > + BOTH_EMPTY)
>> > + ;
>> > + writel(c, port->membase + (UART_TX << 2));
>> > +}
>> > +
>> > +static void __init early_mtk8250_write(struct console *console,
>> > + const char *s, unsigned int count)
>>
>> Is there a reason early_serial8250_write can't work for you other than
>> it is currently static?
>>
>> Rob
>>
>
> The reason is only static. I want to keep 8250_early.c untouchable, all
> modifications in 8250_mtk.c

That is not how kernel development works. You should fix 8250_early.c
to do what you need rather than duplicating code.

Rob