serial: 8250: dw: Allow to use a fallback CPR value if not synthesized
authorMiquel Raynal <miquel.raynal@bootlin.com>
Fri, 22 Apr 2022 18:06:10 +0000 (20:06 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 26 Apr 2022 11:25:47 +0000 (13:25 +0200)
DW UART controllers can be synthesized without the CPR register.
In this case, allow to the platform information to provide a CPR value.

Co-developed-by: Phil Edworthy <phil.edworthy@renesas.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Phil Edworthy <phil.edworthy@renesas.com>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Link: https://lore.kernel.org/r/20220422180615.9098-5-miquel.raynal@bootlin.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/8250/8250_dwlib.c
drivers/tty/serial/8250/8250_dwlib.h

index 622d3b0d89e751851bdc902b6ed7f610cde0de49..f1fb2035361287f6f9d0a6e48d57809b5bad1bc2 100644 (file)
@@ -89,6 +89,8 @@ EXPORT_SYMBOL_GPL(dw8250_do_set_termios);
 
 void dw8250_setup_port(struct uart_port *p)
 {
+       struct dw8250_port_data *pd = p->private_data;
+       struct dw8250_data *data = to_dw8250_data(pd);
        struct uart_8250_port *up = up_to_u8250p(p);
        u32 reg;
 
@@ -108,14 +110,16 @@ void dw8250_setup_port(struct uart_port *p)
        dw8250_writel_ext(p, DW_UART_DLF, 0);
 
        if (reg) {
-               struct dw8250_port_data *d = p->private_data;
-
-               d->dlf_size = fls(reg);
+               pd->dlf_size = fls(reg);
                p->get_divisor = dw8250_get_divisor;
                p->set_divisor = dw8250_set_divisor;
        }
 
        reg = dw8250_readl_ext(p, DW_UART_CPR);
+       if (!reg) {
+               reg = data->pdata->cpr_val;
+               dev_dbg(p->dev, "CPR is not available, using 0x%08x instead\n", reg);
+       }
        if (!reg)
                return;
 
index 0df6baa6eaee41f8021186c42bd309ec6d958895..36a839ef5d9a8ee98d362618be9bfb946717204c 100644 (file)
@@ -23,6 +23,7 @@ struct dw8250_port_data {
 
 struct dw8250_platform_data {
        u8 usr_reg;
+       u32 cpr_val;
        unsigned int quirks;
 };