serial.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * TI DaVinci serial driver
  4. *
  5. * Copyright (C) 2006 Texas Instruments.
  6. */
  7. #include <linux/kernel.h>
  8. #include <linux/init.h>
  9. #include <linux/serial_8250.h>
  10. #include <linux/serial_reg.h>
  11. #include <linux/platform_device.h>
  12. #include <linux/delay.h>
  13. #include <linux/clk.h>
  14. #include <linux/io.h>
  15. #include "serial.h"
  16. #include "cputype.h"
  17. static inline void serial_write_reg(struct plat_serial8250_port *p, int offset,
  18. int value)
  19. {
  20. offset <<= p->regshift;
  21. WARN_ONCE(!p->membase, "unmapped write: uart[%d]\n", offset);
  22. __raw_writel(value, p->membase + offset);
  23. }
  24. static void __init davinci_serial_reset(struct plat_serial8250_port *p)
  25. {
  26. unsigned int pwremu = 0;
  27. serial_write_reg(p, UART_IER, 0); /* disable all interrupts */
  28. /* reset both transmitter and receiver: bits 14,13 = UTRST, URRST */
  29. serial_write_reg(p, UART_DAVINCI_PWREMU, pwremu);
  30. mdelay(10);
  31. pwremu |= (0x3 << 13);
  32. pwremu |= 0x1;
  33. serial_write_reg(p, UART_DAVINCI_PWREMU, pwremu);
  34. if (cpu_is_davinci_dm646x())
  35. serial_write_reg(p, UART_DM646X_SCR,
  36. UART_DM646X_SCR_TX_WATERMARK);
  37. }
  38. int __init davinci_serial_init(struct platform_device *serial_dev)
  39. {
  40. int i, ret = 0;
  41. struct device *dev;
  42. struct plat_serial8250_port *p;
  43. struct clk *clk;
  44. /*
  45. * Make sure the serial ports are muxed on at this point.
  46. * You have to mux them off in device drivers later on if not needed.
  47. */
  48. for (i = 0; serial_dev[i].dev.platform_data != NULL; i++) {
  49. dev = &serial_dev[i].dev;
  50. p = dev->platform_data;
  51. ret = platform_device_register(&serial_dev[i]);
  52. if (ret)
  53. continue;
  54. clk = clk_get(dev, NULL);
  55. if (IS_ERR(clk)) {
  56. pr_err("%s:%d: failed to get UART%d clock\n",
  57. __func__, __LINE__, i);
  58. continue;
  59. }
  60. clk_prepare_enable(clk);
  61. p->uartclk = clk_get_rate(clk);
  62. if (!p->membase && p->mapbase) {
  63. p->membase = ioremap(p->mapbase, SZ_4K);
  64. if (p->membase)
  65. p->flags &= ~UPF_IOREMAP;
  66. else
  67. pr_err("uart regs ioremap failed\n");
  68. }
  69. if (p->membase && p->type != PORT_AR7)
  70. davinci_serial_reset(p);
  71. }
  72. return ret;
  73. }