]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
serial: sh: Add RZ/G2L SCIF support
authorPaul Barker <paul.barker.ct@bp.renesas.com>
Thu, 19 Oct 2023 14:30:44 +0000 (15:30 +0100)
committerMarek Vasut <marek.vasut+renesas@mailbox.org>
Thu, 19 Oct 2023 15:03:20 +0000 (17:03 +0200)
Extend the existing driver to support the SCIF serial ports on the
Renesas RZ/G2L (R9A07G044) SoC. This also requires us to ensure that if
there is a reset signal defined in the device tree, it is de-asserted
before we try to talk to the SCIF module.

Signed-off-by: Paul Barker <paul.barker.ct@bp.renesas.com>
Reviewed-by: Biju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Marek Vasut <marek.vasut+renesas@mailbox.org>
Tested-by: Marek Vasut <marek.vasut+renesas@mailbox.org> # R-Car H3 Salvator-XS
arch/arm/mach-rmobile/Kconfig
drivers/serial/serial_sh.c
drivers/serial/serial_sh.h

index 714eb4405bcfa220cc17ead9a8fc1b339659d2f0..2bb96749fc0da7a866d4a6a24507bdfb2a9f67ef 100644 (file)
@@ -77,6 +77,7 @@ config RZG2L
        imply PINCTRL_RZG2L
        imply RENESAS_SDHI
        imply RZG2L_GPIO
+       imply SCIF_CONSOLE
        imply SYS_MALLOC_F
        help
          Enable support for the Renesas RZ/G2L family of SoCs. Currently
index 9a698b19ccdebb9a0a2bbb115db9ef5ed030f405..c034ab54e15224d6eaabddd0111a3a8597d6de3e 100644 (file)
 #include <asm/processor.h>
 #include <clk.h>
 #include <dm.h>
+#include <dm/device_compat.h>
 #include <dm/platform_data/serial_sh.h>
 #include <errno.h>
 #include <linux/compiler.h>
 #include <linux/delay.h>
+#include <reset.h>
 #include <serial.h>
 #include "serial_sh.h"
 
@@ -199,12 +201,24 @@ static int sh_serial_probe(struct udevice *dev)
 {
        struct sh_serial_plat *plat = dev_get_plat(dev);
        struct uart_port *priv = dev_get_priv(dev);
+       struct reset_ctl rst;
+       int ret;
 
        priv->membase   = (unsigned char *)plat->base;
        priv->mapbase   = plat->base;
        priv->type      = plat->type;
        priv->clk_mode  = plat->clk_mode;
 
+       /* De-assert the module reset if it is defined. */
+       ret = reset_get_by_index(dev, 0, &rst);
+       if (!ret) {
+               ret = reset_deassert(&rst);
+               if (ret < 0) {
+                       dev_err(dev, "failed to de-assert reset line\n");
+                       return ret;
+               }
+       }
+
        sh_serial_init_generic(priv);
 
        return 0;
@@ -221,6 +235,7 @@ static const struct dm_serial_ops sh_serial_ops = {
 static const struct udevice_id sh_serial_id[] ={
        {.compatible = "renesas,sci", .data = PORT_SCI},
        {.compatible = "renesas,scif", .data = PORT_SCIF},
+       {.compatible = "renesas,scif-r9a07g044", .data = PORT_SCIFA},
        {.compatible = "renesas,scifa", .data = PORT_SCIFA},
        {.compatible = "renesas,hscif", .data = PORT_HSCIF},
        {}
index 149ec1fe73978616c14ad3929830f5b613e2e520..58c2d22bc757e5224973bbd899994c1689247571 100644 (file)
@@ -90,7 +90,7 @@ struct uart_port {
 # define SCSCR_INIT(port)      0x38 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
 # define SCIF_ORER 0x0001  /* overrun error bit */
 #elif defined(CONFIG_RCAR_GEN2) || defined(CONFIG_RCAR_64) || \
-      defined(CONFIG_R7S72100)
+      defined(CONFIG_R7S72100) || defined(CONFIG_RZG2L)
 # if defined(CFG_SCIF_A)
 #  define SCIF_ORER    0x0200
 # else
@@ -312,6 +312,9 @@ static inline void sci_##name##_out(struct uart_port *port,\
                                        sh4_scif_offset, sh4_scif_size)
                #define SCIF_FNS(name, sh4_scif_offset, sh4_scif_size) \
                        CPU_SCIF_FNS(name, sh4_scif_offset, sh4_scif_size)
+#elif defined(CONFIG_RZG2L)
+#define SCIF_FNS(reg_name, reg_offset, reg_size) \
+       CPU_SCIF_FNS(reg_name, reg_offset, reg_size)
 #else
 #define SCIx_FNS(name, sh3_sci_offset, sh3_sci_size,\
                                sh4_sci_offset, sh4_sci_size, \
@@ -387,6 +390,20 @@ SCIF_FNS(SCLSR,  0,  0, 0x14, 16)
 #else
 SCIF_FNS(SCLSR,  0,  0, 0x24, 16)
 #endif
+#elif defined(CONFIG_RZG2L)
+SCIF_FNS(SCSMR,  0x00, 16)
+SCIF_FNS(SCBRR,  0x02,  8)
+SCIF_FNS(SCSCR,  0x04, 16)
+SCIF_FNS(SCxTDR, 0x06,  8)
+SCIF_FNS(SCxSR,  0x08, 16)
+SCIF_FNS(SCxRDR, 0x0A,  8)
+SCIF_FNS(SCFCR,  0x0C, 16)
+SCIF_FNS(SCFDR,  0x0E, 16)
+SCIF_FNS(SCSPTR, 0x10, 16)
+SCIF_FNS(SCLSR,  0x12, 16)
+SCIF_FNS(SCSEMR, 0x14,  8)
+SCIF_FNS(SCxTCR, 0x16, 16)
+SCIF_FNS(DL,     0x00,  0)
 #else
 /*      reg      SCI/SH3   SCI/SH4  SCIF/SH3   SCIF/SH4  SCI/H8*/
 /*      name     off  sz   off  sz   off  sz   off  sz   off  sz*/