1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Driver for GRLIB serial ports (APBUART) 4 * 5 * Based on linux/drivers/serial/amba.c 6 * 7 * Copyright (C) 2000 Deep Blue Solutions Ltd. 8 * Copyright (C) 2003 Konrad Eisele <eiselekd@web.de> 9 * Copyright (C) 2006 Daniel Hellstrom <daniel@gaisler.com>, Aeroflex Gaisler AB 10 * Copyright (C) 2008 Gilead Kutnick <kutnickg@zin-tech.com> 11 * Copyright (C) 2009 Kristoffer Glembo <kristoffer@gaisler.com>, Aeroflex Gaisler AB 12 */ 13 14 #include <linux/module.h> 15 #include <linux/tty.h> 16 #include <linux/tty_flip.h> 17 #include <linux/ioport.h> 18 #include <linux/init.h> 19 #include <linux/serial.h> 20 #include <linux/console.h> 21 #include <linux/sysrq.h> 22 #include <linux/kthread.h> 23 #include <linux/device.h> 24 #include <linux/of.h> 25 #include <linux/platform_device.h> 26 #include <linux/io.h> 27 #include <linux/serial_core.h> 28 #include <asm/irq.h> 29 30 #include "apbuart.h" 31 32 #define SERIAL_APBUART_MAJOR TTY_MAJOR 33 #define SERIAL_APBUART_MINOR 64 34 #define UART_DUMMY_RSR_RX 0x8000 /* for ignore all read */ 35 36 static void apbuart_tx_chars(struct uart_port *port); 37 38 static void apbuart_stop_tx(struct uart_port *port) 39 { 40 unsigned int cr; 41 42 cr = UART_GET_CTRL(port); 43 cr &= ~UART_CTRL_TI; 44 UART_PUT_CTRL(port, cr); 45 } 46 47 static void apbuart_start_tx(struct uart_port *port) 48 { 49 unsigned int cr; 50 51 cr = UART_GET_CTRL(port); 52 cr |= UART_CTRL_TI; 53 UART_PUT_CTRL(port, cr); 54 55 if (UART_GET_STATUS(port) & UART_STATUS_THE) 56 apbuart_tx_chars(port); 57 } 58 59 static void apbuart_stop_rx(struct uart_port *port) 60 { 61 unsigned int cr; 62 63 cr = UART_GET_CTRL(port); 64 cr &= ~(UART_CTRL_RI); 65 UART_PUT_CTRL(port, cr); 66 } 67 68 static void apbuart_rx_chars(struct uart_port *port) 69 { 70 unsigned int status, rsr; 71 unsigned int max_chars = port->fifosize; 72 u8 ch, flag; 73 74 status = UART_GET_STATUS(port); 75 76 while (UART_RX_DATA(status) && (max_chars--)) { 77 78 ch = UART_GET_CHAR(port); 79 flag = TTY_NORMAL; 80 81 port->icount.rx++; 82 83 rsr = UART_GET_STATUS(port) | UART_DUMMY_RSR_RX; 84 UART_PUT_STATUS(port, 0); 85 if (rsr & UART_STATUS_ERR) { 86 87 if (rsr & UART_STATUS_BR) { 88 rsr &= ~(UART_STATUS_FE | UART_STATUS_PE); 89 port->icount.brk++; 90 if (uart_handle_break(port)) 91 goto ignore_char; 92 } else if (rsr & UART_STATUS_PE) { 93 port->icount.parity++; 94 } else if (rsr & UART_STATUS_FE) { 95 port->icount.frame++; 96 } 97 if (rsr & UART_STATUS_OE) 98 port->icount.overrun++; 99 100 rsr &= port->read_status_mask; 101 102 if (rsr & UART_STATUS_PE) 103 flag = TTY_PARITY; 104 else if (rsr & UART_STATUS_FE) 105 flag = TTY_FRAME; 106 } 107 108 if (uart_handle_sysrq_char(port, ch)) 109 goto ignore_char; 110 111 uart_insert_char(port, rsr, UART_STATUS_OE, ch, flag); 112 113 114 ignore_char: 115 status = UART_GET_STATUS(port); 116 } 117 118 tty_flip_buffer_push(&port->state->port); 119 } 120 121 static void apbuart_tx_chars(struct uart_port *port) 122 { 123 u8 ch; 124 125 uart_port_tx_limited(port, ch, port->fifosize, 126 true, 127 UART_PUT_CHAR(port, ch), 128 ({})); 129 } 130 131 static irqreturn_t apbuart_int(int irq, void *dev_id) 132 { 133 struct uart_port *port = dev_id; 134 unsigned int status; 135 136 spin_lock(&port->lock); 137 138 status = UART_GET_STATUS(port); 139 if (status & UART_STATUS_DR) 140 apbuart_rx_chars(port); 141 if (status & UART_STATUS_THE) 142 apbuart_tx_chars(port); 143 144 spin_unlock(&port->lock); 145 146 return IRQ_HANDLED; 147 } 148 149 static unsigned int apbuart_tx_empty(struct uart_port *port) 150 { 151 unsigned int status = UART_GET_STATUS(port); 152 return status & UART_STATUS_THE ? TIOCSER_TEMT : 0; 153 } 154 155 static unsigned int apbuart_get_mctrl(struct uart_port *port) 156 { 157 /* The GRLIB APBUART handles flow control in hardware */ 158 return TIOCM_CAR | TIOCM_DSR | TIOCM_CTS; 159 } 160 161 static void apbuart_set_mctrl(struct uart_port *port, unsigned int mctrl) 162 { 163 /* The GRLIB APBUART handles flow control in hardware */ 164 } 165 166 static void apbuart_break_ctl(struct uart_port *port, int break_state) 167 { 168 /* We don't support sending break */ 169 } 170 171 static int apbuart_startup(struct uart_port *port) 172 { 173 int retval; 174 unsigned int cr; 175 176 /* Allocate the IRQ */ 177 retval = request_irq(port->irq, apbuart_int, 0, "apbuart", port); 178 if (retval) 179 return retval; 180 181 /* Finally, enable interrupts */ 182 cr = UART_GET_CTRL(port); 183 UART_PUT_CTRL(port, 184 cr | UART_CTRL_RE | UART_CTRL_TE | 185 UART_CTRL_RI | UART_CTRL_TI); 186 187 return 0; 188 } 189 190 static void apbuart_shutdown(struct uart_port *port) 191 { 192 unsigned int cr; 193 194 /* disable all interrupts, disable the port */ 195 cr = UART_GET_CTRL(port); 196 UART_PUT_CTRL(port, 197 cr & ~(UART_CTRL_RE | UART_CTRL_TE | 198 UART_CTRL_RI | UART_CTRL_TI)); 199 200 /* Free the interrupt */ 201 free_irq(port->irq, port); 202 } 203 204 static void apbuart_set_termios(struct uart_port *port, 205 struct ktermios *termios, const struct ktermios *old) 206 { 207 unsigned int cr; 208 unsigned long flags; 209 unsigned int baud, quot; 210 211 /* Ask the core to calculate the divisor for us. */ 212 baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 16); 213 if (baud == 0) 214 panic("invalid baudrate %i\n", port->uartclk / 16); 215 216 /* uart_get_divisor calc a *16 uart freq, apbuart is *8 */ 217 quot = (uart_get_divisor(port, baud)) * 2; 218 cr = UART_GET_CTRL(port); 219 cr &= ~(UART_CTRL_PE | UART_CTRL_PS); 220 221 if (termios->c_cflag & PARENB) { 222 cr |= UART_CTRL_PE; 223 if ((termios->c_cflag & PARODD)) 224 cr |= UART_CTRL_PS; 225 } 226 227 /* Enable flow control. */ 228 if (termios->c_cflag & CRTSCTS) 229 cr |= UART_CTRL_FL; 230 231 spin_lock_irqsave(&port->lock, flags); 232 233 /* Update the per-port timeout. */ 234 uart_update_timeout(port, termios->c_cflag, baud); 235 236 port->read_status_mask = UART_STATUS_OE; 237 if (termios->c_iflag & INPCK) 238 port->read_status_mask |= UART_STATUS_FE | UART_STATUS_PE; 239 240 /* Characters to ignore */ 241 port->ignore_status_mask = 0; 242 if (termios->c_iflag & IGNPAR) 243 port->ignore_status_mask |= UART_STATUS_FE | UART_STATUS_PE; 244 245 /* Ignore all characters if CREAD is not set. */ 246 if ((termios->c_cflag & CREAD) == 0) 247 port->ignore_status_mask |= UART_DUMMY_RSR_RX; 248 249 /* Set baud rate */ 250 quot -= 1; 251 UART_PUT_SCAL(port, quot); 252 UART_PUT_CTRL(port, cr); 253 254 spin_unlock_irqrestore(&port->lock, flags); 255 } 256 257 static const char *apbuart_type(struct uart_port *port) 258 { 259 return port->type == PORT_APBUART ? "GRLIB/APBUART" : NULL; 260 } 261 262 static void apbuart_release_port(struct uart_port *port) 263 { 264 release_mem_region(port->mapbase, 0x100); 265 } 266 267 static int apbuart_request_port(struct uart_port *port) 268 { 269 return request_mem_region(port->mapbase, 0x100, "grlib-apbuart") 270 != NULL ? 0 : -EBUSY; 271 return 0; 272 } 273 274 /* Configure/autoconfigure the port */ 275 static void apbuart_config_port(struct uart_port *port, int flags) 276 { 277 if (flags & UART_CONFIG_TYPE) { 278 port->type = PORT_APBUART; 279 apbuart_request_port(port); 280 } 281 } 282 283 /* Verify the new serial_struct (for TIOCSSERIAL) */ 284 static int apbuart_verify_port(struct uart_port *port, 285 struct serial_struct *ser) 286 { 287 int ret = 0; 288 if (ser->type != PORT_UNKNOWN && ser->type != PORT_APBUART) 289 ret = -EINVAL; 290 if (ser->irq < 0 || ser->irq >= NR_IRQS) 291 ret = -EINVAL; 292 if (ser->baud_base < 9600) 293 ret = -EINVAL; 294 return ret; 295 } 296 297 static const struct uart_ops grlib_apbuart_ops = { 298 .tx_empty = apbuart_tx_empty, 299 .set_mctrl = apbuart_set_mctrl, 300 .get_mctrl = apbuart_get_mctrl, 301 .stop_tx = apbuart_stop_tx, 302 .start_tx = apbuart_start_tx, 303 .stop_rx = apbuart_stop_rx, 304 .break_ctl = apbuart_break_ctl, 305 .startup = apbuart_startup, 306 .shutdown = apbuart_shutdown, 307 .set_termios = apbuart_set_termios, 308 .type = apbuart_type, 309 .release_port = apbuart_release_port, 310 .request_port = apbuart_request_port, 311 .config_port = apbuart_config_port, 312 .verify_port = apbuart_verify_port, 313 }; 314 315 static struct uart_port grlib_apbuart_ports[UART_NR]; 316 static struct device_node *grlib_apbuart_nodes[UART_NR]; 317 318 static int apbuart_scan_fifo_size(struct uart_port *port, int portnumber) 319 { 320 int ctrl, loop = 0; 321 int status; 322 int fifosize; 323 unsigned long flags; 324 325 ctrl = UART_GET_CTRL(port); 326 327 /* 328 * Enable the transceiver and wait for it to be ready to send data. 329 * Clear interrupts so that this process will not be externally 330 * interrupted in the middle (which can cause the transceiver to 331 * drain prematurely). 332 */ 333 334 local_irq_save(flags); 335 336 UART_PUT_CTRL(port, ctrl | UART_CTRL_TE); 337 338 while (!UART_TX_READY(UART_GET_STATUS(port))) 339 loop++; 340 341 /* 342 * Disable the transceiver so data isn't actually sent during the 343 * actual test. 344 */ 345 346 UART_PUT_CTRL(port, ctrl & ~(UART_CTRL_TE)); 347 348 fifosize = 1; 349 UART_PUT_CHAR(port, 0); 350 351 /* 352 * So long as transmitting a character increments the tranceivier FIFO 353 * length the FIFO must be at least that big. These bytes will 354 * automatically drain off of the FIFO. 355 */ 356 357 status = UART_GET_STATUS(port); 358 while (((status >> 20) & 0x3F) == fifosize) { 359 fifosize++; 360 UART_PUT_CHAR(port, 0); 361 status = UART_GET_STATUS(port); 362 } 363 364 fifosize--; 365 366 UART_PUT_CTRL(port, ctrl); 367 local_irq_restore(flags); 368 369 if (fifosize == 0) 370 fifosize = 1; 371 372 return fifosize; 373 } 374 375 static void apbuart_flush_fifo(struct uart_port *port) 376 { 377 int i; 378 379 for (i = 0; i < port->fifosize; i++) 380 UART_GET_CHAR(port); 381 } 382 383 384 /* ======================================================================== */ 385 /* Console driver, if enabled */ 386 /* ======================================================================== */ 387 388 #ifdef CONFIG_SERIAL_GRLIB_GAISLER_APBUART_CONSOLE 389 390 static void apbuart_console_putchar(struct uart_port *port, unsigned char ch) 391 { 392 unsigned int status; 393 do { 394 status = UART_GET_STATUS(port); 395 } while (!UART_TX_READY(status)); 396 UART_PUT_CHAR(port, ch); 397 } 398 399 static void 400 apbuart_console_write(struct console *co, const char *s, unsigned int count) 401 { 402 struct uart_port *port = &grlib_apbuart_ports[co->index]; 403 unsigned int status, old_cr, new_cr; 404 405 /* First save the CR then disable the interrupts */ 406 old_cr = UART_GET_CTRL(port); 407 new_cr = old_cr & ~(UART_CTRL_RI | UART_CTRL_TI); 408 UART_PUT_CTRL(port, new_cr); 409 410 uart_console_write(port, s, count, apbuart_console_putchar); 411 412 /* 413 * Finally, wait for transmitter to become empty 414 * and restore the TCR 415 */ 416 do { 417 status = UART_GET_STATUS(port); 418 } while (!UART_TX_READY(status)); 419 UART_PUT_CTRL(port, old_cr); 420 } 421 422 static void __init 423 apbuart_console_get_options(struct uart_port *port, int *baud, 424 int *parity, int *bits) 425 { 426 if (UART_GET_CTRL(port) & (UART_CTRL_RE | UART_CTRL_TE)) { 427 428 unsigned int quot, status; 429 status = UART_GET_STATUS(port); 430 431 *parity = 'n'; 432 if (status & UART_CTRL_PE) { 433 if ((status & UART_CTRL_PS) == 0) 434 *parity = 'e'; 435 else 436 *parity = 'o'; 437 } 438 439 *bits = 8; 440 quot = UART_GET_SCAL(port) / 8; 441 *baud = port->uartclk / (16 * (quot + 1)); 442 } 443 } 444 445 static int __init apbuart_console_setup(struct console *co, char *options) 446 { 447 struct uart_port *port; 448 int baud = 38400; 449 int bits = 8; 450 int parity = 'n'; 451 int flow = 'n'; 452 453 pr_debug("apbuart_console_setup co=%p, co->index=%i, options=%s\n", 454 co, co->index, options); 455 456 /* 457 * Check whether an invalid uart number has been specified, and 458 * if so, search for the first available port that does have 459 * console support. 460 */ 461 if (co->index >= grlib_apbuart_port_nr) 462 co->index = 0; 463 464 port = &grlib_apbuart_ports[co->index]; 465 466 spin_lock_init(&port->lock); 467 468 if (options) 469 uart_parse_options(options, &baud, &parity, &bits, &flow); 470 else 471 apbuart_console_get_options(port, &baud, &parity, &bits); 472 473 return uart_set_options(port, co, baud, parity, bits, flow); 474 } 475 476 static struct uart_driver grlib_apbuart_driver; 477 478 static struct console grlib_apbuart_console = { 479 .name = "ttyS", 480 .write = apbuart_console_write, 481 .device = uart_console_device, 482 .setup = apbuart_console_setup, 483 .flags = CON_PRINTBUFFER, 484 .index = -1, 485 .data = &grlib_apbuart_driver, 486 }; 487 488 489 static int grlib_apbuart_configure(void); 490 491 static int __init apbuart_console_init(void) 492 { 493 if (grlib_apbuart_configure()) 494 return -ENODEV; 495 register_console(&grlib_apbuart_console); 496 return 0; 497 } 498 499 console_initcall(apbuart_console_init); 500 501 #define APBUART_CONSOLE (&grlib_apbuart_console) 502 #else 503 #define APBUART_CONSOLE NULL 504 #endif 505 506 static struct uart_driver grlib_apbuart_driver = { 507 .owner = THIS_MODULE, 508 .driver_name = "serial", 509 .dev_name = "ttyS", 510 .major = SERIAL_APBUART_MAJOR, 511 .minor = SERIAL_APBUART_MINOR, 512 .nr = UART_NR, 513 .cons = APBUART_CONSOLE, 514 }; 515 516 517 /* ======================================================================== */ 518 /* OF Platform Driver */ 519 /* ======================================================================== */ 520 521 static int apbuart_probe(struct platform_device *op) 522 { 523 int i; 524 struct uart_port *port = NULL; 525 526 for (i = 0; i < grlib_apbuart_port_nr; i++) { 527 if (op->dev.of_node == grlib_apbuart_nodes[i]) 528 break; 529 } 530 531 port = &grlib_apbuart_ports[i]; 532 port->dev = &op->dev; 533 port->irq = op->archdata.irqs[0]; 534 535 uart_add_one_port(&grlib_apbuart_driver, (struct uart_port *) port); 536 537 apbuart_flush_fifo((struct uart_port *) port); 538 539 printk(KERN_INFO "grlib-apbuart at 0x%llx, irq %d\n", 540 (unsigned long long) port->mapbase, port->irq); 541 return 0; 542 } 543 544 static const struct of_device_id apbuart_match[] = { 545 { 546 .name = "GAISLER_APBUART", 547 }, 548 { 549 .name = "01_00c", 550 }, 551 {}, 552 }; 553 MODULE_DEVICE_TABLE(of, apbuart_match); 554 555 static struct platform_driver grlib_apbuart_of_driver = { 556 .probe = apbuart_probe, 557 .driver = { 558 .name = "grlib-apbuart", 559 .of_match_table = apbuart_match, 560 }, 561 }; 562 563 564 static int __init grlib_apbuart_configure(void) 565 { 566 struct device_node *np; 567 int line = 0; 568 569 for_each_matching_node(np, apbuart_match) { 570 const int *ampopts; 571 const u32 *freq_hz; 572 const struct amba_prom_registers *regs; 573 struct uart_port *port; 574 unsigned long addr; 575 576 ampopts = of_get_property(np, "ampopts", NULL); 577 if (ampopts && (*ampopts == 0)) 578 continue; /* Ignore if used by another OS instance */ 579 regs = of_get_property(np, "reg", NULL); 580 /* Frequency of APB Bus is frequency of UART */ 581 freq_hz = of_get_property(np, "freq", NULL); 582 583 if (!regs || !freq_hz || (*freq_hz == 0)) 584 continue; 585 586 grlib_apbuart_nodes[line] = np; 587 588 addr = regs->phys_addr; 589 590 port = &grlib_apbuart_ports[line]; 591 592 port->mapbase = addr; 593 port->membase = ioremap(addr, sizeof(struct grlib_apbuart_regs_map)); 594 port->irq = 0; 595 port->iotype = UPIO_MEM; 596 port->ops = &grlib_apbuart_ops; 597 port->has_sysrq = IS_ENABLED(CONFIG_SERIAL_GRLIB_GAISLER_APBUART_CONSOLE); 598 port->flags = UPF_BOOT_AUTOCONF; 599 port->line = line; 600 port->uartclk = *freq_hz; 601 port->fifosize = apbuart_scan_fifo_size((struct uart_port *) port, line); 602 line++; 603 604 /* We support maximum UART_NR uarts ... */ 605 if (line == UART_NR) 606 break; 607 } 608 609 grlib_apbuart_driver.nr = grlib_apbuart_port_nr = line; 610 return line ? 0 : -ENODEV; 611 } 612 613 static int __init grlib_apbuart_init(void) 614 { 615 int ret; 616 617 /* Find all APBUARTS in device the tree and initialize their ports */ 618 ret = grlib_apbuart_configure(); 619 if (ret) 620 return ret; 621 622 printk(KERN_INFO "Serial: GRLIB APBUART driver\n"); 623 624 ret = uart_register_driver(&grlib_apbuart_driver); 625 626 if (ret) { 627 printk(KERN_ERR "%s: uart_register_driver failed (%i)\n", 628 __FILE__, ret); 629 return ret; 630 } 631 632 ret = platform_driver_register(&grlib_apbuart_of_driver); 633 if (ret) { 634 printk(KERN_ERR 635 "%s: platform_driver_register failed (%i)\n", 636 __FILE__, ret); 637 uart_unregister_driver(&grlib_apbuart_driver); 638 return ret; 639 } 640 641 return ret; 642 } 643 644 static void __exit grlib_apbuart_exit(void) 645 { 646 int i; 647 648 for (i = 0; i < grlib_apbuart_port_nr; i++) 649 uart_remove_one_port(&grlib_apbuart_driver, 650 &grlib_apbuart_ports[i]); 651 652 uart_unregister_driver(&grlib_apbuart_driver); 653 platform_driver_unregister(&grlib_apbuart_of_driver); 654 } 655 656 module_init(grlib_apbuart_init); 657 module_exit(grlib_apbuart_exit); 658 659 MODULE_AUTHOR("Aeroflex Gaisler AB"); 660 MODULE_DESCRIPTION("GRLIB APBUART serial driver"); 661 MODULE_VERSION("2.1"); 662 MODULE_LICENSE("GPL"); 663