.. | .. |
---|
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) |
---|