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