blob: 56ba0daa05f4c45f91f2327ae505380474a8398b [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001/*
2 * (C) Copyright 2001
3 * Josh Huber <huber@mclx.com>, Mission Critical Linux, Inc.
4 *
5 * modified for marvell db64360 eval board by
6 * Ingo Assmus <ingo.assmus@keymile.com>
7 *
8 * SPDX-License-Identifier: GPL-2.0+
9 */
10
11/*
12 * serial.c - serial support for the gal ev board
13 */
14
15/* supports both the 16650 duart and the MPSC */
16
17#include <common.h>
18#include <command.h>
19#include <serial.h>
20#include <linux/compiler.h>
21
22#include "../include/memory.h"
23#include "serial.h"
24
25#ifdef CONFIG_DB64360
26#include "../db64360/mpsc.h"
27#endif
28
29#ifdef CONFIG_DB64460
30#include "../db64460/mpsc.h"
31#endif
32
33#include "ns16550.h"
34
35DECLARE_GLOBAL_DATA_PTR;
36
37#ifdef CONFIG_MPSC
38static int marvell_serial_init(void)
39{
40#if (defined CONFIG_SYS_INIT_CHAN1) || (defined CONFIG_SYS_INIT_CHAN2)
41 int clock_divisor = 230400 / gd->baudrate;
42#endif
43
44 mpsc_init (gd->baudrate);
45
46 /* init the DUART chans so that KGDB in the kernel can use them */
47#ifdef CONFIG_SYS_INIT_CHAN1
48 NS16550_reinit (COM_PORTS[0], clock_divisor);
49#endif
50#ifdef CONFIG_SYS_INIT_CHAN2
51 NS16550_reinit (COM_PORTS[1], clock_divisor);
52#endif
53 return (0);
54}
55
56static void marvell_serial_putc(const char c)
57{
58 if (c == '\n')
59 mpsc_putchar ('\r');
60
61 mpsc_putchar (c);
62}
63
64static int marvell_serial_getc(void)
65{
66 return mpsc_getchar ();
67}
68
69static int marvell_serial_tstc(void)
70{
71 return mpsc_test_char ();
72}
73
74static void marvell_serial_setbrg(void)
75{
76 galbrg_set_baudrate (CONFIG_MPSC_PORT, gd->baudrate);
77}
78
79#else /* ! CONFIG_MPSC */
80
81static int marvell_serial_init(void)
82{
83 int clock_divisor = 230400 / gd->baudrate;
84
85#ifdef CONFIG_SYS_INIT_CHAN1
86 (void) NS16550_init (0, clock_divisor);
87#endif
88#ifdef CONFIG_SYS_INIT_CHAN2
89 (void) NS16550_init (1, clock_divisor);
90#endif
91 return (0);
92}
93
94static void marvell_serial_putc(const char c)
95{
96 if (c == '\n')
97 NS16550_putc (COM_PORTS[CONFIG_SYS_DUART_CHAN], '\r');
98
99 NS16550_putc (COM_PORTS[CONFIG_SYS_DUART_CHAN], c);
100}
101
102static int marvell_serial_getc(void)
103{
104 return NS16550_getc (COM_PORTS[CONFIG_SYS_DUART_CHAN]);
105}
106
107static int marvell_serial_tstc(void)
108{
109 return NS16550_tstc (COM_PORTS[CONFIG_SYS_DUART_CHAN]);
110}
111
112static void marvell_serial_setbrg(void)
113{
114 int clock_divisor = 230400 / gd->baudrate;
115
116#ifdef CONFIG_SYS_INIT_CHAN1
117 NS16550_reinit (COM_PORTS[0], clock_divisor);
118#endif
119#ifdef CONFIG_SYS_INIT_CHAN2
120 NS16550_reinit (COM_PORTS[1], clock_divisor);
121#endif
122}
123
124#endif /* CONFIG_MPSC */
125
126static struct serial_device marvell_serial_drv = {
127 .name = "marvell_serial",
128 .start = marvell_serial_init,
129 .stop = NULL,
130 .setbrg = marvell_serial_setbrg,
131 .putc = marvell_serial_putc,
132 .puts = default_serial_puts,
133 .getc = marvell_serial_getc,
134 .tstc = marvell_serial_tstc,
135};
136
137void marvell_serial_initialize(void)
138{
139 serial_register(&marvell_serial_drv);
140}
141
142__weak struct serial_device *default_serial_console(void)
143{
144 return &marvell_serial_drv;
145}
146
147#if defined(CONFIG_CMD_KGDB)
148void kgdb_serial_init (void)
149{
150}
151
152void putDebugChar (int c)
153{
154 serial_putc (c);
155}
156
157void putDebugStr (const char *str)
158{
159 serial_puts (str);
160}
161
162int getDebugChar (void)
163{
164 return serial_getc ();
165}
166
167void kgdb_interruptible (int yes)
168{
169 return;
170}
171#endif