[U-Boot] [PATCH 62/71] serial: spl: Implement empty functions for SPL

Marek Vasut
2012-09-18T18:33:11Z

Dear Scott Wood,

> On 09/18/2012 01:03:17 PM, Marek Vasut wrote:
> > Dear Scott Wood,
> >
> > > On 09/18/2012 12:13:57 PM, Marek Vasut wrote:
> > > > Dear Tom Rini,
> > > >
> > > > > On Mon, Sep 17, 2012 at 01:21:27AM +0200, Marek Vasut wrote:
> > > > > > Implement empty serial_* functions for SPL without serial
> > > > > > support enabled. This is imperative to haave once serial
> > > > > > multi is enabled unconditionally.
> > > > > >
> > > > > > Signed-off-by: Marek Vasut <marex@denx.de>
> > > > > > Cc: Marek Vasut <marek.vasut@gmail.com>
> > > > > > Cc: Tom Rini <trini@ti.com>
> > > > > > ---
> > > > > >
> > > > > > common/serial.c | 12 ++++++++++++
> > > > > > 1 file changed, 12 insertions(+)
> > > > > >
> > > > > > diff --git a/common/serial.c b/common/serial.c
> > > > > > index 631af65..cef4ba8 100644
> > > > > > --- a/common/serial.c
> > > > > > +++ b/common/serial.c
> > > > > > @@ -27,6 +27,16 @@
> > > > > >
> > > > > > #include <post.h>
> > > > > > #include <linux/compiler.h>
> > > > > >
> > > > > > +/* Implement prototypes for SPL without serial support */
> > > > > > +#if defined(CONFIG_SPL_BUILD) &&
> > > >
> > > > !defined(CONFIG_SPL_SERIAL_SUPPORT)
> > > >
> > > > > > +int serial_init(void) { return 0; }
> > > > > > +void serial_setbrg(void) {}
> > > > > > +int serial_getc(void) { return 0; }
> > > > > > +int serial_tstc(void) { return 0; }
> > > > > > +void serial_putc(const char c) {}
> > > > > > +void serial_puts(const char *s) {}
> > > > >
> > > > > This isn't quite right. We need to allow for:
> > > > > - No output SPL, strings collected (so #defined to do{} while
> >
> > (0))
> >
> > > > Which is not type-checked and will drag in bugs.
> > >
> > > Not all that likely, since most code will either be built with
> >
> > printf
> >
> > > enabled some of the time, or not contain printf (i.e. it's not quite
> > > the same situation as debug prints which may be rarely enabled).
> > >
> > > An inline function would be fine, but has to be done at the same
> >
> > place
> >
> > > that normal printf is declared -- whereas a macro could be done
> >
> > after
> >
> > > the fact. Unless you use a macro to redirect it to an inline
> >
> > function
> >
> > > of a different name...
> > >
> > > I do not understand why you want to put these stubs in a C file
> >
> > instead
> >
> > > of a header file, though -- you're preventing code from being
> >
> > optimized
> >
> > > away, which is important in some SPLs.
> >
> > I'd say the GCC must optimize it out anyway.
>
> I think I got some wires crossed and was thinking about printf/puts.
> We want those to be optimized away at compile time (not pointed to a
> stub at link time) on an SPL that has no output support, but once
> that's done the low level serial functions shouldn't be referenced
> anymore, right?

But if you point them to stubs, that's OK. The compiler will GC these useless
stubs anyway. But wait, we're getting to LTO here, right?

So the safest bet really is macro in serial.h ?

> -Scott