[[RESEND][PATCH] earlycon: Fix uart_parse_earlycon() if !CONFIG_SERIAL_CORE_CONSOLE] On 19/10/2015 (Mon 17:13) Peter Hurley wrote: > Arnd Bergmann wrote: > > A configuration that enables earlycon but not the core console > > code causes a link error: > > > > drivers/built-in.o: In function `setup_earlycon': > > drivers/tty/serial/earlycon.c:70: undefined reference to `uart_parse_earlycon' > > CONFIG_SERIAL_EARLYCON should not require CONFIG_SERIAL_CORE_CONSOLE. > Move uart_parse_earlycon() and compile if either CONFIG_SERIAL_CORE_CONSOLE > or CONFIG_SERIAL_EARLYCON. > > Reported-by: Arnd Bergmann <arnd@xxxxxxxx> > Signed-off-by: Peter Hurley <peter@xxxxxxxxxxxxxxxxxx> > --- > > NB: The diff moves everything else around uart_parse_earlycon() :/ But, unless I missed something, serial_core.c can be entirely modular itself, and if it is, while early con is not, then you get the fail I reported. AFAICT no amount of shuffling within the file will fix that. So early con _has_ to depend on serial core =y as per the patch I sent. Or did I overlook something? Thanks, Paul. -- > > drivers/tty/serial/serial_core.c | 90 ++++++++++++++++++++-------------------- > 1 file changed, 46 insertions(+), 44 deletions(-) > > diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c > index eec067d..4d42b13 100644 > --- a/drivers/tty/serial/serial_core.c > +++ b/drivers/tty/serial/serial_core.c > @@ -1762,50 +1762,7 @@ static const struct file_operations uart_proc_fops = { > }; > #endif > > -#if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(CONFIG_CONSOLE_POLL) > -/** > - * uart_console_write - write a console message to a serial port > - * @port: the port to write the message > - * @s: array of characters > - * @count: number of characters in string to write > - * @putchar: function to write character to port > - */ > -void uart_console_write(struct uart_port *port, const char *s, > - unsigned int count, > - void (*putchar)(struct uart_port *, int)) > -{ > - unsigned int i; > - > - for (i = 0; i < count; i++, s++) { > - if (*s == '\n') > - putchar(port, '\r'); > - putchar(port, *s); > - } > -} > -EXPORT_SYMBOL_GPL(uart_console_write); > - > -/* > - * Check whether an invalid uart number has been specified, and > - * if so, search for the first available port that does have > - * console support. > - */ > -struct uart_port * __init > -uart_get_console(struct uart_port *ports, int nr, struct console *co) > -{ > - int idx = co->index; > - > - if (idx < 0 || idx >= nr || (ports[idx].iobase == 0 && > - ports[idx].membase == NULL)) > - for (idx = 0; idx < nr; idx++) > - if (ports[idx].iobase != 0 || > - ports[idx].membase != NULL) > - break; > - > - co->index = idx; > - > - return ports + idx; > -} > - > +#if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(CONFIG_SERIAL_EARLYCON) > /** > * uart_parse_earlycon - Parse earlycon options > * @p: ptr to 2nd field (ie., just beyond '<name>,') > @@ -1851,6 +1808,51 @@ int uart_parse_earlycon(char *p, unsigned char *iotype, unsigned long *addr, > return 0; > } > EXPORT_SYMBOL_GPL(uart_parse_earlycon); > +#endif > + > +#if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(CONFIG_CONSOLE_POLL) > +/** > + * uart_console_write - write a console message to a serial port > + * @port: the port to write the message > + * @s: array of characters > + * @count: number of characters in string to write > + * @putchar: function to write character to port > + */ > +void uart_console_write(struct uart_port *port, const char *s, > + unsigned int count, > + void (*putchar)(struct uart_port *, int)) > +{ > + unsigned int i; > + > + for (i = 0; i < count; i++, s++) { > + if (*s == '\n') > + putchar(port, '\r'); > + putchar(port, *s); > + } > +} > +EXPORT_SYMBOL_GPL(uart_console_write); > + > +/* > + * Check whether an invalid uart number has been specified, and > + * if so, search for the first available port that does have > + * console support. > + */ > +struct uart_port * __init > +uart_get_console(struct uart_port *ports, int nr, struct console *co) > +{ > + int idx = co->index; > + > + if (idx < 0 || idx >= nr || (ports[idx].iobase == 0 && > + ports[idx].membase == NULL)) > + for (idx = 0; idx < nr; idx++) > + if (ports[idx].iobase != 0 || > + ports[idx].membase != NULL) > + break; > + > + co->index = idx; > + > + return ports + idx; > +} > > /** > * uart_parse_options - Parse serial port baud/parity/bits/flow control. > -- > 2.3.5 > -- To unsubscribe from this list: send the line "unsubscribe linux-serial" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html