blob: e1876261e5dcc359f53ac12062f900d598d5a241 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 * KGDB and progress routines for the Marvell/Galileo MV64x60 (Discovery).
3 *
4 * Author: Mark A. Greer <mgreer@mvista.com>
5 *
6 * 2003 (c) MontaVista Software, Inc. This file is licensed under
7 * the terms of the GNU General Public License version 2. This program
8 * is licensed "as is" without any warranty of any kind, whether express
9 * or implied.
10 */
11
12/*
13 *****************************************************************************
14 *
15 * Low-level MPSC/UART I/O routines
16 *
17 *****************************************************************************
18 */
19
20
Linus Torvalds1da177e2005-04-16 15:20:36 -070021#include <linux/irq.h>
22#include <asm/delay.h>
23#include <asm/mv64x60.h>
Paul Mackerrasfd582ec2005-10-11 22:08:12 +100024#include <asm/machdep.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070025
26
27#if defined(CONFIG_SERIAL_TEXT_DEBUG)
28
29#define MPSC_CHR_1 0x000c
30#define MPSC_CHR_2 0x0010
31
32static struct mv64x60_handle mv64x60_dbg_bh;
33
34void
35mv64x60_progress_init(u32 base)
36{
37 mv64x60_dbg_bh.v_base = base;
38 return;
39}
40
41static void
42mv64x60_polled_putc(int chan, char c)
43{
44 u32 offset;
45
46 if (chan == 0)
47 offset = 0x8000;
48 else
49 offset = 0x9000;
50
51 mv64x60_write(&mv64x60_dbg_bh, offset + MPSC_CHR_1, (u32)c);
52 mv64x60_write(&mv64x60_dbg_bh, offset + MPSC_CHR_2, 0x200);
53 udelay(2000);
54}
55
56void
57mv64x60_mpsc_progress(char *s, unsigned short hex)
58{
59 volatile char c;
60
61 mv64x60_polled_putc(0, '\r');
62
63 while ((c = *s++) != 0)
64 mv64x60_polled_putc(0, c);
65
66 mv64x60_polled_putc(0, '\n');
67 mv64x60_polled_putc(0, '\r');
68
69 return;
70}
71#endif /* CONFIG_SERIAL_TEXT_DEBUG */
72
73
74#if defined(CONFIG_KGDB)
75
76#if defined(CONFIG_KGDB_TTYS0)
77#define KGDB_PORT 0
78#elif defined(CONFIG_KGDB_TTYS1)
79#define KGDB_PORT 1
80#else
81#error "Invalid kgdb_tty port"
82#endif
83
84void
85putDebugChar(unsigned char c)
86{
87 mv64x60_polled_putc(KGDB_PORT, (char)c);
88}
89
90int
91getDebugChar(void)
92{
93 unsigned char c;
94
95 while (!mv64x60_polled_getc(KGDB_PORT, &c));
96 return (int)c;
97}
98
99void
100putDebugString(char* str)
101{
102 while (*str != '\0') {
103 putDebugChar(*str);
104 str++;
105 }
106 putDebugChar('\r');
107 return;
108}
109
110void
111kgdb_interruptible(int enable)
112{
113}
114
115void
116kgdb_map_scc(void)
117{
118 if (ppc_md.early_serial_map)
119 ppc_md.early_serial_map();
120}
121#endif /* CONFIG_KGDB */