1656a8564SMarek Vasut /*
2656a8564SMarek Vasut * Copyright (c) 2026, Renesas Electronics Corporation. All rights reserved.
3656a8564SMarek Vasut *
4656a8564SMarek Vasut * SPDX-License-Identifier: BSD-3-Clause
5656a8564SMarek Vasut */
6656a8564SMarek Vasut
7656a8564SMarek Vasut #include <stddef.h>
8656a8564SMarek Vasut #include <stdint.h>
9656a8564SMarek Vasut
10656a8564SMarek Vasut #include <drivers/console.h>
11656a8564SMarek Vasut #include <lib/mmio.h>
12656a8564SMarek Vasut #include <lib/utils_def.h>
13656a8564SMarek Vasut #include "scif.h"
14656a8564SMarek Vasut
15656a8564SMarek Vasut #include "cpg_registers.h"
16656a8564SMarek Vasut #include "rcar_def.h"
17656a8564SMarek Vasut #include "rcar_private.h"
18656a8564SMarek Vasut
19656a8564SMarek Vasut /* CPG */
20656a8564SMarek Vasut #define CPG_MSTPSR2_SCIF0 BIT(7)
21656a8564SMarek Vasut #define CPG_MSTPSR3_SCIF2 BIT(10)
22656a8564SMarek Vasut
23656a8564SMarek Vasut /* SCIF */
24656a8564SMarek Vasut #define SCIF0_BASE 0xE6E60000UL
25656a8564SMarek Vasut #define SCIF2_BASE 0xE6E88000UL
26656a8564SMarek Vasut
27656a8564SMarek Vasut /* SCIF */
28656a8564SMarek Vasut #define SCIF_SCSMR 0x00
29656a8564SMarek Vasut #define SCIF_SCBRR 0x04
30656a8564SMarek Vasut #define SCIF_SCSCR 0x08
31656a8564SMarek Vasut #define SCIF_SCFTDR 0x0C
32656a8564SMarek Vasut #define SCIF_SCFSR 0x10
33656a8564SMarek Vasut #define SCIF_SCFCR 0x18
34656a8564SMarek Vasut #define SCIF_SCLSR 0x24
35656a8564SMarek Vasut
36656a8564SMarek Vasut /* MODE pin */
37656a8564SMarek Vasut #define MODEMR_MD12 BIT(12)
38656a8564SMarek Vasut
39656a8564SMarek Vasut #define SCBRR_115200BPS 17
40656a8564SMarek Vasut #define SCBRR_115200BPS_D3_SSCG 16
41656a8564SMarek Vasut #define SCBRR_115200BPS_E3_SSCG 15
42656a8564SMarek Vasut #define SCBRR_230400BPS 8
43656a8564SMarek Vasut
44656a8564SMarek Vasut #define SCSCR_TE_EN BIT(5)
45656a8564SMarek Vasut #define SCSCR_RE_EN BIT(4)
46656a8564SMarek Vasut #define SCSCR_CKE_MASK 3
47656a8564SMarek Vasut #define SCSCR_CKE_INT_CLK 0
48656a8564SMarek Vasut #define SCFCR_TFRST_EN BIT(2)
49656a8564SMarek Vasut #define SCFCR_RFRS_EN BIT(1)
50656a8564SMarek Vasut
console_renesas_init(uintptr_t base_addr,uint32_t uart_clk,uint32_t baud_rate)51*ded1b9c7SMarek Vasut void console_renesas_init(uintptr_t base_addr, uint32_t uart_clk,
52656a8564SMarek Vasut uint32_t baud_rate)
53656a8564SMarek Vasut {
54656a8564SMarek Vasut uint32_t prr = mmio_read_32(PRR);
55656a8564SMarek Vasut uint32_t base;
56656a8564SMarek Vasut int i;
57656a8564SMarek Vasut
58656a8564SMarek Vasut if ((prr & PRR_PRODUCT_MASK) == PRR_PRODUCT_V3M) { /* V3M */
59656a8564SMarek Vasut base = SCIF0_BASE;
60656a8564SMarek Vasut /* Enable SCIF clock */
61656a8564SMarek Vasut mstpcr_write(CPG_SMSTPCR2, CPG_MSTPSR2, CPG_MSTPSR2_SCIF0);
62656a8564SMarek Vasut } else {
63656a8564SMarek Vasut base = SCIF2_BASE;
64656a8564SMarek Vasut /* Enable SCIF clock */
65656a8564SMarek Vasut mstpcr_write(CPG_SMSTPCR3, CPG_MSTPSR3, CPG_MSTPSR3_SCIF2);
66656a8564SMarek Vasut }
67656a8564SMarek Vasut
68656a8564SMarek Vasut scif_console_set_regs(base + SCIF_SCFSR, base + SCIF_SCFTDR);
69656a8564SMarek Vasut
70656a8564SMarek Vasut /* Clear bits TE and RE in SCSCR to 0 */
71656a8564SMarek Vasut mmio_write_16(base + SCIF_SCSCR, 0);
72656a8564SMarek Vasut
73656a8564SMarek Vasut /* Set bits TFRST and RFRST in SCFCR to 1 */
74656a8564SMarek Vasut mmio_clrsetbits_16(base + SCIF_SCFCR,
75656a8564SMarek Vasut SCFCR_TFRST_EN | SCFCR_RFRS_EN,
76656a8564SMarek Vasut SCFCR_TFRST_EN | SCFCR_RFRS_EN);
77656a8564SMarek Vasut
78656a8564SMarek Vasut /*
79656a8564SMarek Vasut * Read flags of ER, DR, BRK, and RDF in SCFSR and those
80656a8564SMarek Vasut * of TO and ORER in SCLSR, then clear them to 0.
81656a8564SMarek Vasut */
82656a8564SMarek Vasut mmio_write_16(base + SCIF_SCFSR, 0);
83656a8564SMarek Vasut mmio_write_16(base + SCIF_SCLSR, 0);
84656a8564SMarek Vasut
85656a8564SMarek Vasut /* Set bits CKE[1:0] in SCSCR */
86656a8564SMarek Vasut mmio_clrsetbits_16(base + SCIF_SCSCR, SCSCR_CKE_MASK,
87656a8564SMarek Vasut SCSCR_CKE_INT_CLK);
88656a8564SMarek Vasut
89656a8564SMarek Vasut /* Set data transfer format in SCSMR */
90656a8564SMarek Vasut mmio_write_16(base + SCIF_SCSMR, 0);
91656a8564SMarek Vasut
92656a8564SMarek Vasut /* Set value in SCBRR */
93656a8564SMarek Vasut if ((prr & (PRR_PRODUCT_MASK | PRR_CUT_MASK)) == PRR_PRODUCT_H3_CUT10) {
94656a8564SMarek Vasut /* H3 ES 1.0 */
95656a8564SMarek Vasut mmio_write_8(base + SCIF_SCBRR, SCBRR_230400BPS);
96656a8564SMarek Vasut } else if (((prr & PRR_PRODUCT_MASK) == PRR_PRODUCT_D3) &&
97656a8564SMarek Vasut (mmio_read_32(RST_MODEMR) & MODEMR_MD12)) {
98656a8564SMarek Vasut /* D3 with SSCG(MD12) ON */
99656a8564SMarek Vasut mmio_write_8(base + SCIF_SCBRR, SCBRR_115200BPS_D3_SSCG);
100656a8564SMarek Vasut } else if (((prr & PRR_PRODUCT_MASK) == PRR_PRODUCT_E3) &&
101656a8564SMarek Vasut (mmio_read_32(RST_MODEMR) & MODEMR_MD12)) {
102656a8564SMarek Vasut /* E3 with SSCG(MD12) ON */
103656a8564SMarek Vasut mmio_write_8(base + SCIF_SCBRR, SCBRR_115200BPS_E3_SSCG);
104656a8564SMarek Vasut } else {
105656a8564SMarek Vasut /* H3/M3/M3N or when SSCG(MD12) is off in E3/D3 */
106656a8564SMarek Vasut mmio_write_8(base + SCIF_SCBRR, SCBRR_115200BPS);
107656a8564SMarek Vasut }
108656a8564SMarek Vasut
109656a8564SMarek Vasut /* 1-bit interval elapsed */
110656a8564SMarek Vasut for (i = 0; i < 100; i++)
111656a8564SMarek Vasut asm volatile("nop");
112656a8564SMarek Vasut
113656a8564SMarek Vasut /*
114656a8564SMarek Vasut * Set bits RTRG[1:0], TTRG[1:0], and MCE in SCFCR
115656a8564SMarek Vasut * Clear bits FRST and RFRST to 0
116656a8564SMarek Vasut */
117656a8564SMarek Vasut mmio_write_16(base + SCIF_SCFCR, 0);
118656a8564SMarek Vasut
119656a8564SMarek Vasut /* Set bits TE and RE in SCSCR to 1 */
120656a8564SMarek Vasut mmio_clrsetbits_16(base + SCIF_SCSCR, SCSCR_TE_EN | SCSCR_RE_EN,
121656a8564SMarek Vasut SCSCR_TE_EN | SCSCR_RE_EN);
122656a8564SMarek Vasut }
123