serial_lpuart: add support for i.MXRT
authorGiulio Benetti <giulio.benetti@benettiengineering.com>
Fri, 10 Jan 2020 14:51:43 +0000 (15:51 +0100)
committerStefano Babic <sbabic@denx.de>
Tue, 14 Jan 2020 21:54:00 +0000 (22:54 +0100)
Add i.MXRT compatible string and cpu type support to lpuart driver,
to use little endian 32 bits configurations.

Also according to RM, the Receive RX FIFO Enable (RXFE) field in LPUART
FIFO register is bit 3, so this definition should change to 0x08 as done
for i.MX8. It needs also to set baudrate the same way as i.MX8 does.

Signed-off-by: Giulio Benetti <giulio.benetti@benettiengineering.com>
drivers/serial/serial_lpuart.c
include/fsl_lpuart.h

index b2ec56172e13d9c0633534f9aaf3bb61ec2a39ca..ccb3ce6701abf35a4a5ff7cabd2e95665ecc3c50 100644 (file)
@@ -49,7 +49,7 @@
 #define FIFO_RXSIZE_MASK       0x7
 #define FIFO_RXSIZE_OFF        0
 #define FIFO_TXFE              0x80
-#ifdef CONFIG_ARCH_IMX8
+#if defined(CONFIG_ARCH_IMX8) || defined(CONFIG_ARCH_IMXRT)
 #define FIFO_RXFE              0x08
 #else
 #define FIFO_RXFE              0x40
@@ -67,7 +67,8 @@ enum lpuart_devtype {
        DEV_VF610 = 1,
        DEV_LS1021A,
        DEV_MX7ULP,
-       DEV_IMX8
+       DEV_IMX8,
+       DEV_IMXRT,
 };
 
 struct lpuart_serial_platdata {
@@ -409,7 +410,8 @@ static int _lpuart32_serial_init(struct udevice *dev)
 
        lpuart_write32(plat->flags, &base->match, 0);
 
-       if (plat->devtype == DEV_MX7ULP || plat->devtype == DEV_IMX8) {
+       if (plat->devtype == DEV_MX7ULP || plat->devtype == DEV_IMX8 ||
+           plat->devtype == DEV_IMXRT) {
                _lpuart32_serial_setbrg_7ulp(dev, gd->baudrate);
        } else {
                /* provide data bits, parity, stop bit, etc */
@@ -426,7 +428,8 @@ static int lpuart_serial_setbrg(struct udevice *dev, int baudrate)
        struct lpuart_serial_platdata *plat = dev_get_platdata(dev);
 
        if (is_lpuart32(dev)) {
-               if (plat->devtype == DEV_MX7ULP || plat->devtype == DEV_IMX8)
+               if (plat->devtype == DEV_MX7ULP || plat->devtype == DEV_IMX8 ||
+                   plat->devtype == DEV_IMXRT)
                        _lpuart32_serial_setbrg_7ulp(dev, baudrate);
                else
                        _lpuart32_serial_setbrg(dev, baudrate);
@@ -530,6 +533,8 @@ static int lpuart_serial_ofdata_to_platdata(struct udevice *dev)
                plat->devtype = DEV_VF610;
        else if (!fdt_node_check_compatible(blob, node, "fsl,imx8qm-lpuart"))
                plat->devtype = DEV_IMX8;
+       else if (!fdt_node_check_compatible(blob, node, "fsl,imxrt-lpuart"))
+               plat->devtype = DEV_IMXRT;
 
        return 0;
 }
@@ -549,6 +554,8 @@ static const struct udevice_id lpuart_serial_ids[] = {
        { .compatible = "fsl,vf610-lpuart"},
        { .compatible = "fsl,imx8qm-lpuart",
                .data = LPUART_FLAG_REGMAP_32BIT_REG },
+       { .compatible = "fsl,imxrt-lpuart",
+               .data = LPUART_FLAG_REGMAP_32BIT_REG },
        { }
 };
 
index fc517d4b7ff8f76824a939771b1b6ea5c11be63c..511fb8436721d95c0da789bc32a130cefbb74281 100644 (file)
@@ -4,7 +4,8 @@
  *
  */
 
-#if defined(CONFIG_ARCH_MX7ULP) || defined(CONFIG_ARCH_IMX8)
+#if defined(CONFIG_ARCH_MX7ULP) || defined(CONFIG_ARCH_IMX8) || \
+       defined(CONFIG_ARCH_IMXRT)
 struct lpuart_fsl_reg32 {
        u32 verid;
        u32 param;