drivers: PL011: allow to supply fixed option string
authorAndre Przywara <andre.przywara@arm.com>
Thu, 21 May 2015 16:26:22 +0000 (17:26 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 24 May 2015 20:08:51 +0000 (13:08 -0700)
The SBSA UART has a fixed baud rate and flow control setting, which
cannot be changed or queried by software.
Add a vendor specific property to always return fixed values when
trying to read the console options.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Tested-by: Mark Langsdorf <mlangsdo@redhat.com>
Tested-by: Naresh Bhat <nbhat@cavium.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/amba-pl011.c

index 3f6b9150e5758c5bfc46125ca92112a926bc034b..6558400f766ffdba4b690029282fb28dcdfa3dae 100644 (file)
@@ -79,6 +79,7 @@ struct vendor_data {
        bool                    dma_threshold;
        bool                    cts_event_workaround;
        bool                    always_enabled;
+       bool                    fixed_options;
 
        unsigned int (*get_fifosize)(struct amba_device *dev);
 };
@@ -96,6 +97,7 @@ static struct vendor_data vendor_arm = {
        .dma_threshold          = false,
        .cts_event_workaround   = false,
        .always_enabled         = false,
+       .fixed_options          = false,
        .get_fifosize           = get_fifosize_arm,
 };
 
@@ -112,6 +114,7 @@ static struct vendor_data vendor_st = {
        .dma_threshold          = true,
        .cts_event_workaround   = true,
        .always_enabled         = false,
+       .fixed_options          = false,
        .get_fifosize           = get_fifosize_st,
 };
 
@@ -160,6 +163,7 @@ struct uart_amba_port {
        unsigned int            lcrh_rx;        /* vendor-specific */
        unsigned int            old_cr;         /* state during shutdown */
        bool                    autorts;
+       unsigned int            fixed_baud;     /* vendor-set fixed baud rate */
        char                    type[12];
 #ifdef CONFIG_DMA_ENGINE
        /* DMA stuff */
@@ -2076,10 +2080,15 @@ static int __init pl011_console_setup(struct console *co, char *options)
 
        uap->port.uartclk = clk_get_rate(uap->clk);
 
-       if (options)
-               uart_parse_options(options, &baud, &parity, &bits, &flow);
-       else
-               pl011_console_get_options(uap, &baud, &parity, &bits);
+       if (uap->vendor->fixed_options) {
+               baud = uap->fixed_baud;
+       } else {
+               if (options)
+                       uart_parse_options(options,
+                                          &baud, &parity, &bits, &flow);
+               else
+                       pl011_console_get_options(uap, &baud, &parity, &bits);
+       }
 
        return uart_set_options(&uap->port, co, baud, parity, bits, flow);
 }