Message ID | 20211204195757.8600-6-semen.protsenko@linaro.org |
---|---|
State | New |
Headers | show |
Series | soc: samsung: Add USI driver | expand |
On 04/12/2021 20:57, Sam Protsenko wrote: > 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> > --- > Changes in v3: > - (none) > > Changes in v2: > - This patch is added in v2 > > drivers/tty/serial/samsung_tty.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com> Best regards, Krzysztof
diff --git a/drivers/tty/serial/samsung_tty.c b/drivers/tty/serial/samsung_tty.c index 61ccb359620a..d002a4e48ed9 100644 --- a/drivers/tty/serial/samsung_tty.c +++ b/drivers/tty/serial/samsung_tty.c @@ -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); } -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, 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) { struct uart_port *port;
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> --- Changes in v3: - (none) Changes in v2: - This patch is added in v2 drivers/tty/serial/samsung_tty.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)