1*3c6170b6SMarek Vasut /*
2*3c6170b6SMarek Vasut * Copyright (c) 2021-2025, Renesas Electronics Corporation. All rights reserved.
3*3c6170b6SMarek Vasut *
4*3c6170b6SMarek Vasut * SPDX-License-Identifier: BSD-3-Clause
5*3c6170b6SMarek Vasut */
6*3c6170b6SMarek Vasut
7*3c6170b6SMarek Vasut #include <stddef.h>
8*3c6170b6SMarek Vasut #include <stdint.h>
9*3c6170b6SMarek Vasut
10*3c6170b6SMarek Vasut #include <drivers/console.h>
11*3c6170b6SMarek Vasut #include <lib/mmio.h>
12*3c6170b6SMarek Vasut #include <lib/utils_def.h>
13*3c6170b6SMarek Vasut #include "scif.h"
14*3c6170b6SMarek Vasut
15*3c6170b6SMarek Vasut /* SCIF/HSCIF */
16*3c6170b6SMarek Vasut #define SCIF_SCFSR_TEND BIT(6)
17*3c6170b6SMarek Vasut #define SCIF_SCFSR_TDFE BIT(5)
18*3c6170b6SMarek Vasut #define TRANS_END_CHECK (SCIF_SCFSR_TEND | SCIF_SCFSR_TDFE)
19*3c6170b6SMarek Vasut
20*3c6170b6SMarek Vasut static uint32_t rcar_putc_fsr;
21*3c6170b6SMarek Vasut static uint32_t rcar_putc_tdr;
22*3c6170b6SMarek Vasut
scif_clrbits_16(uintptr_t addr,uint32_t clear)23*3c6170b6SMarek Vasut static inline void scif_clrbits_16(uintptr_t addr, uint32_t clear)
24*3c6170b6SMarek Vasut {
25*3c6170b6SMarek Vasut mmio_write_16(addr, mmio_read_16(addr) & ~clear);
26*3c6170b6SMarek Vasut }
27*3c6170b6SMarek Vasut
scif_console_trans_end_poll(uint32_t reg)28*3c6170b6SMarek Vasut static void scif_console_trans_end_poll(uint32_t reg)
29*3c6170b6SMarek Vasut {
30*3c6170b6SMarek Vasut /* Check that transfer of SCIF is completed */
31*3c6170b6SMarek Vasut while ((mmio_read_16(reg) & TRANS_END_CHECK) != TRANS_END_CHECK)
32*3c6170b6SMarek Vasut ;
33*3c6170b6SMarek Vasut }
34*3c6170b6SMarek Vasut
scif_console_putc_common(uint8_t chr)35*3c6170b6SMarek Vasut static void scif_console_putc_common(uint8_t chr)
36*3c6170b6SMarek Vasut {
37*3c6170b6SMarek Vasut scif_console_trans_end_poll(rcar_putc_fsr);
38*3c6170b6SMarek Vasut mmio_write_8(rcar_putc_tdr, chr); /* Transfer one character */
39*3c6170b6SMarek Vasut scif_clrbits_16(rcar_putc_fsr, TRANS_END_CHECK); /* TEND,TDFE clear */
40*3c6170b6SMarek Vasut scif_console_trans_end_poll(rcar_putc_fsr);
41*3c6170b6SMarek Vasut }
42*3c6170b6SMarek Vasut
scif_console_set_regs(uint32_t fsr,uint32_t tdr)43*3c6170b6SMarek Vasut void scif_console_set_regs(uint32_t fsr, uint32_t tdr)
44*3c6170b6SMarek Vasut {
45*3c6170b6SMarek Vasut rcar_putc_fsr = fsr;
46*3c6170b6SMarek Vasut rcar_putc_tdr = tdr;
47*3c6170b6SMarek Vasut }
48*3c6170b6SMarek Vasut
console_rcar_putc(int c,console_t * pconsole)49*3c6170b6SMarek Vasut int console_rcar_putc(int c, console_t *pconsole)
50*3c6170b6SMarek Vasut {
51*3c6170b6SMarek Vasut if (rcar_putc_fsr == 0 || rcar_putc_tdr == 0)
52*3c6170b6SMarek Vasut return -1;
53*3c6170b6SMarek Vasut
54*3c6170b6SMarek Vasut if (c == '\n') /* add 'CR' before 'LF' */
55*3c6170b6SMarek Vasut scif_console_putc_common('\r');
56*3c6170b6SMarek Vasut
57*3c6170b6SMarek Vasut scif_console_putc_common(c);
58*3c6170b6SMarek Vasut
59*3c6170b6SMarek Vasut return c;
60*3c6170b6SMarek Vasut }
61*3c6170b6SMarek Vasut
console_rcar_flush(console_t * pconsole)62*3c6170b6SMarek Vasut int console_rcar_flush(console_t *pconsole)
63*3c6170b6SMarek Vasut {
64*3c6170b6SMarek Vasut /* Nothing to do */
65*3c6170b6SMarek Vasut return 0;
66*3c6170b6SMarek Vasut }
67