| .. | .. |
|---|
| 32 | 32 | * Register definitions |
|---|
| 33 | 33 | * |
|---|
| 34 | 34 | * For register details see datasheet: |
|---|
| 35 | | - * http://www.xilinx.com/support/documentation/ip_documentation/opb_uartlite.pdf |
|---|
| 35 | + * https://www.xilinx.com/support/documentation/ip_documentation/opb_uartlite.pdf |
|---|
| 36 | 36 | */ |
|---|
| 37 | 37 | |
|---|
| 38 | 38 | #define ULITE_RX 0x00 |
|---|
| .. | .. |
|---|
| 54 | 54 | #define ULITE_CONTROL_RST_TX 0x01 |
|---|
| 55 | 55 | #define ULITE_CONTROL_RST_RX 0x02 |
|---|
| 56 | 56 | #define ULITE_CONTROL_IE 0x10 |
|---|
| 57 | + |
|---|
| 58 | +/* Static pointer to console port */ |
|---|
| 59 | +#ifdef CONFIG_SERIAL_UARTLITE_CONSOLE |
|---|
| 60 | +static struct uart_port *console_port; |
|---|
| 61 | +#endif |
|---|
| 57 | 62 | |
|---|
| 58 | 63 | struct uartlite_data { |
|---|
| 59 | 64 | const struct uartlite_reg_ops *reg_ops; |
|---|
| .. | .. |
|---|
| 472 | 477 | static void ulite_console_write(struct console *co, const char *s, |
|---|
| 473 | 478 | unsigned int count) |
|---|
| 474 | 479 | { |
|---|
| 475 | | - struct uart_port *port = &ulite_ports[co->index]; |
|---|
| 480 | + struct uart_port *port = console_port; |
|---|
| 476 | 481 | unsigned long flags; |
|---|
| 477 | 482 | unsigned int ier; |
|---|
| 478 | 483 | int locked = 1; |
|---|
| .. | .. |
|---|
| 500 | 505 | |
|---|
| 501 | 506 | static int ulite_console_setup(struct console *co, char *options) |
|---|
| 502 | 507 | { |
|---|
| 503 | | - struct uart_port *port; |
|---|
| 508 | + struct uart_port *port = NULL; |
|---|
| 504 | 509 | int baud = 9600; |
|---|
| 505 | 510 | int bits = 8; |
|---|
| 506 | 511 | int parity = 'n'; |
|---|
| 507 | 512 | int flow = 'n'; |
|---|
| 508 | 513 | |
|---|
| 509 | | - if (co->index < 0 || co->index >= ULITE_NR_UARTS) |
|---|
| 510 | | - return -EINVAL; |
|---|
| 511 | | - |
|---|
| 512 | | - port = &ulite_ports[co->index]; |
|---|
| 514 | + if (co->index >= 0 && co->index < ULITE_NR_UARTS) |
|---|
| 515 | + port = ulite_ports + co->index; |
|---|
| 513 | 516 | |
|---|
| 514 | 517 | /* Has the device been initialized yet? */ |
|---|
| 515 | | - if (!port->mapbase) { |
|---|
| 518 | + if (!port || !port->mapbase) { |
|---|
| 516 | 519 | pr_debug("console on ttyUL%i not present\n", co->index); |
|---|
| 517 | 520 | return -ENODEV; |
|---|
| 518 | 521 | } |
|---|
| 522 | + |
|---|
| 523 | + console_port = port; |
|---|
| 519 | 524 | |
|---|
| 520 | 525 | /* not initialized yet? */ |
|---|
| 521 | 526 | if (!port->membase) { |
|---|
| .. | .. |
|---|
| 540 | 545 | .index = -1, /* Specified on the cmdline (e.g. console=ttyUL0 ) */ |
|---|
| 541 | 546 | .data = &ulite_uart_driver, |
|---|
| 542 | 547 | }; |
|---|
| 543 | | - |
|---|
| 544 | | -static int __init ulite_console_init(void) |
|---|
| 545 | | -{ |
|---|
| 546 | | - register_console(&ulite_console); |
|---|
| 547 | | - return 0; |
|---|
| 548 | | -} |
|---|
| 549 | | - |
|---|
| 550 | | -console_initcall(ulite_console_init); |
|---|
| 551 | 548 | |
|---|
| 552 | 549 | static void early_uartlite_putc(struct uart_port *port, int c) |
|---|
| 553 | 550 | { |
|---|
| .. | .. |
|---|
| 776 | 773 | pdata->clk = NULL; |
|---|
| 777 | 774 | } |
|---|
| 778 | 775 | |
|---|
| 779 | | - ret = clk_prepare(pdata->clk); |
|---|
| 776 | + ret = clk_prepare_enable(pdata->clk); |
|---|
| 780 | 777 | if (ret) { |
|---|
| 781 | 778 | dev_err(&pdev->dev, "Failed to prepare clock\n"); |
|---|
| 782 | 779 | return ret; |
|---|
| 783 | 780 | } |
|---|
| 784 | 781 | |
|---|
| 785 | | - return ulite_assign(&pdev->dev, id, res->start, irq, pdata); |
|---|
| 782 | + if (!ulite_uart_driver.state) { |
|---|
| 783 | + dev_dbg(&pdev->dev, "uartlite: calling uart_register_driver()\n"); |
|---|
| 784 | + ret = uart_register_driver(&ulite_uart_driver); |
|---|
| 785 | + if (ret < 0) { |
|---|
| 786 | + dev_err(&pdev->dev, "Failed to register driver\n"); |
|---|
| 787 | + return ret; |
|---|
| 788 | + } |
|---|
| 789 | + } |
|---|
| 790 | + |
|---|
| 791 | + ret = ulite_assign(&pdev->dev, id, res->start, irq, pdata); |
|---|
| 792 | + |
|---|
| 793 | + clk_disable(pdata->clk); |
|---|
| 794 | + |
|---|
| 795 | + return ret; |
|---|
| 786 | 796 | } |
|---|
| 787 | 797 | |
|---|
| 788 | 798 | static int ulite_remove(struct platform_device *pdev) |
|---|
| .. | .. |
|---|
| 813 | 823 | |
|---|
| 814 | 824 | static int __init ulite_init(void) |
|---|
| 815 | 825 | { |
|---|
| 816 | | - int ret; |
|---|
| 817 | | - |
|---|
| 818 | | - pr_debug("uartlite: calling uart_register_driver()\n"); |
|---|
| 819 | | - ret = uart_register_driver(&ulite_uart_driver); |
|---|
| 820 | | - if (ret) |
|---|
| 821 | | - goto err_uart; |
|---|
| 822 | 826 | |
|---|
| 823 | 827 | pr_debug("uartlite: calling platform_driver_register()\n"); |
|---|
| 824 | | - ret = platform_driver_register(&ulite_platform_driver); |
|---|
| 825 | | - if (ret) |
|---|
| 826 | | - goto err_plat; |
|---|
| 827 | | - |
|---|
| 828 | | - return 0; |
|---|
| 829 | | - |
|---|
| 830 | | -err_plat: |
|---|
| 831 | | - uart_unregister_driver(&ulite_uart_driver); |
|---|
| 832 | | -err_uart: |
|---|
| 833 | | - pr_err("registering uartlite driver failed: err=%i\n", ret); |
|---|
| 834 | | - return ret; |
|---|
| 828 | + return platform_driver_register(&ulite_platform_driver); |
|---|
| 835 | 829 | } |
|---|
| 836 | 830 | |
|---|
| 837 | 831 | static void __exit ulite_exit(void) |
|---|