8250_fintek.c 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. /*
  2. * Probe for F81216A LPC to 4 UART
  3. *
  4. * Copyright (C) 2014-2016 Ricardo Ribalda, Qtechnology A/S
  5. *
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License.
  10. */
  11. #include <linux/module.h>
  12. #include <linux/pci.h>
  13. #include <linux/pnp.h>
  14. #include <linux/kernel.h>
  15. #include <linux/serial_core.h>
  16. #include <linux/irq.h>
  17. #include "8250.h"
  18. #define ADDR_PORT 0
  19. #define DATA_PORT 1
  20. #define EXIT_KEY 0xAA
  21. #define CHIP_ID1 0x20
  22. #define CHIP_ID2 0x21
  23. #define CHIP_ID_F81865 0x0407
  24. #define CHIP_ID_F81866 0x1010
  25. #define CHIP_ID_F81216AD 0x1602
  26. #define CHIP_ID_F81216H 0x0501
  27. #define CHIP_ID_F81216 0x0802
  28. #define VENDOR_ID1 0x23
  29. #define VENDOR_ID1_VAL 0x19
  30. #define VENDOR_ID2 0x24
  31. #define VENDOR_ID2_VAL 0x34
  32. #define IO_ADDR1 0x61
  33. #define IO_ADDR2 0x60
  34. #define LDN 0x7
  35. #define FINTEK_IRQ_MODE 0x70
  36. #define IRQ_SHARE BIT(4)
  37. #define IRQ_MODE_MASK (BIT(6) | BIT(5))
  38. #define IRQ_LEVEL_LOW 0
  39. #define IRQ_EDGE_HIGH BIT(5)
  40. #define RS485 0xF0
  41. #define RTS_INVERT BIT(5)
  42. #define RS485_URA BIT(4)
  43. #define RXW4C_IRA BIT(3)
  44. #define TXW4C_IRA BIT(2)
  45. #define FIFO_CTRL 0xF6
  46. #define FIFO_MODE_MASK (BIT(1) | BIT(0))
  47. #define FIFO_MODE_128 (BIT(1) | BIT(0))
  48. #define RXFTHR_MODE_MASK (BIT(5) | BIT(4))
  49. #define RXFTHR_MODE_4X BIT(5)
  50. #define F81216_LDN_LOW 0x0
  51. #define F81216_LDN_HIGH 0x4
  52. /*
  53. * F81866 registers
  54. *
  55. * The IRQ setting mode of F81866 is not the same with F81216 series.
  56. * Level/Low: IRQ_MODE0:0, IRQ_MODE1:0
  57. * Edge/High: IRQ_MODE0:1, IRQ_MODE1:0
  58. *
  59. * Clock speeds for UART (register F2h)
  60. * 00: 1.8432MHz.
  61. * 01: 18.432MHz.
  62. * 10: 24MHz.
  63. * 11: 14.769MHz.
  64. */
  65. #define F81866_IRQ_MODE 0xf0
  66. #define F81866_IRQ_SHARE BIT(0)
  67. #define F81866_IRQ_MODE0 BIT(1)
  68. #define F81866_FIFO_CTRL FIFO_CTRL
  69. #define F81866_IRQ_MODE1 BIT(3)
  70. #define F81866_LDN_LOW 0x10
  71. #define F81866_LDN_HIGH 0x16
  72. #define F81866_UART_CLK 0xF2
  73. #define F81866_UART_CLK_MASK (BIT(1) | BIT(0))
  74. #define F81866_UART_CLK_1_8432MHZ 0
  75. #define F81866_UART_CLK_14_769MHZ (BIT(1) | BIT(0))
  76. #define F81866_UART_CLK_18_432MHZ BIT(0)
  77. #define F81866_UART_CLK_24MHZ BIT(1)
  78. struct fintek_8250 {
  79. u16 pid;
  80. u16 base_port;
  81. u8 index;
  82. u8 key;
  83. };
  84. static u8 sio_read_reg(struct fintek_8250 *pdata, u8 reg)
  85. {
  86. outb(reg, pdata->base_port + ADDR_PORT);
  87. return inb(pdata->base_port + DATA_PORT);
  88. }
  89. static void sio_write_reg(struct fintek_8250 *pdata, u8 reg, u8 data)
  90. {
  91. outb(reg, pdata->base_port + ADDR_PORT);
  92. outb(data, pdata->base_port + DATA_PORT);
  93. }
  94. static void sio_write_mask_reg(struct fintek_8250 *pdata, u8 reg, u8 mask,
  95. u8 data)
  96. {
  97. u8 tmp;
  98. tmp = (sio_read_reg(pdata, reg) & ~mask) | (mask & data);
  99. sio_write_reg(pdata, reg, tmp);
  100. }
  101. static int fintek_8250_enter_key(u16 base_port, u8 key)
  102. {
  103. if (!request_muxed_region(base_port, 2, "8250_fintek"))
  104. return -EBUSY;
  105. outb(key, base_port + ADDR_PORT);
  106. outb(key, base_port + ADDR_PORT);
  107. return 0;
  108. }
  109. static void fintek_8250_exit_key(u16 base_port)
  110. {
  111. outb(EXIT_KEY, base_port + ADDR_PORT);
  112. release_region(base_port + ADDR_PORT, 2);
  113. }
  114. static int fintek_8250_check_id(struct fintek_8250 *pdata)
  115. {
  116. u16 chip;
  117. if (sio_read_reg(pdata, VENDOR_ID1) != VENDOR_ID1_VAL)
  118. return -ENODEV;
  119. if (sio_read_reg(pdata, VENDOR_ID2) != VENDOR_ID2_VAL)
  120. return -ENODEV;
  121. chip = sio_read_reg(pdata, CHIP_ID1);
  122. chip |= sio_read_reg(pdata, CHIP_ID2) << 8;
  123. switch (chip) {
  124. case CHIP_ID_F81865:
  125. case CHIP_ID_F81866:
  126. case CHIP_ID_F81216AD:
  127. case CHIP_ID_F81216H:
  128. case CHIP_ID_F81216:
  129. break;
  130. default:
  131. return -ENODEV;
  132. }
  133. pdata->pid = chip;
  134. return 0;
  135. }
  136. static int fintek_8250_get_ldn_range(struct fintek_8250 *pdata, int *min,
  137. int *max)
  138. {
  139. switch (pdata->pid) {
  140. case CHIP_ID_F81865:
  141. case CHIP_ID_F81866:
  142. *min = F81866_LDN_LOW;
  143. *max = F81866_LDN_HIGH;
  144. return 0;
  145. case CHIP_ID_F81216AD:
  146. case CHIP_ID_F81216H:
  147. case CHIP_ID_F81216:
  148. *min = F81216_LDN_LOW;
  149. *max = F81216_LDN_HIGH;
  150. return 0;
  151. }
  152. return -ENODEV;
  153. }
  154. static int fintek_8250_rs485_config(struct uart_port *port,
  155. struct serial_rs485 *rs485)
  156. {
  157. uint8_t config = 0;
  158. struct fintek_8250 *pdata = port->private_data;
  159. if (!pdata)
  160. return -EINVAL;
  161. if (rs485->flags & SER_RS485_ENABLED)
  162. memset(rs485->padding, 0, sizeof(rs485->padding));
  163. else
  164. memset(rs485, 0, sizeof(*rs485));
  165. rs485->flags &= SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND |
  166. SER_RS485_RTS_AFTER_SEND;
  167. if (rs485->delay_rts_before_send) {
  168. rs485->delay_rts_before_send = 1;
  169. config |= TXW4C_IRA;
  170. }
  171. if (rs485->delay_rts_after_send) {
  172. rs485->delay_rts_after_send = 1;
  173. config |= RXW4C_IRA;
  174. }
  175. if ((!!(rs485->flags & SER_RS485_RTS_ON_SEND)) ==
  176. (!!(rs485->flags & SER_RS485_RTS_AFTER_SEND)))
  177. rs485->flags &= SER_RS485_ENABLED;
  178. else
  179. config |= RS485_URA;
  180. if (rs485->flags & SER_RS485_RTS_ON_SEND)
  181. config |= RTS_INVERT;
  182. if (fintek_8250_enter_key(pdata->base_port, pdata->key))
  183. return -EBUSY;
  184. sio_write_reg(pdata, LDN, pdata->index);
  185. sio_write_reg(pdata, RS485, config);
  186. fintek_8250_exit_key(pdata->base_port);
  187. port->rs485 = *rs485;
  188. return 0;
  189. }
  190. static void fintek_8250_set_irq_mode(struct fintek_8250 *pdata, bool is_level)
  191. {
  192. sio_write_reg(pdata, LDN, pdata->index);
  193. switch (pdata->pid) {
  194. case CHIP_ID_F81866:
  195. sio_write_mask_reg(pdata, F81866_FIFO_CTRL, F81866_IRQ_MODE1,
  196. 0);
  197. /* fall through */
  198. case CHIP_ID_F81865:
  199. sio_write_mask_reg(pdata, F81866_IRQ_MODE, F81866_IRQ_SHARE,
  200. F81866_IRQ_SHARE);
  201. sio_write_mask_reg(pdata, F81866_IRQ_MODE, F81866_IRQ_MODE0,
  202. is_level ? 0 : F81866_IRQ_MODE0);
  203. break;
  204. case CHIP_ID_F81216AD:
  205. case CHIP_ID_F81216H:
  206. case CHIP_ID_F81216:
  207. sio_write_mask_reg(pdata, FINTEK_IRQ_MODE, IRQ_SHARE,
  208. IRQ_SHARE);
  209. sio_write_mask_reg(pdata, FINTEK_IRQ_MODE, IRQ_MODE_MASK,
  210. is_level ? IRQ_LEVEL_LOW : IRQ_EDGE_HIGH);
  211. break;
  212. }
  213. }
  214. static void fintek_8250_set_max_fifo(struct fintek_8250 *pdata)
  215. {
  216. switch (pdata->pid) {
  217. case CHIP_ID_F81216H: /* 128Bytes FIFO */
  218. case CHIP_ID_F81866:
  219. sio_write_mask_reg(pdata, FIFO_CTRL,
  220. FIFO_MODE_MASK | RXFTHR_MODE_MASK,
  221. FIFO_MODE_128 | RXFTHR_MODE_4X);
  222. break;
  223. default: /* Default 16Bytes FIFO */
  224. break;
  225. }
  226. }
  227. static void fintek_8250_goto_highspeed(struct uart_8250_port *uart,
  228. struct fintek_8250 *pdata)
  229. {
  230. sio_write_reg(pdata, LDN, pdata->index);
  231. switch (pdata->pid) {
  232. case CHIP_ID_F81866: /* set uart clock for high speed serial mode */
  233. sio_write_mask_reg(pdata, F81866_UART_CLK,
  234. F81866_UART_CLK_MASK,
  235. F81866_UART_CLK_14_769MHZ);
  236. uart->port.uartclk = 921600 * 16;
  237. break;
  238. default: /* leave clock speed untouched */
  239. break;
  240. }
  241. }
  242. static int probe_setup_port(struct fintek_8250 *pdata,
  243. struct uart_8250_port *uart)
  244. {
  245. static const u16 addr[] = {0x4e, 0x2e};
  246. static const u8 keys[] = {0x77, 0xa0, 0x87, 0x67};
  247. struct irq_data *irq_data;
  248. bool level_mode = false;
  249. int i, j, k, min, max;
  250. for (i = 0; i < ARRAY_SIZE(addr); i++) {
  251. for (j = 0; j < ARRAY_SIZE(keys); j++) {
  252. pdata->base_port = addr[i];
  253. pdata->key = keys[j];
  254. if (fintek_8250_enter_key(addr[i], keys[j]))
  255. continue;
  256. if (fintek_8250_check_id(pdata) ||
  257. fintek_8250_get_ldn_range(pdata, &min, &max)) {
  258. fintek_8250_exit_key(addr[i]);
  259. continue;
  260. }
  261. for (k = min; k < max; k++) {
  262. u16 aux;
  263. sio_write_reg(pdata, LDN, k);
  264. aux = sio_read_reg(pdata, IO_ADDR1);
  265. aux |= sio_read_reg(pdata, IO_ADDR2) << 8;
  266. if (aux != uart->port.iobase)
  267. continue;
  268. pdata->index = k;
  269. irq_data = irq_get_irq_data(uart->port.irq);
  270. if (irq_data)
  271. level_mode =
  272. irqd_is_level_type(irq_data);
  273. fintek_8250_set_irq_mode(pdata, level_mode);
  274. fintek_8250_set_max_fifo(pdata);
  275. fintek_8250_goto_highspeed(uart, pdata);
  276. fintek_8250_exit_key(addr[i]);
  277. return 0;
  278. }
  279. fintek_8250_exit_key(addr[i]);
  280. }
  281. }
  282. return -ENODEV;
  283. }
  284. static void fintek_8250_set_rs485_handler(struct uart_8250_port *uart)
  285. {
  286. struct fintek_8250 *pdata = uart->port.private_data;
  287. switch (pdata->pid) {
  288. case CHIP_ID_F81216AD:
  289. case CHIP_ID_F81216H:
  290. case CHIP_ID_F81866:
  291. case CHIP_ID_F81865:
  292. uart->port.rs485_config = fintek_8250_rs485_config;
  293. break;
  294. default: /* No RS485 Auto direction functional */
  295. break;
  296. }
  297. }
  298. int fintek_8250_probe(struct uart_8250_port *uart)
  299. {
  300. struct fintek_8250 *pdata;
  301. struct fintek_8250 probe_data;
  302. if (probe_setup_port(&probe_data, uart))
  303. return -ENODEV;
  304. pdata = devm_kzalloc(uart->port.dev, sizeof(*pdata), GFP_KERNEL);
  305. if (!pdata)
  306. return -ENOMEM;
  307. memcpy(pdata, &probe_data, sizeof(probe_data));
  308. uart->port.private_data = pdata;
  309. fintek_8250_set_rs485_handler(uart);
  310. return 0;
  311. }