]> bbs.cooldavid.org Git - net-next-2.6.git/blame - arch/mips/au1000/common/dbg_io.c
[MIPS] TXx9: Kconfig cleanup
[net-next-2.6.git] / arch / mips / au1000 / common / dbg_io.c
CommitLineData
c1dcb14e 1#include <linux/types.h>
1da177e4 2
1da177e4
LT
3#include <asm/mach-au1x00/au1000.h>
4
5#ifdef CONFIG_KGDB
6
7/*
8 * FIXME the user should be able to select the
9 * uart to be used for debugging.
10 */
11#define DEBUG_BASE UART_DEBUG_BASE
1da177e4
LT
12
13#define UART16550_BAUD_2400 2400
14#define UART16550_BAUD_4800 4800
15#define UART16550_BAUD_9600 9600
16#define UART16550_BAUD_19200 19200
17#define UART16550_BAUD_38400 38400
18#define UART16550_BAUD_57600 57600
19#define UART16550_BAUD_115200 115200
20
21#define UART16550_PARITY_NONE 0
22#define UART16550_PARITY_ODD 0x08
23#define UART16550_PARITY_EVEN 0x18
24#define UART16550_PARITY_MARK 0x28
25#define UART16550_PARITY_SPACE 0x38
26
27#define UART16550_DATA_5BIT 0x0
28#define UART16550_DATA_6BIT 0x1
29#define UART16550_DATA_7BIT 0x2
30#define UART16550_DATA_8BIT 0x3
31
32#define UART16550_STOP_1BIT 0x0
33#define UART16550_STOP_2BIT 0x4
34
35
36#define UART_RX 0 /* Receive buffer */
37#define UART_TX 4 /* Transmit buffer */
38#define UART_IER 8 /* Interrupt Enable Register */
39#define UART_IIR 0xC /* Interrupt ID Register */
40#define UART_FCR 0x10 /* FIFO Control Register */
41#define UART_LCR 0x14 /* Line Control Register */
42#define UART_MCR 0x18 /* Modem Control Register */
43#define UART_LSR 0x1C /* Line Status Register */
44#define UART_MSR 0x20 /* Modem Status Register */
45#define UART_CLK 0x28 /* Baud Rat4e Clock Divider */
46#define UART_MOD_CNTRL 0x100 /* Module Control */
47
48/* memory-mapped read/write of the port */
c1dcb14e
SS
49#define UART16550_READ(y) (au_readl(DEBUG_BASE + y) & 0xff)
50#define UART16550_WRITE(y, z) (au_writel(z & 0xff, DEBUG_BASE + y))
1da177e4 51
eba8291b 52extern unsigned long calc_clock(void);
1da177e4 53
c1dcb14e 54void debugInit(u32 baud, u8 data, u8 parity, u8 stop)
1da177e4 55{
c1dcb14e 56 if (UART16550_READ(UART_MOD_CNTRL) != 0x3)
1da177e4 57 UART16550_WRITE(UART_MOD_CNTRL, 3);
eba8291b 58 calc_clock();
1da177e4
LT
59
60 /* disable interrupts */
61 UART16550_WRITE(UART_IER, 0);
62
63 /* set up baud rate */
64 {
c1dcb14e 65 u32 divisor;
1da177e4
LT
66
67 /* set divisor */
68 divisor = get_au1x00_uart_baud_base() / baud;
69 UART16550_WRITE(UART_CLK, divisor & 0xffff);
70 }
71
72 /* set data format */
73 UART16550_WRITE(UART_LCR, (data | parity | stop));
74}
75
c1dcb14e 76static int remoteDebugInitialized;
1da177e4 77
c1dcb14e 78u8 getDebugChar(void)
1da177e4
LT
79{
80 if (!remoteDebugInitialized) {
81 remoteDebugInitialized = 1;
82 debugInit(UART16550_BAUD_115200,
83 UART16550_DATA_8BIT,
84 UART16550_PARITY_NONE,
85 UART16550_STOP_1BIT);
86 }
87
c1dcb14e 88 while ((UART16550_READ(UART_LSR) & 0x1) == 0);
1da177e4
LT
89 return UART16550_READ(UART_RX);
90}
91
92
c1dcb14e 93int putDebugChar(u8 byte)
1da177e4 94{
1da177e4
LT
95 if (!remoteDebugInitialized) {
96 remoteDebugInitialized = 1;
97 debugInit(UART16550_BAUD_115200,
98 UART16550_DATA_8BIT,
99 UART16550_PARITY_NONE,
100 UART16550_STOP_1BIT);
101 }
102
c1dcb14e 103 while ((UART16550_READ(UART_LSR) & 0x40) == 0);
1da177e4 104 UART16550_WRITE(UART_TX, byte);
1da177e4
LT
105
106 return 1;
107}
108
109#endif