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