xref: /rk3399_ARM-atf/drivers/renesas/rcar_gen4/scif/scif.c (revision 9347ed995021ff24275e190998eb71833d270a81)
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