blob: 56ba0daa05f4c45f91f2327ae505380474a8398b [file] [log] [blame]
wdenk3a473b22004-01-03 00:43:19 +00001/*
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 *
Wolfgang Denk1a459662013-07-08 09:37:19 +02008 * SPDX-License-Identifier: GPL-2.0+
wdenk3a473b22004-01-03 00:43:19 +00009 */
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>
Marek Vasutafe4c382012-09-13 12:26:39 +020019#include <serial.h>
20#include <linux/compiler.h>
21
wdenk3a473b22004-01-03 00:43:19 +000022#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
Wolfgang Denkd87080b2006-03-31 18:32:53 +020035DECLARE_GLOBAL_DATA_PTR;
36
wdenk3a473b22004-01-03 00:43:19 +000037#ifdef CONFIG_MPSC
Marek Vasutafe4c382012-09-13 12:26:39 +020038static int marvell_serial_init(void)
wdenk3a473b22004-01-03 00:43:19 +000039{
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020040#if (defined CONFIG_SYS_INIT_CHAN1) || (defined CONFIG_SYS_INIT_CHAN2)
wdenk3a473b22004-01-03 00:43:19 +000041 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 */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020047#ifdef CONFIG_SYS_INIT_CHAN1
wdenk3a473b22004-01-03 00:43:19 +000048 NS16550_reinit (COM_PORTS[0], clock_divisor);
49#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020050#ifdef CONFIG_SYS_INIT_CHAN2
wdenk3a473b22004-01-03 00:43:19 +000051 NS16550_reinit (COM_PORTS[1], clock_divisor);
52#endif
53 return (0);
54}
55
Marek Vasutafe4c382012-09-13 12:26:39 +020056static void marvell_serial_putc(const char c)
wdenk3a473b22004-01-03 00:43:19 +000057{
58 if (c == '\n')
59 mpsc_putchar ('\r');
60
61 mpsc_putchar (c);
62}
63
Marek Vasutafe4c382012-09-13 12:26:39 +020064static int marvell_serial_getc(void)
wdenk3a473b22004-01-03 00:43:19 +000065{
66 return mpsc_getchar ();
67}
68
Marek Vasutafe4c382012-09-13 12:26:39 +020069static int marvell_serial_tstc(void)
wdenk3a473b22004-01-03 00:43:19 +000070{
71 return mpsc_test_char ();
72}
73
Marek Vasutafe4c382012-09-13 12:26:39 +020074static void marvell_serial_setbrg(void)
wdenk3a473b22004-01-03 00:43:19 +000075{
wdenk3a473b22004-01-03 00:43:19 +000076 galbrg_set_baudrate (CONFIG_MPSC_PORT, gd->baudrate);
77}
78
79#else /* ! CONFIG_MPSC */
80
Marek Vasutafe4c382012-09-13 12:26:39 +020081static int marvell_serial_init(void)
wdenk3a473b22004-01-03 00:43:19 +000082{
wdenk3a473b22004-01-03 00:43:19 +000083 int clock_divisor = 230400 / gd->baudrate;
84
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020085#ifdef CONFIG_SYS_INIT_CHAN1
wdenk3a473b22004-01-03 00:43:19 +000086 (void) NS16550_init (0, clock_divisor);
87#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020088#ifdef CONFIG_SYS_INIT_CHAN2
wdenk3a473b22004-01-03 00:43:19 +000089 (void) NS16550_init (1, clock_divisor);
90#endif
91 return (0);
92}
93
Marek Vasutafe4c382012-09-13 12:26:39 +020094static void marvell_serial_putc(const char c)
wdenk3a473b22004-01-03 00:43:19 +000095{
96 if (c == '\n')
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020097 NS16550_putc (COM_PORTS[CONFIG_SYS_DUART_CHAN], '\r');
wdenk3a473b22004-01-03 00:43:19 +000098
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020099 NS16550_putc (COM_PORTS[CONFIG_SYS_DUART_CHAN], c);
wdenk3a473b22004-01-03 00:43:19 +0000100}
101
Marek Vasutafe4c382012-09-13 12:26:39 +0200102static int marvell_serial_getc(void)
wdenk3a473b22004-01-03 00:43:19 +0000103{
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200104 return NS16550_getc (COM_PORTS[CONFIG_SYS_DUART_CHAN]);
wdenk3a473b22004-01-03 00:43:19 +0000105}
106
Marek Vasutafe4c382012-09-13 12:26:39 +0200107static int marvell_serial_tstc(void)
wdenk3a473b22004-01-03 00:43:19 +0000108{
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200109 return NS16550_tstc (COM_PORTS[CONFIG_SYS_DUART_CHAN]);
wdenk3a473b22004-01-03 00:43:19 +0000110}
111
Marek Vasutafe4c382012-09-13 12:26:39 +0200112static void marvell_serial_setbrg(void)
wdenk3a473b22004-01-03 00:43:19 +0000113{
wdenk3a473b22004-01-03 00:43:19 +0000114 int clock_divisor = 230400 / gd->baudrate;
115
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200116#ifdef CONFIG_SYS_INIT_CHAN1
wdenk3a473b22004-01-03 00:43:19 +0000117 NS16550_reinit (COM_PORTS[0], clock_divisor);
118#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200119#ifdef CONFIG_SYS_INIT_CHAN2
wdenk3a473b22004-01-03 00:43:19 +0000120 NS16550_reinit (COM_PORTS[1], clock_divisor);
121#endif
122}
123
124#endif /* CONFIG_MPSC */
125
Marek Vasutafe4c382012-09-13 12:26:39 +0200126static 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,
Marek Vasutec3fd682012-10-06 14:07:02 +0000132 .puts = default_serial_puts,
Marek Vasutafe4c382012-09-13 12:26:39 +0200133 .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}
Marek Vasutafe4c382012-09-13 12:26:39 +0200146
Jon Loeligerfcec2eb2007-07-09 18:19:09 -0500147#if defined(CONFIG_CMD_KGDB)
wdenk3a473b22004-01-03 00:43:19 +0000148void 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}
Jon Loeliger77a31852007-07-10 10:39:10 -0500171#endif