Pull bugzilla-9345 into release branch
[linux-2.6] / arch / mips / au1000 / common / dbg_io.c
1
2 #include <asm/io.h>
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
12 /**/
13
14 /* we need uint32 uint8 */
15 /* #include "types.h" */
16 typedef         unsigned char uint8;
17 typedef         unsigned int  uint32;
18
19 #define         UART16550_BAUD_2400             2400
20 #define         UART16550_BAUD_4800             4800
21 #define         UART16550_BAUD_9600             9600
22 #define         UART16550_BAUD_19200            19200
23 #define         UART16550_BAUD_38400            38400
24 #define         UART16550_BAUD_57600            57600
25 #define         UART16550_BAUD_115200           115200
26
27 #define         UART16550_PARITY_NONE           0
28 #define         UART16550_PARITY_ODD            0x08
29 #define         UART16550_PARITY_EVEN           0x18
30 #define         UART16550_PARITY_MARK           0x28
31 #define         UART16550_PARITY_SPACE          0x38
32
33 #define         UART16550_DATA_5BIT             0x0
34 #define         UART16550_DATA_6BIT             0x1
35 #define         UART16550_DATA_7BIT             0x2
36 #define         UART16550_DATA_8BIT             0x3
37
38 #define         UART16550_STOP_1BIT             0x0
39 #define         UART16550_STOP_2BIT             0x4
40
41
42 #define UART_RX         0       /* Receive buffer */
43 #define UART_TX         4       /* Transmit buffer */
44 #define UART_IER        8       /* Interrupt Enable Register */
45 #define UART_IIR        0xC     /* Interrupt ID Register */
46 #define UART_FCR        0x10    /* FIFO Control Register */
47 #define UART_LCR        0x14    /* Line Control Register */
48 #define UART_MCR        0x18    /* Modem Control Register */
49 #define UART_LSR        0x1C    /* Line Status Register */
50 #define UART_MSR        0x20    /* Modem Status Register */
51 #define UART_CLK        0x28    /* Baud Rat4e Clock Divider */
52 #define UART_MOD_CNTRL  0x100   /* Module Control */
53
54 /* memory-mapped read/write of the port */
55 #define UART16550_READ(y)    (au_readl(DEBUG_BASE + y) & 0xff)
56 #define UART16550_WRITE(y, z) (au_writel(z&0xff, DEBUG_BASE + y))
57
58 extern unsigned long get_au1x00_uart_baud_base(void);
59 extern unsigned long cal_r4koff(void);
60
61 void debugInit(uint32 baud, uint8 data, uint8 parity, uint8 stop)
62 {
63
64         if (UART16550_READ(UART_MOD_CNTRL) != 0x3) {
65                 UART16550_WRITE(UART_MOD_CNTRL, 3);
66         }
67         cal_r4koff();
68
69         /* disable interrupts */
70         UART16550_WRITE(UART_IER, 0);
71
72         /* set up baud rate */
73         {
74                 uint32 divisor;
75
76                 /* set divisor */
77                 divisor = get_au1x00_uart_baud_base() / baud;
78                 UART16550_WRITE(UART_CLK, divisor & 0xffff);
79         }
80
81         /* set data format */
82         UART16550_WRITE(UART_LCR, (data | parity | stop));
83 }
84
85 static int remoteDebugInitialized = 0;
86
87 uint8 getDebugChar(void)
88 {
89         if (!remoteDebugInitialized) {
90                 remoteDebugInitialized = 1;
91                 debugInit(UART16550_BAUD_115200,
92                           UART16550_DATA_8BIT,
93                           UART16550_PARITY_NONE,
94                           UART16550_STOP_1BIT);
95         }
96
97         while((UART16550_READ(UART_LSR) & 0x1) == 0);
98         return UART16550_READ(UART_RX);
99 }
100
101
102 int putDebugChar(uint8 byte)
103 {
104 //      int i;
105
106         if (!remoteDebugInitialized) {
107                 remoteDebugInitialized = 1;
108                 debugInit(UART16550_BAUD_115200,
109                           UART16550_DATA_8BIT,
110                           UART16550_PARITY_NONE,
111                           UART16550_STOP_1BIT);
112         }
113
114         while ((UART16550_READ(UART_LSR)&0x40) == 0);
115         UART16550_WRITE(UART_TX, byte);
116         //for (i=0;i<0xfff;i++);
117
118         return 1;
119 }
120
121 #endif