imx_earlycon.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright 2020 NXP
  4. */
  5. #include <linux/module.h>
  6. #include <linux/ioport.h>
  7. #include <linux/init.h>
  8. #include <linux/serial_core.h>
  9. #include <linux/serial.h>
  10. #include <linux/delay.h>
  11. #include <linux/of.h>
  12. #include <linux/io.h>
  13. #define URTX0 0x40 /* Transmitter Register */
  14. #define UTS_TXFULL (1<<4) /* TxFIFO full */
  15. #define IMX21_UTS 0xb4 /* UART Test Register on all other i.mx*/
  16. static void imx_uart_console_early_putchar(struct uart_port *port, unsigned char ch)
  17. {
  18. while (readl_relaxed(port->membase + IMX21_UTS) & UTS_TXFULL)
  19. cpu_relax();
  20. writel_relaxed(ch, port->membase + URTX0);
  21. }
  22. static void imx_uart_console_early_write(struct console *con, const char *s,
  23. unsigned count)
  24. {
  25. struct earlycon_device *dev = con->data;
  26. uart_console_write(&dev->port, s, count, imx_uart_console_early_putchar);
  27. }
  28. static int __init
  29. imx_console_early_setup(struct earlycon_device *dev, const char *opt)
  30. {
  31. if (!dev->port.membase)
  32. return -ENODEV;
  33. dev->con->write = imx_uart_console_early_write;
  34. return 0;
  35. }
  36. OF_EARLYCON_DECLARE(ec_imx6q, "fsl,imx6q-uart", imx_console_early_setup);
  37. OF_EARLYCON_DECLARE(ec_imx21, "fsl,imx21-uart", imx_console_early_setup);
  38. MODULE_AUTHOR("NXP");
  39. MODULE_DESCRIPTION("IMX earlycon driver");
  40. MODULE_LICENSE("GPL");