sirfsoc_uart.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  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. struct sirfsoc_uart_param {
  10. const char *uart_name;
  11. const char *port_name;
  12. u32 uart_nr;
  13. u32 register_uart_nr;
  14. };
  15. struct sirfsoc_register {
  16. /* hardware uart specific */
  17. u32 sirfsoc_line_ctrl;
  18. u32 sirfsoc_divisor;
  19. /* uart - usp common */
  20. u32 sirfsoc_tx_rx_en;
  21. u32 sirfsoc_int_en_reg;
  22. u32 sirfsoc_int_st_reg;
  23. u32 sirfsoc_tx_dma_io_ctrl;
  24. u32 sirfsoc_tx_dma_io_len;
  25. u32 sirfsoc_tx_fifo_ctrl;
  26. u32 sirfsoc_tx_fifo_level_chk;
  27. u32 sirfsoc_tx_fifo_op;
  28. u32 sirfsoc_tx_fifo_status;
  29. u32 sirfsoc_tx_fifo_data;
  30. u32 sirfsoc_rx_dma_io_ctrl;
  31. u32 sirfsoc_rx_dma_io_len;
  32. u32 sirfsoc_rx_fifo_ctrl;
  33. u32 sirfsoc_rx_fifo_level_chk;
  34. u32 sirfsoc_rx_fifo_op;
  35. u32 sirfsoc_rx_fifo_status;
  36. u32 sirfsoc_rx_fifo_data;
  37. u32 sirfsoc_afc_ctrl;
  38. u32 sirfsoc_swh_dma_io;
  39. /* hardware usp specific */
  40. u32 sirfsoc_mode1;
  41. u32 sirfsoc_mode2;
  42. u32 sirfsoc_tx_frame_ctrl;
  43. u32 sirfsoc_rx_frame_ctrl;
  44. u32 sirfsoc_async_param_reg;
  45. };
  46. typedef u32 (*fifo_full_mask)(int line);
  47. typedef u32 (*fifo_empty_mask)(int line);
  48. struct sirfsoc_fifo_status {
  49. fifo_full_mask ff_full;
  50. fifo_empty_mask ff_empty;
  51. };
  52. struct sirfsoc_int_en {
  53. u32 sirfsoc_rx_done_en;
  54. u32 sirfsoc_tx_done_en;
  55. u32 sirfsoc_rx_oflow_en;
  56. u32 sirfsoc_tx_allout_en;
  57. u32 sirfsoc_rx_io_dma_en;
  58. u32 sirfsoc_tx_io_dma_en;
  59. u32 sirfsoc_rxfifo_full_en;
  60. u32 sirfsoc_txfifo_empty_en;
  61. u32 sirfsoc_rxfifo_thd_en;
  62. u32 sirfsoc_txfifo_thd_en;
  63. u32 sirfsoc_frm_err_en;
  64. u32 sirfsoc_rxd_brk_en;
  65. u32 sirfsoc_rx_timeout_en;
  66. u32 sirfsoc_parity_err_en;
  67. u32 sirfsoc_cts_en;
  68. u32 sirfsoc_rts_en;
  69. };
  70. struct sirfsoc_int_status {
  71. u32 sirfsoc_rx_done;
  72. u32 sirfsoc_tx_done;
  73. u32 sirfsoc_rx_oflow;
  74. u32 sirfsoc_tx_allout;
  75. u32 sirfsoc_rx_io_dma;
  76. u32 sirfsoc_tx_io_dma;
  77. u32 sirfsoc_rxfifo_full;
  78. u32 sirfsoc_txfifo_empty;
  79. u32 sirfsoc_rxfifo_thd;
  80. u32 sirfsoc_txfifo_thd;
  81. u32 sirfsoc_frm_err;
  82. u32 sirfsoc_rxd_brk;
  83. u32 sirfsoc_rx_timeout;
  84. u32 sirfsoc_parity_err;
  85. u32 sirfsoc_cts;
  86. u32 sirfsoc_rts;
  87. };
  88. enum sirfsoc_uart_type {
  89. SIRF_REAL_UART,
  90. SIRF_USP_UART,
  91. };
  92. struct sirfsoc_uart_register {
  93. struct sirfsoc_register uart_reg;
  94. struct sirfsoc_int_en uart_int_en;
  95. struct sirfsoc_int_status uart_int_st;
  96. struct sirfsoc_fifo_status fifo_status;
  97. struct sirfsoc_uart_param uart_param;
  98. enum sirfsoc_uart_type uart_type;
  99. };
  100. u32 usp_ff_full(int line)
  101. {
  102. return 0x80;
  103. }
  104. u32 usp_ff_empty(int line)
  105. {
  106. return 0x100;
  107. }
  108. u32 uart_ff_full(int line)
  109. {
  110. return (line == 1) ? (0x20) : (0x80);
  111. }
  112. u32 uart_ff_empty(int line)
  113. {
  114. return (line == 1) ? (0x40) : (0x100);
  115. }
  116. struct sirfsoc_uart_register sirfsoc_usp = {
  117. .uart_reg = {
  118. .sirfsoc_mode1 = 0x0000,
  119. .sirfsoc_mode2 = 0x0004,
  120. .sirfsoc_tx_frame_ctrl = 0x0008,
  121. .sirfsoc_rx_frame_ctrl = 0x000c,
  122. .sirfsoc_tx_rx_en = 0x0010,
  123. .sirfsoc_int_en_reg = 0x0014,
  124. .sirfsoc_int_st_reg = 0x0018,
  125. .sirfsoc_async_param_reg = 0x0024,
  126. .sirfsoc_tx_dma_io_ctrl = 0x0100,
  127. .sirfsoc_tx_dma_io_len = 0x0104,
  128. .sirfsoc_tx_fifo_ctrl = 0x0108,
  129. .sirfsoc_tx_fifo_level_chk = 0x010c,
  130. .sirfsoc_tx_fifo_op = 0x0110,
  131. .sirfsoc_tx_fifo_status = 0x0114,
  132. .sirfsoc_tx_fifo_data = 0x0118,
  133. .sirfsoc_rx_dma_io_ctrl = 0x0120,
  134. .sirfsoc_rx_dma_io_len = 0x0124,
  135. .sirfsoc_rx_fifo_ctrl = 0x0128,
  136. .sirfsoc_rx_fifo_level_chk = 0x012c,
  137. .sirfsoc_rx_fifo_op = 0x0130,
  138. .sirfsoc_rx_fifo_status = 0x0134,
  139. .sirfsoc_rx_fifo_data = 0x0138,
  140. },
  141. .uart_int_en = {
  142. .sirfsoc_rx_done_en = BIT(0),
  143. .sirfsoc_tx_done_en = BIT(1),
  144. .sirfsoc_rx_oflow_en = BIT(2),
  145. .sirfsoc_tx_allout_en = BIT(3),
  146. .sirfsoc_rx_io_dma_en = BIT(4),
  147. .sirfsoc_tx_io_dma_en = BIT(5),
  148. .sirfsoc_rxfifo_full_en = BIT(6),
  149. .sirfsoc_txfifo_empty_en = BIT(7),
  150. .sirfsoc_rxfifo_thd_en = BIT(8),
  151. .sirfsoc_txfifo_thd_en = BIT(9),
  152. .sirfsoc_frm_err_en = BIT(10),
  153. .sirfsoc_rx_timeout_en = BIT(11),
  154. .sirfsoc_rxd_brk_en = BIT(15),
  155. },
  156. .uart_int_st = {
  157. .sirfsoc_rx_done = BIT(0),
  158. .sirfsoc_tx_done = BIT(1),
  159. .sirfsoc_rx_oflow = BIT(2),
  160. .sirfsoc_tx_allout = BIT(3),
  161. .sirfsoc_rx_io_dma = BIT(4),
  162. .sirfsoc_tx_io_dma = BIT(5),
  163. .sirfsoc_rxfifo_full = BIT(6),
  164. .sirfsoc_txfifo_empty = BIT(7),
  165. .sirfsoc_rxfifo_thd = BIT(8),
  166. .sirfsoc_txfifo_thd = BIT(9),
  167. .sirfsoc_frm_err = BIT(10),
  168. .sirfsoc_rx_timeout = BIT(11),
  169. .sirfsoc_rxd_brk = BIT(15),
  170. },
  171. .fifo_status = {
  172. .ff_full = usp_ff_full,
  173. .ff_empty = usp_ff_empty,
  174. },
  175. .uart_param = {
  176. .uart_name = "ttySiRF",
  177. .port_name = "sirfsoc-uart",
  178. .uart_nr = 2,
  179. .register_uart_nr = 3,
  180. },
  181. };
  182. struct sirfsoc_uart_register sirfsoc_uart = {
  183. .uart_reg = {
  184. .sirfsoc_line_ctrl = 0x0040,
  185. .sirfsoc_tx_rx_en = 0x004c,
  186. .sirfsoc_divisor = 0x0050,
  187. .sirfsoc_int_en_reg = 0x0054,
  188. .sirfsoc_int_st_reg = 0x0058,
  189. .sirfsoc_tx_dma_io_ctrl = 0x0100,
  190. .sirfsoc_tx_dma_io_len = 0x0104,
  191. .sirfsoc_tx_fifo_ctrl = 0x0108,
  192. .sirfsoc_tx_fifo_level_chk = 0x010c,
  193. .sirfsoc_tx_fifo_op = 0x0110,
  194. .sirfsoc_tx_fifo_status = 0x0114,
  195. .sirfsoc_tx_fifo_data = 0x0118,
  196. .sirfsoc_rx_dma_io_ctrl = 0x0120,
  197. .sirfsoc_rx_dma_io_len = 0x0124,
  198. .sirfsoc_rx_fifo_ctrl = 0x0128,
  199. .sirfsoc_rx_fifo_level_chk = 0x012c,
  200. .sirfsoc_rx_fifo_op = 0x0130,
  201. .sirfsoc_rx_fifo_status = 0x0134,
  202. .sirfsoc_rx_fifo_data = 0x0138,
  203. .sirfsoc_afc_ctrl = 0x0140,
  204. .sirfsoc_swh_dma_io = 0x0148,
  205. },
  206. .uart_int_en = {
  207. .sirfsoc_rx_done_en = BIT(0),
  208. .sirfsoc_tx_done_en = BIT(1),
  209. .sirfsoc_rx_oflow_en = BIT(2),
  210. .sirfsoc_tx_allout_en = BIT(3),
  211. .sirfsoc_rx_io_dma_en = BIT(4),
  212. .sirfsoc_tx_io_dma_en = BIT(5),
  213. .sirfsoc_rxfifo_full_en = BIT(6),
  214. .sirfsoc_txfifo_empty_en = BIT(7),
  215. .sirfsoc_rxfifo_thd_en = BIT(8),
  216. .sirfsoc_txfifo_thd_en = BIT(9),
  217. .sirfsoc_frm_err_en = BIT(10),
  218. .sirfsoc_rxd_brk_en = BIT(11),
  219. .sirfsoc_rx_timeout_en = BIT(12),
  220. .sirfsoc_parity_err_en = BIT(13),
  221. .sirfsoc_cts_en = BIT(14),
  222. .sirfsoc_rts_en = BIT(15),
  223. },
  224. .uart_int_st = {
  225. .sirfsoc_rx_done = BIT(0),
  226. .sirfsoc_tx_done = BIT(1),
  227. .sirfsoc_rx_oflow = BIT(2),
  228. .sirfsoc_tx_allout = BIT(3),
  229. .sirfsoc_rx_io_dma = BIT(4),
  230. .sirfsoc_tx_io_dma = BIT(5),
  231. .sirfsoc_rxfifo_full = BIT(6),
  232. .sirfsoc_txfifo_empty = BIT(7),
  233. .sirfsoc_rxfifo_thd = BIT(8),
  234. .sirfsoc_txfifo_thd = BIT(9),
  235. .sirfsoc_frm_err = BIT(10),
  236. .sirfsoc_rxd_brk = BIT(11),
  237. .sirfsoc_rx_timeout = BIT(12),
  238. .sirfsoc_parity_err = BIT(13),
  239. .sirfsoc_cts = BIT(14),
  240. .sirfsoc_rts = BIT(15),
  241. },
  242. .fifo_status = {
  243. .ff_full = uart_ff_full,
  244. .ff_empty = uart_ff_empty,
  245. },
  246. .uart_param = {
  247. .uart_name = "ttySiRF",
  248. .port_name = "sirfsoc_uart",
  249. .uart_nr = 3,
  250. .register_uart_nr = 0,
  251. },
  252. };
  253. /* uart io ctrl */
  254. #define SIRFUART_DATA_BIT_LEN_MASK 0x3
  255. #define SIRFUART_DATA_BIT_LEN_5 BIT(0)
  256. #define SIRFUART_DATA_BIT_LEN_6 1
  257. #define SIRFUART_DATA_BIT_LEN_7 2
  258. #define SIRFUART_DATA_BIT_LEN_8 3
  259. #define SIRFUART_STOP_BIT_LEN_1 0
  260. #define SIRFUART_STOP_BIT_LEN_2 BIT(2)
  261. #define SIRFUART_PARITY_EN BIT(3)
  262. #define SIRFUART_EVEN_BIT BIT(4)
  263. #define SIRFUART_STICK_BIT_MASK (7 << 3)
  264. #define SIRFUART_STICK_BIT_NONE (0 << 3)
  265. #define SIRFUART_STICK_BIT_EVEN BIT(3)
  266. #define SIRFUART_STICK_BIT_ODD (3 << 3)
  267. #define SIRFUART_STICK_BIT_MARK (5 << 3)
  268. #define SIRFUART_STICK_BIT_SPACE (7 << 3)
  269. #define SIRFUART_SET_BREAK BIT(6)
  270. #define SIRFUART_LOOP_BACK BIT(7)
  271. #define SIRFUART_PARITY_MASK (7 << 3)
  272. #define SIRFUART_DUMMY_READ BIT(16)
  273. #define SIRFUART_AFC_CTRL_RX_THD 0x70
  274. #define SIRFUART_AFC_RX_EN BIT(8)
  275. #define SIRFUART_AFC_TX_EN BIT(9)
  276. #define SIRFUART_AFC_CTS_CTRL BIT(10)
  277. #define SIRFUART_AFC_RTS_CTRL BIT(11)
  278. #define SIRFUART_AFC_CTS_STATUS BIT(12)
  279. #define SIRFUART_AFC_RTS_STATUS BIT(13)
  280. /* UART FIFO Register */
  281. #define SIRFUART_FIFO_STOP 0x0
  282. #define SIRFUART_FIFO_RESET BIT(0)
  283. #define SIRFUART_FIFO_START BIT(1)
  284. #define SIRFUART_RX_EN BIT(0)
  285. #define SIRFUART_TX_EN BIT(1)
  286. #define SIRFUART_IO_MODE BIT(0)
  287. #define SIRFUART_DMA_MODE 0x0
  288. /* Macro Specific*/
  289. #define SIRFUART_INT_EN_CLR 0x0060
  290. /* Baud Rate Calculation */
  291. #define SIRF_MIN_SAMPLE_DIV 0xf
  292. #define SIRF_MAX_SAMPLE_DIV 0x3f
  293. #define SIRF_IOCLK_DIV_MAX 0xffff
  294. #define SIRF_SAMPLE_DIV_SHIFT 16
  295. #define SIRF_IOCLK_DIV_MASK 0xffff
  296. #define SIRF_SAMPLE_DIV_MASK 0x3f0000
  297. #define SIRF_BAUD_RATE_SUPPORT_NR 18
  298. /* USP SPEC */
  299. #define SIRFSOC_USP_ENDIAN_CTRL_LSBF BIT(4)
  300. #define SIRFSOC_USP_EN BIT(5)
  301. /* USP-UART Common */
  302. #define SIRFSOC_UART_RX_TIMEOUT(br, to) (((br) * (((to) + 999) / 1000)) / 1000)
  303. #define SIRFUART_RECV_TIMEOUT_VALUE(x) \
  304. (((x) > 0xFFFF) ? 0xFFFF : ((x) & 0xFFFF))
  305. #define SIRFUART_RECV_TIMEOUT(port, x) \
  306. (((port)->line > 2) ? (x & 0xFFFF) : ((x) & 0xFFFF) << 16)
  307. #define SIRFUART_FIFO_THD(port) ((port->line) == 1 ? 16 : 64)
  308. #define SIRFUART_ERR_INT_STAT(port, unit_st) \
  309. (uint_st->sirfsoc_rx_oflow | \
  310. uint_st->sirfsoc_frm_err | \
  311. uint_st->sirfsoc_rxd_brk | \
  312. ((port->line > 2) ? 0 : uint_st->sirfsoc_parity_err))
  313. #define SIRFUART_RX_IO_INT_EN(port, uint_en) \
  314. (uint_en->sirfsoc_rx_timeout_en |\
  315. uint_en->sirfsoc_rxfifo_thd_en |\
  316. uint_en->sirfsoc_rxfifo_full_en |\
  317. uint_en->sirfsoc_frm_err_en |\
  318. uint_en->sirfsoc_rx_oflow_en |\
  319. uint_en->sirfsoc_rxd_brk_en |\
  320. ((port->line > 2) ? 0 : uint_en->sirfsoc_parity_err_en))
  321. #define SIRFUART_RX_IO_INT_ST(uint_st) \
  322. (uint_st->sirfsoc_rx_timeout |\
  323. uint_st->sirfsoc_rxfifo_thd |\
  324. uint_st->sirfsoc_rxfifo_full)
  325. #define SIRFUART_CTS_INT_ST(uint_st) (uint_st->sirfsoc_cts)
  326. /* Generic Definitions */
  327. #define SIRFSOC_UART_NAME "ttySiRF"
  328. #define SIRFSOC_UART_MAJOR 0
  329. #define SIRFSOC_UART_MINOR 0
  330. #define SIRFUART_PORT_NAME "sirfsoc-uart"
  331. #define SIRFUART_MAP_SIZE 0x200
  332. #define SIRFSOC_UART_NR 5
  333. #define SIRFSOC_PORT_TYPE 0xa5
  334. /* Baud Rate Calculation */
  335. #define SIRF_MIN_SAMPLE_DIV 0xf
  336. #define SIRF_MAX_SAMPLE_DIV 0x3f
  337. #define SIRF_IOCLK_DIV_MAX 0xffff
  338. #define SIRF_SAMPLE_DIV_SHIFT 16
  339. #define SIRF_IOCLK_DIV_MASK 0xffff
  340. #define SIRF_SAMPLE_DIV_MASK 0x3f0000
  341. #define SIRF_BAUD_RATE_SUPPORT_NR 18
  342. /* For Fast Baud Rate Calculation */
  343. struct sirfsoc_baudrate_to_regv {
  344. unsigned int baud_rate;
  345. unsigned int reg_val;
  346. };
  347. struct sirfsoc_uart_port {
  348. unsigned char hw_flow_ctrl;
  349. unsigned char ms_enabled;
  350. struct uart_port port;
  351. struct clk *clk;
  352. /* for SiRFmarco, there are SET/CLR for UART_INT_EN */
  353. bool is_marco;
  354. struct sirfsoc_uart_register *uart_reg;
  355. };
  356. /* Hardware Flow Control */
  357. #define SIRFUART_AFC_CTRL_RX_THD 0x70
  358. /* Register Access Control */
  359. #define portaddr(port, reg) ((port)->membase + (reg))
  360. #define rd_regb(port, reg) (__raw_readb(portaddr(port, reg)))
  361. #define rd_regl(port, reg) (__raw_readl(portaddr(port, reg)))
  362. #define wr_regb(port, reg, val) __raw_writeb(val, portaddr(port, reg))
  363. #define wr_regl(port, reg, val) __raw_writel(val, portaddr(port, reg))
  364. /* UART Port Mask */
  365. #define SIRFUART_FIFOLEVEL_MASK(port) ((port->line == 1) ? (0x1f) : (0x7f))
  366. #define SIRFUART_FIFOFULL_MASK(port) ((port->line == 1) ? (0x20) : (0x80))
  367. #define SIRFUART_FIFOEMPTY_MASK(port) ((port->line == 1) ? (0x40) : (0x100))
  368. /* I/O Mode */
  369. #define SIRFSOC_UART_IO_RX_MAX_CNT 256
  370. #define SIRFSOC_UART_IO_TX_REASONABLE_CNT 6