1b45b5bacSMarek Vasut /*
2b45b5bacSMarek Vasut * Copyright (c) 2021-2025, Renesas Electronics Corporation. All rights reserved.
3b45b5bacSMarek Vasut *
4b45b5bacSMarek Vasut * SPDX-License-Identifier: BSD-3-Clause
5b45b5bacSMarek Vasut */
6b45b5bacSMarek Vasut
7b45b5bacSMarek Vasut #include <stddef.h>
8b45b5bacSMarek Vasut #include <stdint.h>
9b45b5bacSMarek Vasut
10b45b5bacSMarek Vasut #include <drivers/console.h>
11b45b5bacSMarek Vasut #include <lib/mmio.h>
12b45b5bacSMarek Vasut #include <lib/utils_def.h>
13b45b5bacSMarek Vasut #include "scif.h"
14b45b5bacSMarek Vasut
15b45b5bacSMarek Vasut #include "rcar_def.h"
16b45b5bacSMarek Vasut
17*13e1e761SMarek Vasut /* CPG */
18*13e1e761SMarek Vasut #define CPG_BASE 0xE6150000UL
19*13e1e761SMarek Vasut #define CPG_CPGWPR (CPG_BASE + 0x0000UL)
20*13e1e761SMarek Vasut #define CPG_CPGWPCR (CPG_BASE + 0x0004UL)
21*13e1e761SMarek Vasut #define CPG_MSTPCR5 (CPG_BASE + 0x2D14UL)
22*13e1e761SMarek Vasut #define CPG_MSTPSR5 (CPG_BASE + 0x2E14UL)
23*13e1e761SMarek Vasut #define CPG_MSTPSR5_HSCIF0 BIT(14)
24*13e1e761SMarek Vasut #define CPG_MSTPCR7 (CPG_BASE + 0x2D1CUL)
25*13e1e761SMarek Vasut #define CPG_MSTPSR7 (CPG_BASE + 0x2E1CUL)
26*13e1e761SMarek Vasut #define CPG_MSTPSR7_SCIF0 BIT(2)
27*13e1e761SMarek Vasut #define CPG_MSTPSR7_SCIF3 BIT(4)
28*13e1e761SMarek Vasut
29b45b5bacSMarek Vasut /* RST */
30b45b5bacSMarek Vasut #define RST_BASE (0xE6160000UL + (RCAR_DOMAIN * 0x4000UL))
31b45b5bacSMarek Vasut #define RST_MODEMR0 RST_BASE
32b45b5bacSMarek Vasut #define RST_MODEMR1 (RST_BASE + 4UL)
33b45b5bacSMarek Vasut #define RST_MODEMR0_MD31 BIT(31)
34b45b5bacSMarek Vasut #define RST_MODEMR1_MD32 BIT(0)
35b45b5bacSMarek Vasut
36b45b5bacSMarek Vasut /* SCIF/HSCIF */
37b45b5bacSMarek Vasut #define SCIF0_BASE 0xE6E60000UL
38b45b5bacSMarek Vasut #define SCIF3_BASE 0xE6C50000UL
39b45b5bacSMarek Vasut #define HSCIF0_BASE 0xE6540000UL
40b45b5bacSMarek Vasut
41b45b5bacSMarek Vasut /* SCIF */
42b45b5bacSMarek Vasut #if (RCAR_LSI == RCAR_S4) /* S4 */
43b45b5bacSMarek Vasut #define SCIF_BASE SCIF3_BASE
44*13e1e761SMarek Vasut #define CPG_MSTPSR7_BIT CPG_MSTPSR7_SCIF3
45b45b5bacSMarek Vasut #else
46b45b5bacSMarek Vasut #define SCIF_BASE SCIF0_BASE
47*13e1e761SMarek Vasut #define CPG_MSTPSR7_BIT CPG_MSTPSR7_SCIF0
48b45b5bacSMarek Vasut #endif
49b45b5bacSMarek Vasut #define SCIF_SCFTDR (SCIF_BASE + 0x000CU) /* 8 Transmit FIFO data register */
50b45b5bacSMarek Vasut #define SCIF_SCFSR (SCIF_BASE + 0x0010U) /* 16 Serial status register */
51b45b5bacSMarek Vasut
52b45b5bacSMarek Vasut /* HSCIF */
53b45b5bacSMarek Vasut #define HSCIF_BASE HSCIF0_BASE
54b45b5bacSMarek Vasut #define HSCIF_HSFTDR (HSCIF_BASE + 0x000CU) /* 8 Transmit FIFO data register */
55b45b5bacSMarek Vasut #define HSCIF_HSFSR (HSCIF_BASE + 0x0010U) /* 16 Serial status register */
56b45b5bacSMarek Vasut
57b45b5bacSMarek Vasut /* Mode */
58b45b5bacSMarek Vasut #define MODEMR_SCIF_DLMODE 0U
59b45b5bacSMarek Vasut #define MODEMR_HSCIF_DLMODE_921600 1U
60b45b5bacSMarek Vasut #define MODEMR_HSCIF_DLMODE_1843200 2U
61b45b5bacSMarek Vasut #define MODEMR_HSCIF_DLMODE_3000000 3U
62b45b5bacSMarek Vasut
console_rcar_init(uintptr_t base_addr,uint32_t uart_clk,uint32_t baud_rate)63b45b5bacSMarek Vasut int console_rcar_init(uintptr_t base_addr, uint32_t uart_clk,
64b45b5bacSMarek Vasut uint32_t baud_rate)
65b45b5bacSMarek Vasut {
66*13e1e761SMarek Vasut uint32_t modemr, mstpcr, mstpsr, mstpbit;
67b45b5bacSMarek Vasut
68b45b5bacSMarek Vasut modemr = ((mmio_read_32(RST_MODEMR0) & RST_MODEMR0_MD31) >> 31U) |
69b45b5bacSMarek Vasut ((mmio_read_32(RST_MODEMR1) & RST_MODEMR1_MD32) << 1U);
70b45b5bacSMarek Vasut
71b21216f7SMarek Vasut if (modemr == MODEMR_HSCIF_DLMODE_3000000 ||
72b21216f7SMarek Vasut modemr == MODEMR_HSCIF_DLMODE_1843200 ||
73b21216f7SMarek Vasut modemr == MODEMR_HSCIF_DLMODE_921600) {
74*13e1e761SMarek Vasut mstpcr = CPG_MSTPCR5;
75*13e1e761SMarek Vasut mstpsr = CPG_MSTPSR5;
76*13e1e761SMarek Vasut mstpbit = CPG_MSTPSR5_HSCIF0;
77b21216f7SMarek Vasut scif_console_set_regs(HSCIF_HSFSR, HSCIF_HSFTDR);
78b21216f7SMarek Vasut } else {
79*13e1e761SMarek Vasut mstpcr = CPG_MSTPCR7;
80*13e1e761SMarek Vasut mstpsr = CPG_MSTPSR7;
81*13e1e761SMarek Vasut mstpbit = CPG_MSTPSR7_BIT;
82b21216f7SMarek Vasut scif_console_set_regs(SCIF_SCFSR, SCIF_SCFTDR);
83b21216f7SMarek Vasut }
84b45b5bacSMarek Vasut
85*13e1e761SMarek Vasut /* Turn SCIF/HSCIF clock ON. */
86*13e1e761SMarek Vasut mmio_clrbits_32(mstpcr, mstpbit);
87*13e1e761SMarek Vasut while (mmio_read_32(mstpsr) & mstpbit)
88*13e1e761SMarek Vasut ;
89*13e1e761SMarek Vasut
90b45b5bacSMarek Vasut return 1;
91b45b5bacSMarek Vasut }
92