blob: 8b5f8fa1176097fa36e68ac9a61e873e5e543ce5 [file] [log] [blame]
wdenk591dda52002-11-18 00:14:45 +00001/*
2 * (C) Copyright 2002
3 * Daniel Engström, Omicron Ceti AB, daniel@omicron.se
wdenk57b2d802003-06-27 21:31:46 +00004 *
wdenk591dda52002-11-18 00:14:45 +00005 * (C) Copyright 2000
6 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
7 *
8 * See file CREDITS for list of people who contributed to this
9 * project.
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License as
13 * published by the Free Software Foundation; either version 2 of
14 * the License, or (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
24 * MA 02111-1307 USA
25 */
26/*------------------------------------------------------------------------------+ */
wdenkabda5ca2003-05-31 18:35:21 +000027
wdenk591dda52002-11-18 00:14:45 +000028/*
29 * This source code has been made available to you by IBM on an AS-IS
30 * basis. Anyone receiving this source is licensed under IBM
31 * copyrights to use it in any way he or she deems fit, including
32 * copying it, modifying it, compiling it, and redistributing it either
33 * with or without modifications. No license under IBM patents or
34 * patent applications is to be implied by the copyright license.
35 *
36 * Any user of this software should understand that IBM cannot provide
37 * technical support for this software and will not be responsible for
38 * any consequences resulting from the use of this software.
39 *
40 * Any person who transfers this source code or any derivative work
41 * must include the IBM copyright notice, this paragraph, and the
42 * preceding two paragraphs in the transferred software.
43 *
44 * COPYRIGHT I B M CORPORATION 1995
45 * LICENSED MATERIAL - PROGRAM PROPERTY OF I B M
46 */
47/*------------------------------------------------------------------------------- */
48
49#include <common.h>
50#include <watchdog.h>
51#include <asm/io.h>
52#include <asm/ibmpc.h>
53
wdenkc35ba4e2004-03-14 22:25:36 +000054#ifdef CONFIG_SERIAL_SOFTWARE_FIFO
wdenk591dda52002-11-18 00:14:45 +000055#include <malloc.h>
56#endif
57
Wolfgang Denk6405a152006-03-31 18:32:53 +020058DECLARE_GLOBAL_DATA_PTR;
59
wdenk591dda52002-11-18 00:14:45 +000060#define UART_RBR 0x00
61#define UART_THR 0x00
62#define UART_IER 0x01
63#define UART_IIR 0x02
64#define UART_FCR 0x02
65#define UART_LCR 0x03
66#define UART_MCR 0x04
67#define UART_LSR 0x05
68#define UART_MSR 0x06
69#define UART_SCR 0x07
70#define UART_DLL 0x00
71#define UART_DLM 0x01
72
73/*-----------------------------------------------------------------------------+
74 | Line Status Register.
75 +-----------------------------------------------------------------------------*/
76#define asyncLSRDataReady1 0x01
77#define asyncLSROverrunError1 0x02
78#define asyncLSRParityError1 0x04
79#define asyncLSRFramingError1 0x08
80#define asyncLSRBreakInterrupt1 0x10
81#define asyncLSRTxHoldEmpty1 0x20
82#define asyncLSRTxShiftEmpty1 0x40
83#define asyncLSRRxFifoError1 0x80
84
85
wdenkc35ba4e2004-03-14 22:25:36 +000086#ifdef CONFIG_SERIAL_SOFTWARE_FIFO
wdenk591dda52002-11-18 00:14:45 +000087/*-----------------------------------------------------------------------------+
88 | Fifo
89 +-----------------------------------------------------------------------------*/
90typedef struct {
91 char *rx_buffer;
92 ulong rx_put;
93 ulong rx_get;
wdenkabda5ca2003-05-31 18:35:21 +000094 int cts;
wdenk591dda52002-11-18 00:14:45 +000095} serial_buffer_t;
96
wdenkabda5ca2003-05-31 18:35:21 +000097volatile serial_buffer_t buf_info;
98static int serial_buffer_active=0;
wdenk591dda52002-11-18 00:14:45 +000099#endif
100
101
wdenkabda5ca2003-05-31 18:35:21 +0000102static int serial_div(int baudrate)
wdenk591dda52002-11-18 00:14:45 +0000103{
wdenk57b2d802003-06-27 21:31:46 +0000104
wdenk591dda52002-11-18 00:14:45 +0000105 switch (baudrate) {
106 case 1200:
107 return 96;
108 case 9600:
109 return 12;
110 case 19200:
111 return 6;
112 case 38400:
113 return 3;
114 case 57600:
115 return 2;
116 case 115200:
wdenk57b2d802003-06-27 21:31:46 +0000117 return 1;
wdenk591dda52002-11-18 00:14:45 +0000118 }
wdenk57b2d802003-06-27 21:31:46 +0000119
wdenkabda5ca2003-05-31 18:35:21 +0000120 return 12;
wdenk591dda52002-11-18 00:14:45 +0000121}
122
123
124/*
125 * Minimal serial functions needed to use one of the SMC ports
126 * as serial console interface.
127 */
128
wdenkabda5ca2003-05-31 18:35:21 +0000129int serial_init(void)
wdenk591dda52002-11-18 00:14:45 +0000130{
wdenk591dda52002-11-18 00:14:45 +0000131 volatile char val;
wdenk591dda52002-11-18 00:14:45 +0000132 int bdiv = serial_div(gd->baudrate);
wdenk57b2d802003-06-27 21:31:46 +0000133
wdenk591dda52002-11-18 00:14:45 +0000134 outb(0x80, UART0_BASE + UART_LCR); /* set DLAB bit */
135 outb(bdiv, UART0_BASE + UART_DLL); /* set baudrate divisor */
136 outb(bdiv >> 8, UART0_BASE + UART_DLM);/* set baudrate divisor */
137 outb(0x03, UART0_BASE + UART_LCR); /* clear DLAB; set 8 bits, no parity */
wdenkabda5ca2003-05-31 18:35:21 +0000138 outb(0x01, UART0_BASE + UART_FCR); /* enable FIFO */
139 outb(0x0b, UART0_BASE + UART_MCR); /* Set DTR and RTS active */
wdenk591dda52002-11-18 00:14:45 +0000140 val = inb(UART0_BASE + UART_LSR); /* clear line status */
141 val = inb(UART0_BASE + UART_RBR); /* read receive buffer */
142 outb(0x00, UART0_BASE + UART_SCR); /* set scratchpad */
143 outb(0x00, UART0_BASE + UART_IER); /* set interrupt enable reg */
144
wdenkabda5ca2003-05-31 18:35:21 +0000145 return 0;
wdenk591dda52002-11-18 00:14:45 +0000146}
147
148
wdenkabda5ca2003-05-31 18:35:21 +0000149void serial_setbrg(void)
wdenk591dda52002-11-18 00:14:45 +0000150{
wdenk591dda52002-11-18 00:14:45 +0000151 unsigned short bdiv;
wdenk57b2d802003-06-27 21:31:46 +0000152
wdenkabda5ca2003-05-31 18:35:21 +0000153 bdiv = serial_div(gd->baudrate);
wdenk591dda52002-11-18 00:14:45 +0000154
155 outb(0x80, UART0_BASE + UART_LCR); /* set DLAB bit */
156 outb(bdiv&0xff, UART0_BASE + UART_DLL); /* set baudrate divisor */
157 outb(bdiv >> 8, UART0_BASE + UART_DLM);/* set baudrate divisor */
158 outb(0x03, UART0_BASE + UART_LCR); /* clear DLAB; set 8 bits, no parity */
159}
160
161
wdenkabda5ca2003-05-31 18:35:21 +0000162void serial_putc(const char c)
wdenk591dda52002-11-18 00:14:45 +0000163{
164 int i;
165
166 if (c == '\n')
167 serial_putc ('\r');
168
169 /* check THRE bit, wait for transmiter available */
170 for (i = 1; i < 3500; i++) {
wdenkabda5ca2003-05-31 18:35:21 +0000171 if ((inb (UART0_BASE + UART_LSR) & 0x20) == 0x20) {
wdenk591dda52002-11-18 00:14:45 +0000172 break;
wdenkabda5ca2003-05-31 18:35:21 +0000173 }
174 udelay(100);
wdenk591dda52002-11-18 00:14:45 +0000175 }
176 outb(c, UART0_BASE + UART_THR); /* put character out */
177}
178
179
wdenkabda5ca2003-05-31 18:35:21 +0000180void serial_puts(const char *s)
wdenk591dda52002-11-18 00:14:45 +0000181{
182 while (*s) {
wdenkabda5ca2003-05-31 18:35:21 +0000183 serial_putc(*s++);
wdenk591dda52002-11-18 00:14:45 +0000184 }
185}
186
187
wdenkabda5ca2003-05-31 18:35:21 +0000188int serial_getc(void)
wdenk591dda52002-11-18 00:14:45 +0000189{
190 unsigned char status = 0;
191
wdenkc35ba4e2004-03-14 22:25:36 +0000192#ifdef CONFIG_SERIAL_SOFTWARE_FIFO
wdenkabda5ca2003-05-31 18:35:21 +0000193 if (serial_buffer_active) {
194 return serial_buffered_getc();
195 }
196#endif
wdenk57b2d802003-06-27 21:31:46 +0000197
wdenk591dda52002-11-18 00:14:45 +0000198 while (1) {
199#if defined(CONFIG_HW_WATCHDOG)
wdenkabda5ca2003-05-31 18:35:21 +0000200 WATCHDOG_RESET(); /* Reset HW Watchdog, if needed */
wdenk591dda52002-11-18 00:14:45 +0000201#endif /* CONFIG_HW_WATCHDOG */
wdenkabda5ca2003-05-31 18:35:21 +0000202 status = inb(UART0_BASE + UART_LSR);
wdenk591dda52002-11-18 00:14:45 +0000203 if ((status & asyncLSRDataReady1) != 0x0) {
204 break;
205 }
206 if ((status & ( asyncLSRFramingError1 |
207 asyncLSROverrunError1 |
208 asyncLSRParityError1 |
209 asyncLSRBreakInterrupt1 )) != 0) {
210 outb(asyncLSRFramingError1 |
211 asyncLSROverrunError1 |
212 asyncLSRParityError1 |
213 asyncLSRBreakInterrupt1, UART0_BASE + UART_LSR);
214 }
215 }
216 return (0x000000ff & (int) inb (UART0_BASE));
217}
218
219
wdenkabda5ca2003-05-31 18:35:21 +0000220int serial_tstc(void)
wdenk591dda52002-11-18 00:14:45 +0000221{
222 unsigned char status;
223
wdenkc35ba4e2004-03-14 22:25:36 +0000224#ifdef CONFIG_SERIAL_SOFTWARE_FIFO
wdenkabda5ca2003-05-31 18:35:21 +0000225 if (serial_buffer_active) {
226 return serial_buffered_tstc();
227 }
228#endif
229
230 status = inb(UART0_BASE + UART_LSR);
wdenk591dda52002-11-18 00:14:45 +0000231 if ((status & asyncLSRDataReady1) != 0x0) {
232 return (1);
233 }
234 if ((status & ( asyncLSRFramingError1 |
235 asyncLSROverrunError1 |
236 asyncLSRParityError1 |
237 asyncLSRBreakInterrupt1 )) != 0) {
238 outb(asyncLSRFramingError1 |
239 asyncLSROverrunError1 |
240 asyncLSRParityError1 |
241 asyncLSRBreakInterrupt1, UART0_BASE + UART_LSR);
242 }
243 return 0;
244}
245
246
wdenkc35ba4e2004-03-14 22:25:36 +0000247#ifdef CONFIG_SERIAL_SOFTWARE_FIFO
wdenk591dda52002-11-18 00:14:45 +0000248
wdenkabda5ca2003-05-31 18:35:21 +0000249void serial_isr(void *arg)
wdenk591dda52002-11-18 00:14:45 +0000250{
251 int space;
252 int c;
wdenk591dda52002-11-18 00:14:45 +0000253 int rx_put = buf_info.rx_put;
254
wdenkabda5ca2003-05-31 18:35:21 +0000255 if (buf_info.rx_get <= rx_put) {
256 space = CONFIG_SERIAL_SOFTWARE_FIFO - (rx_put - buf_info.rx_get);
wdenk591dda52002-11-18 00:14:45 +0000257 } else {
wdenkabda5ca2003-05-31 18:35:21 +0000258 space = buf_info.rx_get - rx_put;
wdenk591dda52002-11-18 00:14:45 +0000259 }
wdenk57b2d802003-06-27 21:31:46 +0000260
wdenkabda5ca2003-05-31 18:35:21 +0000261 while (inb(UART0_BASE + UART_LSR) & 1) {
262 c = inb(UART0_BASE);
wdenk591dda52002-11-18 00:14:45 +0000263 if (space) {
264 buf_info.rx_buffer[rx_put++] = c;
265 space--;
wdenk57b2d802003-06-27 21:31:46 +0000266
wdenkabda5ca2003-05-31 18:35:21 +0000267 if (rx_put == buf_info.rx_get) {
268 buf_info.rx_get++;
269 if (rx_put == CONFIG_SERIAL_SOFTWARE_FIFO) {
270 buf_info.rx_get = 0;
271 }
272 }
wdenk57b2d802003-06-27 21:31:46 +0000273
wdenkabda5ca2003-05-31 18:35:21 +0000274 if (rx_put == CONFIG_SERIAL_SOFTWARE_FIFO) {
275 rx_put = 0;
276 if (0 == buf_info.rx_get) {
277 buf_info.rx_get = 1;
278 }
wdenk57b2d802003-06-27 21:31:46 +0000279
wdenkabda5ca2003-05-31 18:35:21 +0000280 }
wdenk57b2d802003-06-27 21:31:46 +0000281
wdenk591dda52002-11-18 00:14:45 +0000282 }
wdenk591dda52002-11-18 00:14:45 +0000283 if (space < CONFIG_SERIAL_SOFTWARE_FIFO / 4) {
284 /* Stop flow by setting RTS inactive */
wdenkabda5ca2003-05-31 18:35:21 +0000285 outb(inb(UART0_BASE + UART_MCR) & (0xFF ^ 0x02),
wdenk591dda52002-11-18 00:14:45 +0000286 UART0_BASE + UART_MCR);
287 }
288 }
289 buf_info.rx_put = rx_put;
290}
291
wdenkabda5ca2003-05-31 18:35:21 +0000292void serial_buffered_init(void)
wdenk591dda52002-11-18 00:14:45 +0000293{
294 serial_puts ("Switching to interrupt driven serial input mode.\n");
295 buf_info.rx_buffer = malloc (CONFIG_SERIAL_SOFTWARE_FIFO);
296 buf_info.rx_put = 0;
297 buf_info.rx_get = 0;
298
299 if (inb (UART0_BASE + UART_MSR) & 0x10) {
300 serial_puts ("Check CTS signal present on serial port: OK.\n");
wdenkabda5ca2003-05-31 18:35:21 +0000301 buf_info.cts = 1;
wdenk591dda52002-11-18 00:14:45 +0000302 } else {
303 serial_puts ("WARNING: CTS signal not present on serial port.\n");
wdenkabda5ca2003-05-31 18:35:21 +0000304 buf_info.cts = 0;
wdenk591dda52002-11-18 00:14:45 +0000305 }
306
wdenk57b2d802003-06-27 21:31:46 +0000307 irq_install_handler ( VECNUM_U0 /*UART0 */ /*int vec */ ,
wdenk591dda52002-11-18 00:14:45 +0000308 serial_isr /*interrupt_handler_t *handler */ ,
309 (void *) &buf_info /*void *arg */ );
310
311 /* Enable "RX Data Available" Interrupt on UART */
312 /* outb(inb(UART0_BASE + UART_IER) |0x01, UART0_BASE + UART_IER); */
313 outb(0x01, UART0_BASE + UART_IER);
wdenk57b2d802003-06-27 21:31:46 +0000314
wdenkabda5ca2003-05-31 18:35:21 +0000315 /* Set DTR and RTS active, enable interrupts */
316 outb(inb (UART0_BASE + UART_MCR) | 0x0b, UART0_BASE + UART_MCR);
wdenk57b2d802003-06-27 21:31:46 +0000317
wdenkabda5ca2003-05-31 18:35:21 +0000318 /* Setup UART FIFO: RX trigger level: 1 byte, Enable FIFO */
319 outb( /*(1 << 6) |*/ 1, UART0_BASE + UART_FCR);
wdenk57b2d802003-06-27 21:31:46 +0000320
wdenkabda5ca2003-05-31 18:35:21 +0000321 serial_buffer_active = 1;
wdenk591dda52002-11-18 00:14:45 +0000322}
323
324void serial_buffered_putc (const char c)
325{
wdenkabda5ca2003-05-31 18:35:21 +0000326 int i;
wdenk591dda52002-11-18 00:14:45 +0000327 /* Wait for CTS */
328#if defined(CONFIG_HW_WATCHDOG)
329 while (!(inb (UART0_BASE + UART_MSR) & 0x10))
330 WATCHDOG_RESET ();
331#else
wdenkabda5ca2003-05-31 18:35:21 +0000332 if (buf_info.cts) {
333 for (i=0;i<1000;i++) {
334 if ((inb (UART0_BASE + UART_MSR) & 0x10)) {
335 break;
336 }
337 }
338 if (i!=1000) {
339 buf_info.cts = 0;
340 }
341 } else {
342 if ((inb (UART0_BASE + UART_MSR) & 0x10)) {
343 buf_info.cts = 1;
344 }
345 }
wdenk57b2d802003-06-27 21:31:46 +0000346
wdenk591dda52002-11-18 00:14:45 +0000347#endif
348 serial_putc (c);
349}
350
wdenkabda5ca2003-05-31 18:35:21 +0000351void serial_buffered_puts(const char *s)
wdenk591dda52002-11-18 00:14:45 +0000352{
353 serial_puts (s);
354}
355
wdenkabda5ca2003-05-31 18:35:21 +0000356int serial_buffered_getc(void)
wdenk591dda52002-11-18 00:14:45 +0000357{
358 int space;
359 int c;
360 int rx_get = buf_info.rx_get;
361 int rx_put;
362
363#if defined(CONFIG_HW_WATCHDOG)
364 while (rx_get == buf_info.rx_put)
365 WATCHDOG_RESET ();
366#else
367 while (rx_get == buf_info.rx_put);
368#endif
369 c = buf_info.rx_buffer[rx_get++];
wdenkabda5ca2003-05-31 18:35:21 +0000370 if (rx_get == CONFIG_SERIAL_SOFTWARE_FIFO) {
wdenk591dda52002-11-18 00:14:45 +0000371 rx_get = 0;
wdenkabda5ca2003-05-31 18:35:21 +0000372 }
wdenk591dda52002-11-18 00:14:45 +0000373 buf_info.rx_get = rx_get;
374
375 rx_put = buf_info.rx_put;
376 if (rx_get <= rx_put) {
377 space = CONFIG_SERIAL_SOFTWARE_FIFO - (rx_put - rx_get);
378 } else {
379 space = rx_get - rx_put;
380 }
381 if (space > CONFIG_SERIAL_SOFTWARE_FIFO / 2) {
382 /* Start flow by setting RTS active */
383 outb(inb (UART0_BASE + UART_MCR) | 0x02, UART0_BASE + UART_MCR);
384 }
385
386 return c;
387}
388
wdenkabda5ca2003-05-31 18:35:21 +0000389int serial_buffered_tstc(void)
wdenk591dda52002-11-18 00:14:45 +0000390{
391 return (buf_info.rx_get != buf_info.rx_put) ? 1 : 0;
392}
393
394#endif /* CONFIG_SERIAL_SOFTWARE_FIFO */
395
396
Jon Loeligera5217742007-07-09 18:57:22 -0500397#if defined(CONFIG_CMD_KGDB)
wdenk591dda52002-11-18 00:14:45 +0000398/*
399 AS HARNOIS : according to CONFIG_KGDB_SER_INDEX kgdb uses serial port
400 number 0 or number 1
401 - if CONFIG_KGDB_SER_INDEX = 1 => serial port number 0 :
402 configuration has been already done
403 - if CONFIG_KGDB_SER_INDEX = 2 => serial port number 1 :
404 configure port 1 for serial I/O with rate = CONFIG_KGDB_BAUDRATE
405*/
406#if (CONFIG_KGDB_SER_INDEX & 2)
wdenkabda5ca2003-05-31 18:35:21 +0000407void kgdb_serial_init(void)
wdenk591dda52002-11-18 00:14:45 +0000408{
wdenk591dda52002-11-18 00:14:45 +0000409 volatile char val;
410 bdiv = serial_div (CONFIG_KGDB_BAUDRATE);
411
412 /*
413 * Init onboard 16550 UART
414 */
415 outb(0x80, UART1_BASE + UART_LCR); /* set DLAB bit */
Wolfgang Denka159ad02008-07-14 21:19:08 +0200416 outb((bdiv & 0xff), UART1_BASE + UART_DLL); /* set divisor for 9600 baud */
417 outb((bdiv >> 8 ), UART1_BASE + UART_DLM); /* set divisor for 9600 baud */
wdenk591dda52002-11-18 00:14:45 +0000418 outb(0x03, UART1_BASE + UART_LCR); /* line control 8 bits no parity */
419 outb(0x00, UART1_BASE + UART_FCR); /* disable FIFO */
420 outb(0x00, UART1_BASE + UART_MCR); /* no modem control DTR RTS */
421 val = inb(UART1_BASE + UART_LSR); /* clear line status */
422 val = inb(UART1_BASE + UART_RBR); /* read receive buffer */
423 outb(0x00, UART1_BASE + UART_SCR); /* set scratchpad */
424 outb(0x00, UART1_BASE + UART_IER); /* set interrupt enable reg */
425}
426
427
wdenkabda5ca2003-05-31 18:35:21 +0000428void putDebugChar(const char c)
wdenk591dda52002-11-18 00:14:45 +0000429{
430 if (c == '\n')
431 serial_putc ('\r');
432
433 outb(c, UART1_BASE + UART_THR); /* put character out */
434
435 /* check THRE bit, wait for transfer done */
436 while ((inb(UART1_BASE + UART_LSR) & 0x20) != 0x20);
437}
438
439
wdenkabda5ca2003-05-31 18:35:21 +0000440void putDebugStr(const char *s)
wdenk591dda52002-11-18 00:14:45 +0000441{
442 while (*s) {
443 serial_putc(*s++);
444 }
445}
446
447
wdenkabda5ca2003-05-31 18:35:21 +0000448int getDebugChar(void)
wdenk591dda52002-11-18 00:14:45 +0000449{
450 unsigned char status = 0;
451
452 while (1) {
453 status = inb(UART1_BASE + UART_LSR);
454 if ((status & asyncLSRDataReady1) != 0x0) {
455 break;
456 }
457 if ((status & ( asyncLSRFramingError1 |
458 asyncLSROverrunError1 |
459 asyncLSRParityError1 |
460 asyncLSRBreakInterrupt1 )) != 0) {
461 outb(asyncLSRFramingError1 |
462 asyncLSROverrunError1 |
463 asyncLSRParityError1 |
464 asyncLSRBreakInterrupt1, UART1_BASE + UART_LSR);
465 }
466 }
467 return (0x000000ff & (int) inb(UART1_BASE));
468}
469
470
wdenkabda5ca2003-05-31 18:35:21 +0000471void kgdb_interruptible(int yes)
wdenk591dda52002-11-18 00:14:45 +0000472{
473 return;
474}
475
476#else /* ! (CONFIG_KGDB_SER_INDEX & 2) */
477
wdenkabda5ca2003-05-31 18:35:21 +0000478void kgdb_serial_init(void)
wdenk591dda52002-11-18 00:14:45 +0000479{
480 serial_printf ("[on serial] ");
481}
482
wdenkabda5ca2003-05-31 18:35:21 +0000483void putDebugChar(int c)
wdenk591dda52002-11-18 00:14:45 +0000484{
485 serial_putc (c);
486}
487
wdenkabda5ca2003-05-31 18:35:21 +0000488void putDebugStr(const char *str)
wdenk591dda52002-11-18 00:14:45 +0000489{
490 serial_puts (str);
491}
492
wdenkabda5ca2003-05-31 18:35:21 +0000493int getDebugChar(void)
wdenk591dda52002-11-18 00:14:45 +0000494{
495 return serial_getc ();
496}
497
wdenkabda5ca2003-05-31 18:35:21 +0000498void kgdb_interruptible(int yes)
wdenk591dda52002-11-18 00:14:45 +0000499{
500 return;
501}
502#endif /* (CONFIG_KGDB_SER_INDEX & 2) */
Jon Loeliger07efe2a2007-07-10 10:27:39 -0500503#endif