1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * dz.c: Serial port driver for DECstations equipped 4 * with the DZ chipset. 5 * 6 * Copyright (C) 1998 Olivier A. D. Lebaillif 7 * 8 * Email: olivier.lebaillif@ifrsys.com 9 * 10 * Copyright (C) 2004, 2006, 2007 Maciej W. Rozycki 11 * 12 * [31-AUG-98] triemer 13 * Changed IRQ to use Harald's dec internals interrupts.h 14 * removed base_addr code - moving address assignment to setup.c 15 * Changed name of dz_init to rs_init to be consistent with tc code 16 * [13-NOV-98] triemer fixed code to receive characters 17 * after patches by harald to irq code. 18 * [09-JAN-99] triemer minor fix for schedule - due to removal of timeout 19 * field from "current" - somewhere between 2.1.121 and 2.1.131 20 Qua Jun 27 15:02:26 BRT 2001 21 * [27-JUN-2001] Arnaldo Carvalho de Melo <acme@conectiva.com.br> - cleanups 22 * 23 * Parts (C) 1999 David Airlie, airlied@linux.ie 24 * [07-SEP-99] Bugfixes 25 * 26 * [06-Jan-2002] Russell King <rmk@arm.linux.org.uk> 27 * Converted to new serial core 28 */ 29 30 #undef DEBUG_DZ 31 32 #include <linux/bitops.h> 33 #include <linux/compiler.h> 34 #include <linux/console.h> 35 #include <linux/delay.h> 36 #include <linux/errno.h> 37 #include <linux/init.h> 38 #include <linux/interrupt.h> 39 #include <linux/ioport.h> 40 #include <linux/kernel.h> 41 #include <linux/major.h> 42 #include <linux/module.h> 43 #include <linux/serial.h> 44 #include <linux/serial_core.h> 45 #include <linux/sysrq.h> 46 #include <linux/tty.h> 47 #include <linux/tty_flip.h> 48 49 #include <linux/atomic.h> 50 #include <linux/io.h> 51 #include <asm/bootinfo.h> 52 53 #include <asm/dec/interrupts.h> 54 #include <asm/dec/kn01.h> 55 #include <asm/dec/kn02.h> 56 #include <asm/dec/machtype.h> 57 #include <asm/dec/prom.h> 58 #include <asm/dec/system.h> 59 60 #include "dz.h" 61 62 63 MODULE_DESCRIPTION("DECstation DZ serial driver"); 64 MODULE_LICENSE("GPL"); 65 66 67 static char dz_name[] __initdata = "DECstation DZ serial driver version "; 68 static char dz_version[] __initdata = "1.04"; 69 70 struct dz_port { 71 struct dz_mux *mux; 72 struct uart_port port; 73 unsigned int cflag; 74 }; 75 76 struct dz_mux { 77 struct dz_port dport[DZ_NB_PORT]; 78 atomic_t map_guard; 79 atomic_t irq_guard; 80 int initialised; 81 }; 82 83 static struct dz_mux dz_mux; 84 85 static inline struct dz_port *to_dport(struct uart_port *uport) 86 { 87 return container_of(uport, struct dz_port, port); 88 } 89 90 /* 91 * ------------------------------------------------------------ 92 * dz_in () and dz_out () 93 * 94 * These routines are used to access the registers of the DZ 95 * chip, hiding relocation differences between implementation. 96 * ------------------------------------------------------------ 97 */ 98 99 static u16 dz_in(struct dz_port *dport, unsigned offset) 100 { 101 void __iomem *addr = dport->port.membase + offset; 102 103 return readw(addr); 104 } 105 106 static void dz_out(struct dz_port *dport, unsigned offset, u16 value) 107 { 108 void __iomem *addr = dport->port.membase + offset; 109 110 writew(value, addr); 111 } 112 113 /* 114 * ------------------------------------------------------------ 115 * rs_stop () and rs_start () 116 * 117 * These routines are called before setting or resetting 118 * tty->flow.stopped. They enable or disable transmitter interrupts, 119 * as necessary. 120 * ------------------------------------------------------------ 121 */ 122 123 static void dz_stop_tx(struct uart_port *uport) 124 { 125 struct dz_port *dport = to_dport(uport); 126 u16 tmp, mask = 1 << dport->port.line; 127 128 tmp = dz_in(dport, DZ_TCR); /* read the TX flag */ 129 tmp &= ~mask; /* clear the TX flag */ 130 dz_out(dport, DZ_TCR, tmp); 131 } 132 133 static void dz_start_tx(struct uart_port *uport) 134 { 135 struct dz_port *dport = to_dport(uport); 136 u16 tmp, mask = 1 << dport->port.line; 137 138 tmp = dz_in(dport, DZ_TCR); /* read the TX flag */ 139 tmp |= mask; /* set the TX flag */ 140 dz_out(dport, DZ_TCR, tmp); 141 } 142 143 static void dz_stop_rx(struct uart_port *uport) 144 { 145 struct dz_port *dport = to_dport(uport); 146 147 dport->cflag &= ~DZ_RXENAB; 148 dz_out(dport, DZ_LPR, dport->cflag); 149 } 150 151 /* 152 * ------------------------------------------------------------ 153 * 154 * Here start the interrupt handling routines. All of the following 155 * subroutines are declared as inline and are folded into 156 * dz_interrupt. They were separated out for readability's sake. 157 * 158 * Note: dz_interrupt() is a "fast" interrupt, which means that it 159 * runs with interrupts turned off. People who may want to modify 160 * dz_interrupt() should try to keep the interrupt handler as fast as 161 * possible. After you are done making modifications, it is not a bad 162 * idea to do: 163 * 164 * make drivers/serial/dz.s 165 * 166 * and look at the resulting assemble code in dz.s. 167 * 168 * ------------------------------------------------------------ 169 */ 170 171 /* 172 * ------------------------------------------------------------ 173 * receive_char () 174 * 175 * This routine deals with inputs from any lines. 176 * ------------------------------------------------------------ 177 */ 178 static inline void dz_receive_chars(struct dz_mux *mux) 179 { 180 struct uart_port *uport; 181 struct dz_port *dport = &mux->dport[0]; 182 struct uart_icount *icount; 183 int lines_rx[DZ_NB_PORT] = { [0 ... DZ_NB_PORT - 1] = 0 }; 184 unsigned char ch, flag; 185 u16 status; 186 int i; 187 188 while ((status = dz_in(dport, DZ_RBUF)) & DZ_DVAL) { 189 dport = &mux->dport[LINE(status)]; 190 uport = &dport->port; 191 192 ch = UCHAR(status); /* grab the char */ 193 flag = TTY_NORMAL; 194 195 icount = &uport->icount; 196 icount->rx++; 197 198 if (unlikely(status & (DZ_OERR | DZ_FERR | DZ_PERR))) { 199 200 /* 201 * There is no separate BREAK status bit, so treat 202 * null characters with framing errors as BREAKs; 203 * normally, otherwise. For this move the Framing 204 * Error bit to a simulated BREAK bit. 205 */ 206 if (!ch) { 207 status |= (status & DZ_FERR) >> 208 (ffs(DZ_FERR) - ffs(DZ_BREAK)); 209 status &= ~DZ_FERR; 210 } 211 212 /* Handle SysRq/SAK & keep track of the statistics. */ 213 if (status & DZ_BREAK) { 214 icount->brk++; 215 if (uart_handle_break(uport)) 216 continue; 217 } else if (status & DZ_FERR) 218 icount->frame++; 219 else if (status & DZ_PERR) 220 icount->parity++; 221 if (status & DZ_OERR) 222 icount->overrun++; 223 224 status &= uport->read_status_mask; 225 if (status & DZ_BREAK) 226 flag = TTY_BREAK; 227 else if (status & DZ_FERR) 228 flag = TTY_FRAME; 229 else if (status & DZ_PERR) 230 flag = TTY_PARITY; 231 232 } 233 234 if (uart_handle_sysrq_char(uport, ch)) 235 continue; 236 237 uart_insert_char(uport, status, DZ_OERR, ch, flag); 238 lines_rx[LINE(status)] = 1; 239 } 240 for (i = 0; i < DZ_NB_PORT; i++) 241 if (lines_rx[i]) 242 tty_flip_buffer_push(&mux->dport[i].port.state->port); 243 } 244 245 /* 246 * ------------------------------------------------------------ 247 * transmit_char () 248 * 249 * This routine deals with outputs to any lines. 250 * ------------------------------------------------------------ 251 */ 252 static inline void dz_transmit_chars(struct dz_mux *mux) 253 { 254 struct dz_port *dport = &mux->dport[0]; 255 struct circ_buf *xmit; 256 unsigned char tmp; 257 u16 status; 258 259 status = dz_in(dport, DZ_CSR); 260 dport = &mux->dport[LINE(status)]; 261 xmit = &dport->port.state->xmit; 262 263 if (dport->port.x_char) { /* XON/XOFF chars */ 264 dz_out(dport, DZ_TDR, dport->port.x_char); 265 dport->port.icount.tx++; 266 dport->port.x_char = 0; 267 return; 268 } 269 /* If nothing to do or stopped or hardware stopped. */ 270 if (uart_circ_empty(xmit) || uart_tx_stopped(&dport->port)) { 271 spin_lock(&dport->port.lock); 272 dz_stop_tx(&dport->port); 273 spin_unlock(&dport->port.lock); 274 return; 275 } 276 277 /* 278 * If something to do... (remember the dz has no output fifo, 279 * so we go one char at a time) :-< 280 */ 281 tmp = xmit->buf[xmit->tail]; 282 xmit->tail = (xmit->tail + 1) & (DZ_XMIT_SIZE - 1); 283 dz_out(dport, DZ_TDR, tmp); 284 dport->port.icount.tx++; 285 286 if (uart_circ_chars_pending(xmit) < DZ_WAKEUP_CHARS) 287 uart_write_wakeup(&dport->port); 288 289 /* Are we are done. */ 290 if (uart_circ_empty(xmit)) { 291 spin_lock(&dport->port.lock); 292 dz_stop_tx(&dport->port); 293 spin_unlock(&dport->port.lock); 294 } 295 } 296 297 /* 298 * ------------------------------------------------------------ 299 * check_modem_status() 300 * 301 * DS 3100 & 5100: Only valid for the MODEM line, duh! 302 * DS 5000/200: Valid for the MODEM and PRINTER line. 303 * ------------------------------------------------------------ 304 */ 305 static inline void check_modem_status(struct dz_port *dport) 306 { 307 /* 308 * FIXME: 309 * 1. No status change interrupt; use a timer. 310 * 2. Handle the 3100/5000 as appropriate. --macro 311 */ 312 u16 status; 313 314 /* If not the modem line just return. */ 315 if (dport->port.line != DZ_MODEM) 316 return; 317 318 status = dz_in(dport, DZ_MSR); 319 320 /* it's easy, since DSR2 is the only bit in the register */ 321 if (status) 322 dport->port.icount.dsr++; 323 } 324 325 /* 326 * ------------------------------------------------------------ 327 * dz_interrupt () 328 * 329 * this is the main interrupt routine for the DZ chip. 330 * It deals with the multiple ports. 331 * ------------------------------------------------------------ 332 */ 333 static irqreturn_t dz_interrupt(int irq, void *dev_id) 334 { 335 struct dz_mux *mux = dev_id; 336 struct dz_port *dport = &mux->dport[0]; 337 u16 status; 338 339 /* get the reason why we just got an irq */ 340 status = dz_in(dport, DZ_CSR); 341 342 if ((status & (DZ_RDONE | DZ_RIE)) == (DZ_RDONE | DZ_RIE)) 343 dz_receive_chars(mux); 344 345 if ((status & (DZ_TRDY | DZ_TIE)) == (DZ_TRDY | DZ_TIE)) 346 dz_transmit_chars(mux); 347 348 return IRQ_HANDLED; 349 } 350 351 /* 352 * ------------------------------------------------------------------- 353 * Here ends the DZ interrupt routines. 354 * ------------------------------------------------------------------- 355 */ 356 357 static unsigned int dz_get_mctrl(struct uart_port *uport) 358 { 359 /* 360 * FIXME: Handle the 3100/5000 as appropriate. --macro 361 */ 362 struct dz_port *dport = to_dport(uport); 363 unsigned int mctrl = TIOCM_CAR | TIOCM_DSR | TIOCM_CTS; 364 365 if (dport->port.line == DZ_MODEM) { 366 if (dz_in(dport, DZ_MSR) & DZ_MODEM_DSR) 367 mctrl &= ~TIOCM_DSR; 368 } 369 370 return mctrl; 371 } 372 373 static void dz_set_mctrl(struct uart_port *uport, unsigned int mctrl) 374 { 375 /* 376 * FIXME: Handle the 3100/5000 as appropriate. --macro 377 */ 378 struct dz_port *dport = to_dport(uport); 379 u16 tmp; 380 381 if (dport->port.line == DZ_MODEM) { 382 tmp = dz_in(dport, DZ_TCR); 383 if (mctrl & TIOCM_DTR) 384 tmp &= ~DZ_MODEM_DTR; 385 else 386 tmp |= DZ_MODEM_DTR; 387 dz_out(dport, DZ_TCR, tmp); 388 } 389 } 390 391 /* 392 * ------------------------------------------------------------------- 393 * startup () 394 * 395 * various initialization tasks 396 * ------------------------------------------------------------------- 397 */ 398 static int dz_startup(struct uart_port *uport) 399 { 400 struct dz_port *dport = to_dport(uport); 401 struct dz_mux *mux = dport->mux; 402 unsigned long flags; 403 int irq_guard; 404 int ret; 405 u16 tmp; 406 407 irq_guard = atomic_add_return(1, &mux->irq_guard); 408 if (irq_guard != 1) 409 return 0; 410 411 ret = request_irq(dport->port.irq, dz_interrupt, 412 IRQF_SHARED, "dz", mux); 413 if (ret) { 414 atomic_add(-1, &mux->irq_guard); 415 printk(KERN_ERR "dz: Cannot get IRQ %d!\n", dport->port.irq); 416 return ret; 417 } 418 419 spin_lock_irqsave(&dport->port.lock, flags); 420 421 /* Enable interrupts. */ 422 tmp = dz_in(dport, DZ_CSR); 423 tmp |= DZ_RIE | DZ_TIE; 424 dz_out(dport, DZ_CSR, tmp); 425 426 spin_unlock_irqrestore(&dport->port.lock, flags); 427 428 return 0; 429 } 430 431 /* 432 * ------------------------------------------------------------------- 433 * shutdown () 434 * 435 * This routine will shutdown a serial port; interrupts are disabled, and 436 * DTR is dropped if the hangup on close termio flag is on. 437 * ------------------------------------------------------------------- 438 */ 439 static void dz_shutdown(struct uart_port *uport) 440 { 441 struct dz_port *dport = to_dport(uport); 442 struct dz_mux *mux = dport->mux; 443 unsigned long flags; 444 int irq_guard; 445 u16 tmp; 446 447 spin_lock_irqsave(&dport->port.lock, flags); 448 dz_stop_tx(&dport->port); 449 spin_unlock_irqrestore(&dport->port.lock, flags); 450 451 irq_guard = atomic_add_return(-1, &mux->irq_guard); 452 if (!irq_guard) { 453 /* Disable interrupts. */ 454 tmp = dz_in(dport, DZ_CSR); 455 tmp &= ~(DZ_RIE | DZ_TIE); 456 dz_out(dport, DZ_CSR, tmp); 457 458 free_irq(dport->port.irq, mux); 459 } 460 } 461 462 /* 463 * ------------------------------------------------------------------- 464 * dz_tx_empty() -- get the transmitter empty status 465 * 466 * Purpose: Let user call ioctl() to get info when the UART physically 467 * is emptied. On bus types like RS485, the transmitter must 468 * release the bus after transmitting. This must be done when 469 * the transmit shift register is empty, not be done when the 470 * transmit holding register is empty. This functionality 471 * allows an RS485 driver to be written in user space. 472 * ------------------------------------------------------------------- 473 */ 474 static unsigned int dz_tx_empty(struct uart_port *uport) 475 { 476 struct dz_port *dport = to_dport(uport); 477 unsigned short tmp, mask = 1 << dport->port.line; 478 479 tmp = dz_in(dport, DZ_TCR); 480 tmp &= mask; 481 482 return tmp ? 0 : TIOCSER_TEMT; 483 } 484 485 static void dz_break_ctl(struct uart_port *uport, int break_state) 486 { 487 /* 488 * FIXME: Can't access BREAK bits in TDR easily; 489 * reuse the code for polled TX. --macro 490 */ 491 struct dz_port *dport = to_dport(uport); 492 unsigned long flags; 493 unsigned short tmp, mask = 1 << dport->port.line; 494 495 spin_lock_irqsave(&uport->lock, flags); 496 tmp = dz_in(dport, DZ_TCR); 497 if (break_state) 498 tmp |= mask; 499 else 500 tmp &= ~mask; 501 dz_out(dport, DZ_TCR, tmp); 502 spin_unlock_irqrestore(&uport->lock, flags); 503 } 504 505 static int dz_encode_baud_rate(unsigned int baud) 506 { 507 switch (baud) { 508 case 50: 509 return DZ_B50; 510 case 75: 511 return DZ_B75; 512 case 110: 513 return DZ_B110; 514 case 134: 515 return DZ_B134; 516 case 150: 517 return DZ_B150; 518 case 300: 519 return DZ_B300; 520 case 600: 521 return DZ_B600; 522 case 1200: 523 return DZ_B1200; 524 case 1800: 525 return DZ_B1800; 526 case 2000: 527 return DZ_B2000; 528 case 2400: 529 return DZ_B2400; 530 case 3600: 531 return DZ_B3600; 532 case 4800: 533 return DZ_B4800; 534 case 7200: 535 return DZ_B7200; 536 case 9600: 537 return DZ_B9600; 538 default: 539 return -1; 540 } 541 } 542 543 544 static void dz_reset(struct dz_port *dport) 545 { 546 struct dz_mux *mux = dport->mux; 547 548 if (mux->initialised) 549 return; 550 551 dz_out(dport, DZ_CSR, DZ_CLR); 552 while (dz_in(dport, DZ_CSR) & DZ_CLR); 553 iob(); 554 555 /* Enable scanning. */ 556 dz_out(dport, DZ_CSR, DZ_MSE); 557 558 mux->initialised = 1; 559 } 560 561 static void dz_set_termios(struct uart_port *uport, struct ktermios *termios, 562 const struct ktermios *old_termios) 563 { 564 struct dz_port *dport = to_dport(uport); 565 unsigned long flags; 566 unsigned int cflag, baud; 567 int bflag; 568 569 cflag = dport->port.line; 570 571 switch (termios->c_cflag & CSIZE) { 572 case CS5: 573 cflag |= DZ_CS5; 574 break; 575 case CS6: 576 cflag |= DZ_CS6; 577 break; 578 case CS7: 579 cflag |= DZ_CS7; 580 break; 581 case CS8: 582 default: 583 cflag |= DZ_CS8; 584 } 585 586 if (termios->c_cflag & CSTOPB) 587 cflag |= DZ_CSTOPB; 588 if (termios->c_cflag & PARENB) 589 cflag |= DZ_PARENB; 590 if (termios->c_cflag & PARODD) 591 cflag |= DZ_PARODD; 592 593 baud = uart_get_baud_rate(uport, termios, old_termios, 50, 9600); 594 bflag = dz_encode_baud_rate(baud); 595 if (bflag < 0) { 596 if (old_termios) { 597 /* Keep unchanged. */ 598 baud = tty_termios_baud_rate(old_termios); 599 bflag = dz_encode_baud_rate(baud); 600 } 601 if (bflag < 0) { /* Resort to 9600. */ 602 baud = 9600; 603 bflag = DZ_B9600; 604 } 605 tty_termios_encode_baud_rate(termios, baud, baud); 606 } 607 cflag |= bflag; 608 609 if (termios->c_cflag & CREAD) 610 cflag |= DZ_RXENAB; 611 612 spin_lock_irqsave(&dport->port.lock, flags); 613 614 uart_update_timeout(uport, termios->c_cflag, baud); 615 616 dz_out(dport, DZ_LPR, cflag); 617 dport->cflag = cflag; 618 619 /* setup accept flag */ 620 dport->port.read_status_mask = DZ_OERR; 621 if (termios->c_iflag & INPCK) 622 dport->port.read_status_mask |= DZ_FERR | DZ_PERR; 623 if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) 624 dport->port.read_status_mask |= DZ_BREAK; 625 626 /* characters to ignore */ 627 uport->ignore_status_mask = 0; 628 if ((termios->c_iflag & (IGNPAR | IGNBRK)) == (IGNPAR | IGNBRK)) 629 dport->port.ignore_status_mask |= DZ_OERR; 630 if (termios->c_iflag & IGNPAR) 631 dport->port.ignore_status_mask |= DZ_FERR | DZ_PERR; 632 if (termios->c_iflag & IGNBRK) 633 dport->port.ignore_status_mask |= DZ_BREAK; 634 635 spin_unlock_irqrestore(&dport->port.lock, flags); 636 } 637 638 /* 639 * Hack alert! 640 * Required solely so that the initial PROM-based console 641 * works undisturbed in parallel with this one. 642 */ 643 static void dz_pm(struct uart_port *uport, unsigned int state, 644 unsigned int oldstate) 645 { 646 struct dz_port *dport = to_dport(uport); 647 unsigned long flags; 648 649 spin_lock_irqsave(&dport->port.lock, flags); 650 if (state < 3) 651 dz_start_tx(&dport->port); 652 else 653 dz_stop_tx(&dport->port); 654 spin_unlock_irqrestore(&dport->port.lock, flags); 655 } 656 657 658 static const char *dz_type(struct uart_port *uport) 659 { 660 return "DZ"; 661 } 662 663 static void dz_release_port(struct uart_port *uport) 664 { 665 struct dz_mux *mux = to_dport(uport)->mux; 666 int map_guard; 667 668 iounmap(uport->membase); 669 uport->membase = NULL; 670 671 map_guard = atomic_add_return(-1, &mux->map_guard); 672 if (!map_guard) 673 release_mem_region(uport->mapbase, dec_kn_slot_size); 674 } 675 676 static int dz_map_port(struct uart_port *uport) 677 { 678 if (!uport->membase) 679 uport->membase = ioremap(uport->mapbase, 680 dec_kn_slot_size); 681 if (!uport->membase) { 682 printk(KERN_ERR "dz: Cannot map MMIO\n"); 683 return -ENOMEM; 684 } 685 return 0; 686 } 687 688 static int dz_request_port(struct uart_port *uport) 689 { 690 struct dz_mux *mux = to_dport(uport)->mux; 691 int map_guard; 692 int ret; 693 694 map_guard = atomic_add_return(1, &mux->map_guard); 695 if (map_guard == 1) { 696 if (!request_mem_region(uport->mapbase, dec_kn_slot_size, 697 "dz")) { 698 atomic_add(-1, &mux->map_guard); 699 printk(KERN_ERR 700 "dz: Unable to reserve MMIO resource\n"); 701 return -EBUSY; 702 } 703 } 704 ret = dz_map_port(uport); 705 if (ret) { 706 map_guard = atomic_add_return(-1, &mux->map_guard); 707 if (!map_guard) 708 release_mem_region(uport->mapbase, dec_kn_slot_size); 709 return ret; 710 } 711 return 0; 712 } 713 714 static void dz_config_port(struct uart_port *uport, int flags) 715 { 716 struct dz_port *dport = to_dport(uport); 717 718 if (flags & UART_CONFIG_TYPE) { 719 if (dz_request_port(uport)) 720 return; 721 722 uport->type = PORT_DZ; 723 724 dz_reset(dport); 725 } 726 } 727 728 /* 729 * Verify the new serial_struct (for TIOCSSERIAL). 730 */ 731 static int dz_verify_port(struct uart_port *uport, struct serial_struct *ser) 732 { 733 int ret = 0; 734 735 if (ser->type != PORT_UNKNOWN && ser->type != PORT_DZ) 736 ret = -EINVAL; 737 if (ser->irq != uport->irq) 738 ret = -EINVAL; 739 return ret; 740 } 741 742 static const struct uart_ops dz_ops = { 743 .tx_empty = dz_tx_empty, 744 .get_mctrl = dz_get_mctrl, 745 .set_mctrl = dz_set_mctrl, 746 .stop_tx = dz_stop_tx, 747 .start_tx = dz_start_tx, 748 .stop_rx = dz_stop_rx, 749 .break_ctl = dz_break_ctl, 750 .startup = dz_startup, 751 .shutdown = dz_shutdown, 752 .set_termios = dz_set_termios, 753 .pm = dz_pm, 754 .type = dz_type, 755 .release_port = dz_release_port, 756 .request_port = dz_request_port, 757 .config_port = dz_config_port, 758 .verify_port = dz_verify_port, 759 }; 760 761 static void __init dz_init_ports(void) 762 { 763 static int first = 1; 764 unsigned long base; 765 int line; 766 767 if (!first) 768 return; 769 first = 0; 770 771 if (mips_machtype == MACH_DS23100 || mips_machtype == MACH_DS5100) 772 base = dec_kn_slot_base + KN01_DZ11; 773 else 774 base = dec_kn_slot_base + KN02_DZ11; 775 776 for (line = 0; line < DZ_NB_PORT; line++) { 777 struct dz_port *dport = &dz_mux.dport[line]; 778 struct uart_port *uport = &dport->port; 779 780 dport->mux = &dz_mux; 781 782 uport->irq = dec_interrupt[DEC_IRQ_DZ11]; 783 uport->fifosize = 1; 784 uport->iotype = UPIO_MEM; 785 uport->flags = UPF_BOOT_AUTOCONF; 786 uport->ops = &dz_ops; 787 uport->line = line; 788 uport->mapbase = base; 789 uport->has_sysrq = IS_ENABLED(CONFIG_SERIAL_DZ_CONSOLE); 790 } 791 } 792 793 #ifdef CONFIG_SERIAL_DZ_CONSOLE 794 /* 795 * ------------------------------------------------------------------- 796 * dz_console_putchar() -- transmit a character 797 * 798 * Polled transmission. This is tricky. We need to mask transmit 799 * interrupts so that they do not interfere, enable the transmitter 800 * for the line requested and then wait till the transmit scanner 801 * requests data for this line. But it may request data for another 802 * line first, in which case we have to disable its transmitter and 803 * repeat waiting till our line pops up. Only then the character may 804 * be transmitted. Finally, the state of the transmitter mask is 805 * restored. Welcome to the world of PDP-11! 806 * ------------------------------------------------------------------- 807 */ 808 static void dz_console_putchar(struct uart_port *uport, unsigned char ch) 809 { 810 struct dz_port *dport = to_dport(uport); 811 unsigned long flags; 812 unsigned short csr, tcr, trdy, mask; 813 int loops = 10000; 814 815 spin_lock_irqsave(&dport->port.lock, flags); 816 csr = dz_in(dport, DZ_CSR); 817 dz_out(dport, DZ_CSR, csr & ~DZ_TIE); 818 tcr = dz_in(dport, DZ_TCR); 819 tcr |= 1 << dport->port.line; 820 mask = tcr; 821 dz_out(dport, DZ_TCR, mask); 822 iob(); 823 spin_unlock_irqrestore(&dport->port.lock, flags); 824 825 do { 826 trdy = dz_in(dport, DZ_CSR); 827 if (!(trdy & DZ_TRDY)) 828 continue; 829 trdy = (trdy & DZ_TLINE) >> 8; 830 if (trdy == dport->port.line) 831 break; 832 mask &= ~(1 << trdy); 833 dz_out(dport, DZ_TCR, mask); 834 iob(); 835 udelay(2); 836 } while (--loops); 837 838 if (loops) /* Cannot send otherwise. */ 839 dz_out(dport, DZ_TDR, ch); 840 841 dz_out(dport, DZ_TCR, tcr); 842 dz_out(dport, DZ_CSR, csr); 843 } 844 845 /* 846 * ------------------------------------------------------------------- 847 * dz_console_print () 848 * 849 * dz_console_print is registered for printk. 850 * The console must be locked when we get here. 851 * ------------------------------------------------------------------- 852 */ 853 static void dz_console_print(struct console *co, 854 const char *str, 855 unsigned int count) 856 { 857 struct dz_port *dport = &dz_mux.dport[co->index]; 858 #ifdef DEBUG_DZ 859 prom_printf((char *) str); 860 #endif 861 uart_console_write(&dport->port, str, count, dz_console_putchar); 862 } 863 864 static int __init dz_console_setup(struct console *co, char *options) 865 { 866 struct dz_port *dport = &dz_mux.dport[co->index]; 867 struct uart_port *uport = &dport->port; 868 int baud = 9600; 869 int bits = 8; 870 int parity = 'n'; 871 int flow = 'n'; 872 int ret; 873 874 ret = dz_map_port(uport); 875 if (ret) 876 return ret; 877 878 spin_lock_init(&dport->port.lock); /* For dz_pm(). */ 879 880 dz_reset(dport); 881 dz_pm(uport, 0, -1); 882 883 if (options) 884 uart_parse_options(options, &baud, &parity, &bits, &flow); 885 886 return uart_set_options(&dport->port, co, baud, parity, bits, flow); 887 } 888 889 static struct uart_driver dz_reg; 890 static struct console dz_console = { 891 .name = "ttyS", 892 .write = dz_console_print, 893 .device = uart_console_device, 894 .setup = dz_console_setup, 895 .flags = CON_PRINTBUFFER, 896 .index = -1, 897 .data = &dz_reg, 898 }; 899 900 static int __init dz_serial_console_init(void) 901 { 902 if (!IOASIC) { 903 dz_init_ports(); 904 register_console(&dz_console); 905 return 0; 906 } else 907 return -ENXIO; 908 } 909 910 console_initcall(dz_serial_console_init); 911 912 #define SERIAL_DZ_CONSOLE &dz_console 913 #else 914 #define SERIAL_DZ_CONSOLE NULL 915 #endif /* CONFIG_SERIAL_DZ_CONSOLE */ 916 917 static struct uart_driver dz_reg = { 918 .owner = THIS_MODULE, 919 .driver_name = "serial", 920 .dev_name = "ttyS", 921 .major = TTY_MAJOR, 922 .minor = 64, 923 .nr = DZ_NB_PORT, 924 .cons = SERIAL_DZ_CONSOLE, 925 }; 926 927 static int __init dz_init(void) 928 { 929 int ret, i; 930 931 if (IOASIC) 932 return -ENXIO; 933 934 printk("%s%s\n", dz_name, dz_version); 935 936 dz_init_ports(); 937 938 ret = uart_register_driver(&dz_reg); 939 if (ret) 940 return ret; 941 942 for (i = 0; i < DZ_NB_PORT; i++) 943 uart_add_one_port(&dz_reg, &dz_mux.dport[i].port); 944 945 return 0; 946 } 947 948 module_init(dz_init); 949