On Tue, 18 Nov 2014 21:16:08 -0600
, Rob Herring <[email protected]>
wrote:
> On Wed, Nov 12, 2014 at 2:54 PM, Kevin Cernekee <[email protected]> wrote:
> > If an earlycon (stdout-path) node is being used, check for "big-endian"
> > or "native-endian" properties and pass the appropriate iotype to the
> > driver.
> >
> > Note that LE sets UPIO_MEM (8-bit) but BE sets UPIO_MEM32BE (32-bit). The
> > big-endian property only really makes sense in the context of 32-bit
> > registers, since 8-bit accesses never require data swapping.
> >
> > At some point, the of_earlycon code may want to pass in the reg-io-width,
> > reg-offset, and reg-shift parameters too.
> >
> > Signed-off-by: Kevin Cernekee <[email protected]>
> > ---
> > drivers/of/fdt.c | 9 ++++++++-
> > drivers/tty/serial/earlycon.c | 4 ++--
> > include/linux/serial_core.h | 2 +-
> > 3 files changed, 11 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
> > index 30e97bc..15f80c9 100644
> > --- a/drivers/of/fdt.c
> > +++ b/drivers/of/fdt.c
> > @@ -10,6 +10,7 @@
> > */
> >
> > #include <linux/kernel.h>
> > +#include <linux/kconfig.h>
> > #include <linux/initrd.h>
> > #include <linux/memblock.h>
> > #include <linux/of.h>
> > @@ -784,7 +785,13 @@ int __init early_init_dt_scan_chosen_serial(void)
> > if (!addr)
> > return -ENXIO;
> >
> > - of_setup_earlycon(addr, match->data);
> > + if (fdt_getprop(fdt, offset, "big-endian", NULL) ||
> > + (fdt_getprop(fdt, offset, "native-endian", NULL) &&
>
> Is native-endian documented?
>
> > + IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))) {
> > + of_setup_earlycon(addr, UPIO_MEM32BE, match->data);
> > + } else {
> > + of_setup_earlycon(addr, UPIO_MEM, match->data);
> > + }
>
> I'd rather see something like this, so we can more easily add any
> other properties later:
>
> iotype = 0;
> if (fdt_getprop(fdt, offset, "big-endian", NULL) ||
> (fdt_getprop(fdt, offset, "native-endian", NULL) &&
> IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)))
> iotype = UPIO_MEM32BE;
>
> of_setup_earlycon(addr, iotype ? : UPIO_MEM, match->data);
or even initialize iotype to UPIO_MEM at the outset. :-)
I've also asked for the tests in an if to be wrapped up into a helper. I
can foresee other code wanting to use this.
g.
>
> > return 0;
> > }
> > return -ENODEV;
> > diff --git a/drivers/tty/serial/earlycon.c b/drivers/tty/serial/earlycon.c
> > index a514ee6..548f7d7 100644
> > --- a/drivers/tty/serial/earlycon.c
> > +++ b/drivers/tty/serial/earlycon.c
> > @@ -148,13 +148,13 @@ int __init setup_earlycon(char *buf, const char
> > *match,
> > return 0;
> > }
> >
> > -int __init of_setup_earlycon(unsigned long addr,
> > +int __init of_setup_earlycon(unsigned long addr, unsigned char iotype,
> > int (*setup)(struct earlycon_device *, const
> > char *))
> > {
> > int err;
> > struct uart_port *port = &early_console_dev.port;
> >
> > - port->iotype = UPIO_MEM;
> > + port->iotype = iotype;
> > port->mapbase = addr;
> > port->uartclk = BASE_BAUD * 16;
> > port->membase = earlycon_map(addr, SZ_4K);
> > diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
> > index d2d5bf6..0d60c64 100644
> > --- a/include/linux/serial_core.h
> > +++ b/include/linux/serial_core.h
> > @@ -310,7 +310,7 @@ struct earlycon_device {
> > int setup_earlycon(char *buf, const char *match,
> > int (*setup)(struct earlycon_device *, const char *));
> >
> > -extern int of_setup_earlycon(unsigned long addr,
> > +extern int of_setup_earlycon(unsigned long addr, unsigned char iotype,
> > int (*setup)(struct earlycon_device *, const
> > char *));
> >
> > #define EARLYCON_DECLARE(name, func) \
> > --
> > 2.1.1
> >
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html