2 * marvell kirkwood uart (supposed to be a 16550)
5 #include "../port/lib.h"
10 #include "../port/error.h"
11 // #include "../port/uart.h"
19 IRRintrmask = (1<<4)-1,
33 FCRrxtriggermask = 3<<6,
37 FCRrxtrigger14 = 3<<6,
60 extern PhysUart kwphysuart;
62 typedef struct UartReg UartReg;
84 typedef struct Ctlr Ctlr;
91 static Ctlr kirkwoodctlr[] = {
93 .regs = nil, /* filled in below */
97 static Uart kirkwooduart[] = {
99 .regs = &kirkwoodctlr[0],
111 Ctlr *ctlr = uart->regs;
112 UartReg *regs = ctlr->regs;
116 while ((lsr = regs->lsr) & LSRrx) {
124 if((lsr & (LSRbi|LSRframeerr|LSRparerr)) == 0)
130 kw_intr(Ureg*, void *arg)
133 Ctlr *ctlr = uart->regs;
134 UartReg *regs = ctlr->regs;
138 kirkwoodctlr[0].regs = (UartReg *)soc.uart[0];
139 regs = (UartReg *)soc.uart[0]; /* caution */
148 intrclear(Irqhi, ctlr->irq);
154 kirkwoodctlr[0].regs = (UartReg *)soc.uart[0];
160 kw_enable(Uart* uart, int ie)
162 Ctlr *ctlr = uart->regs;
163 UartReg *regs = ctlr->regs;
166 kirkwoodctlr[0].regs = (UartReg *)soc.uart[0];
167 regs = (UartReg *)soc.uart[0]; /* caution */
171 regs->fcr = FCRenable|FCRrxtrigger4;
172 regs->ier = IERrx|IERtx;
173 intrenable(Irqhi, ctlr->irq, kw_intr, uart, uart->name);
175 (*uart->phys->dtr)(uart, 1);
176 (*uart->phys->rts)(uart, 1);
180 kw_disable(Uart* uart)
182 Ctlr *ctlr = uart->regs;
184 (*uart->phys->dtr)(uart, 0);
185 (*uart->phys->rts)(uart, 0);
186 (*uart->phys->fifo)(uart, 0);
188 intrdisable(Irqhi, ctlr->irq, kw_intr, uart, uart->name);
194 Ctlr *ctlr = uart->regs;
195 UartReg *regs = ctlr->regs;
198 if(uart->cts == 0 || uart->blocked)
201 for(i = 0; i < 16; i++) {
202 if((regs->lsr & LSRthre) == 0 ||
203 uart->op >= uart->oe && uartstageoutput(uart) == 0)
205 regs->thr = *uart->op++;
210 kw_break(Uart* uart, int ms)
216 kw_baud(Uart* uart, int baud)
223 kw_bits(Uart* uart, int bits)
230 kw_stop(Uart* uart, int stop)
237 kw_parity(Uart* uart, int parity)
244 kw_modemctl(Uart* uart, int on)
250 kw_rts(Uart* uart, int on)
256 kw_dtr(Uart* uart, int on)
262 kw_status(Uart* uart, void* buf, long n, long offset)
264 USED(uart, buf, n, offset);
269 kw_fifo(Uart* uart, int level)
277 Ctlr *ctlr = uart->regs;
278 UartReg *regs = ctlr->regs;
280 while((regs->lsr&LSRrx) == 0)
286 kw_putc(Uart *uart, int c)
288 Ctlr *ctlr = uart->regs;
289 UartReg *regs = ctlr->regs;
291 /* can be called from iprint, among many other places */
293 kirkwoodctlr[0].regs = (UartReg *)soc.uart[0];
294 regs = (UartReg *)soc.uart[0]; /* caution */
297 while((regs->lsr&LSRthre) == 0)
303 PhysUart kwphysuart = {
307 .disable = kw_disable,
314 .modemctl = kw_modemctl,
324 uartkirkwoodconsole(void)
328 uart = &kirkwooduart[0];
329 (*uart->phys->enable)(uart, 0);
330 uartctl(uart, "b115200 l8 pn s1 i1");
333 //serialputs("uart0 kirkwood\n", strlen("uart0 kirkwood\n"));
340 UartReg *regs = (UartReg *)soc.uart[0];
344 if (cnt <= 0) /* cpuhz not set yet? */
346 while((regs->lsr & LSRthre) == 0 && --cnt > 0)
355 serialputs(char *p, int len)