sirfsoc_uart.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. /*
  2. * Drivers for CSR SiRFprimaII onboard UARTs.
  3. *
  4. * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
  5. *
  6. * Licensed under GPLv2 or later.
  7. */
  8. #include <linux/bitops.h>
  9. /* UART Register Offset Define */
  10. #define SIRFUART_LINE_CTRL 0x0040
  11. #define SIRFUART_TX_RX_EN 0x004c
  12. #define SIRFUART_DIVISOR 0x0050
  13. #define SIRFUART_INT_EN 0x0054
  14. #define SIRFUART_INT_STATUS 0x0058
  15. #define SIRFUART_TX_DMA_IO_CTRL 0x0100
  16. #define SIRFUART_TX_DMA_IO_LEN 0x0104
  17. #define SIRFUART_TX_FIFO_CTRL 0x0108
  18. #define SIRFUART_TX_FIFO_LEVEL_CHK 0x010C
  19. #define SIRFUART_TX_FIFO_OP 0x0110
  20. #define SIRFUART_TX_FIFO_STATUS 0x0114
  21. #define SIRFUART_TX_FIFO_DATA 0x0118
  22. #define SIRFUART_RX_DMA_IO_CTRL 0x0120
  23. #define SIRFUART_RX_DMA_IO_LEN 0x0124
  24. #define SIRFUART_RX_FIFO_CTRL 0x0128
  25. #define SIRFUART_RX_FIFO_LEVEL_CHK 0x012C
  26. #define SIRFUART_RX_FIFO_OP 0x0130
  27. #define SIRFUART_RX_FIFO_STATUS 0x0134
  28. #define SIRFUART_RX_FIFO_DATA 0x0138
  29. #define SIRFUART_AFC_CTRL 0x0140
  30. #define SIRFUART_SWH_DMA_IO 0x0148
  31. /* UART Line Control Register */
  32. #define SIRFUART_DATA_BIT_LEN_MASK 0x3
  33. #define SIRFUART_DATA_BIT_LEN_5 BIT(0)
  34. #define SIRFUART_DATA_BIT_LEN_6 1
  35. #define SIRFUART_DATA_BIT_LEN_7 2
  36. #define SIRFUART_DATA_BIT_LEN_8 3
  37. #define SIRFUART_STOP_BIT_LEN_1 0
  38. #define SIRFUART_STOP_BIT_LEN_2 BIT(2)
  39. #define SIRFUART_PARITY_EN BIT(3)
  40. #define SIRFUART_EVEN_BIT BIT(4)
  41. #define SIRFUART_STICK_BIT_MASK (7 << 3)
  42. #define SIRFUART_STICK_BIT_NONE (0 << 3)
  43. #define SIRFUART_STICK_BIT_EVEN BIT(3)
  44. #define SIRFUART_STICK_BIT_ODD (3 << 3)
  45. #define SIRFUART_STICK_BIT_MARK (5 << 3)
  46. #define SIRFUART_STICK_BIT_SPACE (7 << 3)
  47. #define SIRFUART_SET_BREAK BIT(6)
  48. #define SIRFUART_LOOP_BACK BIT(7)
  49. #define SIRFUART_PARITY_MASK (7 << 3)
  50. #define SIRFUART_DUMMY_READ BIT(16)
  51. #define SIRFSOC_UART_RX_TIMEOUT(br, to) (((br) * (((to) + 999) / 1000)) / 1000)
  52. #define SIRFUART_RECV_TIMEOUT_MASK (0xFFFF << 16)
  53. #define SIRFUART_RECV_TIMEOUT(x) (((x) & 0xFFFF) << 16)
  54. /* UART Auto Flow Control */
  55. #define SIRFUART_AFC_RX_THD_MASK 0x000000FF
  56. #define SIRFUART_AFC_RX_EN BIT(8)
  57. #define SIRFUART_AFC_TX_EN BIT(9)
  58. #define SIRFUART_CTS_CTRL BIT(10)
  59. #define SIRFUART_RTS_CTRL BIT(11)
  60. #define SIRFUART_CTS_IN_STATUS BIT(12)
  61. #define SIRFUART_RTS_OUT_STATUS BIT(13)
  62. /* UART Interrupt Enable Register */
  63. #define SIRFUART_RX_DONE_INT BIT(0)
  64. #define SIRFUART_TX_DONE_INT BIT(1)
  65. #define SIRFUART_RX_OFLOW_INT BIT(2)
  66. #define SIRFUART_TX_ALLOUT_INT BIT(3)
  67. #define SIRFUART_RX_IO_DMA_INT BIT(4)
  68. #define SIRFUART_TX_IO_DMA_INT BIT(5)
  69. #define SIRFUART_RXFIFO_FULL_INT BIT(6)
  70. #define SIRFUART_TXFIFO_EMPTY_INT BIT(7)
  71. #define SIRFUART_RXFIFO_THD_INT BIT(8)
  72. #define SIRFUART_TXFIFO_THD_INT BIT(9)
  73. #define SIRFUART_FRM_ERR_INT BIT(10)
  74. #define SIRFUART_RXD_BREAK_INT BIT(11)
  75. #define SIRFUART_RX_TIMEOUT_INT BIT(12)
  76. #define SIRFUART_PARITY_ERR_INT BIT(13)
  77. #define SIRFUART_CTS_INT_EN BIT(14)
  78. #define SIRFUART_RTS_INT_EN BIT(15)
  79. /* UART Interrupt Status Register */
  80. #define SIRFUART_RX_DONE BIT(0)
  81. #define SIRFUART_TX_DONE BIT(1)
  82. #define SIRFUART_RX_OFLOW BIT(2)
  83. #define SIRFUART_TX_ALL_EMPTY BIT(3)
  84. #define SIRFUART_DMA_IO_RX_DONE BIT(4)
  85. #define SIRFUART_DMA_IO_TX_DONE BIT(5)
  86. #define SIRFUART_RXFIFO_FULL BIT(6)
  87. #define SIRFUART_TXFIFO_EMPTY BIT(7)
  88. #define SIRFUART_RXFIFO_THD_REACH BIT(8)
  89. #define SIRFUART_TXFIFO_THD_REACH BIT(9)
  90. #define SIRFUART_FRM_ERR BIT(10)
  91. #define SIRFUART_RXD_BREAK BIT(11)
  92. #define SIRFUART_RX_TIMEOUT BIT(12)
  93. #define SIRFUART_PARITY_ERR BIT(13)
  94. #define SIRFUART_CTS_CHANGE BIT(14)
  95. #define SIRFUART_RTS_CHANGE BIT(15)
  96. #define SIRFUART_PLUG_IN BIT(16)
  97. #define SIRFUART_ERR_INT_STAT \
  98. (SIRFUART_RX_OFLOW | \
  99. SIRFUART_FRM_ERR | \
  100. SIRFUART_RXD_BREAK | \
  101. SIRFUART_PARITY_ERR)
  102. #define SIRFUART_ERR_INT_EN \
  103. (SIRFUART_RX_OFLOW_INT | \
  104. SIRFUART_FRM_ERR_INT | \
  105. SIRFUART_RXD_BREAK_INT | \
  106. SIRFUART_PARITY_ERR_INT)
  107. #define SIRFUART_TX_INT_EN SIRFUART_TXFIFO_EMPTY_INT
  108. #define SIRFUART_RX_IO_INT_EN \
  109. (SIRFUART_RX_TIMEOUT_INT | \
  110. SIRFUART_RXFIFO_THD_INT | \
  111. SIRFUART_RXFIFO_FULL_INT | \
  112. SIRFUART_ERR_INT_EN)
  113. /* UART FIFO Register */
  114. #define SIRFUART_TX_FIFO_STOP 0x0
  115. #define SIRFUART_TX_FIFO_RESET 0x1
  116. #define SIRFUART_TX_FIFO_START 0x2
  117. #define SIRFUART_RX_FIFO_STOP 0x0
  118. #define SIRFUART_RX_FIFO_RESET 0x1
  119. #define SIRFUART_RX_FIFO_START 0x2
  120. #define SIRFUART_TX_MODE_DMA 0
  121. #define SIRFUART_TX_MODE_IO 1
  122. #define SIRFUART_RX_MODE_DMA 0
  123. #define SIRFUART_RX_MODE_IO 1
  124. #define SIRFUART_RX_EN 0x1
  125. #define SIRFUART_TX_EN 0x2
  126. /* Generic Definitions */
  127. #define SIRFSOC_UART_NAME "ttySiRF"
  128. #define SIRFSOC_UART_MAJOR 0
  129. #define SIRFSOC_UART_MINOR 0
  130. #define SIRFUART_PORT_NAME "sirfsoc-uart"
  131. #define SIRFUART_MAP_SIZE 0x200
  132. #define SIRFSOC_UART_NR 3
  133. #define SIRFSOC_PORT_TYPE 0xa5
  134. /* Baud Rate Calculation */
  135. #define SIRF_MIN_SAMPLE_DIV 0xf
  136. #define SIRF_MAX_SAMPLE_DIV 0x3f
  137. #define SIRF_IOCLK_DIV_MAX 0xffff
  138. #define SIRF_SAMPLE_DIV_SHIFT 16
  139. #define SIRF_IOCLK_DIV_MASK 0xffff
  140. #define SIRF_SAMPLE_DIV_MASK 0x3f0000
  141. #define SIRF_BAUD_RATE_SUPPORT_NR 18
  142. /* For Fast Baud Rate Calculation */
  143. struct sirfsoc_baudrate_to_regv {
  144. unsigned int baud_rate;
  145. unsigned int reg_val;
  146. };
  147. struct sirfsoc_uart_port {
  148. unsigned char hw_flow_ctrl;
  149. unsigned char ms_enabled;
  150. struct uart_port port;
  151. struct pinctrl *p;
  152. };
  153. /* Hardware Flow Control */
  154. #define SIRFUART_AFC_CTRL_RX_THD 0x70
  155. /* Register Access Control */
  156. #define portaddr(port, reg) ((port)->membase + (reg))
  157. #define rd_regb(port, reg) (__raw_readb(portaddr(port, reg)))
  158. #define rd_regl(port, reg) (__raw_readl(portaddr(port, reg)))
  159. #define wr_regb(port, reg, val) __raw_writeb(val, portaddr(port, reg))
  160. #define wr_regl(port, reg, val) __raw_writel(val, portaddr(port, reg))
  161. /* UART Port Mask */
  162. #define SIRFUART_FIFOLEVEL_MASK(port) ((port->line == 1) ? (0x1f) : (0x7f))
  163. #define SIRFUART_FIFOFULL_MASK(port) ((port->line == 1) ? (0x20) : (0x80))
  164. #define SIRFUART_FIFOEMPTY_MASK(port) ((port->line == 1) ? (0x40) : (0x100))
  165. /* I/O Mode */
  166. #define SIRFSOC_UART_IO_RX_MAX_CNT 256
  167. #define SIRFSOC_UART_IO_TX_REASONABLE_CNT 6