Add changes so Lantiq serial driver can be compiled as a module.
Also, make this driver's use as console selectable/configurable.

Signed-off-by: Rahul Tanwar <[email protected]>
---
 drivers/tty/serial/Kconfig  | 13 +++++++++++--
 drivers/tty/serial/lantiq.c | 43 ++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 51 insertions(+), 5 deletions(-)

diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig
index 4b0a7b98f8c7..996782247174 100644
--- a/drivers/tty/serial/Kconfig
+++ b/drivers/tty/serial/Kconfig
@@ -1034,13 +1034,22 @@ config SERIAL_SIFIVE_CONSOLE
          boot time.)
 
 config SERIAL_LANTIQ
-       bool "Lantiq serial driver"
+       tristate "Lantiq serial driver"
        depends on (LANTIQ || X86) || COMPILE_TEST
        select SERIAL_CORE
+       help
+         Support for UART on Lantiq and Intel SoCs.
+         To compile this driver as a module, choose M here, the
+         module will be called lantiq.
+
+config SERIAL_LANTIQ_CONSOLE
+       bool "Console on Lantiq UART"
+       depends on SERIAL_LANTIQ=y
        select SERIAL_CORE_CONSOLE
        select SERIAL_EARLYCON
        help
-         Support for console and UART on Lantiq SoCs.
+         Select this option if you would like to use a Lantiq UART as the
+         system console.
 
 config SERIAL_QE
        tristate "Freescale QUICC Engine serial port support"
diff --git a/drivers/tty/serial/lantiq.c b/drivers/tty/serial/lantiq.c
index c5e46ff972e4..93ed59bccd11 100644
--- a/drivers/tty/serial/lantiq.c
+++ b/drivers/tty/serial/lantiq.c
@@ -15,6 +15,7 @@
 #include <linux/io.h>
 #include <linux/ioport.h>
 #include <linux/lantiq.h>
+#include <linux/module.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
 #include <linux/of_platform.h>
@@ -597,6 +598,13 @@ static const struct uart_ops lqasc_pops = {
        .verify_port =  lqasc_verify_port,
 };
 
+
+/*
+ * Linux console interface
+ */
+
+#ifdef CONFIG_SERIAL_LANTIQ_CONSOLE
+
 static void
 lqasc_console_putchar(struct uart_port *port, int ch)
 {
@@ -705,6 +713,14 @@ lqasc_serial_early_console_setup(struct earlycon_device 
*device,
 OF_EARLYCON_DECLARE(lantiq, "lantiq,asc", lqasc_serial_early_console_setup);
 OF_EARLYCON_DECLARE(lantiq, "intel,lgm-asc", lqasc_serial_early_console_setup);
 
+#define LANTIQ_SERIAL_CONSOLE  (&lqasc_console)
+
+#else
+
+#define LANTIQ_SERIAL_CONSOLE  NULL
+
+#endif
+
 static struct uart_driver lqasc_reg = {
        .owner =        THIS_MODULE,
        .driver_name =  DRVNAME,
@@ -712,7 +728,7 @@ static struct uart_driver lqasc_reg = {
        .major =        0,
        .minor =        0,
        .nr =           MAXPORTS,
-       .cons =         &lqasc_console,
+       .cons =         LANTIQ_SERIAL_CONSOLE,
 };
 
 static int fetch_irq_lantiq(struct device *dev, struct ltq_uart_port *ltq_port)
@@ -899,6 +915,13 @@ lqasc_probe(struct platform_device *pdev)
        return ret;
 }
 
+static int lqasc_remove(struct platform_device *pdev)
+{
+       struct uart_port *port = platform_get_drvdata(pdev);
+
+       return uart_remove_one_port(&lqasc_reg, port);
+}
+
 static const struct ltq_soc_data soc_data_lantiq = {
        .fetch_irq = fetch_irq_lantiq,
        .request_irq = request_irq_lantiq,
@@ -916,8 +939,11 @@ static const struct of_device_id ltq_asc_match[] = {
        { .compatible = "intel,lgm-asc", .data = &soc_data_intel },
        {},
 };
+MODULE_DEVICE_TABLE(of, ltq_asc_match);
 
 static struct platform_driver lqasc_driver = {
+       .probe          = lqasc_probe,
+       .remove         = lqasc_remove,
        .driver         = {
                .name   = DRVNAME,
                .of_match_table = ltq_asc_match,
@@ -933,10 +959,21 @@ init_lqasc(void)
        if (ret != 0)
                return ret;
 
-       ret = platform_driver_probe(&lqasc_driver, lqasc_probe);
+       ret = platform_driver_register(&lqasc_driver);
        if (ret != 0)
                uart_unregister_driver(&lqasc_reg);
 
        return ret;
 }
-device_initcall(init_lqasc);
+
+static void __exit exit_lqasc(void)
+{
+       platform_driver_unregister(&lqasc_driver);
+       uart_unregister_driver(&lqasc_reg);
+}
+
+module_init(init_lqasc);
+module_exit(exit_lqasc);
+
+MODULE_DESCRIPTION("Serial driver for Lantiq & Intel gateway SoCs");
+MODULE_LICENSE("GPL v2");
-- 
2.11.0

Reply via email to