sirfsoc_uart.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473
  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. #define SIRFSOC_USP_MODE2_RXD_DELAY_OFFSET 0
  302. #define SIRFSOC_USP_MODE2_TXD_DELAY_OFFSET 8
  303. #define SIRFSOC_USP_MODE2_CLK_DIVISOR_MASK 0x3ff
  304. #define SIRFSOC_USP_MODE2_CLK_DIVISOR_OFFSET 21
  305. #define SIRFSOC_USP_TX_DATA_LEN_OFFSET 0
  306. #define SIRFSOC_USP_TX_SYNC_LEN_OFFSET 8
  307. #define SIRFSOC_USP_TX_FRAME_LEN_OFFSET 16
  308. #define SIRFSOC_USP_TX_SHIFTER_LEN_OFFSET 24
  309. #define SIRFSOC_USP_TX_CLK_DIVISOR_OFFSET 30
  310. #define SIRFSOC_USP_RX_DATA_LEN_OFFSET 0
  311. #define SIRFSOC_USP_RX_FRAME_LEN_OFFSET 8
  312. #define SIRFSOC_USP_RX_SHIFTER_LEN_OFFSET 16
  313. #define SIRFSOC_USP_RX_CLK_DIVISOR_OFFSET 24
  314. #define SIRFSOC_USP_ASYNC_DIV2_MASK 0x3f
  315. #define SIRFSOC_USP_ASYNC_DIV2_OFFSET 16
  316. /* USP-UART Common */
  317. #define SIRFSOC_UART_RX_TIMEOUT(br, to) (((br) * (((to) + 999) / 1000)) / 1000)
  318. #define SIRFUART_RECV_TIMEOUT_VALUE(x) \
  319. (((x) > 0xFFFF) ? 0xFFFF : ((x) & 0xFFFF))
  320. #define SIRFUART_RECV_TIMEOUT(port, x) \
  321. (((port)->line > 2) ? (x & 0xFFFF) : ((x) & 0xFFFF) << 16)
  322. #define SIRFUART_FIFO_THD(port) ((port->line) == 1 ? 16 : 64)
  323. #define SIRFUART_ERR_INT_STAT(port, unit_st) \
  324. (uint_st->sirfsoc_rx_oflow | \
  325. uint_st->sirfsoc_frm_err | \
  326. uint_st->sirfsoc_rxd_brk | \
  327. ((port->line > 2) ? 0 : uint_st->sirfsoc_parity_err))
  328. #define SIRFUART_RX_IO_INT_EN(port, uint_en) \
  329. (uint_en->sirfsoc_rx_timeout_en |\
  330. uint_en->sirfsoc_rxfifo_thd_en |\
  331. uint_en->sirfsoc_rxfifo_full_en |\
  332. uint_en->sirfsoc_frm_err_en |\
  333. uint_en->sirfsoc_rx_oflow_en |\
  334. uint_en->sirfsoc_rxd_brk_en |\
  335. ((port->line > 2) ? 0 : uint_en->sirfsoc_parity_err_en))
  336. #define SIRFUART_RX_IO_INT_ST(uint_st) \
  337. (uint_st->sirfsoc_rx_timeout |\
  338. uint_st->sirfsoc_rxfifo_thd |\
  339. uint_st->sirfsoc_rxfifo_full)
  340. #define SIRFUART_CTS_INT_ST(uint_st) (uint_st->sirfsoc_cts)
  341. #define SIRFUART_RX_DMA_INT_EN(port, uint_en) \
  342. (uint_en->sirfsoc_rx_timeout_en |\
  343. uint_en->sirfsoc_frm_err_en |\
  344. uint_en->sirfsoc_rx_oflow_en |\
  345. uint_en->sirfsoc_rxd_brk_en |\
  346. ((port->line > 2) ? 0 : uint_en->sirfsoc_parity_err_en))
  347. /* Generic Definitions */
  348. #define SIRFSOC_UART_NAME "ttySiRF"
  349. #define SIRFSOC_UART_MAJOR 0
  350. #define SIRFSOC_UART_MINOR 0
  351. #define SIRFUART_PORT_NAME "sirfsoc-uart"
  352. #define SIRFUART_MAP_SIZE 0x200
  353. #define SIRFSOC_UART_NR 6
  354. #define SIRFSOC_PORT_TYPE 0xa5
  355. /* Baud Rate Calculation */
  356. #define SIRF_MIN_SAMPLE_DIV 0xf
  357. #define SIRF_MAX_SAMPLE_DIV 0x3f
  358. #define SIRF_IOCLK_DIV_MAX 0xffff
  359. #define SIRF_SAMPLE_DIV_SHIFT 16
  360. #define SIRF_IOCLK_DIV_MASK 0xffff
  361. #define SIRF_SAMPLE_DIV_MASK 0x3f0000
  362. #define SIRF_BAUD_RATE_SUPPORT_NR 18
  363. /* Uart Common Use Macro*/
  364. #define SIRFSOC_RX_DMA_BUF_SIZE 256
  365. #define BYTES_TO_ALIGN(dma_addr) ((unsigned long)(dma_addr) & 0x3)
  366. #define LOOP_DMA_BUFA_FILL 1
  367. #define LOOP_DMA_BUFB_FILL 2
  368. #define TX_TRAN_PIO 1
  369. #define TX_TRAN_DMA 2
  370. /* Uart Fifo Level Chk */
  371. #define SIRFUART_TX_FIFO_SC_OFFSET 0
  372. #define SIRFUART_TX_FIFO_LC_OFFSET 10
  373. #define SIRFUART_TX_FIFO_HC_OFFSET 20
  374. #define SIRFUART_TX_FIFO_CHK_SC(line, value) ((((line) == 1) ? (value & 0x3) :\
  375. (value & 0x1f)) << SIRFUART_TX_FIFO_SC_OFFSET)
  376. #define SIRFUART_TX_FIFO_CHK_LC(line, value) ((((line) == 1) ? (value & 0x3) :\
  377. (value & 0x1f)) << SIRFUART_TX_FIFO_LC_OFFSET)
  378. #define SIRFUART_TX_FIFO_CHK_HC(line, value) ((((line) == 1) ? (value & 0x3) :\
  379. (value & 0x1f)) << SIRFUART_TX_FIFO_HC_OFFSET)
  380. #define SIRFUART_RX_FIFO_CHK_SC SIRFUART_TX_FIFO_CHK_SC
  381. #define SIRFUART_RX_FIFO_CHK_LC SIRFUART_TX_FIFO_CHK_LC
  382. #define SIRFUART_RX_FIFO_CHK_HC SIRFUART_TX_FIFO_CHK_HC
  383. /* Indicate how many buffers used */
  384. #define SIRFSOC_RX_LOOP_BUF_CNT 2
  385. /* Indicate if DMA channel valid */
  386. #define IS_DMA_CHAN_VALID(x) ((x) != -1)
  387. #define UNVALID_DMA_CHAN -1
  388. /* For Fast Baud Rate Calculation */
  389. struct sirfsoc_baudrate_to_regv {
  390. unsigned int baud_rate;
  391. unsigned int reg_val;
  392. };
  393. enum sirfsoc_tx_state {
  394. TX_DMA_IDLE,
  395. TX_DMA_RUNNING,
  396. TX_DMA_PAUSE,
  397. };
  398. struct sirfsoc_loop_buffer {
  399. struct circ_buf xmit;
  400. dma_cookie_t cookie;
  401. struct dma_async_tx_descriptor *desc;
  402. dma_addr_t dma_addr;
  403. };
  404. struct sirfsoc_uart_port {
  405. bool hw_flow_ctrl;
  406. bool ms_enabled;
  407. struct uart_port port;
  408. struct clk *clk;
  409. /* for SiRFmarco, there are SET/CLR for UART_INT_EN */
  410. bool is_marco;
  411. struct sirfsoc_uart_register *uart_reg;
  412. int rx_dma_no;
  413. int tx_dma_no;
  414. struct dma_chan *rx_dma_chan;
  415. struct dma_chan *tx_dma_chan;
  416. dma_addr_t tx_dma_addr;
  417. struct dma_async_tx_descriptor *tx_dma_desc;
  418. spinlock_t rx_lock;
  419. spinlock_t tx_lock;
  420. struct tasklet_struct rx_dma_complete_tasklet;
  421. struct tasklet_struct rx_tmo_process_tasklet;
  422. unsigned int rx_io_count;
  423. unsigned long transfer_size;
  424. enum sirfsoc_tx_state tx_dma_state;
  425. unsigned int cts_gpio;
  426. unsigned int rts_gpio;
  427. struct sirfsoc_loop_buffer rx_dma_items[SIRFSOC_RX_LOOP_BUF_CNT];
  428. int rx_completed;
  429. int rx_issued;
  430. };
  431. /* Hardware Flow Control */
  432. #define SIRFUART_AFC_CTRL_RX_THD 0x70
  433. /* Register Access Control */
  434. #define portaddr(port, reg) ((port)->membase + (reg))
  435. #define rd_regb(port, reg) (__raw_readb(portaddr(port, reg)))
  436. #define rd_regl(port, reg) (__raw_readl(portaddr(port, reg)))
  437. #define wr_regb(port, reg, val) __raw_writeb(val, portaddr(port, reg))
  438. #define wr_regl(port, reg, val) __raw_writel(val, portaddr(port, reg))
  439. /* UART Port Mask */
  440. #define SIRFUART_FIFOLEVEL_MASK(port) ((port->line == 1) ? (0x1f) : (0x7f))
  441. #define SIRFUART_FIFOFULL_MASK(port) ((port->line == 1) ? (0x20) : (0x80))
  442. #define SIRFUART_FIFOEMPTY_MASK(port) ((port->line == 1) ? (0x40) : (0x100))
  443. /* I/O Mode */
  444. #define SIRFSOC_UART_IO_RX_MAX_CNT 256
  445. #define SIRFSOC_UART_IO_TX_REASONABLE_CNT 6