8250_fintek.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Probe for F81216A LPC to 4 UART
  4. *
  5. * Copyright (C) 2014-2016 Ricardo Ribalda, Qtechnology A/S
  6. */
  7. #include <linux/module.h>
  8. #include <linux/pci.h>
  9. #include <linux/pnp.h>
  10. #include <linux/kernel.h>
  11. #include <linux/serial_core.h>
  12. #include <linux/irq.h>
  13. #include "8250.h"
  14. #define ADDR_PORT 0
  15. #define DATA_PORT 1
  16. #define EXIT_KEY 0xAA
  17. #define CHIP_ID1 0x20
  18. #define CHIP_ID2 0x21
  19. #define CHIP_ID_F81865 0x0407
  20. #define CHIP_ID_F81866 0x1010
  21. #define CHIP_ID_F81966 0x0215
  22. #define CHIP_ID_F81216AD 0x1602
  23. #define CHIP_ID_F81216H 0x0501
  24. #define CHIP_ID_F81216 0x0802
  25. #define VENDOR_ID1 0x23
  26. #define VENDOR_ID1_VAL 0x19
  27. #define VENDOR_ID2 0x24
  28. #define VENDOR_ID2_VAL 0x34
  29. #define IO_ADDR1 0x61
  30. #define IO_ADDR2 0x60
  31. #define LDN 0x7
  32. #define FINTEK_IRQ_MODE 0x70
  33. #define IRQ_SHARE BIT(4)
  34. #define IRQ_MODE_MASK (BIT(6) | BIT(5))
  35. #define IRQ_LEVEL_LOW 0
  36. #define IRQ_EDGE_HIGH BIT(5)
  37. /*
  38. * F81216H clock source register, the value and mask is the same with F81866,
  39. * but it's on F0h.
  40. *
  41. * Clock speeds for UART (register F0h)
  42. * 00: 1.8432MHz.
  43. * 01: 18.432MHz.
  44. * 10: 24MHz.
  45. * 11: 14.769MHz.
  46. */
  47. #define RS485 0xF0
  48. #define RTS_INVERT BIT(5)
  49. #define RS485_URA BIT(4)
  50. #define RXW4C_IRA BIT(3)
  51. #define TXW4C_IRA BIT(2)
  52. #define FIFO_CTRL 0xF6
  53. #define FIFO_MODE_MASK (BIT(1) | BIT(0))
  54. #define FIFO_MODE_128 (BIT(1) | BIT(0))
  55. #define RXFTHR_MODE_MASK (BIT(5) | BIT(4))
  56. #define RXFTHR_MODE_4X BIT(5)
  57. #define F81216_LDN_LOW 0x0
  58. #define F81216_LDN_HIGH 0x4
  59. /*
  60. * F81866/966 registers
  61. *
  62. * The IRQ setting mode of F81866/966 is not the same with F81216 series.
  63. * Level/Low: IRQ_MODE0:0, IRQ_MODE1:0
  64. * Edge/High: IRQ_MODE0:1, IRQ_MODE1:0
  65. *
  66. * Clock speeds for UART (register F2h)
  67. * 00: 1.8432MHz.
  68. * 01: 18.432MHz.
  69. * 10: 24MHz.
  70. * 11: 14.769MHz.
  71. */
  72. #define F81866_IRQ_MODE 0xf0
  73. #define F81866_IRQ_SHARE BIT(0)
  74. #define F81866_IRQ_MODE0 BIT(1)
  75. #define F81866_FIFO_CTRL FIFO_CTRL
  76. #define F81866_IRQ_MODE1 BIT(3)
  77. #define F81866_LDN_LOW 0x10
  78. #define F81866_LDN_HIGH 0x16
  79. #define F81866_UART_CLK 0xF2
  80. #define F81866_UART_CLK_MASK (BIT(1) | BIT(0))
  81. #define F81866_UART_CLK_1_8432MHZ 0
  82. #define F81866_UART_CLK_14_769MHZ (BIT(1) | BIT(0))
  83. #define F81866_UART_CLK_18_432MHZ BIT(0)
  84. #define F81866_UART_CLK_24MHZ BIT(1)
  85. struct fintek_8250 {
  86. u16 pid;
  87. u16 base_port;
  88. u8 index;
  89. u8 key;
  90. };
  91. static u8 sio_read_reg(struct fintek_8250 *pdata, u8 reg)
  92. {
  93. outb(reg, pdata->base_port + ADDR_PORT);
  94. return inb(pdata->base_port + DATA_PORT);
  95. }
  96. static void sio_write_reg(struct fintek_8250 *pdata, u8 reg, u8 data)
  97. {
  98. outb(reg, pdata->base_port + ADDR_PORT);
  99. outb(data, pdata->base_port + DATA_PORT);
  100. }
  101. static void sio_write_mask_reg(struct fintek_8250 *pdata, u8 reg, u8 mask,
  102. u8 data)
  103. {
  104. u8 tmp;
  105. tmp = (sio_read_reg(pdata, reg) & ~mask) | (mask & data);
  106. sio_write_reg(pdata, reg, tmp);
  107. }
  108. static int fintek_8250_enter_key(u16 base_port, u8 key)
  109. {
  110. if (!request_muxed_region(base_port, 2, "8250_fintek"))
  111. return -EBUSY;
  112. /* Force to deactive all SuperIO in this base_port */
  113. outb(EXIT_KEY, base_port + ADDR_PORT);
  114. outb(key, base_port + ADDR_PORT);
  115. outb(key, base_port + ADDR_PORT);
  116. return 0;
  117. }
  118. static void fintek_8250_exit_key(u16 base_port)
  119. {
  120. outb(EXIT_KEY, base_port + ADDR_PORT);
  121. release_region(base_port + ADDR_PORT, 2);
  122. }
  123. static int fintek_8250_check_id(struct fintek_8250 *pdata)
  124. {
  125. u16 chip;
  126. if (sio_read_reg(pdata, VENDOR_ID1) != VENDOR_ID1_VAL)
  127. return -ENODEV;
  128. if (sio_read_reg(pdata, VENDOR_ID2) != VENDOR_ID2_VAL)
  129. return -ENODEV;
  130. chip = sio_read_reg(pdata, CHIP_ID1);
  131. chip |= sio_read_reg(pdata, CHIP_ID2) << 8;
  132. switch (chip) {
  133. case CHIP_ID_F81865:
  134. case CHIP_ID_F81866:
  135. case CHIP_ID_F81966:
  136. case CHIP_ID_F81216AD:
  137. case CHIP_ID_F81216H:
  138. case CHIP_ID_F81216:
  139. break;
  140. default:
  141. return -ENODEV;
  142. }
  143. pdata->pid = chip;
  144. return 0;
  145. }
  146. static int fintek_8250_get_ldn_range(struct fintek_8250 *pdata, int *min,
  147. int *max)
  148. {
  149. switch (pdata->pid) {
  150. case CHIP_ID_F81966:
  151. case CHIP_ID_F81865:
  152. case CHIP_ID_F81866:
  153. *min = F81866_LDN_LOW;
  154. *max = F81866_LDN_HIGH;
  155. return 0;
  156. case CHIP_ID_F81216AD:
  157. case CHIP_ID_F81216H:
  158. case CHIP_ID_F81216:
  159. *min = F81216_LDN_LOW;
  160. *max = F81216_LDN_HIGH;
  161. return 0;
  162. }
  163. return -ENODEV;
  164. }
  165. static int fintek_8250_rs485_config(struct uart_port *port, struct ktermios *termios,
  166. struct serial_rs485 *rs485)
  167. {
  168. uint8_t config = 0;
  169. struct fintek_8250 *pdata = port->private_data;
  170. if (!pdata)
  171. return -EINVAL;
  172. if (rs485->flags & SER_RS485_ENABLED) {
  173. /* Hardware do not support same RTS level on send and receive */
  174. if (!(rs485->flags & SER_RS485_RTS_ON_SEND) ==
  175. !(rs485->flags & SER_RS485_RTS_AFTER_SEND))
  176. return -EINVAL;
  177. config |= RS485_URA;
  178. }
  179. if (rs485->delay_rts_before_send) {
  180. rs485->delay_rts_before_send = 1;
  181. config |= TXW4C_IRA;
  182. }
  183. if (rs485->delay_rts_after_send) {
  184. rs485->delay_rts_after_send = 1;
  185. config |= RXW4C_IRA;
  186. }
  187. if (rs485->flags & SER_RS485_RTS_ON_SEND)
  188. config |= RTS_INVERT;
  189. if (fintek_8250_enter_key(pdata->base_port, pdata->key))
  190. return -EBUSY;
  191. sio_write_reg(pdata, LDN, pdata->index);
  192. sio_write_reg(pdata, RS485, config);
  193. fintek_8250_exit_key(pdata->base_port);
  194. return 0;
  195. }
  196. static void fintek_8250_set_irq_mode(struct fintek_8250 *pdata, bool is_level)
  197. {
  198. sio_write_reg(pdata, LDN, pdata->index);
  199. switch (pdata->pid) {
  200. case CHIP_ID_F81966:
  201. case CHIP_ID_F81866:
  202. sio_write_mask_reg(pdata, F81866_FIFO_CTRL, F81866_IRQ_MODE1,
  203. 0);
  204. fallthrough;
  205. case CHIP_ID_F81865:
  206. sio_write_mask_reg(pdata, F81866_IRQ_MODE, F81866_IRQ_SHARE,
  207. F81866_IRQ_SHARE);
  208. sio_write_mask_reg(pdata, F81866_IRQ_MODE, F81866_IRQ_MODE0,
  209. is_level ? 0 : F81866_IRQ_MODE0);
  210. break;
  211. case CHIP_ID_F81216AD:
  212. case CHIP_ID_F81216H:
  213. case CHIP_ID_F81216:
  214. sio_write_mask_reg(pdata, FINTEK_IRQ_MODE, IRQ_SHARE,
  215. IRQ_SHARE);
  216. sio_write_mask_reg(pdata, FINTEK_IRQ_MODE, IRQ_MODE_MASK,
  217. is_level ? IRQ_LEVEL_LOW : IRQ_EDGE_HIGH);
  218. break;
  219. }
  220. }
  221. static void fintek_8250_set_max_fifo(struct fintek_8250 *pdata)
  222. {
  223. switch (pdata->pid) {
  224. case CHIP_ID_F81216H: /* 128Bytes FIFO */
  225. case CHIP_ID_F81966:
  226. case CHIP_ID_F81866:
  227. sio_write_mask_reg(pdata, FIFO_CTRL,
  228. FIFO_MODE_MASK | RXFTHR_MODE_MASK,
  229. FIFO_MODE_128 | RXFTHR_MODE_4X);
  230. break;
  231. default: /* Default 16Bytes FIFO */
  232. break;
  233. }
  234. }
  235. static void fintek_8250_set_termios(struct uart_port *port,
  236. struct ktermios *termios,
  237. const struct ktermios *old)
  238. {
  239. struct fintek_8250 *pdata = port->private_data;
  240. unsigned int baud = tty_termios_baud_rate(termios);
  241. int i;
  242. u8 reg;
  243. static u32 baudrate_table[] = {115200, 921600, 1152000, 1500000};
  244. static u8 clock_table[] = { F81866_UART_CLK_1_8432MHZ,
  245. F81866_UART_CLK_14_769MHZ, F81866_UART_CLK_18_432MHZ,
  246. F81866_UART_CLK_24MHZ };
  247. /*
  248. * We'll use serial8250_do_set_termios() for baud = 0, otherwise It'll
  249. * crash on baudrate_table[i] % baud with "division by zero".
  250. */
  251. if (!baud)
  252. goto exit;
  253. switch (pdata->pid) {
  254. case CHIP_ID_F81216H:
  255. reg = RS485;
  256. break;
  257. case CHIP_ID_F81966:
  258. case CHIP_ID_F81866:
  259. reg = F81866_UART_CLK;
  260. break;
  261. default:
  262. /* Don't change clocksource with unknown PID */
  263. dev_warn(port->dev,
  264. "%s: pid: %x Not support. use default set_termios.\n",
  265. __func__, pdata->pid);
  266. goto exit;
  267. }
  268. for (i = 0; i < ARRAY_SIZE(baudrate_table); ++i) {
  269. if (baud > baudrate_table[i] || baudrate_table[i] % baud != 0)
  270. continue;
  271. if (port->uartclk == baudrate_table[i] * 16)
  272. break;
  273. if (fintek_8250_enter_key(pdata->base_port, pdata->key))
  274. continue;
  275. port->uartclk = baudrate_table[i] * 16;
  276. sio_write_reg(pdata, LDN, pdata->index);
  277. sio_write_mask_reg(pdata, reg, F81866_UART_CLK_MASK,
  278. clock_table[i]);
  279. fintek_8250_exit_key(pdata->base_port);
  280. break;
  281. }
  282. if (i == ARRAY_SIZE(baudrate_table)) {
  283. baud = tty_termios_baud_rate(old);
  284. tty_termios_encode_baud_rate(termios, baud, baud);
  285. }
  286. exit:
  287. serial8250_do_set_termios(port, termios, old);
  288. }
  289. static void fintek_8250_set_termios_handler(struct uart_8250_port *uart)
  290. {
  291. struct fintek_8250 *pdata = uart->port.private_data;
  292. switch (pdata->pid) {
  293. case CHIP_ID_F81216H:
  294. case CHIP_ID_F81966:
  295. case CHIP_ID_F81866:
  296. uart->port.set_termios = fintek_8250_set_termios;
  297. break;
  298. default:
  299. break;
  300. }
  301. }
  302. static int probe_setup_port(struct fintek_8250 *pdata,
  303. struct uart_8250_port *uart)
  304. {
  305. static const u16 addr[] = {0x4e, 0x2e};
  306. static const u8 keys[] = {0x77, 0xa0, 0x87, 0x67};
  307. struct irq_data *irq_data;
  308. bool level_mode = false;
  309. int i, j, k, min, max;
  310. for (i = 0; i < ARRAY_SIZE(addr); i++) {
  311. for (j = 0; j < ARRAY_SIZE(keys); j++) {
  312. pdata->base_port = addr[i];
  313. pdata->key = keys[j];
  314. if (fintek_8250_enter_key(addr[i], keys[j]))
  315. continue;
  316. if (fintek_8250_check_id(pdata) ||
  317. fintek_8250_get_ldn_range(pdata, &min, &max)) {
  318. fintek_8250_exit_key(addr[i]);
  319. continue;
  320. }
  321. for (k = min; k < max; k++) {
  322. u16 aux;
  323. sio_write_reg(pdata, LDN, k);
  324. aux = sio_read_reg(pdata, IO_ADDR1);
  325. aux |= sio_read_reg(pdata, IO_ADDR2) << 8;
  326. if (aux != uart->port.iobase)
  327. continue;
  328. pdata->index = k;
  329. irq_data = irq_get_irq_data(uart->port.irq);
  330. if (irq_data)
  331. level_mode =
  332. irqd_is_level_type(irq_data);
  333. fintek_8250_set_irq_mode(pdata, level_mode);
  334. fintek_8250_set_max_fifo(pdata);
  335. fintek_8250_exit_key(addr[i]);
  336. return 0;
  337. }
  338. fintek_8250_exit_key(addr[i]);
  339. }
  340. }
  341. return -ENODEV;
  342. }
  343. /* Only the first port supports delays */
  344. static const struct serial_rs485 fintek_8250_rs485_supported_port0 = {
  345. .flags = SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND | SER_RS485_RTS_AFTER_SEND,
  346. .delay_rts_before_send = 1,
  347. .delay_rts_after_send = 1,
  348. };
  349. static const struct serial_rs485 fintek_8250_rs485_supported = {
  350. .flags = SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND | SER_RS485_RTS_AFTER_SEND,
  351. };
  352. static void fintek_8250_set_rs485_handler(struct uart_8250_port *uart)
  353. {
  354. struct fintek_8250 *pdata = uart->port.private_data;
  355. switch (pdata->pid) {
  356. case CHIP_ID_F81216AD:
  357. case CHIP_ID_F81216H:
  358. case CHIP_ID_F81966:
  359. case CHIP_ID_F81866:
  360. case CHIP_ID_F81865:
  361. uart->port.rs485_config = fintek_8250_rs485_config;
  362. if (!pdata->index)
  363. uart->port.rs485_supported = fintek_8250_rs485_supported_port0;
  364. else
  365. uart->port.rs485_supported = fintek_8250_rs485_supported;
  366. break;
  367. default: /* No RS485 Auto direction functional */
  368. break;
  369. }
  370. }
  371. int fintek_8250_probe(struct uart_8250_port *uart)
  372. {
  373. struct fintek_8250 *pdata;
  374. struct fintek_8250 probe_data;
  375. if (probe_setup_port(&probe_data, uart))
  376. return -ENODEV;
  377. pdata = devm_kzalloc(uart->port.dev, sizeof(*pdata), GFP_KERNEL);
  378. if (!pdata)
  379. return -ENOMEM;
  380. memcpy(pdata, &probe_data, sizeof(probe_data));
  381. uart->port.private_data = pdata;
  382. fintek_8250_set_rs485_handler(uart);
  383. fintek_8250_set_termios_handler(uart);
  384. return 0;
  385. }