mirror of
https://github.com/torvalds/linux.git
synced 2024-11-16 17:12:06 +00:00
tty: serial: samsung: Fix console registration from module
On modern Exynos SoCs (like Exynos850) the UART can be implemented as a part of USI IP-core. In such case, USI driver is used to initialize USI registers, and it also calls of_platform_populate() to instantiate all sub-nodes (e.g. serial node) of USI node. When serial driver is built-in, but USI driver is a module, and CONFIG_SERIAL_SAMSUNG_CONSOLE is enabled, next call chain will happen when loading USI module from user space: usi_init v usi_probe v of_platform_populate v s3c24xx_serial_probe v uart_add_one_port v uart_configure_port v register_console v try_enable_new_console v s3c24xx_serial_console_setup But because the serial driver is built-in, and s3c24xx_serial_console_setup() is marked with __init keyword, that symbol will discarded and long gone by that time already, causing failed paging request. That happens during the next config combination: EXYNOS_USI=m SERIAL_SAMSUNG=y SERIAL_SAMSUNG_CONSOLE=y That config should be completely possible, so rather than limiting SERIAL_SAMSUNG choice to "m" only when USI=m, remove __init keyword for all affected functions. Signed-off-by: Sam Protsenko <semen.protsenko@linaro.org> Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com> Link: https://lore.kernel.org/r/20211204195757.8600-6-semen.protsenko@linaro.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
0882b473b0
commit
8cf8d3c4a6
@ -2500,7 +2500,8 @@ s3c24xx_serial_console_write(struct console *co, const char *s,
|
|||||||
uart_console_write(cons_uart, s, count, s3c24xx_serial_console_putchar);
|
uart_console_write(cons_uart, s, count, s3c24xx_serial_console_putchar);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init
|
/* Shouldn't be __init, as it can be instantiated from other module */
|
||||||
|
static void
|
||||||
s3c24xx_serial_get_options(struct uart_port *port, int *baud,
|
s3c24xx_serial_get_options(struct uart_port *port, int *baud,
|
||||||
int *parity, int *bits)
|
int *parity, int *bits)
|
||||||
{
|
{
|
||||||
@ -2563,7 +2564,8 @@ s3c24xx_serial_get_options(struct uart_port *port, int *baud,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init
|
/* Shouldn't be __init, as it can be instantiated from other module */
|
||||||
|
static int
|
||||||
s3c24xx_serial_console_setup(struct console *co, char *options)
|
s3c24xx_serial_console_setup(struct console *co, char *options)
|
||||||
{
|
{
|
||||||
struct uart_port *port;
|
struct uart_port *port;
|
||||||
|
Loading…
Reference in New Issue
Block a user