3
* Martin Winistoerfer, martinwinistoerfer@gmx.ch.
5
* SPDX-License-Identifier: GPL-2.0+
11
* Discription: Serial interface driver for SCI1 and SCI2.
12
* Since this code will be called from ROM use
13
* only non-static local variables.
22
#include <linux/compiler.h>
24
DECLARE_GLOBAL_DATA_PTR;
30
static int ready_to_send(void)
32
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
33
volatile short status;
36
#if defined(CONFIG_5xx_CONS_SCI1)
37
status = immr->im_qsmcm.qsmcm_sc1sr;
39
status = immr->im_qsmcm.qsmcm_sc2sr;
42
#if defined(CONFIG_WATCHDOG)
43
reset_5xx_watchdog (immr);
45
} while ((status & SCI_TDRE) == 0);
51
* Minimal global serial functions needed to use one of the SCI modules.
54
static int mpc5xx_serial_init(void)
56
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
60
#if defined(CONFIG_5xx_CONS_SCI1)
61
/* 10-Bit, 1 start bit, 8 data bit, no parity, 1 stop bit */
62
immr->im_qsmcm.qsmcm_scc1r1 = SCI_M_10;
63
immr->im_qsmcm.qsmcm_scc1r1 = SCI_TE | SCI_RE;
65
immr->im_qsmcm.qsmcm_scc2r1 = SCI_M_10;
66
immr->im_qsmcm.qsmcm_scc2r1 = SCI_TE | SCI_RE;
71
static void mpc5xx_serial_putc(const char c)
73
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
75
/* Test for completition */
77
#if defined(CONFIG_5xx_CONS_SCI1)
78
immr->im_qsmcm.qsmcm_sc1dr = (short)c;
80
immr->im_qsmcm.qsmcm_sc2dr = (short)c;
84
#if defined(CONFIG_5xx_CONS_SCI1)
85
immr->im_qsmcm.qsmcm_sc1dr = (short)'\r';
87
immr->im_qsmcm.qsmcm_sc2dr = (short)'\r';
93
static int mpc5xx_serial_getc(void)
95
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
96
volatile short status;
101
#if defined(CONFIG_5xx_CONS_SCI1)
102
status = immr->im_qsmcm.qsmcm_sc1sr;
104
status = immr->im_qsmcm.qsmcm_sc2sr;
107
#if defined(CONFIG_WATCHDOG)
108
reset_5xx_watchdog (immr);
110
} while ((status & SCI_RDRF) == 0);
113
#if defined(CONFIG_5xx_CONS_SCI1)
114
tmp = (unsigned char)(immr->im_qsmcm.qsmcm_sc1dr & SCI_SCXDR_MK);
116
tmp = (unsigned char)( immr->im_qsmcm.qsmcm_sc2dr & SCI_SCXDR_MK);
121
static int mpc5xx_serial_tstc(void)
123
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
126
/* New data character ? */
127
#if defined(CONFIG_5xx_CONS_SCI1)
128
status = immr->im_qsmcm.qsmcm_sc1sr;
130
status = immr->im_qsmcm.qsmcm_sc2sr;
132
return (status & SCI_RDRF);
135
static void mpc5xx_serial_setbrg(void)
137
volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
141
scxbr = (gd->cpu_clk / (32 * gd->baudrate));
142
#if defined(CONFIG_5xx_CONS_SCI1)
143
immr->im_qsmcm.qsmcm_scc1r0 = (scxbr & SCI_SCXBR_MK);
145
immr->im_qsmcm.qsmcm_scc2r0 = (scxbr & SCI_SCXBR_MK);
149
static struct serial_device mpc5xx_serial_drv = {
150
.name = "mpc5xx_serial",
151
.start = mpc5xx_serial_init,
153
.setbrg = mpc5xx_serial_setbrg,
154
.putc = mpc5xx_serial_putc,
155
.puts = default_serial_puts,
156
.getc = mpc5xx_serial_getc,
157
.tstc = mpc5xx_serial_tstc,
160
void mpc5xx_serial_initialize(void)
162
serial_register(&mpc5xx_serial_drv);
165
__weak struct serial_device *default_serial_console(void)
167
return &mpc5xx_serial_drv;