1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Base port operations for 8250/16550-type serial ports
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
6*4882a593Smuzhiyun * Split from 8250_core.c, Copyright (C) 2001 Russell King.
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * A note about mapbase / membase
9*4882a593Smuzhiyun *
10*4882a593Smuzhiyun * mapbase is the physical address of the IO port.
11*4882a593Smuzhiyun * membase is an 'ioremapped' cookie.
12*4882a593Smuzhiyun */
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun #include <linux/module.h>
15*4882a593Smuzhiyun #include <linux/moduleparam.h>
16*4882a593Smuzhiyun #include <linux/ioport.h>
17*4882a593Smuzhiyun #include <linux/init.h>
18*4882a593Smuzhiyun #include <linux/console.h>
19*4882a593Smuzhiyun #include <linux/gpio/consumer.h>
20*4882a593Smuzhiyun #include <linux/sysrq.h>
21*4882a593Smuzhiyun #include <linux/delay.h>
22*4882a593Smuzhiyun #include <linux/platform_device.h>
23*4882a593Smuzhiyun #include <linux/tty.h>
24*4882a593Smuzhiyun #include <linux/ratelimit.h>
25*4882a593Smuzhiyun #include <linux/tty_flip.h>
26*4882a593Smuzhiyun #include <linux/serial.h>
27*4882a593Smuzhiyun #include <linux/serial_8250.h>
28*4882a593Smuzhiyun #include <linux/nmi.h>
29*4882a593Smuzhiyun #include <linux/mutex.h>
30*4882a593Smuzhiyun #include <linux/slab.h>
31*4882a593Smuzhiyun #include <linux/uaccess.h>
32*4882a593Smuzhiyun #include <linux/pm_runtime.h>
33*4882a593Smuzhiyun #include <linux/ktime.h>
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun #include <asm/io.h>
36*4882a593Smuzhiyun #include <asm/irq.h>
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun #include "8250.h"
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun /* Nuvoton NPCM timeout register */
41*4882a593Smuzhiyun #define UART_NPCM_TOR 7
42*4882a593Smuzhiyun #define UART_NPCM_TOIE BIT(7) /* Timeout Interrupt Enable */
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun /*
45*4882a593Smuzhiyun * Debugging.
46*4882a593Smuzhiyun */
47*4882a593Smuzhiyun #if 0
48*4882a593Smuzhiyun #define DEBUG_AUTOCONF(fmt...) printk(fmt)
49*4882a593Smuzhiyun #else
50*4882a593Smuzhiyun #define DEBUG_AUTOCONF(fmt...) do { } while (0)
51*4882a593Smuzhiyun #endif
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun #define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun /*
56*4882a593Smuzhiyun * Here we define the default xmit fifo size used for each type of UART.
57*4882a593Smuzhiyun */
58*4882a593Smuzhiyun static const struct serial8250_config uart_config[] = {
59*4882a593Smuzhiyun #ifndef CONFIG_ROCKCHIP_MINI_KERNEL
60*4882a593Smuzhiyun [PORT_UNKNOWN] = {
61*4882a593Smuzhiyun .name = "unknown",
62*4882a593Smuzhiyun .fifo_size = 1,
63*4882a593Smuzhiyun .tx_loadsz = 1,
64*4882a593Smuzhiyun },
65*4882a593Smuzhiyun [PORT_8250] = {
66*4882a593Smuzhiyun .name = "8250",
67*4882a593Smuzhiyun .fifo_size = 1,
68*4882a593Smuzhiyun .tx_loadsz = 1,
69*4882a593Smuzhiyun },
70*4882a593Smuzhiyun [PORT_16450] = {
71*4882a593Smuzhiyun .name = "16450",
72*4882a593Smuzhiyun .fifo_size = 1,
73*4882a593Smuzhiyun .tx_loadsz = 1,
74*4882a593Smuzhiyun },
75*4882a593Smuzhiyun [PORT_16550] = {
76*4882a593Smuzhiyun .name = "16550",
77*4882a593Smuzhiyun .fifo_size = 1,
78*4882a593Smuzhiyun .tx_loadsz = 1,
79*4882a593Smuzhiyun },
80*4882a593Smuzhiyun #endif
81*4882a593Smuzhiyun [PORT_16550A] = {
82*4882a593Smuzhiyun .name = "16550A",
83*4882a593Smuzhiyun .fifo_size = 16,
84*4882a593Smuzhiyun .tx_loadsz = 16,
85*4882a593Smuzhiyun .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
86*4882a593Smuzhiyun .rxtrig_bytes = {1, 4, 8, 14},
87*4882a593Smuzhiyun .flags = UART_CAP_FIFO,
88*4882a593Smuzhiyun },
89*4882a593Smuzhiyun #ifndef CONFIG_ROCKCHIP_MINI_KERNEL
90*4882a593Smuzhiyun [PORT_CIRRUS] = {
91*4882a593Smuzhiyun .name = "Cirrus",
92*4882a593Smuzhiyun .fifo_size = 1,
93*4882a593Smuzhiyun .tx_loadsz = 1,
94*4882a593Smuzhiyun },
95*4882a593Smuzhiyun [PORT_16650] = {
96*4882a593Smuzhiyun .name = "ST16650",
97*4882a593Smuzhiyun .fifo_size = 1,
98*4882a593Smuzhiyun .tx_loadsz = 1,
99*4882a593Smuzhiyun .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
100*4882a593Smuzhiyun },
101*4882a593Smuzhiyun [PORT_16650V2] = {
102*4882a593Smuzhiyun .name = "ST16650V2",
103*4882a593Smuzhiyun .fifo_size = 32,
104*4882a593Smuzhiyun .tx_loadsz = 16,
105*4882a593Smuzhiyun .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
106*4882a593Smuzhiyun UART_FCR_T_TRIG_00,
107*4882a593Smuzhiyun .rxtrig_bytes = {8, 16, 24, 28},
108*4882a593Smuzhiyun .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
109*4882a593Smuzhiyun },
110*4882a593Smuzhiyun [PORT_16750] = {
111*4882a593Smuzhiyun .name = "TI16750",
112*4882a593Smuzhiyun .fifo_size = 64,
113*4882a593Smuzhiyun .tx_loadsz = 64,
114*4882a593Smuzhiyun .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 |
115*4882a593Smuzhiyun UART_FCR7_64BYTE,
116*4882a593Smuzhiyun .rxtrig_bytes = {1, 16, 32, 56},
117*4882a593Smuzhiyun .flags = UART_CAP_FIFO | UART_CAP_SLEEP | UART_CAP_AFE,
118*4882a593Smuzhiyun },
119*4882a593Smuzhiyun [PORT_STARTECH] = {
120*4882a593Smuzhiyun .name = "Startech",
121*4882a593Smuzhiyun .fifo_size = 1,
122*4882a593Smuzhiyun .tx_loadsz = 1,
123*4882a593Smuzhiyun },
124*4882a593Smuzhiyun [PORT_16C950] = {
125*4882a593Smuzhiyun .name = "16C950/954",
126*4882a593Smuzhiyun .fifo_size = 128,
127*4882a593Smuzhiyun .tx_loadsz = 128,
128*4882a593Smuzhiyun .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01,
129*4882a593Smuzhiyun .rxtrig_bytes = {16, 32, 112, 120},
130*4882a593Smuzhiyun /* UART_CAP_EFR breaks billionon CF bluetooth card. */
131*4882a593Smuzhiyun .flags = UART_CAP_FIFO | UART_CAP_SLEEP,
132*4882a593Smuzhiyun },
133*4882a593Smuzhiyun [PORT_16654] = {
134*4882a593Smuzhiyun .name = "ST16654",
135*4882a593Smuzhiyun .fifo_size = 64,
136*4882a593Smuzhiyun .tx_loadsz = 32,
137*4882a593Smuzhiyun .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
138*4882a593Smuzhiyun UART_FCR_T_TRIG_10,
139*4882a593Smuzhiyun .rxtrig_bytes = {8, 16, 56, 60},
140*4882a593Smuzhiyun .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
141*4882a593Smuzhiyun },
142*4882a593Smuzhiyun [PORT_16850] = {
143*4882a593Smuzhiyun .name = "XR16850",
144*4882a593Smuzhiyun .fifo_size = 128,
145*4882a593Smuzhiyun .tx_loadsz = 128,
146*4882a593Smuzhiyun .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
147*4882a593Smuzhiyun .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
148*4882a593Smuzhiyun },
149*4882a593Smuzhiyun [PORT_RSA] = {
150*4882a593Smuzhiyun .name = "RSA",
151*4882a593Smuzhiyun .fifo_size = 2048,
152*4882a593Smuzhiyun .tx_loadsz = 2048,
153*4882a593Smuzhiyun .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_11,
154*4882a593Smuzhiyun .flags = UART_CAP_FIFO,
155*4882a593Smuzhiyun },
156*4882a593Smuzhiyun [PORT_NS16550A] = {
157*4882a593Smuzhiyun .name = "NS16550A",
158*4882a593Smuzhiyun .fifo_size = 16,
159*4882a593Smuzhiyun .tx_loadsz = 16,
160*4882a593Smuzhiyun .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
161*4882a593Smuzhiyun .flags = UART_CAP_FIFO | UART_NATSEMI,
162*4882a593Smuzhiyun },
163*4882a593Smuzhiyun [PORT_XSCALE] = {
164*4882a593Smuzhiyun .name = "XScale",
165*4882a593Smuzhiyun .fifo_size = 32,
166*4882a593Smuzhiyun .tx_loadsz = 32,
167*4882a593Smuzhiyun .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
168*4882a593Smuzhiyun .flags = UART_CAP_FIFO | UART_CAP_UUE | UART_CAP_RTOIE,
169*4882a593Smuzhiyun },
170*4882a593Smuzhiyun [PORT_OCTEON] = {
171*4882a593Smuzhiyun .name = "OCTEON",
172*4882a593Smuzhiyun .fifo_size = 64,
173*4882a593Smuzhiyun .tx_loadsz = 64,
174*4882a593Smuzhiyun .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
175*4882a593Smuzhiyun .flags = UART_CAP_FIFO,
176*4882a593Smuzhiyun },
177*4882a593Smuzhiyun [PORT_AR7] = {
178*4882a593Smuzhiyun .name = "AR7",
179*4882a593Smuzhiyun .fifo_size = 16,
180*4882a593Smuzhiyun .tx_loadsz = 16,
181*4882a593Smuzhiyun .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_00,
182*4882a593Smuzhiyun .flags = UART_CAP_FIFO /* | UART_CAP_AFE */,
183*4882a593Smuzhiyun },
184*4882a593Smuzhiyun [PORT_U6_16550A] = {
185*4882a593Smuzhiyun .name = "U6_16550A",
186*4882a593Smuzhiyun .fifo_size = 64,
187*4882a593Smuzhiyun .tx_loadsz = 64,
188*4882a593Smuzhiyun .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
189*4882a593Smuzhiyun .flags = UART_CAP_FIFO | UART_CAP_AFE,
190*4882a593Smuzhiyun },
191*4882a593Smuzhiyun [PORT_TEGRA] = {
192*4882a593Smuzhiyun .name = "Tegra",
193*4882a593Smuzhiyun .fifo_size = 32,
194*4882a593Smuzhiyun .tx_loadsz = 8,
195*4882a593Smuzhiyun .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
196*4882a593Smuzhiyun UART_FCR_T_TRIG_01,
197*4882a593Smuzhiyun .rxtrig_bytes = {1, 4, 8, 14},
198*4882a593Smuzhiyun .flags = UART_CAP_FIFO | UART_CAP_RTOIE,
199*4882a593Smuzhiyun },
200*4882a593Smuzhiyun [PORT_XR17D15X] = {
201*4882a593Smuzhiyun .name = "XR17D15X",
202*4882a593Smuzhiyun .fifo_size = 64,
203*4882a593Smuzhiyun .tx_loadsz = 64,
204*4882a593Smuzhiyun .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
205*4882a593Smuzhiyun .flags = UART_CAP_FIFO | UART_CAP_AFE | UART_CAP_EFR |
206*4882a593Smuzhiyun UART_CAP_SLEEP,
207*4882a593Smuzhiyun },
208*4882a593Smuzhiyun [PORT_XR17V35X] = {
209*4882a593Smuzhiyun .name = "XR17V35X",
210*4882a593Smuzhiyun .fifo_size = 256,
211*4882a593Smuzhiyun .tx_loadsz = 256,
212*4882a593Smuzhiyun .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_11 |
213*4882a593Smuzhiyun UART_FCR_T_TRIG_11,
214*4882a593Smuzhiyun .flags = UART_CAP_FIFO | UART_CAP_AFE | UART_CAP_EFR |
215*4882a593Smuzhiyun UART_CAP_SLEEP,
216*4882a593Smuzhiyun },
217*4882a593Smuzhiyun [PORT_LPC3220] = {
218*4882a593Smuzhiyun .name = "LPC3220",
219*4882a593Smuzhiyun .fifo_size = 64,
220*4882a593Smuzhiyun .tx_loadsz = 32,
221*4882a593Smuzhiyun .fcr = UART_FCR_DMA_SELECT | UART_FCR_ENABLE_FIFO |
222*4882a593Smuzhiyun UART_FCR_R_TRIG_00 | UART_FCR_T_TRIG_00,
223*4882a593Smuzhiyun .flags = UART_CAP_FIFO,
224*4882a593Smuzhiyun },
225*4882a593Smuzhiyun [PORT_BRCM_TRUMANAGE] = {
226*4882a593Smuzhiyun .name = "TruManage",
227*4882a593Smuzhiyun .fifo_size = 1,
228*4882a593Smuzhiyun .tx_loadsz = 1024,
229*4882a593Smuzhiyun .flags = UART_CAP_HFIFO,
230*4882a593Smuzhiyun },
231*4882a593Smuzhiyun [PORT_8250_CIR] = {
232*4882a593Smuzhiyun .name = "CIR port"
233*4882a593Smuzhiyun },
234*4882a593Smuzhiyun [PORT_ALTR_16550_F32] = {
235*4882a593Smuzhiyun .name = "Altera 16550 FIFO32",
236*4882a593Smuzhiyun .fifo_size = 32,
237*4882a593Smuzhiyun .tx_loadsz = 32,
238*4882a593Smuzhiyun .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
239*4882a593Smuzhiyun .rxtrig_bytes = {1, 8, 16, 30},
240*4882a593Smuzhiyun .flags = UART_CAP_FIFO | UART_CAP_AFE,
241*4882a593Smuzhiyun },
242*4882a593Smuzhiyun [PORT_ALTR_16550_F64] = {
243*4882a593Smuzhiyun .name = "Altera 16550 FIFO64",
244*4882a593Smuzhiyun .fifo_size = 64,
245*4882a593Smuzhiyun .tx_loadsz = 64,
246*4882a593Smuzhiyun .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
247*4882a593Smuzhiyun .rxtrig_bytes = {1, 16, 32, 62},
248*4882a593Smuzhiyun .flags = UART_CAP_FIFO | UART_CAP_AFE,
249*4882a593Smuzhiyun },
250*4882a593Smuzhiyun [PORT_ALTR_16550_F128] = {
251*4882a593Smuzhiyun .name = "Altera 16550 FIFO128",
252*4882a593Smuzhiyun .fifo_size = 128,
253*4882a593Smuzhiyun .tx_loadsz = 128,
254*4882a593Smuzhiyun .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
255*4882a593Smuzhiyun .rxtrig_bytes = {1, 32, 64, 126},
256*4882a593Smuzhiyun .flags = UART_CAP_FIFO | UART_CAP_AFE,
257*4882a593Smuzhiyun },
258*4882a593Smuzhiyun /*
259*4882a593Smuzhiyun * tx_loadsz is set to 63-bytes instead of 64-bytes to implement
260*4882a593Smuzhiyun * workaround of errata A-008006 which states that tx_loadsz should
261*4882a593Smuzhiyun * be configured less than Maximum supported fifo bytes.
262*4882a593Smuzhiyun */
263*4882a593Smuzhiyun [PORT_16550A_FSL64] = {
264*4882a593Smuzhiyun .name = "16550A_FSL64",
265*4882a593Smuzhiyun .fifo_size = 64,
266*4882a593Smuzhiyun .tx_loadsz = 63,
267*4882a593Smuzhiyun .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 |
268*4882a593Smuzhiyun UART_FCR7_64BYTE,
269*4882a593Smuzhiyun .flags = UART_CAP_FIFO,
270*4882a593Smuzhiyun },
271*4882a593Smuzhiyun [PORT_RT2880] = {
272*4882a593Smuzhiyun .name = "Palmchip BK-3103",
273*4882a593Smuzhiyun .fifo_size = 16,
274*4882a593Smuzhiyun .tx_loadsz = 16,
275*4882a593Smuzhiyun .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
276*4882a593Smuzhiyun .rxtrig_bytes = {1, 4, 8, 14},
277*4882a593Smuzhiyun .flags = UART_CAP_FIFO,
278*4882a593Smuzhiyun },
279*4882a593Smuzhiyun [PORT_DA830] = {
280*4882a593Smuzhiyun .name = "TI DA8xx/66AK2x",
281*4882a593Smuzhiyun .fifo_size = 16,
282*4882a593Smuzhiyun .tx_loadsz = 16,
283*4882a593Smuzhiyun .fcr = UART_FCR_DMA_SELECT | UART_FCR_ENABLE_FIFO |
284*4882a593Smuzhiyun UART_FCR_R_TRIG_10,
285*4882a593Smuzhiyun .rxtrig_bytes = {1, 4, 8, 14},
286*4882a593Smuzhiyun .flags = UART_CAP_FIFO | UART_CAP_AFE,
287*4882a593Smuzhiyun },
288*4882a593Smuzhiyun [PORT_MTK_BTIF] = {
289*4882a593Smuzhiyun .name = "MediaTek BTIF",
290*4882a593Smuzhiyun .fifo_size = 16,
291*4882a593Smuzhiyun .tx_loadsz = 16,
292*4882a593Smuzhiyun .fcr = UART_FCR_ENABLE_FIFO |
293*4882a593Smuzhiyun UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT,
294*4882a593Smuzhiyun .flags = UART_CAP_FIFO,
295*4882a593Smuzhiyun },
296*4882a593Smuzhiyun [PORT_NPCM] = {
297*4882a593Smuzhiyun .name = "Nuvoton 16550",
298*4882a593Smuzhiyun .fifo_size = 16,
299*4882a593Smuzhiyun .tx_loadsz = 16,
300*4882a593Smuzhiyun .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 |
301*4882a593Smuzhiyun UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT,
302*4882a593Smuzhiyun .rxtrig_bytes = {1, 4, 8, 14},
303*4882a593Smuzhiyun .flags = UART_CAP_FIFO,
304*4882a593Smuzhiyun },
305*4882a593Smuzhiyun [PORT_SUNIX] = {
306*4882a593Smuzhiyun .name = "Sunix",
307*4882a593Smuzhiyun .fifo_size = 128,
308*4882a593Smuzhiyun .tx_loadsz = 128,
309*4882a593Smuzhiyun .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
310*4882a593Smuzhiyun .rxtrig_bytes = {1, 32, 64, 112},
311*4882a593Smuzhiyun .flags = UART_CAP_FIFO | UART_CAP_SLEEP,
312*4882a593Smuzhiyun },
313*4882a593Smuzhiyun #endif
314*4882a593Smuzhiyun };
315*4882a593Smuzhiyun
316*4882a593Smuzhiyun /* Uart divisor latch read */
default_serial_dl_read(struct uart_8250_port * up)317*4882a593Smuzhiyun static int default_serial_dl_read(struct uart_8250_port *up)
318*4882a593Smuzhiyun {
319*4882a593Smuzhiyun /* Assign these in pieces to truncate any bits above 7. */
320*4882a593Smuzhiyun unsigned char dll = serial_in(up, UART_DLL);
321*4882a593Smuzhiyun unsigned char dlm = serial_in(up, UART_DLM);
322*4882a593Smuzhiyun
323*4882a593Smuzhiyun return dll | dlm << 8;
324*4882a593Smuzhiyun }
325*4882a593Smuzhiyun
326*4882a593Smuzhiyun /* Uart divisor latch write */
default_serial_dl_write(struct uart_8250_port * up,int value)327*4882a593Smuzhiyun static void default_serial_dl_write(struct uart_8250_port *up, int value)
328*4882a593Smuzhiyun {
329*4882a593Smuzhiyun serial_out(up, UART_DLL, value & 0xff);
330*4882a593Smuzhiyun serial_out(up, UART_DLM, value >> 8 & 0xff);
331*4882a593Smuzhiyun }
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun #ifdef CONFIG_SERIAL_8250_RT288X
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun /* Au1x00/RT288x UART hardware has a weird register layout */
336*4882a593Smuzhiyun static const s8 au_io_in_map[8] = {
337*4882a593Smuzhiyun 0, /* UART_RX */
338*4882a593Smuzhiyun 2, /* UART_IER */
339*4882a593Smuzhiyun 3, /* UART_IIR */
340*4882a593Smuzhiyun 5, /* UART_LCR */
341*4882a593Smuzhiyun 6, /* UART_MCR */
342*4882a593Smuzhiyun 7, /* UART_LSR */
343*4882a593Smuzhiyun 8, /* UART_MSR */
344*4882a593Smuzhiyun -1, /* UART_SCR (unmapped) */
345*4882a593Smuzhiyun };
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun static const s8 au_io_out_map[8] = {
348*4882a593Smuzhiyun 1, /* UART_TX */
349*4882a593Smuzhiyun 2, /* UART_IER */
350*4882a593Smuzhiyun 4, /* UART_FCR */
351*4882a593Smuzhiyun 5, /* UART_LCR */
352*4882a593Smuzhiyun 6, /* UART_MCR */
353*4882a593Smuzhiyun -1, /* UART_LSR (unmapped) */
354*4882a593Smuzhiyun -1, /* UART_MSR (unmapped) */
355*4882a593Smuzhiyun -1, /* UART_SCR (unmapped) */
356*4882a593Smuzhiyun };
357*4882a593Smuzhiyun
au_serial_in(struct uart_port * p,int offset)358*4882a593Smuzhiyun unsigned int au_serial_in(struct uart_port *p, int offset)
359*4882a593Smuzhiyun {
360*4882a593Smuzhiyun if (offset >= ARRAY_SIZE(au_io_in_map))
361*4882a593Smuzhiyun return UINT_MAX;
362*4882a593Smuzhiyun offset = au_io_in_map[offset];
363*4882a593Smuzhiyun if (offset < 0)
364*4882a593Smuzhiyun return UINT_MAX;
365*4882a593Smuzhiyun return __raw_readl(p->membase + (offset << p->regshift));
366*4882a593Smuzhiyun }
367*4882a593Smuzhiyun
au_serial_out(struct uart_port * p,int offset,int value)368*4882a593Smuzhiyun void au_serial_out(struct uart_port *p, int offset, int value)
369*4882a593Smuzhiyun {
370*4882a593Smuzhiyun if (offset >= ARRAY_SIZE(au_io_out_map))
371*4882a593Smuzhiyun return;
372*4882a593Smuzhiyun offset = au_io_out_map[offset];
373*4882a593Smuzhiyun if (offset < 0)
374*4882a593Smuzhiyun return;
375*4882a593Smuzhiyun __raw_writel(value, p->membase + (offset << p->regshift));
376*4882a593Smuzhiyun }
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun /* Au1x00 haven't got a standard divisor latch */
au_serial_dl_read(struct uart_8250_port * up)379*4882a593Smuzhiyun static int au_serial_dl_read(struct uart_8250_port *up)
380*4882a593Smuzhiyun {
381*4882a593Smuzhiyun return __raw_readl(up->port.membase + 0x28);
382*4882a593Smuzhiyun }
383*4882a593Smuzhiyun
au_serial_dl_write(struct uart_8250_port * up,int value)384*4882a593Smuzhiyun static void au_serial_dl_write(struct uart_8250_port *up, int value)
385*4882a593Smuzhiyun {
386*4882a593Smuzhiyun __raw_writel(value, up->port.membase + 0x28);
387*4882a593Smuzhiyun }
388*4882a593Smuzhiyun
389*4882a593Smuzhiyun #endif
390*4882a593Smuzhiyun
391*4882a593Smuzhiyun #ifndef CONFIG_ROCKCHIP_MINI_KERNEL
hub6_serial_in(struct uart_port * p,int offset)392*4882a593Smuzhiyun static unsigned int hub6_serial_in(struct uart_port *p, int offset)
393*4882a593Smuzhiyun {
394*4882a593Smuzhiyun offset = offset << p->regshift;
395*4882a593Smuzhiyun outb(p->hub6 - 1 + offset, p->iobase);
396*4882a593Smuzhiyun return inb(p->iobase + 1);
397*4882a593Smuzhiyun }
398*4882a593Smuzhiyun
hub6_serial_out(struct uart_port * p,int offset,int value)399*4882a593Smuzhiyun static void hub6_serial_out(struct uart_port *p, int offset, int value)
400*4882a593Smuzhiyun {
401*4882a593Smuzhiyun offset = offset << p->regshift;
402*4882a593Smuzhiyun outb(p->hub6 - 1 + offset, p->iobase);
403*4882a593Smuzhiyun outb(value, p->iobase + 1);
404*4882a593Smuzhiyun }
405*4882a593Smuzhiyun
mem_serial_in(struct uart_port * p,int offset)406*4882a593Smuzhiyun static unsigned int mem_serial_in(struct uart_port *p, int offset)
407*4882a593Smuzhiyun {
408*4882a593Smuzhiyun offset = offset << p->regshift;
409*4882a593Smuzhiyun return readb(p->membase + offset);
410*4882a593Smuzhiyun }
411*4882a593Smuzhiyun
mem_serial_out(struct uart_port * p,int offset,int value)412*4882a593Smuzhiyun static void mem_serial_out(struct uart_port *p, int offset, int value)
413*4882a593Smuzhiyun {
414*4882a593Smuzhiyun offset = offset << p->regshift;
415*4882a593Smuzhiyun writeb(value, p->membase + offset);
416*4882a593Smuzhiyun }
417*4882a593Smuzhiyun
mem16_serial_out(struct uart_port * p,int offset,int value)418*4882a593Smuzhiyun static void mem16_serial_out(struct uart_port *p, int offset, int value)
419*4882a593Smuzhiyun {
420*4882a593Smuzhiyun offset = offset << p->regshift;
421*4882a593Smuzhiyun writew(value, p->membase + offset);
422*4882a593Smuzhiyun }
423*4882a593Smuzhiyun
mem16_serial_in(struct uart_port * p,int offset)424*4882a593Smuzhiyun static unsigned int mem16_serial_in(struct uart_port *p, int offset)
425*4882a593Smuzhiyun {
426*4882a593Smuzhiyun offset = offset << p->regshift;
427*4882a593Smuzhiyun return readw(p->membase + offset);
428*4882a593Smuzhiyun }
429*4882a593Smuzhiyun
mem32_serial_out(struct uart_port * p,int offset,int value)430*4882a593Smuzhiyun static void mem32_serial_out(struct uart_port *p, int offset, int value)
431*4882a593Smuzhiyun {
432*4882a593Smuzhiyun offset = offset << p->regshift;
433*4882a593Smuzhiyun writel(value, p->membase + offset);
434*4882a593Smuzhiyun }
435*4882a593Smuzhiyun
mem32_serial_in(struct uart_port * p,int offset)436*4882a593Smuzhiyun static unsigned int mem32_serial_in(struct uart_port *p, int offset)
437*4882a593Smuzhiyun {
438*4882a593Smuzhiyun offset = offset << p->regshift;
439*4882a593Smuzhiyun return readl(p->membase + offset);
440*4882a593Smuzhiyun }
441*4882a593Smuzhiyun
mem32be_serial_out(struct uart_port * p,int offset,int value)442*4882a593Smuzhiyun static void mem32be_serial_out(struct uart_port *p, int offset, int value)
443*4882a593Smuzhiyun {
444*4882a593Smuzhiyun offset = offset << p->regshift;
445*4882a593Smuzhiyun iowrite32be(value, p->membase + offset);
446*4882a593Smuzhiyun }
447*4882a593Smuzhiyun
mem32be_serial_in(struct uart_port * p,int offset)448*4882a593Smuzhiyun static unsigned int mem32be_serial_in(struct uart_port *p, int offset)
449*4882a593Smuzhiyun {
450*4882a593Smuzhiyun offset = offset << p->regshift;
451*4882a593Smuzhiyun return ioread32be(p->membase + offset);
452*4882a593Smuzhiyun }
453*4882a593Smuzhiyun
io_serial_in(struct uart_port * p,int offset)454*4882a593Smuzhiyun static unsigned int io_serial_in(struct uart_port *p, int offset)
455*4882a593Smuzhiyun {
456*4882a593Smuzhiyun offset = offset << p->regshift;
457*4882a593Smuzhiyun return inb(p->iobase + offset);
458*4882a593Smuzhiyun }
459*4882a593Smuzhiyun
io_serial_out(struct uart_port * p,int offset,int value)460*4882a593Smuzhiyun static void io_serial_out(struct uart_port *p, int offset, int value)
461*4882a593Smuzhiyun {
462*4882a593Smuzhiyun offset = offset << p->regshift;
463*4882a593Smuzhiyun outb(value, p->iobase + offset);
464*4882a593Smuzhiyun }
465*4882a593Smuzhiyun #endif
466*4882a593Smuzhiyun
467*4882a593Smuzhiyun static int serial8250_default_handle_irq(struct uart_port *port);
468*4882a593Smuzhiyun
set_io_from_upio(struct uart_port * p)469*4882a593Smuzhiyun static void set_io_from_upio(struct uart_port *p)
470*4882a593Smuzhiyun {
471*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(p);
472*4882a593Smuzhiyun
473*4882a593Smuzhiyun up->dl_read = default_serial_dl_read;
474*4882a593Smuzhiyun up->dl_write = default_serial_dl_write;
475*4882a593Smuzhiyun
476*4882a593Smuzhiyun #ifndef CONFIG_ROCKCHIP_MINI_KERNEL
477*4882a593Smuzhiyun switch (p->iotype) {
478*4882a593Smuzhiyun case UPIO_HUB6:
479*4882a593Smuzhiyun p->serial_in = hub6_serial_in;
480*4882a593Smuzhiyun p->serial_out = hub6_serial_out;
481*4882a593Smuzhiyun break;
482*4882a593Smuzhiyun
483*4882a593Smuzhiyun case UPIO_MEM:
484*4882a593Smuzhiyun p->serial_in = mem_serial_in;
485*4882a593Smuzhiyun p->serial_out = mem_serial_out;
486*4882a593Smuzhiyun break;
487*4882a593Smuzhiyun
488*4882a593Smuzhiyun case UPIO_MEM16:
489*4882a593Smuzhiyun p->serial_in = mem16_serial_in;
490*4882a593Smuzhiyun p->serial_out = mem16_serial_out;
491*4882a593Smuzhiyun break;
492*4882a593Smuzhiyun
493*4882a593Smuzhiyun case UPIO_MEM32:
494*4882a593Smuzhiyun p->serial_in = mem32_serial_in;
495*4882a593Smuzhiyun p->serial_out = mem32_serial_out;
496*4882a593Smuzhiyun break;
497*4882a593Smuzhiyun
498*4882a593Smuzhiyun case UPIO_MEM32BE:
499*4882a593Smuzhiyun p->serial_in = mem32be_serial_in;
500*4882a593Smuzhiyun p->serial_out = mem32be_serial_out;
501*4882a593Smuzhiyun break;
502*4882a593Smuzhiyun
503*4882a593Smuzhiyun #ifdef CONFIG_SERIAL_8250_RT288X
504*4882a593Smuzhiyun case UPIO_AU:
505*4882a593Smuzhiyun p->serial_in = au_serial_in;
506*4882a593Smuzhiyun p->serial_out = au_serial_out;
507*4882a593Smuzhiyun up->dl_read = au_serial_dl_read;
508*4882a593Smuzhiyun up->dl_write = au_serial_dl_write;
509*4882a593Smuzhiyun break;
510*4882a593Smuzhiyun #endif
511*4882a593Smuzhiyun
512*4882a593Smuzhiyun default:
513*4882a593Smuzhiyun p->serial_in = io_serial_in;
514*4882a593Smuzhiyun p->serial_out = io_serial_out;
515*4882a593Smuzhiyun break;
516*4882a593Smuzhiyun }
517*4882a593Smuzhiyun #endif
518*4882a593Smuzhiyun /* Remember loaded iotype */
519*4882a593Smuzhiyun up->cur_iotype = p->iotype;
520*4882a593Smuzhiyun p->handle_irq = serial8250_default_handle_irq;
521*4882a593Smuzhiyun }
522*4882a593Smuzhiyun
523*4882a593Smuzhiyun static void
serial_port_out_sync(struct uart_port * p,int offset,int value)524*4882a593Smuzhiyun serial_port_out_sync(struct uart_port *p, int offset, int value)
525*4882a593Smuzhiyun {
526*4882a593Smuzhiyun switch (p->iotype) {
527*4882a593Smuzhiyun case UPIO_MEM:
528*4882a593Smuzhiyun case UPIO_MEM16:
529*4882a593Smuzhiyun case UPIO_MEM32:
530*4882a593Smuzhiyun case UPIO_MEM32BE:
531*4882a593Smuzhiyun case UPIO_AU:
532*4882a593Smuzhiyun p->serial_out(p, offset, value);
533*4882a593Smuzhiyun p->serial_in(p, UART_LCR); /* safe, no side-effects */
534*4882a593Smuzhiyun break;
535*4882a593Smuzhiyun default:
536*4882a593Smuzhiyun p->serial_out(p, offset, value);
537*4882a593Smuzhiyun }
538*4882a593Smuzhiyun }
539*4882a593Smuzhiyun
540*4882a593Smuzhiyun /*
541*4882a593Smuzhiyun * FIFO support.
542*4882a593Smuzhiyun */
serial8250_clear_fifos(struct uart_8250_port * p)543*4882a593Smuzhiyun static void serial8250_clear_fifos(struct uart_8250_port *p)
544*4882a593Smuzhiyun {
545*4882a593Smuzhiyun if (p->capabilities & UART_CAP_FIFO) {
546*4882a593Smuzhiyun serial_out(p, UART_FCR, UART_FCR_ENABLE_FIFO);
547*4882a593Smuzhiyun serial_out(p, UART_FCR, UART_FCR_ENABLE_FIFO |
548*4882a593Smuzhiyun UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
549*4882a593Smuzhiyun serial_out(p, UART_FCR, 0);
550*4882a593Smuzhiyun }
551*4882a593Smuzhiyun }
552*4882a593Smuzhiyun
553*4882a593Smuzhiyun static enum hrtimer_restart serial8250_em485_handle_start_tx(struct hrtimer *t);
554*4882a593Smuzhiyun static enum hrtimer_restart serial8250_em485_handle_stop_tx(struct hrtimer *t);
555*4882a593Smuzhiyun
serial8250_clear_and_reinit_fifos(struct uart_8250_port * p)556*4882a593Smuzhiyun void serial8250_clear_and_reinit_fifos(struct uart_8250_port *p)
557*4882a593Smuzhiyun {
558*4882a593Smuzhiyun serial8250_clear_fifos(p);
559*4882a593Smuzhiyun serial_out(p, UART_FCR, p->fcr);
560*4882a593Smuzhiyun }
561*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(serial8250_clear_and_reinit_fifos);
562*4882a593Smuzhiyun
serial8250_rpm_get(struct uart_8250_port * p)563*4882a593Smuzhiyun void serial8250_rpm_get(struct uart_8250_port *p)
564*4882a593Smuzhiyun {
565*4882a593Smuzhiyun if (!(p->capabilities & UART_CAP_RPM))
566*4882a593Smuzhiyun return;
567*4882a593Smuzhiyun pm_runtime_get_sync(p->port.dev);
568*4882a593Smuzhiyun }
569*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(serial8250_rpm_get);
570*4882a593Smuzhiyun
serial8250_rpm_put(struct uart_8250_port * p)571*4882a593Smuzhiyun void serial8250_rpm_put(struct uart_8250_port *p)
572*4882a593Smuzhiyun {
573*4882a593Smuzhiyun if (!(p->capabilities & UART_CAP_RPM))
574*4882a593Smuzhiyun return;
575*4882a593Smuzhiyun pm_runtime_mark_last_busy(p->port.dev);
576*4882a593Smuzhiyun pm_runtime_put_autosuspend(p->port.dev);
577*4882a593Smuzhiyun }
578*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(serial8250_rpm_put);
579*4882a593Smuzhiyun
580*4882a593Smuzhiyun /**
581*4882a593Smuzhiyun * serial8250_em485_init() - put uart_8250_port into rs485 emulating
582*4882a593Smuzhiyun * @p: uart_8250_port port instance
583*4882a593Smuzhiyun *
584*4882a593Smuzhiyun * The function is used to start rs485 software emulating on the
585*4882a593Smuzhiyun * &struct uart_8250_port* @p. Namely, RTS is switched before/after
586*4882a593Smuzhiyun * transmission. The function is idempotent, so it is safe to call it
587*4882a593Smuzhiyun * multiple times.
588*4882a593Smuzhiyun *
589*4882a593Smuzhiyun * The caller MUST enable interrupt on empty shift register before
590*4882a593Smuzhiyun * calling serial8250_em485_init(). This interrupt is not a part of
591*4882a593Smuzhiyun * 8250 standard, but implementation defined.
592*4882a593Smuzhiyun *
593*4882a593Smuzhiyun * The function is supposed to be called from .rs485_config callback
594*4882a593Smuzhiyun * or from any other callback protected with p->port.lock spinlock.
595*4882a593Smuzhiyun *
596*4882a593Smuzhiyun * See also serial8250_em485_destroy()
597*4882a593Smuzhiyun *
598*4882a593Smuzhiyun * Return 0 - success, -errno - otherwise
599*4882a593Smuzhiyun */
serial8250_em485_init(struct uart_8250_port * p)600*4882a593Smuzhiyun static int serial8250_em485_init(struct uart_8250_port *p)
601*4882a593Smuzhiyun {
602*4882a593Smuzhiyun if (p->em485)
603*4882a593Smuzhiyun goto deassert_rts;
604*4882a593Smuzhiyun
605*4882a593Smuzhiyun p->em485 = kmalloc(sizeof(struct uart_8250_em485), GFP_ATOMIC);
606*4882a593Smuzhiyun if (!p->em485)
607*4882a593Smuzhiyun return -ENOMEM;
608*4882a593Smuzhiyun
609*4882a593Smuzhiyun hrtimer_init(&p->em485->stop_tx_timer, CLOCK_MONOTONIC,
610*4882a593Smuzhiyun HRTIMER_MODE_REL);
611*4882a593Smuzhiyun hrtimer_init(&p->em485->start_tx_timer, CLOCK_MONOTONIC,
612*4882a593Smuzhiyun HRTIMER_MODE_REL);
613*4882a593Smuzhiyun p->em485->stop_tx_timer.function = &serial8250_em485_handle_stop_tx;
614*4882a593Smuzhiyun p->em485->start_tx_timer.function = &serial8250_em485_handle_start_tx;
615*4882a593Smuzhiyun p->em485->port = p;
616*4882a593Smuzhiyun p->em485->active_timer = NULL;
617*4882a593Smuzhiyun p->em485->tx_stopped = true;
618*4882a593Smuzhiyun
619*4882a593Smuzhiyun deassert_rts:
620*4882a593Smuzhiyun if (p->em485->tx_stopped)
621*4882a593Smuzhiyun p->rs485_stop_tx(p);
622*4882a593Smuzhiyun
623*4882a593Smuzhiyun return 0;
624*4882a593Smuzhiyun }
625*4882a593Smuzhiyun
626*4882a593Smuzhiyun /**
627*4882a593Smuzhiyun * serial8250_em485_destroy() - put uart_8250_port into normal state
628*4882a593Smuzhiyun * @p: uart_8250_port port instance
629*4882a593Smuzhiyun *
630*4882a593Smuzhiyun * The function is used to stop rs485 software emulating on the
631*4882a593Smuzhiyun * &struct uart_8250_port* @p. The function is idempotent, so it is safe to
632*4882a593Smuzhiyun * call it multiple times.
633*4882a593Smuzhiyun *
634*4882a593Smuzhiyun * The function is supposed to be called from .rs485_config callback
635*4882a593Smuzhiyun * or from any other callback protected with p->port.lock spinlock.
636*4882a593Smuzhiyun *
637*4882a593Smuzhiyun * See also serial8250_em485_init()
638*4882a593Smuzhiyun */
serial8250_em485_destroy(struct uart_8250_port * p)639*4882a593Smuzhiyun void serial8250_em485_destroy(struct uart_8250_port *p)
640*4882a593Smuzhiyun {
641*4882a593Smuzhiyun if (!p->em485)
642*4882a593Smuzhiyun return;
643*4882a593Smuzhiyun
644*4882a593Smuzhiyun hrtimer_cancel(&p->em485->start_tx_timer);
645*4882a593Smuzhiyun hrtimer_cancel(&p->em485->stop_tx_timer);
646*4882a593Smuzhiyun
647*4882a593Smuzhiyun kfree(p->em485);
648*4882a593Smuzhiyun p->em485 = NULL;
649*4882a593Smuzhiyun }
650*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(serial8250_em485_destroy);
651*4882a593Smuzhiyun
652*4882a593Smuzhiyun /**
653*4882a593Smuzhiyun * serial8250_em485_config() - generic ->rs485_config() callback
654*4882a593Smuzhiyun * @port: uart port
655*4882a593Smuzhiyun * @rs485: rs485 settings
656*4882a593Smuzhiyun *
657*4882a593Smuzhiyun * Generic callback usable by 8250 uart drivers to activate rs485 settings
658*4882a593Smuzhiyun * if the uart is incapable of driving RTS as a Transmit Enable signal in
659*4882a593Smuzhiyun * hardware, relying on software emulation instead.
660*4882a593Smuzhiyun */
serial8250_em485_config(struct uart_port * port,struct serial_rs485 * rs485)661*4882a593Smuzhiyun int serial8250_em485_config(struct uart_port *port, struct serial_rs485 *rs485)
662*4882a593Smuzhiyun {
663*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
664*4882a593Smuzhiyun
665*4882a593Smuzhiyun /* pick sane settings if the user hasn't */
666*4882a593Smuzhiyun if (!!(rs485->flags & SER_RS485_RTS_ON_SEND) ==
667*4882a593Smuzhiyun !!(rs485->flags & SER_RS485_RTS_AFTER_SEND)) {
668*4882a593Smuzhiyun rs485->flags |= SER_RS485_RTS_ON_SEND;
669*4882a593Smuzhiyun rs485->flags &= ~SER_RS485_RTS_AFTER_SEND;
670*4882a593Smuzhiyun }
671*4882a593Smuzhiyun
672*4882a593Smuzhiyun gpiod_set_value(port->rs485_term_gpio,
673*4882a593Smuzhiyun rs485->flags & SER_RS485_TERMINATE_BUS);
674*4882a593Smuzhiyun
675*4882a593Smuzhiyun /*
676*4882a593Smuzhiyun * Both serial8250_em485_init() and serial8250_em485_destroy()
677*4882a593Smuzhiyun * are idempotent.
678*4882a593Smuzhiyun */
679*4882a593Smuzhiyun if (rs485->flags & SER_RS485_ENABLED)
680*4882a593Smuzhiyun return serial8250_em485_init(up);
681*4882a593Smuzhiyun
682*4882a593Smuzhiyun serial8250_em485_destroy(up);
683*4882a593Smuzhiyun return 0;
684*4882a593Smuzhiyun }
685*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(serial8250_em485_config);
686*4882a593Smuzhiyun
687*4882a593Smuzhiyun /*
688*4882a593Smuzhiyun * These two wrappers ensure that enable_runtime_pm_tx() can be called more than
689*4882a593Smuzhiyun * once and disable_runtime_pm_tx() will still disable RPM because the fifo is
690*4882a593Smuzhiyun * empty and the HW can idle again.
691*4882a593Smuzhiyun */
serial8250_rpm_get_tx(struct uart_8250_port * p)692*4882a593Smuzhiyun void serial8250_rpm_get_tx(struct uart_8250_port *p)
693*4882a593Smuzhiyun {
694*4882a593Smuzhiyun unsigned char rpm_active;
695*4882a593Smuzhiyun
696*4882a593Smuzhiyun if (!(p->capabilities & UART_CAP_RPM))
697*4882a593Smuzhiyun return;
698*4882a593Smuzhiyun
699*4882a593Smuzhiyun rpm_active = xchg(&p->rpm_tx_active, 1);
700*4882a593Smuzhiyun if (rpm_active)
701*4882a593Smuzhiyun return;
702*4882a593Smuzhiyun pm_runtime_get_sync(p->port.dev);
703*4882a593Smuzhiyun }
704*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(serial8250_rpm_get_tx);
705*4882a593Smuzhiyun
serial8250_rpm_put_tx(struct uart_8250_port * p)706*4882a593Smuzhiyun void serial8250_rpm_put_tx(struct uart_8250_port *p)
707*4882a593Smuzhiyun {
708*4882a593Smuzhiyun unsigned char rpm_active;
709*4882a593Smuzhiyun
710*4882a593Smuzhiyun if (!(p->capabilities & UART_CAP_RPM))
711*4882a593Smuzhiyun return;
712*4882a593Smuzhiyun
713*4882a593Smuzhiyun rpm_active = xchg(&p->rpm_tx_active, 0);
714*4882a593Smuzhiyun if (!rpm_active)
715*4882a593Smuzhiyun return;
716*4882a593Smuzhiyun pm_runtime_mark_last_busy(p->port.dev);
717*4882a593Smuzhiyun pm_runtime_put_autosuspend(p->port.dev);
718*4882a593Smuzhiyun }
719*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(serial8250_rpm_put_tx);
720*4882a593Smuzhiyun
721*4882a593Smuzhiyun /*
722*4882a593Smuzhiyun * IER sleep support. UARTs which have EFRs need the "extended
723*4882a593Smuzhiyun * capability" bit enabled. Note that on XR16C850s, we need to
724*4882a593Smuzhiyun * reset LCR to write to IER.
725*4882a593Smuzhiyun */
serial8250_set_sleep(struct uart_8250_port * p,int sleep)726*4882a593Smuzhiyun static void serial8250_set_sleep(struct uart_8250_port *p, int sleep)
727*4882a593Smuzhiyun {
728*4882a593Smuzhiyun unsigned char lcr = 0, efr = 0;
729*4882a593Smuzhiyun
730*4882a593Smuzhiyun serial8250_rpm_get(p);
731*4882a593Smuzhiyun
732*4882a593Smuzhiyun if (p->capabilities & UART_CAP_SLEEP) {
733*4882a593Smuzhiyun if (p->capabilities & UART_CAP_EFR) {
734*4882a593Smuzhiyun lcr = serial_in(p, UART_LCR);
735*4882a593Smuzhiyun efr = serial_in(p, UART_EFR);
736*4882a593Smuzhiyun serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B);
737*4882a593Smuzhiyun serial_out(p, UART_EFR, UART_EFR_ECB);
738*4882a593Smuzhiyun serial_out(p, UART_LCR, 0);
739*4882a593Smuzhiyun }
740*4882a593Smuzhiyun serial_out(p, UART_IER, sleep ? UART_IERX_SLEEP : 0);
741*4882a593Smuzhiyun if (p->capabilities & UART_CAP_EFR) {
742*4882a593Smuzhiyun serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B);
743*4882a593Smuzhiyun serial_out(p, UART_EFR, efr);
744*4882a593Smuzhiyun serial_out(p, UART_LCR, lcr);
745*4882a593Smuzhiyun }
746*4882a593Smuzhiyun }
747*4882a593Smuzhiyun
748*4882a593Smuzhiyun serial8250_rpm_put(p);
749*4882a593Smuzhiyun }
750*4882a593Smuzhiyun
751*4882a593Smuzhiyun #ifdef CONFIG_SERIAL_8250_RSA
752*4882a593Smuzhiyun /*
753*4882a593Smuzhiyun * Attempts to turn on the RSA FIFO. Returns zero on failure.
754*4882a593Smuzhiyun * We set the port uart clock rate if we succeed.
755*4882a593Smuzhiyun */
__enable_rsa(struct uart_8250_port * up)756*4882a593Smuzhiyun static int __enable_rsa(struct uart_8250_port *up)
757*4882a593Smuzhiyun {
758*4882a593Smuzhiyun unsigned char mode;
759*4882a593Smuzhiyun int result;
760*4882a593Smuzhiyun
761*4882a593Smuzhiyun mode = serial_in(up, UART_RSA_MSR);
762*4882a593Smuzhiyun result = mode & UART_RSA_MSR_FIFO;
763*4882a593Smuzhiyun
764*4882a593Smuzhiyun if (!result) {
765*4882a593Smuzhiyun serial_out(up, UART_RSA_MSR, mode | UART_RSA_MSR_FIFO);
766*4882a593Smuzhiyun mode = serial_in(up, UART_RSA_MSR);
767*4882a593Smuzhiyun result = mode & UART_RSA_MSR_FIFO;
768*4882a593Smuzhiyun }
769*4882a593Smuzhiyun
770*4882a593Smuzhiyun if (result)
771*4882a593Smuzhiyun up->port.uartclk = SERIAL_RSA_BAUD_BASE * 16;
772*4882a593Smuzhiyun
773*4882a593Smuzhiyun return result;
774*4882a593Smuzhiyun }
775*4882a593Smuzhiyun
enable_rsa(struct uart_8250_port * up)776*4882a593Smuzhiyun static void enable_rsa(struct uart_8250_port *up)
777*4882a593Smuzhiyun {
778*4882a593Smuzhiyun if (up->port.type == PORT_RSA) {
779*4882a593Smuzhiyun if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) {
780*4882a593Smuzhiyun spin_lock_irq(&up->port.lock);
781*4882a593Smuzhiyun __enable_rsa(up);
782*4882a593Smuzhiyun spin_unlock_irq(&up->port.lock);
783*4882a593Smuzhiyun }
784*4882a593Smuzhiyun if (up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16)
785*4882a593Smuzhiyun serial_out(up, UART_RSA_FRR, 0);
786*4882a593Smuzhiyun }
787*4882a593Smuzhiyun }
788*4882a593Smuzhiyun
789*4882a593Smuzhiyun /*
790*4882a593Smuzhiyun * Attempts to turn off the RSA FIFO. Returns zero on failure.
791*4882a593Smuzhiyun * It is unknown why interrupts were disabled in here. However,
792*4882a593Smuzhiyun * the caller is expected to preserve this behaviour by grabbing
793*4882a593Smuzhiyun * the spinlock before calling this function.
794*4882a593Smuzhiyun */
disable_rsa(struct uart_8250_port * up)795*4882a593Smuzhiyun static void disable_rsa(struct uart_8250_port *up)
796*4882a593Smuzhiyun {
797*4882a593Smuzhiyun unsigned char mode;
798*4882a593Smuzhiyun int result;
799*4882a593Smuzhiyun
800*4882a593Smuzhiyun if (up->port.type == PORT_RSA &&
801*4882a593Smuzhiyun up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) {
802*4882a593Smuzhiyun spin_lock_irq(&up->port.lock);
803*4882a593Smuzhiyun
804*4882a593Smuzhiyun mode = serial_in(up, UART_RSA_MSR);
805*4882a593Smuzhiyun result = !(mode & UART_RSA_MSR_FIFO);
806*4882a593Smuzhiyun
807*4882a593Smuzhiyun if (!result) {
808*4882a593Smuzhiyun serial_out(up, UART_RSA_MSR, mode & ~UART_RSA_MSR_FIFO);
809*4882a593Smuzhiyun mode = serial_in(up, UART_RSA_MSR);
810*4882a593Smuzhiyun result = !(mode & UART_RSA_MSR_FIFO);
811*4882a593Smuzhiyun }
812*4882a593Smuzhiyun
813*4882a593Smuzhiyun if (result)
814*4882a593Smuzhiyun up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16;
815*4882a593Smuzhiyun spin_unlock_irq(&up->port.lock);
816*4882a593Smuzhiyun }
817*4882a593Smuzhiyun }
818*4882a593Smuzhiyun #endif /* CONFIG_SERIAL_8250_RSA */
819*4882a593Smuzhiyun
820*4882a593Smuzhiyun /*
821*4882a593Smuzhiyun * This is a quickie test to see how big the FIFO is.
822*4882a593Smuzhiyun * It doesn't work at all the time, more's the pity.
823*4882a593Smuzhiyun */
size_fifo(struct uart_8250_port * up)824*4882a593Smuzhiyun static int size_fifo(struct uart_8250_port *up)
825*4882a593Smuzhiyun {
826*4882a593Smuzhiyun unsigned char old_fcr, old_mcr, old_lcr;
827*4882a593Smuzhiyun unsigned short old_dl;
828*4882a593Smuzhiyun int count;
829*4882a593Smuzhiyun
830*4882a593Smuzhiyun old_lcr = serial_in(up, UART_LCR);
831*4882a593Smuzhiyun serial_out(up, UART_LCR, 0);
832*4882a593Smuzhiyun old_fcr = serial_in(up, UART_FCR);
833*4882a593Smuzhiyun old_mcr = serial8250_in_MCR(up);
834*4882a593Smuzhiyun serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO |
835*4882a593Smuzhiyun UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
836*4882a593Smuzhiyun serial8250_out_MCR(up, UART_MCR_LOOP);
837*4882a593Smuzhiyun serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
838*4882a593Smuzhiyun old_dl = serial_dl_read(up);
839*4882a593Smuzhiyun serial_dl_write(up, 0x0001);
840*4882a593Smuzhiyun serial_out(up, UART_LCR, 0x03);
841*4882a593Smuzhiyun for (count = 0; count < 256; count++)
842*4882a593Smuzhiyun serial_out(up, UART_TX, count);
843*4882a593Smuzhiyun mdelay(20);/* FIXME - schedule_timeout */
844*4882a593Smuzhiyun for (count = 0; (serial_in(up, UART_LSR) & UART_LSR_DR) &&
845*4882a593Smuzhiyun (count < 256); count++)
846*4882a593Smuzhiyun serial_in(up, UART_RX);
847*4882a593Smuzhiyun serial_out(up, UART_FCR, old_fcr);
848*4882a593Smuzhiyun serial8250_out_MCR(up, old_mcr);
849*4882a593Smuzhiyun serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
850*4882a593Smuzhiyun serial_dl_write(up, old_dl);
851*4882a593Smuzhiyun serial_out(up, UART_LCR, old_lcr);
852*4882a593Smuzhiyun
853*4882a593Smuzhiyun return count;
854*4882a593Smuzhiyun }
855*4882a593Smuzhiyun
856*4882a593Smuzhiyun /*
857*4882a593Smuzhiyun * Read UART ID using the divisor method - set DLL and DLM to zero
858*4882a593Smuzhiyun * and the revision will be in DLL and device type in DLM. We
859*4882a593Smuzhiyun * preserve the device state across this.
860*4882a593Smuzhiyun */
autoconfig_read_divisor_id(struct uart_8250_port * p)861*4882a593Smuzhiyun static unsigned int autoconfig_read_divisor_id(struct uart_8250_port *p)
862*4882a593Smuzhiyun {
863*4882a593Smuzhiyun unsigned char old_lcr;
864*4882a593Smuzhiyun unsigned int id, old_dl;
865*4882a593Smuzhiyun
866*4882a593Smuzhiyun old_lcr = serial_in(p, UART_LCR);
867*4882a593Smuzhiyun serial_out(p, UART_LCR, UART_LCR_CONF_MODE_A);
868*4882a593Smuzhiyun old_dl = serial_dl_read(p);
869*4882a593Smuzhiyun serial_dl_write(p, 0);
870*4882a593Smuzhiyun id = serial_dl_read(p);
871*4882a593Smuzhiyun serial_dl_write(p, old_dl);
872*4882a593Smuzhiyun
873*4882a593Smuzhiyun serial_out(p, UART_LCR, old_lcr);
874*4882a593Smuzhiyun
875*4882a593Smuzhiyun return id;
876*4882a593Smuzhiyun }
877*4882a593Smuzhiyun
878*4882a593Smuzhiyun /*
879*4882a593Smuzhiyun * This is a helper routine to autodetect StarTech/Exar/Oxsemi UART's.
880*4882a593Smuzhiyun * When this function is called we know it is at least a StarTech
881*4882a593Smuzhiyun * 16650 V2, but it might be one of several StarTech UARTs, or one of
882*4882a593Smuzhiyun * its clones. (We treat the broken original StarTech 16650 V1 as a
883*4882a593Smuzhiyun * 16550, and why not? Startech doesn't seem to even acknowledge its
884*4882a593Smuzhiyun * existence.)
885*4882a593Smuzhiyun *
886*4882a593Smuzhiyun * What evil have men's minds wrought...
887*4882a593Smuzhiyun */
autoconfig_has_efr(struct uart_8250_port * up)888*4882a593Smuzhiyun static void autoconfig_has_efr(struct uart_8250_port *up)
889*4882a593Smuzhiyun {
890*4882a593Smuzhiyun unsigned int id1, id2, id3, rev;
891*4882a593Smuzhiyun
892*4882a593Smuzhiyun /*
893*4882a593Smuzhiyun * Everything with an EFR has SLEEP
894*4882a593Smuzhiyun */
895*4882a593Smuzhiyun up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP;
896*4882a593Smuzhiyun
897*4882a593Smuzhiyun /*
898*4882a593Smuzhiyun * First we check to see if it's an Oxford Semiconductor UART.
899*4882a593Smuzhiyun *
900*4882a593Smuzhiyun * If we have to do this here because some non-National
901*4882a593Smuzhiyun * Semiconductor clone chips lock up if you try writing to the
902*4882a593Smuzhiyun * LSR register (which serial_icr_read does)
903*4882a593Smuzhiyun */
904*4882a593Smuzhiyun
905*4882a593Smuzhiyun /*
906*4882a593Smuzhiyun * Check for Oxford Semiconductor 16C950.
907*4882a593Smuzhiyun *
908*4882a593Smuzhiyun * EFR [4] must be set else this test fails.
909*4882a593Smuzhiyun *
910*4882a593Smuzhiyun * This shouldn't be necessary, but Mike Hudson (Exoray@isys.ca)
911*4882a593Smuzhiyun * claims that it's needed for 952 dual UART's (which are not
912*4882a593Smuzhiyun * recommended for new designs).
913*4882a593Smuzhiyun */
914*4882a593Smuzhiyun up->acr = 0;
915*4882a593Smuzhiyun serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
916*4882a593Smuzhiyun serial_out(up, UART_EFR, UART_EFR_ECB);
917*4882a593Smuzhiyun serial_out(up, UART_LCR, 0x00);
918*4882a593Smuzhiyun id1 = serial_icr_read(up, UART_ID1);
919*4882a593Smuzhiyun id2 = serial_icr_read(up, UART_ID2);
920*4882a593Smuzhiyun id3 = serial_icr_read(up, UART_ID3);
921*4882a593Smuzhiyun rev = serial_icr_read(up, UART_REV);
922*4882a593Smuzhiyun
923*4882a593Smuzhiyun DEBUG_AUTOCONF("950id=%02x:%02x:%02x:%02x ", id1, id2, id3, rev);
924*4882a593Smuzhiyun
925*4882a593Smuzhiyun if (id1 == 0x16 && id2 == 0xC9 &&
926*4882a593Smuzhiyun (id3 == 0x50 || id3 == 0x52 || id3 == 0x54)) {
927*4882a593Smuzhiyun up->port.type = PORT_16C950;
928*4882a593Smuzhiyun
929*4882a593Smuzhiyun /*
930*4882a593Smuzhiyun * Enable work around for the Oxford Semiconductor 952 rev B
931*4882a593Smuzhiyun * chip which causes it to seriously miscalculate baud rates
932*4882a593Smuzhiyun * when DLL is 0.
933*4882a593Smuzhiyun */
934*4882a593Smuzhiyun if (id3 == 0x52 && rev == 0x01)
935*4882a593Smuzhiyun up->bugs |= UART_BUG_QUOT;
936*4882a593Smuzhiyun return;
937*4882a593Smuzhiyun }
938*4882a593Smuzhiyun
939*4882a593Smuzhiyun /*
940*4882a593Smuzhiyun * We check for a XR16C850 by setting DLL and DLM to 0, and then
941*4882a593Smuzhiyun * reading back DLL and DLM. The chip type depends on the DLM
942*4882a593Smuzhiyun * value read back:
943*4882a593Smuzhiyun * 0x10 - XR16C850 and the DLL contains the chip revision.
944*4882a593Smuzhiyun * 0x12 - XR16C2850.
945*4882a593Smuzhiyun * 0x14 - XR16C854.
946*4882a593Smuzhiyun */
947*4882a593Smuzhiyun id1 = autoconfig_read_divisor_id(up);
948*4882a593Smuzhiyun DEBUG_AUTOCONF("850id=%04x ", id1);
949*4882a593Smuzhiyun
950*4882a593Smuzhiyun id2 = id1 >> 8;
951*4882a593Smuzhiyun if (id2 == 0x10 || id2 == 0x12 || id2 == 0x14) {
952*4882a593Smuzhiyun up->port.type = PORT_16850;
953*4882a593Smuzhiyun return;
954*4882a593Smuzhiyun }
955*4882a593Smuzhiyun
956*4882a593Smuzhiyun /*
957*4882a593Smuzhiyun * It wasn't an XR16C850.
958*4882a593Smuzhiyun *
959*4882a593Smuzhiyun * We distinguish between the '654 and the '650 by counting
960*4882a593Smuzhiyun * how many bytes are in the FIFO. I'm using this for now,
961*4882a593Smuzhiyun * since that's the technique that was sent to me in the
962*4882a593Smuzhiyun * serial driver update, but I'm not convinced this works.
963*4882a593Smuzhiyun * I've had problems doing this in the past. -TYT
964*4882a593Smuzhiyun */
965*4882a593Smuzhiyun if (size_fifo(up) == 64)
966*4882a593Smuzhiyun up->port.type = PORT_16654;
967*4882a593Smuzhiyun else
968*4882a593Smuzhiyun up->port.type = PORT_16650V2;
969*4882a593Smuzhiyun }
970*4882a593Smuzhiyun
971*4882a593Smuzhiyun /*
972*4882a593Smuzhiyun * We detected a chip without a FIFO. Only two fall into
973*4882a593Smuzhiyun * this category - the original 8250 and the 16450. The
974*4882a593Smuzhiyun * 16450 has a scratch register (accessible with LCR=0)
975*4882a593Smuzhiyun */
autoconfig_8250(struct uart_8250_port * up)976*4882a593Smuzhiyun static void autoconfig_8250(struct uart_8250_port *up)
977*4882a593Smuzhiyun {
978*4882a593Smuzhiyun unsigned char scratch, status1, status2;
979*4882a593Smuzhiyun
980*4882a593Smuzhiyun up->port.type = PORT_8250;
981*4882a593Smuzhiyun
982*4882a593Smuzhiyun scratch = serial_in(up, UART_SCR);
983*4882a593Smuzhiyun serial_out(up, UART_SCR, 0xa5);
984*4882a593Smuzhiyun status1 = serial_in(up, UART_SCR);
985*4882a593Smuzhiyun serial_out(up, UART_SCR, 0x5a);
986*4882a593Smuzhiyun status2 = serial_in(up, UART_SCR);
987*4882a593Smuzhiyun serial_out(up, UART_SCR, scratch);
988*4882a593Smuzhiyun
989*4882a593Smuzhiyun if (status1 == 0xa5 && status2 == 0x5a)
990*4882a593Smuzhiyun up->port.type = PORT_16450;
991*4882a593Smuzhiyun }
992*4882a593Smuzhiyun
broken_efr(struct uart_8250_port * up)993*4882a593Smuzhiyun static int broken_efr(struct uart_8250_port *up)
994*4882a593Smuzhiyun {
995*4882a593Smuzhiyun /*
996*4882a593Smuzhiyun * Exar ST16C2550 "A2" devices incorrectly detect as
997*4882a593Smuzhiyun * having an EFR, and report an ID of 0x0201. See
998*4882a593Smuzhiyun * http://linux.derkeiler.com/Mailing-Lists/Kernel/2004-11/4812.html
999*4882a593Smuzhiyun */
1000*4882a593Smuzhiyun if (autoconfig_read_divisor_id(up) == 0x0201 && size_fifo(up) == 16)
1001*4882a593Smuzhiyun return 1;
1002*4882a593Smuzhiyun
1003*4882a593Smuzhiyun return 0;
1004*4882a593Smuzhiyun }
1005*4882a593Smuzhiyun
1006*4882a593Smuzhiyun /*
1007*4882a593Smuzhiyun * We know that the chip has FIFOs. Does it have an EFR? The
1008*4882a593Smuzhiyun * EFR is located in the same register position as the IIR and
1009*4882a593Smuzhiyun * we know the top two bits of the IIR are currently set. The
1010*4882a593Smuzhiyun * EFR should contain zero. Try to read the EFR.
1011*4882a593Smuzhiyun */
autoconfig_16550a(struct uart_8250_port * up)1012*4882a593Smuzhiyun static void autoconfig_16550a(struct uart_8250_port *up)
1013*4882a593Smuzhiyun {
1014*4882a593Smuzhiyun unsigned char status1, status2;
1015*4882a593Smuzhiyun unsigned int iersave;
1016*4882a593Smuzhiyun
1017*4882a593Smuzhiyun up->port.type = PORT_16550A;
1018*4882a593Smuzhiyun up->capabilities |= UART_CAP_FIFO;
1019*4882a593Smuzhiyun
1020*4882a593Smuzhiyun if (!IS_ENABLED(CONFIG_SERIAL_8250_16550A_VARIANTS))
1021*4882a593Smuzhiyun return;
1022*4882a593Smuzhiyun
1023*4882a593Smuzhiyun /*
1024*4882a593Smuzhiyun * Check for presence of the EFR when DLAB is set.
1025*4882a593Smuzhiyun * Only ST16C650V1 UARTs pass this test.
1026*4882a593Smuzhiyun */
1027*4882a593Smuzhiyun serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
1028*4882a593Smuzhiyun if (serial_in(up, UART_EFR) == 0) {
1029*4882a593Smuzhiyun serial_out(up, UART_EFR, 0xA8);
1030*4882a593Smuzhiyun if (serial_in(up, UART_EFR) != 0) {
1031*4882a593Smuzhiyun DEBUG_AUTOCONF("EFRv1 ");
1032*4882a593Smuzhiyun up->port.type = PORT_16650;
1033*4882a593Smuzhiyun up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP;
1034*4882a593Smuzhiyun } else {
1035*4882a593Smuzhiyun serial_out(up, UART_LCR, 0);
1036*4882a593Smuzhiyun serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO |
1037*4882a593Smuzhiyun UART_FCR7_64BYTE);
1038*4882a593Smuzhiyun status1 = serial_in(up, UART_IIR) >> 5;
1039*4882a593Smuzhiyun serial_out(up, UART_FCR, 0);
1040*4882a593Smuzhiyun serial_out(up, UART_LCR, 0);
1041*4882a593Smuzhiyun
1042*4882a593Smuzhiyun if (status1 == 7)
1043*4882a593Smuzhiyun up->port.type = PORT_16550A_FSL64;
1044*4882a593Smuzhiyun else
1045*4882a593Smuzhiyun DEBUG_AUTOCONF("Motorola 8xxx DUART ");
1046*4882a593Smuzhiyun }
1047*4882a593Smuzhiyun serial_out(up, UART_EFR, 0);
1048*4882a593Smuzhiyun return;
1049*4882a593Smuzhiyun }
1050*4882a593Smuzhiyun
1051*4882a593Smuzhiyun /*
1052*4882a593Smuzhiyun * Maybe it requires 0xbf to be written to the LCR.
1053*4882a593Smuzhiyun * (other ST16C650V2 UARTs, TI16C752A, etc)
1054*4882a593Smuzhiyun */
1055*4882a593Smuzhiyun serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
1056*4882a593Smuzhiyun if (serial_in(up, UART_EFR) == 0 && !broken_efr(up)) {
1057*4882a593Smuzhiyun DEBUG_AUTOCONF("EFRv2 ");
1058*4882a593Smuzhiyun autoconfig_has_efr(up);
1059*4882a593Smuzhiyun return;
1060*4882a593Smuzhiyun }
1061*4882a593Smuzhiyun
1062*4882a593Smuzhiyun /*
1063*4882a593Smuzhiyun * Check for a National Semiconductor SuperIO chip.
1064*4882a593Smuzhiyun * Attempt to switch to bank 2, read the value of the LOOP bit
1065*4882a593Smuzhiyun * from EXCR1. Switch back to bank 0, change it in MCR. Then
1066*4882a593Smuzhiyun * switch back to bank 2, read it from EXCR1 again and check
1067*4882a593Smuzhiyun * it's changed. If so, set baud_base in EXCR2 to 921600. -- dwmw2
1068*4882a593Smuzhiyun */
1069*4882a593Smuzhiyun serial_out(up, UART_LCR, 0);
1070*4882a593Smuzhiyun status1 = serial8250_in_MCR(up);
1071*4882a593Smuzhiyun serial_out(up, UART_LCR, 0xE0);
1072*4882a593Smuzhiyun status2 = serial_in(up, 0x02); /* EXCR1 */
1073*4882a593Smuzhiyun
1074*4882a593Smuzhiyun if (!((status2 ^ status1) & UART_MCR_LOOP)) {
1075*4882a593Smuzhiyun serial_out(up, UART_LCR, 0);
1076*4882a593Smuzhiyun serial8250_out_MCR(up, status1 ^ UART_MCR_LOOP);
1077*4882a593Smuzhiyun serial_out(up, UART_LCR, 0xE0);
1078*4882a593Smuzhiyun status2 = serial_in(up, 0x02); /* EXCR1 */
1079*4882a593Smuzhiyun serial_out(up, UART_LCR, 0);
1080*4882a593Smuzhiyun serial8250_out_MCR(up, status1);
1081*4882a593Smuzhiyun
1082*4882a593Smuzhiyun if ((status2 ^ status1) & UART_MCR_LOOP) {
1083*4882a593Smuzhiyun unsigned short quot;
1084*4882a593Smuzhiyun
1085*4882a593Smuzhiyun serial_out(up, UART_LCR, 0xE0);
1086*4882a593Smuzhiyun
1087*4882a593Smuzhiyun quot = serial_dl_read(up);
1088*4882a593Smuzhiyun quot <<= 3;
1089*4882a593Smuzhiyun
1090*4882a593Smuzhiyun if (ns16550a_goto_highspeed(up))
1091*4882a593Smuzhiyun serial_dl_write(up, quot);
1092*4882a593Smuzhiyun
1093*4882a593Smuzhiyun serial_out(up, UART_LCR, 0);
1094*4882a593Smuzhiyun
1095*4882a593Smuzhiyun up->port.uartclk = 921600*16;
1096*4882a593Smuzhiyun up->port.type = PORT_NS16550A;
1097*4882a593Smuzhiyun up->capabilities |= UART_NATSEMI;
1098*4882a593Smuzhiyun return;
1099*4882a593Smuzhiyun }
1100*4882a593Smuzhiyun }
1101*4882a593Smuzhiyun
1102*4882a593Smuzhiyun /*
1103*4882a593Smuzhiyun * No EFR. Try to detect a TI16750, which only sets bit 5 of
1104*4882a593Smuzhiyun * the IIR when 64 byte FIFO mode is enabled when DLAB is set.
1105*4882a593Smuzhiyun * Try setting it with and without DLAB set. Cheap clones
1106*4882a593Smuzhiyun * set bit 5 without DLAB set.
1107*4882a593Smuzhiyun */
1108*4882a593Smuzhiyun serial_out(up, UART_LCR, 0);
1109*4882a593Smuzhiyun serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE);
1110*4882a593Smuzhiyun status1 = serial_in(up, UART_IIR) >> 5;
1111*4882a593Smuzhiyun serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
1112*4882a593Smuzhiyun serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
1113*4882a593Smuzhiyun serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE);
1114*4882a593Smuzhiyun status2 = serial_in(up, UART_IIR) >> 5;
1115*4882a593Smuzhiyun serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
1116*4882a593Smuzhiyun serial_out(up, UART_LCR, 0);
1117*4882a593Smuzhiyun
1118*4882a593Smuzhiyun DEBUG_AUTOCONF("iir1=%d iir2=%d ", status1, status2);
1119*4882a593Smuzhiyun
1120*4882a593Smuzhiyun if (status1 == 6 && status2 == 7) {
1121*4882a593Smuzhiyun up->port.type = PORT_16750;
1122*4882a593Smuzhiyun up->capabilities |= UART_CAP_AFE | UART_CAP_SLEEP;
1123*4882a593Smuzhiyun return;
1124*4882a593Smuzhiyun }
1125*4882a593Smuzhiyun
1126*4882a593Smuzhiyun /*
1127*4882a593Smuzhiyun * Try writing and reading the UART_IER_UUE bit (b6).
1128*4882a593Smuzhiyun * If it works, this is probably one of the Xscale platform's
1129*4882a593Smuzhiyun * internal UARTs.
1130*4882a593Smuzhiyun * We're going to explicitly set the UUE bit to 0 before
1131*4882a593Smuzhiyun * trying to write and read a 1 just to make sure it's not
1132*4882a593Smuzhiyun * already a 1 and maybe locked there before we even start start.
1133*4882a593Smuzhiyun */
1134*4882a593Smuzhiyun iersave = serial_in(up, UART_IER);
1135*4882a593Smuzhiyun serial_out(up, UART_IER, iersave & ~UART_IER_UUE);
1136*4882a593Smuzhiyun if (!(serial_in(up, UART_IER) & UART_IER_UUE)) {
1137*4882a593Smuzhiyun /*
1138*4882a593Smuzhiyun * OK it's in a known zero state, try writing and reading
1139*4882a593Smuzhiyun * without disturbing the current state of the other bits.
1140*4882a593Smuzhiyun */
1141*4882a593Smuzhiyun serial_out(up, UART_IER, iersave | UART_IER_UUE);
1142*4882a593Smuzhiyun if (serial_in(up, UART_IER) & UART_IER_UUE) {
1143*4882a593Smuzhiyun /*
1144*4882a593Smuzhiyun * It's an Xscale.
1145*4882a593Smuzhiyun * We'll leave the UART_IER_UUE bit set to 1 (enabled).
1146*4882a593Smuzhiyun */
1147*4882a593Smuzhiyun DEBUG_AUTOCONF("Xscale ");
1148*4882a593Smuzhiyun up->port.type = PORT_XSCALE;
1149*4882a593Smuzhiyun up->capabilities |= UART_CAP_UUE | UART_CAP_RTOIE;
1150*4882a593Smuzhiyun return;
1151*4882a593Smuzhiyun }
1152*4882a593Smuzhiyun } else {
1153*4882a593Smuzhiyun /*
1154*4882a593Smuzhiyun * If we got here we couldn't force the IER_UUE bit to 0.
1155*4882a593Smuzhiyun * Log it and continue.
1156*4882a593Smuzhiyun */
1157*4882a593Smuzhiyun DEBUG_AUTOCONF("Couldn't force IER_UUE to 0 ");
1158*4882a593Smuzhiyun }
1159*4882a593Smuzhiyun serial_out(up, UART_IER, iersave);
1160*4882a593Smuzhiyun
1161*4882a593Smuzhiyun /*
1162*4882a593Smuzhiyun * We distinguish between 16550A and U6 16550A by counting
1163*4882a593Smuzhiyun * how many bytes are in the FIFO.
1164*4882a593Smuzhiyun */
1165*4882a593Smuzhiyun if (up->port.type == PORT_16550A && size_fifo(up) == 64) {
1166*4882a593Smuzhiyun up->port.type = PORT_U6_16550A;
1167*4882a593Smuzhiyun up->capabilities |= UART_CAP_AFE;
1168*4882a593Smuzhiyun }
1169*4882a593Smuzhiyun }
1170*4882a593Smuzhiyun
1171*4882a593Smuzhiyun /*
1172*4882a593Smuzhiyun * This routine is called by rs_init() to initialize a specific serial
1173*4882a593Smuzhiyun * port. It determines what type of UART chip this serial port is
1174*4882a593Smuzhiyun * using: 8250, 16450, 16550, 16550A. The important question is
1175*4882a593Smuzhiyun * whether or not this UART is a 16550A or not, since this will
1176*4882a593Smuzhiyun * determine whether or not we can use its FIFO features or not.
1177*4882a593Smuzhiyun */
autoconfig(struct uart_8250_port * up)1178*4882a593Smuzhiyun static void autoconfig(struct uart_8250_port *up)
1179*4882a593Smuzhiyun {
1180*4882a593Smuzhiyun unsigned char status1, scratch, scratch2, scratch3;
1181*4882a593Smuzhiyun unsigned char save_lcr, save_mcr;
1182*4882a593Smuzhiyun struct uart_port *port = &up->port;
1183*4882a593Smuzhiyun unsigned long flags;
1184*4882a593Smuzhiyun unsigned int old_capabilities;
1185*4882a593Smuzhiyun
1186*4882a593Smuzhiyun if (!port->iobase && !port->mapbase && !port->membase)
1187*4882a593Smuzhiyun return;
1188*4882a593Smuzhiyun
1189*4882a593Smuzhiyun DEBUG_AUTOCONF("%s: autoconf (0x%04lx, 0x%p): ",
1190*4882a593Smuzhiyun port->name, port->iobase, port->membase);
1191*4882a593Smuzhiyun
1192*4882a593Smuzhiyun /*
1193*4882a593Smuzhiyun * We really do need global IRQs disabled here - we're going to
1194*4882a593Smuzhiyun * be frobbing the chips IRQ enable register to see if it exists.
1195*4882a593Smuzhiyun */
1196*4882a593Smuzhiyun spin_lock_irqsave(&port->lock, flags);
1197*4882a593Smuzhiyun
1198*4882a593Smuzhiyun up->capabilities = 0;
1199*4882a593Smuzhiyun up->bugs = 0;
1200*4882a593Smuzhiyun
1201*4882a593Smuzhiyun if (!(port->flags & UPF_BUGGY_UART)) {
1202*4882a593Smuzhiyun /*
1203*4882a593Smuzhiyun * Do a simple existence test first; if we fail this,
1204*4882a593Smuzhiyun * there's no point trying anything else.
1205*4882a593Smuzhiyun *
1206*4882a593Smuzhiyun * 0x80 is used as a nonsense port to prevent against
1207*4882a593Smuzhiyun * false positives due to ISA bus float. The
1208*4882a593Smuzhiyun * assumption is that 0x80 is a non-existent port;
1209*4882a593Smuzhiyun * which should be safe since include/asm/io.h also
1210*4882a593Smuzhiyun * makes this assumption.
1211*4882a593Smuzhiyun *
1212*4882a593Smuzhiyun * Note: this is safe as long as MCR bit 4 is clear
1213*4882a593Smuzhiyun * and the device is in "PC" mode.
1214*4882a593Smuzhiyun */
1215*4882a593Smuzhiyun scratch = serial_in(up, UART_IER);
1216*4882a593Smuzhiyun serial_out(up, UART_IER, 0);
1217*4882a593Smuzhiyun #ifdef __i386__
1218*4882a593Smuzhiyun outb(0xff, 0x080);
1219*4882a593Smuzhiyun #endif
1220*4882a593Smuzhiyun /*
1221*4882a593Smuzhiyun * Mask out IER[7:4] bits for test as some UARTs (e.g. TL
1222*4882a593Smuzhiyun * 16C754B) allow only to modify them if an EFR bit is set.
1223*4882a593Smuzhiyun */
1224*4882a593Smuzhiyun scratch2 = serial_in(up, UART_IER) & 0x0f;
1225*4882a593Smuzhiyun serial_out(up, UART_IER, 0x0F);
1226*4882a593Smuzhiyun #ifdef __i386__
1227*4882a593Smuzhiyun outb(0, 0x080);
1228*4882a593Smuzhiyun #endif
1229*4882a593Smuzhiyun scratch3 = serial_in(up, UART_IER) & 0x0f;
1230*4882a593Smuzhiyun serial_out(up, UART_IER, scratch);
1231*4882a593Smuzhiyun if (scratch2 != 0 || scratch3 != 0x0F) {
1232*4882a593Smuzhiyun /*
1233*4882a593Smuzhiyun * We failed; there's nothing here
1234*4882a593Smuzhiyun */
1235*4882a593Smuzhiyun spin_unlock_irqrestore(&port->lock, flags);
1236*4882a593Smuzhiyun DEBUG_AUTOCONF("IER test failed (%02x, %02x) ",
1237*4882a593Smuzhiyun scratch2, scratch3);
1238*4882a593Smuzhiyun goto out;
1239*4882a593Smuzhiyun }
1240*4882a593Smuzhiyun }
1241*4882a593Smuzhiyun
1242*4882a593Smuzhiyun save_mcr = serial8250_in_MCR(up);
1243*4882a593Smuzhiyun save_lcr = serial_in(up, UART_LCR);
1244*4882a593Smuzhiyun
1245*4882a593Smuzhiyun /*
1246*4882a593Smuzhiyun * Check to see if a UART is really there. Certain broken
1247*4882a593Smuzhiyun * internal modems based on the Rockwell chipset fail this
1248*4882a593Smuzhiyun * test, because they apparently don't implement the loopback
1249*4882a593Smuzhiyun * test mode. So this test is skipped on the COM 1 through
1250*4882a593Smuzhiyun * COM 4 ports. This *should* be safe, since no board
1251*4882a593Smuzhiyun * manufacturer would be stupid enough to design a board
1252*4882a593Smuzhiyun * that conflicts with COM 1-4 --- we hope!
1253*4882a593Smuzhiyun */
1254*4882a593Smuzhiyun if (!(port->flags & UPF_SKIP_TEST)) {
1255*4882a593Smuzhiyun serial8250_out_MCR(up, UART_MCR_LOOP | 0x0A);
1256*4882a593Smuzhiyun status1 = serial_in(up, UART_MSR) & 0xF0;
1257*4882a593Smuzhiyun serial8250_out_MCR(up, save_mcr);
1258*4882a593Smuzhiyun if (status1 != 0x90) {
1259*4882a593Smuzhiyun spin_unlock_irqrestore(&port->lock, flags);
1260*4882a593Smuzhiyun DEBUG_AUTOCONF("LOOP test failed (%02x) ",
1261*4882a593Smuzhiyun status1);
1262*4882a593Smuzhiyun goto out;
1263*4882a593Smuzhiyun }
1264*4882a593Smuzhiyun }
1265*4882a593Smuzhiyun
1266*4882a593Smuzhiyun /*
1267*4882a593Smuzhiyun * We're pretty sure there's a port here. Lets find out what
1268*4882a593Smuzhiyun * type of port it is. The IIR top two bits allows us to find
1269*4882a593Smuzhiyun * out if it's 8250 or 16450, 16550, 16550A or later. This
1270*4882a593Smuzhiyun * determines what we test for next.
1271*4882a593Smuzhiyun *
1272*4882a593Smuzhiyun * We also initialise the EFR (if any) to zero for later. The
1273*4882a593Smuzhiyun * EFR occupies the same register location as the FCR and IIR.
1274*4882a593Smuzhiyun */
1275*4882a593Smuzhiyun serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
1276*4882a593Smuzhiyun serial_out(up, UART_EFR, 0);
1277*4882a593Smuzhiyun serial_out(up, UART_LCR, 0);
1278*4882a593Smuzhiyun
1279*4882a593Smuzhiyun serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
1280*4882a593Smuzhiyun
1281*4882a593Smuzhiyun /* Assign this as it is to truncate any bits above 7. */
1282*4882a593Smuzhiyun scratch = serial_in(up, UART_IIR);
1283*4882a593Smuzhiyun
1284*4882a593Smuzhiyun switch (scratch >> 6) {
1285*4882a593Smuzhiyun case 0:
1286*4882a593Smuzhiyun autoconfig_8250(up);
1287*4882a593Smuzhiyun break;
1288*4882a593Smuzhiyun case 1:
1289*4882a593Smuzhiyun port->type = PORT_UNKNOWN;
1290*4882a593Smuzhiyun break;
1291*4882a593Smuzhiyun case 2:
1292*4882a593Smuzhiyun port->type = PORT_16550;
1293*4882a593Smuzhiyun break;
1294*4882a593Smuzhiyun case 3:
1295*4882a593Smuzhiyun autoconfig_16550a(up);
1296*4882a593Smuzhiyun break;
1297*4882a593Smuzhiyun }
1298*4882a593Smuzhiyun
1299*4882a593Smuzhiyun #ifdef CONFIG_SERIAL_8250_RSA
1300*4882a593Smuzhiyun /*
1301*4882a593Smuzhiyun * Only probe for RSA ports if we got the region.
1302*4882a593Smuzhiyun */
1303*4882a593Smuzhiyun if (port->type == PORT_16550A && up->probe & UART_PROBE_RSA &&
1304*4882a593Smuzhiyun __enable_rsa(up))
1305*4882a593Smuzhiyun port->type = PORT_RSA;
1306*4882a593Smuzhiyun #endif
1307*4882a593Smuzhiyun
1308*4882a593Smuzhiyun serial_out(up, UART_LCR, save_lcr);
1309*4882a593Smuzhiyun
1310*4882a593Smuzhiyun port->fifosize = uart_config[up->port.type].fifo_size;
1311*4882a593Smuzhiyun old_capabilities = up->capabilities;
1312*4882a593Smuzhiyun up->capabilities = uart_config[port->type].flags;
1313*4882a593Smuzhiyun up->tx_loadsz = uart_config[port->type].tx_loadsz;
1314*4882a593Smuzhiyun
1315*4882a593Smuzhiyun if (port->type == PORT_UNKNOWN)
1316*4882a593Smuzhiyun goto out_lock;
1317*4882a593Smuzhiyun
1318*4882a593Smuzhiyun /*
1319*4882a593Smuzhiyun * Reset the UART.
1320*4882a593Smuzhiyun */
1321*4882a593Smuzhiyun #ifdef CONFIG_SERIAL_8250_RSA
1322*4882a593Smuzhiyun if (port->type == PORT_RSA)
1323*4882a593Smuzhiyun serial_out(up, UART_RSA_FRR, 0);
1324*4882a593Smuzhiyun #endif
1325*4882a593Smuzhiyun serial8250_out_MCR(up, save_mcr);
1326*4882a593Smuzhiyun serial8250_clear_fifos(up);
1327*4882a593Smuzhiyun serial_in(up, UART_RX);
1328*4882a593Smuzhiyun if (up->capabilities & UART_CAP_UUE)
1329*4882a593Smuzhiyun serial_out(up, UART_IER, UART_IER_UUE);
1330*4882a593Smuzhiyun else
1331*4882a593Smuzhiyun serial_out(up, UART_IER, 0);
1332*4882a593Smuzhiyun
1333*4882a593Smuzhiyun out_lock:
1334*4882a593Smuzhiyun spin_unlock_irqrestore(&port->lock, flags);
1335*4882a593Smuzhiyun
1336*4882a593Smuzhiyun /*
1337*4882a593Smuzhiyun * Check if the device is a Fintek F81216A
1338*4882a593Smuzhiyun */
1339*4882a593Smuzhiyun if (port->type == PORT_16550A && port->iotype == UPIO_PORT)
1340*4882a593Smuzhiyun fintek_8250_probe(up);
1341*4882a593Smuzhiyun
1342*4882a593Smuzhiyun if (up->capabilities != old_capabilities) {
1343*4882a593Smuzhiyun dev_warn(port->dev, "detected caps %08x should be %08x\n",
1344*4882a593Smuzhiyun old_capabilities, up->capabilities);
1345*4882a593Smuzhiyun }
1346*4882a593Smuzhiyun out:
1347*4882a593Smuzhiyun DEBUG_AUTOCONF("iir=%d ", scratch);
1348*4882a593Smuzhiyun DEBUG_AUTOCONF("type=%s\n", uart_config[port->type].name);
1349*4882a593Smuzhiyun }
1350*4882a593Smuzhiyun
autoconfig_irq(struct uart_8250_port * up)1351*4882a593Smuzhiyun static void autoconfig_irq(struct uart_8250_port *up)
1352*4882a593Smuzhiyun {
1353*4882a593Smuzhiyun struct uart_port *port = &up->port;
1354*4882a593Smuzhiyun unsigned char save_mcr, save_ier;
1355*4882a593Smuzhiyun unsigned char save_ICP = 0;
1356*4882a593Smuzhiyun unsigned int ICP = 0;
1357*4882a593Smuzhiyun unsigned long irqs;
1358*4882a593Smuzhiyun int irq;
1359*4882a593Smuzhiyun
1360*4882a593Smuzhiyun if (port->flags & UPF_FOURPORT) {
1361*4882a593Smuzhiyun ICP = (port->iobase & 0xfe0) | 0x1f;
1362*4882a593Smuzhiyun save_ICP = inb_p(ICP);
1363*4882a593Smuzhiyun outb_p(0x80, ICP);
1364*4882a593Smuzhiyun inb_p(ICP);
1365*4882a593Smuzhiyun }
1366*4882a593Smuzhiyun
1367*4882a593Smuzhiyun if (uart_console(port))
1368*4882a593Smuzhiyun console_lock();
1369*4882a593Smuzhiyun
1370*4882a593Smuzhiyun /* forget possible initially masked and pending IRQ */
1371*4882a593Smuzhiyun probe_irq_off(probe_irq_on());
1372*4882a593Smuzhiyun save_mcr = serial8250_in_MCR(up);
1373*4882a593Smuzhiyun save_ier = serial_in(up, UART_IER);
1374*4882a593Smuzhiyun serial8250_out_MCR(up, UART_MCR_OUT1 | UART_MCR_OUT2);
1375*4882a593Smuzhiyun
1376*4882a593Smuzhiyun irqs = probe_irq_on();
1377*4882a593Smuzhiyun serial8250_out_MCR(up, 0);
1378*4882a593Smuzhiyun udelay(10);
1379*4882a593Smuzhiyun if (port->flags & UPF_FOURPORT) {
1380*4882a593Smuzhiyun serial8250_out_MCR(up, UART_MCR_DTR | UART_MCR_RTS);
1381*4882a593Smuzhiyun } else {
1382*4882a593Smuzhiyun serial8250_out_MCR(up,
1383*4882a593Smuzhiyun UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2);
1384*4882a593Smuzhiyun }
1385*4882a593Smuzhiyun serial_out(up, UART_IER, 0x0f); /* enable all intrs */
1386*4882a593Smuzhiyun serial_in(up, UART_LSR);
1387*4882a593Smuzhiyun serial_in(up, UART_RX);
1388*4882a593Smuzhiyun serial_in(up, UART_IIR);
1389*4882a593Smuzhiyun serial_in(up, UART_MSR);
1390*4882a593Smuzhiyun serial_out(up, UART_TX, 0xFF);
1391*4882a593Smuzhiyun udelay(20);
1392*4882a593Smuzhiyun irq = probe_irq_off(irqs);
1393*4882a593Smuzhiyun
1394*4882a593Smuzhiyun serial8250_out_MCR(up, save_mcr);
1395*4882a593Smuzhiyun serial_out(up, UART_IER, save_ier);
1396*4882a593Smuzhiyun
1397*4882a593Smuzhiyun if (port->flags & UPF_FOURPORT)
1398*4882a593Smuzhiyun outb_p(save_ICP, ICP);
1399*4882a593Smuzhiyun
1400*4882a593Smuzhiyun if (uart_console(port))
1401*4882a593Smuzhiyun console_unlock();
1402*4882a593Smuzhiyun
1403*4882a593Smuzhiyun port->irq = (irq > 0) ? irq : 0;
1404*4882a593Smuzhiyun }
1405*4882a593Smuzhiyun
serial8250_stop_rx(struct uart_port * port)1406*4882a593Smuzhiyun static void serial8250_stop_rx(struct uart_port *port)
1407*4882a593Smuzhiyun {
1408*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
1409*4882a593Smuzhiyun
1410*4882a593Smuzhiyun serial8250_rpm_get(up);
1411*4882a593Smuzhiyun
1412*4882a593Smuzhiyun up->ier &= ~(UART_IER_RLSI | UART_IER_RDI);
1413*4882a593Smuzhiyun up->port.read_status_mask &= ~UART_LSR_DR;
1414*4882a593Smuzhiyun serial_port_out(port, UART_IER, up->ier);
1415*4882a593Smuzhiyun
1416*4882a593Smuzhiyun serial8250_rpm_put(up);
1417*4882a593Smuzhiyun }
1418*4882a593Smuzhiyun
1419*4882a593Smuzhiyun /**
1420*4882a593Smuzhiyun * serial8250_em485_stop_tx() - generic ->rs485_stop_tx() callback
1421*4882a593Smuzhiyun * @p: uart 8250 port
1422*4882a593Smuzhiyun *
1423*4882a593Smuzhiyun * Generic callback usable by 8250 uart drivers to stop rs485 transmission.
1424*4882a593Smuzhiyun */
serial8250_em485_stop_tx(struct uart_8250_port * p)1425*4882a593Smuzhiyun void serial8250_em485_stop_tx(struct uart_8250_port *p)
1426*4882a593Smuzhiyun {
1427*4882a593Smuzhiyun unsigned char mcr = serial8250_in_MCR(p);
1428*4882a593Smuzhiyun
1429*4882a593Smuzhiyun if (p->port.rs485.flags & SER_RS485_RTS_AFTER_SEND)
1430*4882a593Smuzhiyun mcr |= UART_MCR_RTS;
1431*4882a593Smuzhiyun else
1432*4882a593Smuzhiyun mcr &= ~UART_MCR_RTS;
1433*4882a593Smuzhiyun serial8250_out_MCR(p, mcr);
1434*4882a593Smuzhiyun
1435*4882a593Smuzhiyun /*
1436*4882a593Smuzhiyun * Empty the RX FIFO, we are not interested in anything
1437*4882a593Smuzhiyun * received during the half-duplex transmission.
1438*4882a593Smuzhiyun * Enable previously disabled RX interrupts.
1439*4882a593Smuzhiyun */
1440*4882a593Smuzhiyun if (!(p->port.rs485.flags & SER_RS485_RX_DURING_TX)) {
1441*4882a593Smuzhiyun serial8250_clear_and_reinit_fifos(p);
1442*4882a593Smuzhiyun
1443*4882a593Smuzhiyun p->ier |= UART_IER_RLSI | UART_IER_RDI;
1444*4882a593Smuzhiyun serial_port_out(&p->port, UART_IER, p->ier);
1445*4882a593Smuzhiyun }
1446*4882a593Smuzhiyun }
1447*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(serial8250_em485_stop_tx);
1448*4882a593Smuzhiyun
serial8250_em485_handle_stop_tx(struct hrtimer * t)1449*4882a593Smuzhiyun static enum hrtimer_restart serial8250_em485_handle_stop_tx(struct hrtimer *t)
1450*4882a593Smuzhiyun {
1451*4882a593Smuzhiyun struct uart_8250_em485 *em485;
1452*4882a593Smuzhiyun struct uart_8250_port *p;
1453*4882a593Smuzhiyun unsigned long flags;
1454*4882a593Smuzhiyun
1455*4882a593Smuzhiyun em485 = container_of(t, struct uart_8250_em485, stop_tx_timer);
1456*4882a593Smuzhiyun p = em485->port;
1457*4882a593Smuzhiyun
1458*4882a593Smuzhiyun serial8250_rpm_get(p);
1459*4882a593Smuzhiyun spin_lock_irqsave(&p->port.lock, flags);
1460*4882a593Smuzhiyun if (em485->active_timer == &em485->stop_tx_timer) {
1461*4882a593Smuzhiyun p->rs485_stop_tx(p);
1462*4882a593Smuzhiyun em485->active_timer = NULL;
1463*4882a593Smuzhiyun em485->tx_stopped = true;
1464*4882a593Smuzhiyun }
1465*4882a593Smuzhiyun spin_unlock_irqrestore(&p->port.lock, flags);
1466*4882a593Smuzhiyun serial8250_rpm_put(p);
1467*4882a593Smuzhiyun return HRTIMER_NORESTART;
1468*4882a593Smuzhiyun }
1469*4882a593Smuzhiyun
start_hrtimer_ms(struct hrtimer * hrt,unsigned long msec)1470*4882a593Smuzhiyun static void start_hrtimer_ms(struct hrtimer *hrt, unsigned long msec)
1471*4882a593Smuzhiyun {
1472*4882a593Smuzhiyun long sec = msec / 1000;
1473*4882a593Smuzhiyun long nsec = (msec % 1000) * 1000000;
1474*4882a593Smuzhiyun ktime_t t = ktime_set(sec, nsec);
1475*4882a593Smuzhiyun
1476*4882a593Smuzhiyun hrtimer_start(hrt, t, HRTIMER_MODE_REL);
1477*4882a593Smuzhiyun }
1478*4882a593Smuzhiyun
__stop_tx_rs485(struct uart_8250_port * p)1479*4882a593Smuzhiyun static void __stop_tx_rs485(struct uart_8250_port *p)
1480*4882a593Smuzhiyun {
1481*4882a593Smuzhiyun struct uart_8250_em485 *em485 = p->em485;
1482*4882a593Smuzhiyun
1483*4882a593Smuzhiyun /*
1484*4882a593Smuzhiyun * rs485_stop_tx() is going to set RTS according to config
1485*4882a593Smuzhiyun * AND flush RX FIFO if required.
1486*4882a593Smuzhiyun */
1487*4882a593Smuzhiyun if (p->port.rs485.delay_rts_after_send > 0) {
1488*4882a593Smuzhiyun em485->active_timer = &em485->stop_tx_timer;
1489*4882a593Smuzhiyun start_hrtimer_ms(&em485->stop_tx_timer,
1490*4882a593Smuzhiyun p->port.rs485.delay_rts_after_send);
1491*4882a593Smuzhiyun } else {
1492*4882a593Smuzhiyun p->rs485_stop_tx(p);
1493*4882a593Smuzhiyun em485->active_timer = NULL;
1494*4882a593Smuzhiyun em485->tx_stopped = true;
1495*4882a593Smuzhiyun }
1496*4882a593Smuzhiyun }
1497*4882a593Smuzhiyun
__do_stop_tx(struct uart_8250_port * p)1498*4882a593Smuzhiyun static inline void __do_stop_tx(struct uart_8250_port *p)
1499*4882a593Smuzhiyun {
1500*4882a593Smuzhiyun if (serial8250_clear_THRI(p))
1501*4882a593Smuzhiyun serial8250_rpm_put_tx(p);
1502*4882a593Smuzhiyun }
1503*4882a593Smuzhiyun
__stop_tx(struct uart_8250_port * p)1504*4882a593Smuzhiyun static inline void __stop_tx(struct uart_8250_port *p)
1505*4882a593Smuzhiyun {
1506*4882a593Smuzhiyun struct uart_8250_em485 *em485 = p->em485;
1507*4882a593Smuzhiyun
1508*4882a593Smuzhiyun if (em485) {
1509*4882a593Smuzhiyun unsigned char lsr = serial_in(p, UART_LSR);
1510*4882a593Smuzhiyun p->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
1511*4882a593Smuzhiyun
1512*4882a593Smuzhiyun /*
1513*4882a593Smuzhiyun * To provide required timeing and allow FIFO transfer,
1514*4882a593Smuzhiyun * __stop_tx_rs485() must be called only when both FIFO and
1515*4882a593Smuzhiyun * shift register are empty. It is for device driver to enable
1516*4882a593Smuzhiyun * interrupt on TEMT.
1517*4882a593Smuzhiyun */
1518*4882a593Smuzhiyun if ((lsr & BOTH_EMPTY) != BOTH_EMPTY)
1519*4882a593Smuzhiyun return;
1520*4882a593Smuzhiyun
1521*4882a593Smuzhiyun __stop_tx_rs485(p);
1522*4882a593Smuzhiyun }
1523*4882a593Smuzhiyun __do_stop_tx(p);
1524*4882a593Smuzhiyun }
1525*4882a593Smuzhiyun
serial8250_stop_tx(struct uart_port * port)1526*4882a593Smuzhiyun static void serial8250_stop_tx(struct uart_port *port)
1527*4882a593Smuzhiyun {
1528*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
1529*4882a593Smuzhiyun
1530*4882a593Smuzhiyun serial8250_rpm_get(up);
1531*4882a593Smuzhiyun __stop_tx(up);
1532*4882a593Smuzhiyun
1533*4882a593Smuzhiyun /*
1534*4882a593Smuzhiyun * We really want to stop the transmitter from sending.
1535*4882a593Smuzhiyun */
1536*4882a593Smuzhiyun if (port->type == PORT_16C950) {
1537*4882a593Smuzhiyun up->acr |= UART_ACR_TXDIS;
1538*4882a593Smuzhiyun serial_icr_write(up, UART_ACR, up->acr);
1539*4882a593Smuzhiyun }
1540*4882a593Smuzhiyun serial8250_rpm_put(up);
1541*4882a593Smuzhiyun }
1542*4882a593Smuzhiyun
__start_tx(struct uart_port * port)1543*4882a593Smuzhiyun static inline void __start_tx(struct uart_port *port)
1544*4882a593Smuzhiyun {
1545*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
1546*4882a593Smuzhiyun
1547*4882a593Smuzhiyun #ifdef CONFIG_ARCH_ROCKCHIP
1548*4882a593Smuzhiyun if (up->dma && up->dma->txchan && !up->dma->tx_dma(up))
1549*4882a593Smuzhiyun return;
1550*4882a593Smuzhiyun #else
1551*4882a593Smuzhiyun if (up->dma && !up->dma->tx_dma(up))
1552*4882a593Smuzhiyun return;
1553*4882a593Smuzhiyun #endif
1554*4882a593Smuzhiyun
1555*4882a593Smuzhiyun if (serial8250_set_THRI(up)) {
1556*4882a593Smuzhiyun if (up->bugs & UART_BUG_TXEN) {
1557*4882a593Smuzhiyun unsigned char lsr;
1558*4882a593Smuzhiyun
1559*4882a593Smuzhiyun lsr = serial_in(up, UART_LSR);
1560*4882a593Smuzhiyun up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
1561*4882a593Smuzhiyun if (lsr & UART_LSR_THRE)
1562*4882a593Smuzhiyun serial8250_tx_chars(up);
1563*4882a593Smuzhiyun }
1564*4882a593Smuzhiyun }
1565*4882a593Smuzhiyun
1566*4882a593Smuzhiyun /*
1567*4882a593Smuzhiyun * Re-enable the transmitter if we disabled it.
1568*4882a593Smuzhiyun */
1569*4882a593Smuzhiyun if (port->type == PORT_16C950 && up->acr & UART_ACR_TXDIS) {
1570*4882a593Smuzhiyun up->acr &= ~UART_ACR_TXDIS;
1571*4882a593Smuzhiyun serial_icr_write(up, UART_ACR, up->acr);
1572*4882a593Smuzhiyun }
1573*4882a593Smuzhiyun }
1574*4882a593Smuzhiyun
1575*4882a593Smuzhiyun /**
1576*4882a593Smuzhiyun * serial8250_em485_start_tx() - generic ->rs485_start_tx() callback
1577*4882a593Smuzhiyun * @up: uart 8250 port
1578*4882a593Smuzhiyun *
1579*4882a593Smuzhiyun * Generic callback usable by 8250 uart drivers to start rs485 transmission.
1580*4882a593Smuzhiyun * Assumes that setting the RTS bit in the MCR register means RTS is high.
1581*4882a593Smuzhiyun * (Some chips use inverse semantics.) Further assumes that reception is
1582*4882a593Smuzhiyun * stoppable by disabling the UART_IER_RDI interrupt. (Some chips set the
1583*4882a593Smuzhiyun * UART_LSR_DR bit even when UART_IER_RDI is disabled, foiling this approach.)
1584*4882a593Smuzhiyun */
serial8250_em485_start_tx(struct uart_8250_port * up)1585*4882a593Smuzhiyun void serial8250_em485_start_tx(struct uart_8250_port *up)
1586*4882a593Smuzhiyun {
1587*4882a593Smuzhiyun unsigned char mcr = serial8250_in_MCR(up);
1588*4882a593Smuzhiyun
1589*4882a593Smuzhiyun if (!(up->port.rs485.flags & SER_RS485_RX_DURING_TX))
1590*4882a593Smuzhiyun serial8250_stop_rx(&up->port);
1591*4882a593Smuzhiyun
1592*4882a593Smuzhiyun if (up->port.rs485.flags & SER_RS485_RTS_ON_SEND)
1593*4882a593Smuzhiyun mcr |= UART_MCR_RTS;
1594*4882a593Smuzhiyun else
1595*4882a593Smuzhiyun mcr &= ~UART_MCR_RTS;
1596*4882a593Smuzhiyun serial8250_out_MCR(up, mcr);
1597*4882a593Smuzhiyun }
1598*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(serial8250_em485_start_tx);
1599*4882a593Smuzhiyun
start_tx_rs485(struct uart_port * port)1600*4882a593Smuzhiyun static inline void start_tx_rs485(struct uart_port *port)
1601*4882a593Smuzhiyun {
1602*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
1603*4882a593Smuzhiyun struct uart_8250_em485 *em485 = up->em485;
1604*4882a593Smuzhiyun
1605*4882a593Smuzhiyun /*
1606*4882a593Smuzhiyun * While serial8250_em485_handle_stop_tx() is a noop if
1607*4882a593Smuzhiyun * em485->active_timer != &em485->stop_tx_timer, it might happen that
1608*4882a593Smuzhiyun * the timer is still armed and triggers only after the current bunch of
1609*4882a593Smuzhiyun * chars is send and em485->active_timer == &em485->stop_tx_timer again.
1610*4882a593Smuzhiyun * So cancel the timer. There is still a theoretical race condition if
1611*4882a593Smuzhiyun * the timer is already running and only comes around to check for
1612*4882a593Smuzhiyun * em485->active_timer when &em485->stop_tx_timer is armed again.
1613*4882a593Smuzhiyun */
1614*4882a593Smuzhiyun if (em485->active_timer == &em485->stop_tx_timer)
1615*4882a593Smuzhiyun hrtimer_try_to_cancel(&em485->stop_tx_timer);
1616*4882a593Smuzhiyun
1617*4882a593Smuzhiyun em485->active_timer = NULL;
1618*4882a593Smuzhiyun
1619*4882a593Smuzhiyun if (em485->tx_stopped) {
1620*4882a593Smuzhiyun em485->tx_stopped = false;
1621*4882a593Smuzhiyun
1622*4882a593Smuzhiyun up->rs485_start_tx(up);
1623*4882a593Smuzhiyun
1624*4882a593Smuzhiyun if (up->port.rs485.delay_rts_before_send > 0) {
1625*4882a593Smuzhiyun em485->active_timer = &em485->start_tx_timer;
1626*4882a593Smuzhiyun start_hrtimer_ms(&em485->start_tx_timer,
1627*4882a593Smuzhiyun up->port.rs485.delay_rts_before_send);
1628*4882a593Smuzhiyun return;
1629*4882a593Smuzhiyun }
1630*4882a593Smuzhiyun }
1631*4882a593Smuzhiyun
1632*4882a593Smuzhiyun __start_tx(port);
1633*4882a593Smuzhiyun }
1634*4882a593Smuzhiyun
serial8250_em485_handle_start_tx(struct hrtimer * t)1635*4882a593Smuzhiyun static enum hrtimer_restart serial8250_em485_handle_start_tx(struct hrtimer *t)
1636*4882a593Smuzhiyun {
1637*4882a593Smuzhiyun struct uart_8250_em485 *em485;
1638*4882a593Smuzhiyun struct uart_8250_port *p;
1639*4882a593Smuzhiyun unsigned long flags;
1640*4882a593Smuzhiyun
1641*4882a593Smuzhiyun em485 = container_of(t, struct uart_8250_em485, start_tx_timer);
1642*4882a593Smuzhiyun p = em485->port;
1643*4882a593Smuzhiyun
1644*4882a593Smuzhiyun spin_lock_irqsave(&p->port.lock, flags);
1645*4882a593Smuzhiyun if (em485->active_timer == &em485->start_tx_timer) {
1646*4882a593Smuzhiyun __start_tx(&p->port);
1647*4882a593Smuzhiyun em485->active_timer = NULL;
1648*4882a593Smuzhiyun }
1649*4882a593Smuzhiyun spin_unlock_irqrestore(&p->port.lock, flags);
1650*4882a593Smuzhiyun return HRTIMER_NORESTART;
1651*4882a593Smuzhiyun }
1652*4882a593Smuzhiyun
serial8250_start_tx(struct uart_port * port)1653*4882a593Smuzhiyun static void serial8250_start_tx(struct uart_port *port)
1654*4882a593Smuzhiyun {
1655*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
1656*4882a593Smuzhiyun struct uart_8250_em485 *em485 = up->em485;
1657*4882a593Smuzhiyun
1658*4882a593Smuzhiyun serial8250_rpm_get_tx(up);
1659*4882a593Smuzhiyun
1660*4882a593Smuzhiyun if (em485 &&
1661*4882a593Smuzhiyun em485->active_timer == &em485->start_tx_timer)
1662*4882a593Smuzhiyun return;
1663*4882a593Smuzhiyun
1664*4882a593Smuzhiyun if (em485)
1665*4882a593Smuzhiyun start_tx_rs485(port);
1666*4882a593Smuzhiyun else
1667*4882a593Smuzhiyun __start_tx(port);
1668*4882a593Smuzhiyun }
1669*4882a593Smuzhiyun
serial8250_throttle(struct uart_port * port)1670*4882a593Smuzhiyun static void serial8250_throttle(struct uart_port *port)
1671*4882a593Smuzhiyun {
1672*4882a593Smuzhiyun port->throttle(port);
1673*4882a593Smuzhiyun }
1674*4882a593Smuzhiyun
serial8250_unthrottle(struct uart_port * port)1675*4882a593Smuzhiyun static void serial8250_unthrottle(struct uart_port *port)
1676*4882a593Smuzhiyun {
1677*4882a593Smuzhiyun port->unthrottle(port);
1678*4882a593Smuzhiyun }
1679*4882a593Smuzhiyun
serial8250_disable_ms(struct uart_port * port)1680*4882a593Smuzhiyun static void serial8250_disable_ms(struct uart_port *port)
1681*4882a593Smuzhiyun {
1682*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
1683*4882a593Smuzhiyun
1684*4882a593Smuzhiyun /* no MSR capabilities */
1685*4882a593Smuzhiyun if (up->bugs & UART_BUG_NOMSR)
1686*4882a593Smuzhiyun return;
1687*4882a593Smuzhiyun
1688*4882a593Smuzhiyun mctrl_gpio_disable_ms(up->gpios);
1689*4882a593Smuzhiyun
1690*4882a593Smuzhiyun up->ier &= ~UART_IER_MSI;
1691*4882a593Smuzhiyun serial_port_out(port, UART_IER, up->ier);
1692*4882a593Smuzhiyun }
1693*4882a593Smuzhiyun
serial8250_enable_ms(struct uart_port * port)1694*4882a593Smuzhiyun static void serial8250_enable_ms(struct uart_port *port)
1695*4882a593Smuzhiyun {
1696*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
1697*4882a593Smuzhiyun
1698*4882a593Smuzhiyun /* no MSR capabilities */
1699*4882a593Smuzhiyun if (up->bugs & UART_BUG_NOMSR)
1700*4882a593Smuzhiyun return;
1701*4882a593Smuzhiyun
1702*4882a593Smuzhiyun mctrl_gpio_enable_ms(up->gpios);
1703*4882a593Smuzhiyun
1704*4882a593Smuzhiyun up->ier |= UART_IER_MSI;
1705*4882a593Smuzhiyun
1706*4882a593Smuzhiyun serial8250_rpm_get(up);
1707*4882a593Smuzhiyun serial_port_out(port, UART_IER, up->ier);
1708*4882a593Smuzhiyun serial8250_rpm_put(up);
1709*4882a593Smuzhiyun }
1710*4882a593Smuzhiyun
serial8250_read_char(struct uart_8250_port * up,unsigned char lsr)1711*4882a593Smuzhiyun void serial8250_read_char(struct uart_8250_port *up, unsigned char lsr)
1712*4882a593Smuzhiyun {
1713*4882a593Smuzhiyun struct uart_port *port = &up->port;
1714*4882a593Smuzhiyun unsigned char ch;
1715*4882a593Smuzhiyun char flag = TTY_NORMAL;
1716*4882a593Smuzhiyun
1717*4882a593Smuzhiyun if (likely(lsr & UART_LSR_DR))
1718*4882a593Smuzhiyun ch = serial_in(up, UART_RX);
1719*4882a593Smuzhiyun else
1720*4882a593Smuzhiyun /*
1721*4882a593Smuzhiyun * Intel 82571 has a Serial Over Lan device that will
1722*4882a593Smuzhiyun * set UART_LSR_BI without setting UART_LSR_DR when
1723*4882a593Smuzhiyun * it receives a break. To avoid reading from the
1724*4882a593Smuzhiyun * receive buffer without UART_LSR_DR bit set, we
1725*4882a593Smuzhiyun * just force the read character to be 0
1726*4882a593Smuzhiyun */
1727*4882a593Smuzhiyun ch = 0;
1728*4882a593Smuzhiyun
1729*4882a593Smuzhiyun port->icount.rx++;
1730*4882a593Smuzhiyun
1731*4882a593Smuzhiyun lsr |= up->lsr_saved_flags;
1732*4882a593Smuzhiyun up->lsr_saved_flags = 0;
1733*4882a593Smuzhiyun
1734*4882a593Smuzhiyun if (unlikely(lsr & UART_LSR_BRK_ERROR_BITS)) {
1735*4882a593Smuzhiyun if (lsr & UART_LSR_BI) {
1736*4882a593Smuzhiyun lsr &= ~(UART_LSR_FE | UART_LSR_PE);
1737*4882a593Smuzhiyun port->icount.brk++;
1738*4882a593Smuzhiyun /*
1739*4882a593Smuzhiyun * We do the SysRQ and SAK checking
1740*4882a593Smuzhiyun * here because otherwise the break
1741*4882a593Smuzhiyun * may get masked by ignore_status_mask
1742*4882a593Smuzhiyun * or read_status_mask.
1743*4882a593Smuzhiyun */
1744*4882a593Smuzhiyun if (uart_handle_break(port))
1745*4882a593Smuzhiyun return;
1746*4882a593Smuzhiyun } else if (lsr & UART_LSR_PE)
1747*4882a593Smuzhiyun port->icount.parity++;
1748*4882a593Smuzhiyun else if (lsr & UART_LSR_FE)
1749*4882a593Smuzhiyun port->icount.frame++;
1750*4882a593Smuzhiyun if (lsr & UART_LSR_OE)
1751*4882a593Smuzhiyun port->icount.overrun++;
1752*4882a593Smuzhiyun
1753*4882a593Smuzhiyun /*
1754*4882a593Smuzhiyun * Mask off conditions which should be ignored.
1755*4882a593Smuzhiyun */
1756*4882a593Smuzhiyun lsr &= port->read_status_mask;
1757*4882a593Smuzhiyun
1758*4882a593Smuzhiyun if (lsr & UART_LSR_BI) {
1759*4882a593Smuzhiyun dev_dbg(port->dev, "handling break\n");
1760*4882a593Smuzhiyun flag = TTY_BREAK;
1761*4882a593Smuzhiyun } else if (lsr & UART_LSR_PE)
1762*4882a593Smuzhiyun flag = TTY_PARITY;
1763*4882a593Smuzhiyun else if (lsr & UART_LSR_FE)
1764*4882a593Smuzhiyun flag = TTY_FRAME;
1765*4882a593Smuzhiyun }
1766*4882a593Smuzhiyun if (uart_prepare_sysrq_char(port, ch))
1767*4882a593Smuzhiyun return;
1768*4882a593Smuzhiyun
1769*4882a593Smuzhiyun uart_insert_char(port, lsr, UART_LSR_OE, ch, flag);
1770*4882a593Smuzhiyun }
1771*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(serial8250_read_char);
1772*4882a593Smuzhiyun
1773*4882a593Smuzhiyun /*
1774*4882a593Smuzhiyun * serial8250_rx_chars: processes according to the passed in LSR
1775*4882a593Smuzhiyun * value, and returns the remaining LSR bits not handled
1776*4882a593Smuzhiyun * by this Rx routine.
1777*4882a593Smuzhiyun */
serial8250_rx_chars(struct uart_8250_port * up,unsigned char lsr)1778*4882a593Smuzhiyun unsigned char serial8250_rx_chars(struct uart_8250_port *up, unsigned char lsr)
1779*4882a593Smuzhiyun {
1780*4882a593Smuzhiyun struct uart_port *port = &up->port;
1781*4882a593Smuzhiyun int max_count = 256;
1782*4882a593Smuzhiyun
1783*4882a593Smuzhiyun do {
1784*4882a593Smuzhiyun serial8250_read_char(up, lsr);
1785*4882a593Smuzhiyun if (--max_count == 0)
1786*4882a593Smuzhiyun break;
1787*4882a593Smuzhiyun lsr = serial_in(up, UART_LSR);
1788*4882a593Smuzhiyun } while (lsr & (UART_LSR_DR | UART_LSR_BI));
1789*4882a593Smuzhiyun
1790*4882a593Smuzhiyun tty_flip_buffer_push(&port->state->port);
1791*4882a593Smuzhiyun return lsr;
1792*4882a593Smuzhiyun }
1793*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(serial8250_rx_chars);
1794*4882a593Smuzhiyun
serial8250_tx_chars(struct uart_8250_port * up)1795*4882a593Smuzhiyun void serial8250_tx_chars(struct uart_8250_port *up)
1796*4882a593Smuzhiyun {
1797*4882a593Smuzhiyun struct uart_port *port = &up->port;
1798*4882a593Smuzhiyun struct circ_buf *xmit = &port->state->xmit;
1799*4882a593Smuzhiyun int count;
1800*4882a593Smuzhiyun
1801*4882a593Smuzhiyun if (port->x_char) {
1802*4882a593Smuzhiyun uart_xchar_out(port, UART_TX);
1803*4882a593Smuzhiyun return;
1804*4882a593Smuzhiyun }
1805*4882a593Smuzhiyun if (uart_tx_stopped(port)) {
1806*4882a593Smuzhiyun serial8250_stop_tx(port);
1807*4882a593Smuzhiyun return;
1808*4882a593Smuzhiyun }
1809*4882a593Smuzhiyun if (uart_circ_empty(xmit)) {
1810*4882a593Smuzhiyun __stop_tx(up);
1811*4882a593Smuzhiyun return;
1812*4882a593Smuzhiyun }
1813*4882a593Smuzhiyun
1814*4882a593Smuzhiyun count = up->tx_loadsz;
1815*4882a593Smuzhiyun do {
1816*4882a593Smuzhiyun serial_out(up, UART_TX, xmit->buf[xmit->tail]);
1817*4882a593Smuzhiyun if (up->bugs & UART_BUG_TXRACE) {
1818*4882a593Smuzhiyun /*
1819*4882a593Smuzhiyun * The Aspeed BMC virtual UARTs have a bug where data
1820*4882a593Smuzhiyun * may get stuck in the BMC's Tx FIFO from bursts of
1821*4882a593Smuzhiyun * writes on the APB interface.
1822*4882a593Smuzhiyun *
1823*4882a593Smuzhiyun * Delay back-to-back writes by a read cycle to avoid
1824*4882a593Smuzhiyun * stalling the VUART. Read a register that won't have
1825*4882a593Smuzhiyun * side-effects and discard the result.
1826*4882a593Smuzhiyun */
1827*4882a593Smuzhiyun serial_in(up, UART_SCR);
1828*4882a593Smuzhiyun }
1829*4882a593Smuzhiyun xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
1830*4882a593Smuzhiyun port->icount.tx++;
1831*4882a593Smuzhiyun if (uart_circ_empty(xmit))
1832*4882a593Smuzhiyun break;
1833*4882a593Smuzhiyun if ((up->capabilities & UART_CAP_HFIFO) &&
1834*4882a593Smuzhiyun (serial_in(up, UART_LSR) & BOTH_EMPTY) != BOTH_EMPTY)
1835*4882a593Smuzhiyun break;
1836*4882a593Smuzhiyun /* The BCM2835 MINI UART THRE bit is really a not-full bit. */
1837*4882a593Smuzhiyun if ((up->capabilities & UART_CAP_MINI) &&
1838*4882a593Smuzhiyun !(serial_in(up, UART_LSR) & UART_LSR_THRE))
1839*4882a593Smuzhiyun break;
1840*4882a593Smuzhiyun } while (--count > 0);
1841*4882a593Smuzhiyun
1842*4882a593Smuzhiyun if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
1843*4882a593Smuzhiyun uart_write_wakeup(port);
1844*4882a593Smuzhiyun
1845*4882a593Smuzhiyun /*
1846*4882a593Smuzhiyun * With RPM enabled, we have to wait until the FIFO is empty before the
1847*4882a593Smuzhiyun * HW can go idle. So we get here once again with empty FIFO and disable
1848*4882a593Smuzhiyun * the interrupt and RPM in __stop_tx()
1849*4882a593Smuzhiyun */
1850*4882a593Smuzhiyun if (uart_circ_empty(xmit) && !(up->capabilities & UART_CAP_RPM))
1851*4882a593Smuzhiyun __stop_tx(up);
1852*4882a593Smuzhiyun }
1853*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(serial8250_tx_chars);
1854*4882a593Smuzhiyun
1855*4882a593Smuzhiyun /* Caller holds uart port lock */
serial8250_modem_status(struct uart_8250_port * up)1856*4882a593Smuzhiyun unsigned int serial8250_modem_status(struct uart_8250_port *up)
1857*4882a593Smuzhiyun {
1858*4882a593Smuzhiyun struct uart_port *port = &up->port;
1859*4882a593Smuzhiyun unsigned int status = serial_in(up, UART_MSR);
1860*4882a593Smuzhiyun
1861*4882a593Smuzhiyun status |= up->msr_saved_flags;
1862*4882a593Smuzhiyun up->msr_saved_flags = 0;
1863*4882a593Smuzhiyun if (status & UART_MSR_ANY_DELTA && up->ier & UART_IER_MSI &&
1864*4882a593Smuzhiyun port->state != NULL) {
1865*4882a593Smuzhiyun if (status & UART_MSR_TERI)
1866*4882a593Smuzhiyun port->icount.rng++;
1867*4882a593Smuzhiyun if (status & UART_MSR_DDSR)
1868*4882a593Smuzhiyun port->icount.dsr++;
1869*4882a593Smuzhiyun if (status & UART_MSR_DDCD)
1870*4882a593Smuzhiyun uart_handle_dcd_change(port, status & UART_MSR_DCD);
1871*4882a593Smuzhiyun if (status & UART_MSR_DCTS)
1872*4882a593Smuzhiyun uart_handle_cts_change(port, status & UART_MSR_CTS);
1873*4882a593Smuzhiyun
1874*4882a593Smuzhiyun wake_up_interruptible(&port->state->port.delta_msr_wait);
1875*4882a593Smuzhiyun }
1876*4882a593Smuzhiyun
1877*4882a593Smuzhiyun return status;
1878*4882a593Smuzhiyun }
1879*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(serial8250_modem_status);
1880*4882a593Smuzhiyun
handle_rx_dma(struct uart_8250_port * up,unsigned int iir)1881*4882a593Smuzhiyun static bool handle_rx_dma(struct uart_8250_port *up, unsigned int iir)
1882*4882a593Smuzhiyun {
1883*4882a593Smuzhiyun #ifdef CONFIG_ARCH_ROCKCHIP
1884*4882a593Smuzhiyun if ((iir & 0xf) != UART_IIR_RX_TIMEOUT)
1885*4882a593Smuzhiyun return 0;
1886*4882a593Smuzhiyun else
1887*4882a593Smuzhiyun return up->dma->rx_dma(up);
1888*4882a593Smuzhiyun #else
1889*4882a593Smuzhiyun switch (iir & 0x3f) {
1890*4882a593Smuzhiyun case UART_IIR_RDI:
1891*4882a593Smuzhiyun if (!up->dma->rx_running)
1892*4882a593Smuzhiyun break;
1893*4882a593Smuzhiyun fallthrough;
1894*4882a593Smuzhiyun case UART_IIR_RLSI:
1895*4882a593Smuzhiyun case UART_IIR_RX_TIMEOUT:
1896*4882a593Smuzhiyun serial8250_rx_dma_flush(up);
1897*4882a593Smuzhiyun return true;
1898*4882a593Smuzhiyun }
1899*4882a593Smuzhiyun return up->dma->rx_dma(up);
1900*4882a593Smuzhiyun #endif
1901*4882a593Smuzhiyun }
1902*4882a593Smuzhiyun
1903*4882a593Smuzhiyun /*
1904*4882a593Smuzhiyun * This handles the interrupt from one port.
1905*4882a593Smuzhiyun */
serial8250_handle_irq(struct uart_port * port,unsigned int iir)1906*4882a593Smuzhiyun int serial8250_handle_irq(struct uart_port *port, unsigned int iir)
1907*4882a593Smuzhiyun {
1908*4882a593Smuzhiyun unsigned char status;
1909*4882a593Smuzhiyun unsigned long flags;
1910*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
1911*4882a593Smuzhiyun #ifndef CONFIG_ARCH_ROCKCHIP
1912*4882a593Smuzhiyun bool skip_rx = false;
1913*4882a593Smuzhiyun #endif
1914*4882a593Smuzhiyun
1915*4882a593Smuzhiyun if (iir & UART_IIR_NO_INT)
1916*4882a593Smuzhiyun return 0;
1917*4882a593Smuzhiyun
1918*4882a593Smuzhiyun spin_lock_irqsave(&port->lock, flags);
1919*4882a593Smuzhiyun
1920*4882a593Smuzhiyun status = serial_port_in(port, UART_LSR);
1921*4882a593Smuzhiyun
1922*4882a593Smuzhiyun #ifdef CONFIG_ARCH_ROCKCHIP
1923*4882a593Smuzhiyun if (status & (UART_LSR_DR | UART_LSR_BI)) {
1924*4882a593Smuzhiyun int dma_err = -1;
1925*4882a593Smuzhiyun
1926*4882a593Smuzhiyun if (up->dma && up->dma->rxchan)
1927*4882a593Smuzhiyun dma_err = handle_rx_dma(up, iir);
1928*4882a593Smuzhiyun
1929*4882a593Smuzhiyun if (!up->dma || dma_err)
1930*4882a593Smuzhiyun status = serial8250_rx_chars(up, status);
1931*4882a593Smuzhiyun }
1932*4882a593Smuzhiyun #else
1933*4882a593Smuzhiyun /*
1934*4882a593Smuzhiyun * If port is stopped and there are no error conditions in the
1935*4882a593Smuzhiyun * FIFO, then don't drain the FIFO, as this may lead to TTY buffer
1936*4882a593Smuzhiyun * overflow. Not servicing, RX FIFO would trigger auto HW flow
1937*4882a593Smuzhiyun * control when FIFO occupancy reaches preset threshold, thus
1938*4882a593Smuzhiyun * halting RX. This only works when auto HW flow control is
1939*4882a593Smuzhiyun * available.
1940*4882a593Smuzhiyun */
1941*4882a593Smuzhiyun if (!(status & (UART_LSR_FIFOE | UART_LSR_BRK_ERROR_BITS)) &&
1942*4882a593Smuzhiyun (port->status & (UPSTAT_AUTOCTS | UPSTAT_AUTORTS)) &&
1943*4882a593Smuzhiyun !(port->read_status_mask & UART_LSR_DR))
1944*4882a593Smuzhiyun skip_rx = true;
1945*4882a593Smuzhiyun
1946*4882a593Smuzhiyun if (status & (UART_LSR_DR | UART_LSR_BI) && !skip_rx) {
1947*4882a593Smuzhiyun if (!up->dma || handle_rx_dma(up, iir))
1948*4882a593Smuzhiyun status = serial8250_rx_chars(up, status);
1949*4882a593Smuzhiyun }
1950*4882a593Smuzhiyun #endif
1951*4882a593Smuzhiyun serial8250_modem_status(up);
1952*4882a593Smuzhiyun #ifdef CONFIG_ARCH_ROCKCHIP
1953*4882a593Smuzhiyun if ((!up->dma || (up->dma && (!up->dma->txchan || up->dma->tx_err))) &&
1954*4882a593Smuzhiyun ((iir & 0xf) == UART_IIR_THRI))
1955*4882a593Smuzhiyun serial8250_tx_chars(up);
1956*4882a593Smuzhiyun #else
1957*4882a593Smuzhiyun if ((!up->dma || (up->dma && up->dma->tx_err)) &&
1958*4882a593Smuzhiyun (status & UART_LSR_THRE))
1959*4882a593Smuzhiyun serial8250_tx_chars(up);
1960*4882a593Smuzhiyun #endif
1961*4882a593Smuzhiyun
1962*4882a593Smuzhiyun #ifdef CONFIG_ARCH_ROCKCHIP
1963*4882a593Smuzhiyun if (status & UART_LSR_BRK_ERROR_BITS) {
1964*4882a593Smuzhiyun
1965*4882a593Smuzhiyun if (status & UART_LSR_OE)
1966*4882a593Smuzhiyun pr_err("%s: Overrun error!\n", port->name);
1967*4882a593Smuzhiyun if (status & UART_LSR_PE)
1968*4882a593Smuzhiyun pr_err("%s: Parity error!\n", port->name);
1969*4882a593Smuzhiyun if (status & UART_LSR_FE)
1970*4882a593Smuzhiyun pr_err("%s: Frame error!\n", port->name);
1971*4882a593Smuzhiyun if (status & UART_LSR_BI)
1972*4882a593Smuzhiyun pr_err("%s: Break interrupt!\n", port->name);
1973*4882a593Smuzhiyun
1974*4882a593Smuzhiyun pr_err("%s: maybe rx pin is low or baudrate is not correct!\n",
1975*4882a593Smuzhiyun port->name);
1976*4882a593Smuzhiyun }
1977*4882a593Smuzhiyun #endif
1978*4882a593Smuzhiyun uart_unlock_and_check_sysrq(port, flags);
1979*4882a593Smuzhiyun return 1;
1980*4882a593Smuzhiyun }
1981*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(serial8250_handle_irq);
1982*4882a593Smuzhiyun
serial8250_default_handle_irq(struct uart_port * port)1983*4882a593Smuzhiyun static int serial8250_default_handle_irq(struct uart_port *port)
1984*4882a593Smuzhiyun {
1985*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
1986*4882a593Smuzhiyun unsigned int iir;
1987*4882a593Smuzhiyun int ret;
1988*4882a593Smuzhiyun
1989*4882a593Smuzhiyun serial8250_rpm_get(up);
1990*4882a593Smuzhiyun
1991*4882a593Smuzhiyun iir = serial_port_in(port, UART_IIR);
1992*4882a593Smuzhiyun ret = serial8250_handle_irq(port, iir);
1993*4882a593Smuzhiyun
1994*4882a593Smuzhiyun serial8250_rpm_put(up);
1995*4882a593Smuzhiyun return ret;
1996*4882a593Smuzhiyun }
1997*4882a593Smuzhiyun
1998*4882a593Smuzhiyun /*
1999*4882a593Smuzhiyun * Newer 16550 compatible parts such as the SC16C650 & Altera 16550 Soft IP
2000*4882a593Smuzhiyun * have a programmable TX threshold that triggers the THRE interrupt in
2001*4882a593Smuzhiyun * the IIR register. In this case, the THRE interrupt indicates the FIFO
2002*4882a593Smuzhiyun * has space available. Load it up with tx_loadsz bytes.
2003*4882a593Smuzhiyun */
serial8250_tx_threshold_handle_irq(struct uart_port * port)2004*4882a593Smuzhiyun static int serial8250_tx_threshold_handle_irq(struct uart_port *port)
2005*4882a593Smuzhiyun {
2006*4882a593Smuzhiyun unsigned long flags;
2007*4882a593Smuzhiyun unsigned int iir = serial_port_in(port, UART_IIR);
2008*4882a593Smuzhiyun
2009*4882a593Smuzhiyun /* TX Threshold IRQ triggered so load up FIFO */
2010*4882a593Smuzhiyun if ((iir & UART_IIR_ID) == UART_IIR_THRI) {
2011*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
2012*4882a593Smuzhiyun
2013*4882a593Smuzhiyun spin_lock_irqsave(&port->lock, flags);
2014*4882a593Smuzhiyun serial8250_tx_chars(up);
2015*4882a593Smuzhiyun spin_unlock_irqrestore(&port->lock, flags);
2016*4882a593Smuzhiyun }
2017*4882a593Smuzhiyun
2018*4882a593Smuzhiyun iir = serial_port_in(port, UART_IIR);
2019*4882a593Smuzhiyun return serial8250_handle_irq(port, iir);
2020*4882a593Smuzhiyun }
2021*4882a593Smuzhiyun
serial8250_tx_empty(struct uart_port * port)2022*4882a593Smuzhiyun static unsigned int serial8250_tx_empty(struct uart_port *port)
2023*4882a593Smuzhiyun {
2024*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
2025*4882a593Smuzhiyun unsigned long flags;
2026*4882a593Smuzhiyun unsigned int lsr;
2027*4882a593Smuzhiyun
2028*4882a593Smuzhiyun serial8250_rpm_get(up);
2029*4882a593Smuzhiyun
2030*4882a593Smuzhiyun spin_lock_irqsave(&port->lock, flags);
2031*4882a593Smuzhiyun lsr = serial_port_in(port, UART_LSR);
2032*4882a593Smuzhiyun up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
2033*4882a593Smuzhiyun spin_unlock_irqrestore(&port->lock, flags);
2034*4882a593Smuzhiyun
2035*4882a593Smuzhiyun serial8250_rpm_put(up);
2036*4882a593Smuzhiyun
2037*4882a593Smuzhiyun return (lsr & BOTH_EMPTY) == BOTH_EMPTY ? TIOCSER_TEMT : 0;
2038*4882a593Smuzhiyun }
2039*4882a593Smuzhiyun
serial8250_do_get_mctrl(struct uart_port * port)2040*4882a593Smuzhiyun unsigned int serial8250_do_get_mctrl(struct uart_port *port)
2041*4882a593Smuzhiyun {
2042*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
2043*4882a593Smuzhiyun unsigned int status;
2044*4882a593Smuzhiyun unsigned int val;
2045*4882a593Smuzhiyun
2046*4882a593Smuzhiyun serial8250_rpm_get(up);
2047*4882a593Smuzhiyun status = serial8250_modem_status(up);
2048*4882a593Smuzhiyun serial8250_rpm_put(up);
2049*4882a593Smuzhiyun
2050*4882a593Smuzhiyun val = serial8250_MSR_to_TIOCM(status);
2051*4882a593Smuzhiyun if (up->gpios)
2052*4882a593Smuzhiyun return mctrl_gpio_get(up->gpios, &val);
2053*4882a593Smuzhiyun
2054*4882a593Smuzhiyun return val;
2055*4882a593Smuzhiyun }
2056*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(serial8250_do_get_mctrl);
2057*4882a593Smuzhiyun
serial8250_get_mctrl(struct uart_port * port)2058*4882a593Smuzhiyun static unsigned int serial8250_get_mctrl(struct uart_port *port)
2059*4882a593Smuzhiyun {
2060*4882a593Smuzhiyun if (port->get_mctrl)
2061*4882a593Smuzhiyun return port->get_mctrl(port);
2062*4882a593Smuzhiyun return serial8250_do_get_mctrl(port);
2063*4882a593Smuzhiyun }
2064*4882a593Smuzhiyun
serial8250_do_set_mctrl(struct uart_port * port,unsigned int mctrl)2065*4882a593Smuzhiyun void serial8250_do_set_mctrl(struct uart_port *port, unsigned int mctrl)
2066*4882a593Smuzhiyun {
2067*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
2068*4882a593Smuzhiyun unsigned char mcr;
2069*4882a593Smuzhiyun
2070*4882a593Smuzhiyun mcr = serial8250_TIOCM_to_MCR(mctrl);
2071*4882a593Smuzhiyun
2072*4882a593Smuzhiyun mcr = (mcr & up->mcr_mask) | up->mcr_force | up->mcr;
2073*4882a593Smuzhiyun
2074*4882a593Smuzhiyun serial8250_out_MCR(up, mcr);
2075*4882a593Smuzhiyun }
2076*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(serial8250_do_set_mctrl);
2077*4882a593Smuzhiyun
serial8250_set_mctrl(struct uart_port * port,unsigned int mctrl)2078*4882a593Smuzhiyun static void serial8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
2079*4882a593Smuzhiyun {
2080*4882a593Smuzhiyun if (port->rs485.flags & SER_RS485_ENABLED)
2081*4882a593Smuzhiyun return;
2082*4882a593Smuzhiyun
2083*4882a593Smuzhiyun if (port->set_mctrl)
2084*4882a593Smuzhiyun port->set_mctrl(port, mctrl);
2085*4882a593Smuzhiyun else
2086*4882a593Smuzhiyun serial8250_do_set_mctrl(port, mctrl);
2087*4882a593Smuzhiyun }
2088*4882a593Smuzhiyun
serial8250_break_ctl(struct uart_port * port,int break_state)2089*4882a593Smuzhiyun static void serial8250_break_ctl(struct uart_port *port, int break_state)
2090*4882a593Smuzhiyun {
2091*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
2092*4882a593Smuzhiyun unsigned long flags;
2093*4882a593Smuzhiyun
2094*4882a593Smuzhiyun serial8250_rpm_get(up);
2095*4882a593Smuzhiyun spin_lock_irqsave(&port->lock, flags);
2096*4882a593Smuzhiyun if (break_state == -1)
2097*4882a593Smuzhiyun up->lcr |= UART_LCR_SBC;
2098*4882a593Smuzhiyun else
2099*4882a593Smuzhiyun up->lcr &= ~UART_LCR_SBC;
2100*4882a593Smuzhiyun serial_port_out(port, UART_LCR, up->lcr);
2101*4882a593Smuzhiyun spin_unlock_irqrestore(&port->lock, flags);
2102*4882a593Smuzhiyun serial8250_rpm_put(up);
2103*4882a593Smuzhiyun }
2104*4882a593Smuzhiyun
2105*4882a593Smuzhiyun /*
2106*4882a593Smuzhiyun * Wait for transmitter & holding register to empty
2107*4882a593Smuzhiyun */
wait_for_xmitr(struct uart_8250_port * up,int bits)2108*4882a593Smuzhiyun static void wait_for_xmitr(struct uart_8250_port *up, int bits)
2109*4882a593Smuzhiyun {
2110*4882a593Smuzhiyun unsigned int status, tmout = 10000;
2111*4882a593Smuzhiyun
2112*4882a593Smuzhiyun /* Wait up to 10ms for the character(s) to be sent. */
2113*4882a593Smuzhiyun for (;;) {
2114*4882a593Smuzhiyun status = serial_in(up, UART_LSR);
2115*4882a593Smuzhiyun
2116*4882a593Smuzhiyun up->lsr_saved_flags |= status & LSR_SAVE_FLAGS;
2117*4882a593Smuzhiyun
2118*4882a593Smuzhiyun if ((status & bits) == bits)
2119*4882a593Smuzhiyun break;
2120*4882a593Smuzhiyun if (--tmout == 0)
2121*4882a593Smuzhiyun break;
2122*4882a593Smuzhiyun udelay(1);
2123*4882a593Smuzhiyun touch_nmi_watchdog();
2124*4882a593Smuzhiyun }
2125*4882a593Smuzhiyun
2126*4882a593Smuzhiyun /* Wait up to 1s for flow control if necessary */
2127*4882a593Smuzhiyun if (up->port.flags & UPF_CONS_FLOW) {
2128*4882a593Smuzhiyun for (tmout = 1000000; tmout; tmout--) {
2129*4882a593Smuzhiyun unsigned int msr = serial_in(up, UART_MSR);
2130*4882a593Smuzhiyun up->msr_saved_flags |= msr & MSR_SAVE_FLAGS;
2131*4882a593Smuzhiyun if (msr & UART_MSR_CTS)
2132*4882a593Smuzhiyun break;
2133*4882a593Smuzhiyun udelay(1);
2134*4882a593Smuzhiyun touch_nmi_watchdog();
2135*4882a593Smuzhiyun }
2136*4882a593Smuzhiyun }
2137*4882a593Smuzhiyun }
2138*4882a593Smuzhiyun
2139*4882a593Smuzhiyun #ifdef CONFIG_CONSOLE_POLL
2140*4882a593Smuzhiyun /*
2141*4882a593Smuzhiyun * Console polling routines for writing and reading from the uart while
2142*4882a593Smuzhiyun * in an interrupt or debug context.
2143*4882a593Smuzhiyun */
2144*4882a593Smuzhiyun
serial8250_get_poll_char(struct uart_port * port)2145*4882a593Smuzhiyun static int serial8250_get_poll_char(struct uart_port *port)
2146*4882a593Smuzhiyun {
2147*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
2148*4882a593Smuzhiyun unsigned char lsr;
2149*4882a593Smuzhiyun int status;
2150*4882a593Smuzhiyun
2151*4882a593Smuzhiyun serial8250_rpm_get(up);
2152*4882a593Smuzhiyun
2153*4882a593Smuzhiyun lsr = serial_port_in(port, UART_LSR);
2154*4882a593Smuzhiyun
2155*4882a593Smuzhiyun if (!(lsr & UART_LSR_DR)) {
2156*4882a593Smuzhiyun status = NO_POLL_CHAR;
2157*4882a593Smuzhiyun goto out;
2158*4882a593Smuzhiyun }
2159*4882a593Smuzhiyun
2160*4882a593Smuzhiyun status = serial_port_in(port, UART_RX);
2161*4882a593Smuzhiyun out:
2162*4882a593Smuzhiyun serial8250_rpm_put(up);
2163*4882a593Smuzhiyun return status;
2164*4882a593Smuzhiyun }
2165*4882a593Smuzhiyun
2166*4882a593Smuzhiyun
serial8250_put_poll_char(struct uart_port * port,unsigned char c)2167*4882a593Smuzhiyun static void serial8250_put_poll_char(struct uart_port *port,
2168*4882a593Smuzhiyun unsigned char c)
2169*4882a593Smuzhiyun {
2170*4882a593Smuzhiyun unsigned int ier;
2171*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
2172*4882a593Smuzhiyun
2173*4882a593Smuzhiyun serial8250_rpm_get(up);
2174*4882a593Smuzhiyun /*
2175*4882a593Smuzhiyun * First save the IER then disable the interrupts
2176*4882a593Smuzhiyun */
2177*4882a593Smuzhiyun ier = serial_port_in(port, UART_IER);
2178*4882a593Smuzhiyun if (up->capabilities & UART_CAP_UUE)
2179*4882a593Smuzhiyun serial_port_out(port, UART_IER, UART_IER_UUE);
2180*4882a593Smuzhiyun else
2181*4882a593Smuzhiyun serial_port_out(port, UART_IER, 0);
2182*4882a593Smuzhiyun
2183*4882a593Smuzhiyun wait_for_xmitr(up, BOTH_EMPTY);
2184*4882a593Smuzhiyun /*
2185*4882a593Smuzhiyun * Send the character out.
2186*4882a593Smuzhiyun */
2187*4882a593Smuzhiyun serial_port_out(port, UART_TX, c);
2188*4882a593Smuzhiyun
2189*4882a593Smuzhiyun /*
2190*4882a593Smuzhiyun * Finally, wait for transmitter to become empty
2191*4882a593Smuzhiyun * and restore the IER
2192*4882a593Smuzhiyun */
2193*4882a593Smuzhiyun wait_for_xmitr(up, BOTH_EMPTY);
2194*4882a593Smuzhiyun serial_port_out(port, UART_IER, ier);
2195*4882a593Smuzhiyun serial8250_rpm_put(up);
2196*4882a593Smuzhiyun }
2197*4882a593Smuzhiyun
2198*4882a593Smuzhiyun #endif /* CONFIG_CONSOLE_POLL */
2199*4882a593Smuzhiyun
serial8250_do_startup(struct uart_port * port)2200*4882a593Smuzhiyun int serial8250_do_startup(struct uart_port *port)
2201*4882a593Smuzhiyun {
2202*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
2203*4882a593Smuzhiyun unsigned long flags;
2204*4882a593Smuzhiyun unsigned char lsr, iir;
2205*4882a593Smuzhiyun int retval;
2206*4882a593Smuzhiyun
2207*4882a593Smuzhiyun if (!port->fifosize)
2208*4882a593Smuzhiyun port->fifosize = uart_config[port->type].fifo_size;
2209*4882a593Smuzhiyun if (!up->tx_loadsz)
2210*4882a593Smuzhiyun up->tx_loadsz = uart_config[port->type].tx_loadsz;
2211*4882a593Smuzhiyun if (!up->capabilities)
2212*4882a593Smuzhiyun up->capabilities = uart_config[port->type].flags;
2213*4882a593Smuzhiyun up->mcr = 0;
2214*4882a593Smuzhiyun
2215*4882a593Smuzhiyun if (port->iotype != up->cur_iotype)
2216*4882a593Smuzhiyun set_io_from_upio(port);
2217*4882a593Smuzhiyun
2218*4882a593Smuzhiyun serial8250_rpm_get(up);
2219*4882a593Smuzhiyun if (port->type == PORT_16C950) {
2220*4882a593Smuzhiyun /* Wake up and initialize UART */
2221*4882a593Smuzhiyun up->acr = 0;
2222*4882a593Smuzhiyun serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B);
2223*4882a593Smuzhiyun serial_port_out(port, UART_EFR, UART_EFR_ECB);
2224*4882a593Smuzhiyun serial_port_out(port, UART_IER, 0);
2225*4882a593Smuzhiyun serial_port_out(port, UART_LCR, 0);
2226*4882a593Smuzhiyun serial_icr_write(up, UART_CSR, 0); /* Reset the UART */
2227*4882a593Smuzhiyun serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B);
2228*4882a593Smuzhiyun serial_port_out(port, UART_EFR, UART_EFR_ECB);
2229*4882a593Smuzhiyun serial_port_out(port, UART_LCR, 0);
2230*4882a593Smuzhiyun }
2231*4882a593Smuzhiyun
2232*4882a593Smuzhiyun if (port->type == PORT_DA830) {
2233*4882a593Smuzhiyun /* Reset the port */
2234*4882a593Smuzhiyun serial_port_out(port, UART_IER, 0);
2235*4882a593Smuzhiyun serial_port_out(port, UART_DA830_PWREMU_MGMT, 0);
2236*4882a593Smuzhiyun mdelay(10);
2237*4882a593Smuzhiyun
2238*4882a593Smuzhiyun /* Enable Tx, Rx and free run mode */
2239*4882a593Smuzhiyun serial_port_out(port, UART_DA830_PWREMU_MGMT,
2240*4882a593Smuzhiyun UART_DA830_PWREMU_MGMT_UTRST |
2241*4882a593Smuzhiyun UART_DA830_PWREMU_MGMT_URRST |
2242*4882a593Smuzhiyun UART_DA830_PWREMU_MGMT_FREE);
2243*4882a593Smuzhiyun }
2244*4882a593Smuzhiyun
2245*4882a593Smuzhiyun if (port->type == PORT_NPCM) {
2246*4882a593Smuzhiyun /*
2247*4882a593Smuzhiyun * Nuvoton calls the scratch register 'UART_TOR' (timeout
2248*4882a593Smuzhiyun * register). Enable it, and set TIOC (timeout interrupt
2249*4882a593Smuzhiyun * comparator) to be 0x20 for correct operation.
2250*4882a593Smuzhiyun */
2251*4882a593Smuzhiyun serial_port_out(port, UART_NPCM_TOR, UART_NPCM_TOIE | 0x20);
2252*4882a593Smuzhiyun }
2253*4882a593Smuzhiyun
2254*4882a593Smuzhiyun #ifdef CONFIG_SERIAL_8250_RSA
2255*4882a593Smuzhiyun /*
2256*4882a593Smuzhiyun * If this is an RSA port, see if we can kick it up to the
2257*4882a593Smuzhiyun * higher speed clock.
2258*4882a593Smuzhiyun */
2259*4882a593Smuzhiyun enable_rsa(up);
2260*4882a593Smuzhiyun #endif
2261*4882a593Smuzhiyun
2262*4882a593Smuzhiyun /*
2263*4882a593Smuzhiyun * Clear the FIFO buffers and disable them.
2264*4882a593Smuzhiyun * (they will be reenabled in set_termios())
2265*4882a593Smuzhiyun */
2266*4882a593Smuzhiyun serial8250_clear_fifos(up);
2267*4882a593Smuzhiyun
2268*4882a593Smuzhiyun /*
2269*4882a593Smuzhiyun * Clear the interrupt registers.
2270*4882a593Smuzhiyun */
2271*4882a593Smuzhiyun serial_port_in(port, UART_LSR);
2272*4882a593Smuzhiyun serial_port_in(port, UART_RX);
2273*4882a593Smuzhiyun serial_port_in(port, UART_IIR);
2274*4882a593Smuzhiyun serial_port_in(port, UART_MSR);
2275*4882a593Smuzhiyun
2276*4882a593Smuzhiyun /*
2277*4882a593Smuzhiyun * At this point, there's no way the LSR could still be 0xff;
2278*4882a593Smuzhiyun * if it is, then bail out, because there's likely no UART
2279*4882a593Smuzhiyun * here.
2280*4882a593Smuzhiyun */
2281*4882a593Smuzhiyun if (!(port->flags & UPF_BUGGY_UART) &&
2282*4882a593Smuzhiyun (serial_port_in(port, UART_LSR) == 0xff)) {
2283*4882a593Smuzhiyun dev_info_ratelimited(port->dev, "LSR safety check engaged!\n");
2284*4882a593Smuzhiyun retval = -ENODEV;
2285*4882a593Smuzhiyun goto out;
2286*4882a593Smuzhiyun }
2287*4882a593Smuzhiyun
2288*4882a593Smuzhiyun /*
2289*4882a593Smuzhiyun * For a XR16C850, we need to set the trigger levels
2290*4882a593Smuzhiyun */
2291*4882a593Smuzhiyun if (port->type == PORT_16850) {
2292*4882a593Smuzhiyun unsigned char fctr;
2293*4882a593Smuzhiyun
2294*4882a593Smuzhiyun serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
2295*4882a593Smuzhiyun
2296*4882a593Smuzhiyun fctr = serial_in(up, UART_FCTR) & ~(UART_FCTR_RX|UART_FCTR_TX);
2297*4882a593Smuzhiyun serial_port_out(port, UART_FCTR,
2298*4882a593Smuzhiyun fctr | UART_FCTR_TRGD | UART_FCTR_RX);
2299*4882a593Smuzhiyun serial_port_out(port, UART_TRG, UART_TRG_96);
2300*4882a593Smuzhiyun serial_port_out(port, UART_FCTR,
2301*4882a593Smuzhiyun fctr | UART_FCTR_TRGD | UART_FCTR_TX);
2302*4882a593Smuzhiyun serial_port_out(port, UART_TRG, UART_TRG_96);
2303*4882a593Smuzhiyun
2304*4882a593Smuzhiyun serial_port_out(port, UART_LCR, 0);
2305*4882a593Smuzhiyun }
2306*4882a593Smuzhiyun
2307*4882a593Smuzhiyun /*
2308*4882a593Smuzhiyun * For the Altera 16550 variants, set TX threshold trigger level.
2309*4882a593Smuzhiyun */
2310*4882a593Smuzhiyun if (((port->type == PORT_ALTR_16550_F32) ||
2311*4882a593Smuzhiyun (port->type == PORT_ALTR_16550_F64) ||
2312*4882a593Smuzhiyun (port->type == PORT_ALTR_16550_F128)) && (port->fifosize > 1)) {
2313*4882a593Smuzhiyun /* Bounds checking of TX threshold (valid 0 to fifosize-2) */
2314*4882a593Smuzhiyun if ((up->tx_loadsz < 2) || (up->tx_loadsz > port->fifosize)) {
2315*4882a593Smuzhiyun dev_err(port->dev, "TX FIFO Threshold errors, skipping\n");
2316*4882a593Smuzhiyun } else {
2317*4882a593Smuzhiyun serial_port_out(port, UART_ALTR_AFR,
2318*4882a593Smuzhiyun UART_ALTR_EN_TXFIFO_LW);
2319*4882a593Smuzhiyun serial_port_out(port, UART_ALTR_TX_LOW,
2320*4882a593Smuzhiyun port->fifosize - up->tx_loadsz);
2321*4882a593Smuzhiyun port->handle_irq = serial8250_tx_threshold_handle_irq;
2322*4882a593Smuzhiyun }
2323*4882a593Smuzhiyun }
2324*4882a593Smuzhiyun
2325*4882a593Smuzhiyun /* Check if we need to have shared IRQs */
2326*4882a593Smuzhiyun if (port->irq && (up->port.flags & UPF_SHARE_IRQ))
2327*4882a593Smuzhiyun up->port.irqflags |= IRQF_SHARED;
2328*4882a593Smuzhiyun
2329*4882a593Smuzhiyun if (port->irq && !(up->port.flags & UPF_NO_THRE_TEST)) {
2330*4882a593Smuzhiyun unsigned char iir1;
2331*4882a593Smuzhiyun
2332*4882a593Smuzhiyun if (port->irqflags & IRQF_SHARED)
2333*4882a593Smuzhiyun disable_irq_nosync(port->irq);
2334*4882a593Smuzhiyun
2335*4882a593Smuzhiyun /*
2336*4882a593Smuzhiyun * Test for UARTs that do not reassert THRE when the
2337*4882a593Smuzhiyun * transmitter is idle and the interrupt has already
2338*4882a593Smuzhiyun * been cleared. Real 16550s should always reassert
2339*4882a593Smuzhiyun * this interrupt whenever the transmitter is idle and
2340*4882a593Smuzhiyun * the interrupt is enabled. Delays are necessary to
2341*4882a593Smuzhiyun * allow register changes to become visible.
2342*4882a593Smuzhiyun */
2343*4882a593Smuzhiyun spin_lock_irqsave(&port->lock, flags);
2344*4882a593Smuzhiyun
2345*4882a593Smuzhiyun wait_for_xmitr(up, UART_LSR_THRE);
2346*4882a593Smuzhiyun serial_port_out_sync(port, UART_IER, UART_IER_THRI);
2347*4882a593Smuzhiyun udelay(1); /* allow THRE to set */
2348*4882a593Smuzhiyun iir1 = serial_port_in(port, UART_IIR);
2349*4882a593Smuzhiyun serial_port_out(port, UART_IER, 0);
2350*4882a593Smuzhiyun serial_port_out_sync(port, UART_IER, UART_IER_THRI);
2351*4882a593Smuzhiyun udelay(1); /* allow a working UART time to re-assert THRE */
2352*4882a593Smuzhiyun iir = serial_port_in(port, UART_IIR);
2353*4882a593Smuzhiyun serial_port_out(port, UART_IER, 0);
2354*4882a593Smuzhiyun
2355*4882a593Smuzhiyun spin_unlock_irqrestore(&port->lock, flags);
2356*4882a593Smuzhiyun
2357*4882a593Smuzhiyun if (port->irqflags & IRQF_SHARED)
2358*4882a593Smuzhiyun enable_irq(port->irq);
2359*4882a593Smuzhiyun
2360*4882a593Smuzhiyun /*
2361*4882a593Smuzhiyun * If the interrupt is not reasserted, or we otherwise
2362*4882a593Smuzhiyun * don't trust the iir, setup a timer to kick the UART
2363*4882a593Smuzhiyun * on a regular basis.
2364*4882a593Smuzhiyun */
2365*4882a593Smuzhiyun if ((!(iir1 & UART_IIR_NO_INT) && (iir & UART_IIR_NO_INT)) ||
2366*4882a593Smuzhiyun up->port.flags & UPF_BUG_THRE) {
2367*4882a593Smuzhiyun up->bugs |= UART_BUG_THRE;
2368*4882a593Smuzhiyun }
2369*4882a593Smuzhiyun }
2370*4882a593Smuzhiyun
2371*4882a593Smuzhiyun retval = up->ops->setup_irq(up);
2372*4882a593Smuzhiyun if (retval)
2373*4882a593Smuzhiyun goto out;
2374*4882a593Smuzhiyun
2375*4882a593Smuzhiyun /*
2376*4882a593Smuzhiyun * Now, initialize the UART
2377*4882a593Smuzhiyun */
2378*4882a593Smuzhiyun serial_port_out(port, UART_LCR, UART_LCR_WLEN8);
2379*4882a593Smuzhiyun
2380*4882a593Smuzhiyun spin_lock_irqsave(&port->lock, flags);
2381*4882a593Smuzhiyun if (up->port.flags & UPF_FOURPORT) {
2382*4882a593Smuzhiyun if (!up->port.irq)
2383*4882a593Smuzhiyun up->port.mctrl |= TIOCM_OUT1;
2384*4882a593Smuzhiyun } else
2385*4882a593Smuzhiyun /*
2386*4882a593Smuzhiyun * Most PC uarts need OUT2 raised to enable interrupts.
2387*4882a593Smuzhiyun */
2388*4882a593Smuzhiyun if (port->irq)
2389*4882a593Smuzhiyun up->port.mctrl |= TIOCM_OUT2;
2390*4882a593Smuzhiyun
2391*4882a593Smuzhiyun serial8250_set_mctrl(port, port->mctrl);
2392*4882a593Smuzhiyun
2393*4882a593Smuzhiyun /*
2394*4882a593Smuzhiyun * Serial over Lan (SoL) hack:
2395*4882a593Smuzhiyun * Intel 8257x Gigabit ethernet chips have a 16550 emulation, to be
2396*4882a593Smuzhiyun * used for Serial Over Lan. Those chips take a longer time than a
2397*4882a593Smuzhiyun * normal serial device to signalize that a transmission data was
2398*4882a593Smuzhiyun * queued. Due to that, the above test generally fails. One solution
2399*4882a593Smuzhiyun * would be to delay the reading of iir. However, this is not
2400*4882a593Smuzhiyun * reliable, since the timeout is variable. So, let's just don't
2401*4882a593Smuzhiyun * test if we receive TX irq. This way, we'll never enable
2402*4882a593Smuzhiyun * UART_BUG_TXEN.
2403*4882a593Smuzhiyun */
2404*4882a593Smuzhiyun if (up->port.quirks & UPQ_NO_TXEN_TEST)
2405*4882a593Smuzhiyun goto dont_test_tx_en;
2406*4882a593Smuzhiyun
2407*4882a593Smuzhiyun /*
2408*4882a593Smuzhiyun * Do a quick test to see if we receive an interrupt when we enable
2409*4882a593Smuzhiyun * the TX irq.
2410*4882a593Smuzhiyun */
2411*4882a593Smuzhiyun serial_port_out(port, UART_IER, UART_IER_THRI);
2412*4882a593Smuzhiyun lsr = serial_port_in(port, UART_LSR);
2413*4882a593Smuzhiyun iir = serial_port_in(port, UART_IIR);
2414*4882a593Smuzhiyun serial_port_out(port, UART_IER, 0);
2415*4882a593Smuzhiyun
2416*4882a593Smuzhiyun if (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT) {
2417*4882a593Smuzhiyun if (!(up->bugs & UART_BUG_TXEN)) {
2418*4882a593Smuzhiyun up->bugs |= UART_BUG_TXEN;
2419*4882a593Smuzhiyun dev_dbg(port->dev, "enabling bad tx status workarounds\n");
2420*4882a593Smuzhiyun }
2421*4882a593Smuzhiyun } else {
2422*4882a593Smuzhiyun up->bugs &= ~UART_BUG_TXEN;
2423*4882a593Smuzhiyun }
2424*4882a593Smuzhiyun
2425*4882a593Smuzhiyun dont_test_tx_en:
2426*4882a593Smuzhiyun spin_unlock_irqrestore(&port->lock, flags);
2427*4882a593Smuzhiyun
2428*4882a593Smuzhiyun /*
2429*4882a593Smuzhiyun * Clear the interrupt registers again for luck, and clear the
2430*4882a593Smuzhiyun * saved flags to avoid getting false values from polling
2431*4882a593Smuzhiyun * routines or the previous session.
2432*4882a593Smuzhiyun */
2433*4882a593Smuzhiyun serial_port_in(port, UART_LSR);
2434*4882a593Smuzhiyun serial_port_in(port, UART_RX);
2435*4882a593Smuzhiyun serial_port_in(port, UART_IIR);
2436*4882a593Smuzhiyun serial_port_in(port, UART_MSR);
2437*4882a593Smuzhiyun up->lsr_saved_flags = 0;
2438*4882a593Smuzhiyun up->msr_saved_flags = 0;
2439*4882a593Smuzhiyun
2440*4882a593Smuzhiyun /*
2441*4882a593Smuzhiyun * Request DMA channels for both RX and TX.
2442*4882a593Smuzhiyun */
2443*4882a593Smuzhiyun if (up->dma) {
2444*4882a593Smuzhiyun const char *msg = NULL;
2445*4882a593Smuzhiyun
2446*4882a593Smuzhiyun if (uart_console(port))
2447*4882a593Smuzhiyun msg = "forbid DMA for kernel console";
2448*4882a593Smuzhiyun else if (serial8250_request_dma(up))
2449*4882a593Smuzhiyun #ifdef CONFIG_ARCH_ROCKCHIP
2450*4882a593Smuzhiyun msg = "failed to request DMA, use interrupt mode";
2451*4882a593Smuzhiyun #else
2452*4882a593Smuzhiyun msg = "failed to request DMA";
2453*4882a593Smuzhiyun #endif
2454*4882a593Smuzhiyun if (msg) {
2455*4882a593Smuzhiyun dev_warn_ratelimited(port->dev, "%s\n", msg);
2456*4882a593Smuzhiyun up->dma = NULL;
2457*4882a593Smuzhiyun }
2458*4882a593Smuzhiyun }
2459*4882a593Smuzhiyun
2460*4882a593Smuzhiyun /*
2461*4882a593Smuzhiyun * Set the IER shadow for rx interrupts but defer actual interrupt
2462*4882a593Smuzhiyun * enable until after the FIFOs are enabled; otherwise, an already-
2463*4882a593Smuzhiyun * active sender can swamp the interrupt handler with "too much work".
2464*4882a593Smuzhiyun */
2465*4882a593Smuzhiyun up->ier = UART_IER_RLSI | UART_IER_RDI;
2466*4882a593Smuzhiyun
2467*4882a593Smuzhiyun if (port->flags & UPF_FOURPORT) {
2468*4882a593Smuzhiyun unsigned int icp;
2469*4882a593Smuzhiyun /*
2470*4882a593Smuzhiyun * Enable interrupts on the AST Fourport board
2471*4882a593Smuzhiyun */
2472*4882a593Smuzhiyun icp = (port->iobase & 0xfe0) | 0x01f;
2473*4882a593Smuzhiyun outb_p(0x80, icp);
2474*4882a593Smuzhiyun inb_p(icp);
2475*4882a593Smuzhiyun }
2476*4882a593Smuzhiyun retval = 0;
2477*4882a593Smuzhiyun out:
2478*4882a593Smuzhiyun serial8250_rpm_put(up);
2479*4882a593Smuzhiyun return retval;
2480*4882a593Smuzhiyun }
2481*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(serial8250_do_startup);
2482*4882a593Smuzhiyun
serial8250_startup(struct uart_port * port)2483*4882a593Smuzhiyun static int serial8250_startup(struct uart_port *port)
2484*4882a593Smuzhiyun {
2485*4882a593Smuzhiyun if (port->startup)
2486*4882a593Smuzhiyun return port->startup(port);
2487*4882a593Smuzhiyun return serial8250_do_startup(port);
2488*4882a593Smuzhiyun }
2489*4882a593Smuzhiyun
serial8250_do_shutdown(struct uart_port * port)2490*4882a593Smuzhiyun void serial8250_do_shutdown(struct uart_port *port)
2491*4882a593Smuzhiyun {
2492*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
2493*4882a593Smuzhiyun unsigned long flags;
2494*4882a593Smuzhiyun
2495*4882a593Smuzhiyun serial8250_rpm_get(up);
2496*4882a593Smuzhiyun /*
2497*4882a593Smuzhiyun * Disable interrupts from this port
2498*4882a593Smuzhiyun */
2499*4882a593Smuzhiyun spin_lock_irqsave(&port->lock, flags);
2500*4882a593Smuzhiyun up->ier = 0;
2501*4882a593Smuzhiyun serial_port_out(port, UART_IER, 0);
2502*4882a593Smuzhiyun spin_unlock_irqrestore(&port->lock, flags);
2503*4882a593Smuzhiyun
2504*4882a593Smuzhiyun synchronize_irq(port->irq);
2505*4882a593Smuzhiyun
2506*4882a593Smuzhiyun if (up->dma)
2507*4882a593Smuzhiyun serial8250_release_dma(up);
2508*4882a593Smuzhiyun
2509*4882a593Smuzhiyun spin_lock_irqsave(&port->lock, flags);
2510*4882a593Smuzhiyun if (port->flags & UPF_FOURPORT) {
2511*4882a593Smuzhiyun /* reset interrupts on the AST Fourport board */
2512*4882a593Smuzhiyun inb((port->iobase & 0xfe0) | 0x1f);
2513*4882a593Smuzhiyun port->mctrl |= TIOCM_OUT1;
2514*4882a593Smuzhiyun } else
2515*4882a593Smuzhiyun port->mctrl &= ~TIOCM_OUT2;
2516*4882a593Smuzhiyun
2517*4882a593Smuzhiyun serial8250_set_mctrl(port, port->mctrl);
2518*4882a593Smuzhiyun spin_unlock_irqrestore(&port->lock, flags);
2519*4882a593Smuzhiyun
2520*4882a593Smuzhiyun /*
2521*4882a593Smuzhiyun * Disable break condition and FIFOs
2522*4882a593Smuzhiyun */
2523*4882a593Smuzhiyun serial_port_out(port, UART_LCR,
2524*4882a593Smuzhiyun serial_port_in(port, UART_LCR) & ~UART_LCR_SBC);
2525*4882a593Smuzhiyun serial8250_clear_fifos(up);
2526*4882a593Smuzhiyun
2527*4882a593Smuzhiyun #ifdef CONFIG_SERIAL_8250_RSA
2528*4882a593Smuzhiyun /*
2529*4882a593Smuzhiyun * Reset the RSA board back to 115kbps compat mode.
2530*4882a593Smuzhiyun */
2531*4882a593Smuzhiyun disable_rsa(up);
2532*4882a593Smuzhiyun #endif
2533*4882a593Smuzhiyun
2534*4882a593Smuzhiyun /*
2535*4882a593Smuzhiyun * Read data port to reset things, and then unlink from
2536*4882a593Smuzhiyun * the IRQ chain.
2537*4882a593Smuzhiyun */
2538*4882a593Smuzhiyun serial_port_in(port, UART_RX);
2539*4882a593Smuzhiyun serial8250_rpm_put(up);
2540*4882a593Smuzhiyun
2541*4882a593Smuzhiyun up->ops->release_irq(up);
2542*4882a593Smuzhiyun }
2543*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(serial8250_do_shutdown);
2544*4882a593Smuzhiyun
serial8250_shutdown(struct uart_port * port)2545*4882a593Smuzhiyun static void serial8250_shutdown(struct uart_port *port)
2546*4882a593Smuzhiyun {
2547*4882a593Smuzhiyun if (port->shutdown)
2548*4882a593Smuzhiyun port->shutdown(port);
2549*4882a593Smuzhiyun else
2550*4882a593Smuzhiyun serial8250_do_shutdown(port);
2551*4882a593Smuzhiyun }
2552*4882a593Smuzhiyun
2553*4882a593Smuzhiyun /* Nuvoton NPCM UARTs have a custom divisor calculation */
npcm_get_divisor(struct uart_8250_port * up,unsigned int baud)2554*4882a593Smuzhiyun static unsigned int npcm_get_divisor(struct uart_8250_port *up,
2555*4882a593Smuzhiyun unsigned int baud)
2556*4882a593Smuzhiyun {
2557*4882a593Smuzhiyun struct uart_port *port = &up->port;
2558*4882a593Smuzhiyun
2559*4882a593Smuzhiyun return DIV_ROUND_CLOSEST(port->uartclk, 16 * baud + 2) - 2;
2560*4882a593Smuzhiyun }
2561*4882a593Smuzhiyun
serial8250_do_get_divisor(struct uart_port * port,unsigned int baud,unsigned int * frac)2562*4882a593Smuzhiyun static unsigned int serial8250_do_get_divisor(struct uart_port *port,
2563*4882a593Smuzhiyun unsigned int baud,
2564*4882a593Smuzhiyun unsigned int *frac)
2565*4882a593Smuzhiyun {
2566*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
2567*4882a593Smuzhiyun unsigned int quot;
2568*4882a593Smuzhiyun
2569*4882a593Smuzhiyun /*
2570*4882a593Smuzhiyun * Handle magic divisors for baud rates above baud_base on
2571*4882a593Smuzhiyun * SMSC SuperIO chips.
2572*4882a593Smuzhiyun *
2573*4882a593Smuzhiyun */
2574*4882a593Smuzhiyun if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
2575*4882a593Smuzhiyun baud == (port->uartclk/4))
2576*4882a593Smuzhiyun quot = 0x8001;
2577*4882a593Smuzhiyun else if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
2578*4882a593Smuzhiyun baud == (port->uartclk/8))
2579*4882a593Smuzhiyun quot = 0x8002;
2580*4882a593Smuzhiyun else if (up->port.type == PORT_NPCM)
2581*4882a593Smuzhiyun quot = npcm_get_divisor(up, baud);
2582*4882a593Smuzhiyun else
2583*4882a593Smuzhiyun quot = uart_get_divisor(port, baud);
2584*4882a593Smuzhiyun
2585*4882a593Smuzhiyun /*
2586*4882a593Smuzhiyun * Oxford Semi 952 rev B workaround
2587*4882a593Smuzhiyun */
2588*4882a593Smuzhiyun if (up->bugs & UART_BUG_QUOT && (quot & 0xff) == 0)
2589*4882a593Smuzhiyun quot++;
2590*4882a593Smuzhiyun
2591*4882a593Smuzhiyun return quot;
2592*4882a593Smuzhiyun }
2593*4882a593Smuzhiyun
serial8250_get_divisor(struct uart_port * port,unsigned int baud,unsigned int * frac)2594*4882a593Smuzhiyun static unsigned int serial8250_get_divisor(struct uart_port *port,
2595*4882a593Smuzhiyun unsigned int baud,
2596*4882a593Smuzhiyun unsigned int *frac)
2597*4882a593Smuzhiyun {
2598*4882a593Smuzhiyun if (port->get_divisor)
2599*4882a593Smuzhiyun return port->get_divisor(port, baud, frac);
2600*4882a593Smuzhiyun
2601*4882a593Smuzhiyun return serial8250_do_get_divisor(port, baud, frac);
2602*4882a593Smuzhiyun }
2603*4882a593Smuzhiyun
serial8250_compute_lcr(struct uart_8250_port * up,tcflag_t c_cflag)2604*4882a593Smuzhiyun static unsigned char serial8250_compute_lcr(struct uart_8250_port *up,
2605*4882a593Smuzhiyun tcflag_t c_cflag)
2606*4882a593Smuzhiyun {
2607*4882a593Smuzhiyun unsigned char cval;
2608*4882a593Smuzhiyun
2609*4882a593Smuzhiyun switch (c_cflag & CSIZE) {
2610*4882a593Smuzhiyun case CS5:
2611*4882a593Smuzhiyun cval = UART_LCR_WLEN5;
2612*4882a593Smuzhiyun break;
2613*4882a593Smuzhiyun case CS6:
2614*4882a593Smuzhiyun cval = UART_LCR_WLEN6;
2615*4882a593Smuzhiyun break;
2616*4882a593Smuzhiyun case CS7:
2617*4882a593Smuzhiyun cval = UART_LCR_WLEN7;
2618*4882a593Smuzhiyun break;
2619*4882a593Smuzhiyun default:
2620*4882a593Smuzhiyun case CS8:
2621*4882a593Smuzhiyun cval = UART_LCR_WLEN8;
2622*4882a593Smuzhiyun break;
2623*4882a593Smuzhiyun }
2624*4882a593Smuzhiyun
2625*4882a593Smuzhiyun if (c_cflag & CSTOPB)
2626*4882a593Smuzhiyun cval |= UART_LCR_STOP;
2627*4882a593Smuzhiyun if (c_cflag & PARENB) {
2628*4882a593Smuzhiyun cval |= UART_LCR_PARITY;
2629*4882a593Smuzhiyun if (up->bugs & UART_BUG_PARITY)
2630*4882a593Smuzhiyun up->fifo_bug = true;
2631*4882a593Smuzhiyun }
2632*4882a593Smuzhiyun if (!(c_cflag & PARODD))
2633*4882a593Smuzhiyun cval |= UART_LCR_EPAR;
2634*4882a593Smuzhiyun #ifdef CMSPAR
2635*4882a593Smuzhiyun if (c_cflag & CMSPAR)
2636*4882a593Smuzhiyun cval |= UART_LCR_SPAR;
2637*4882a593Smuzhiyun #endif
2638*4882a593Smuzhiyun
2639*4882a593Smuzhiyun return cval;
2640*4882a593Smuzhiyun }
2641*4882a593Smuzhiyun
serial8250_do_set_divisor(struct uart_port * port,unsigned int baud,unsigned int quot,unsigned int quot_frac)2642*4882a593Smuzhiyun void serial8250_do_set_divisor(struct uart_port *port, unsigned int baud,
2643*4882a593Smuzhiyun unsigned int quot, unsigned int quot_frac)
2644*4882a593Smuzhiyun {
2645*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
2646*4882a593Smuzhiyun
2647*4882a593Smuzhiyun #ifdef CONFIG_ARCH_ROCKCHIP
2648*4882a593Smuzhiyun serial_port_out(port, UART_MCR, UART_MCR_LOOP);
2649*4882a593Smuzhiyun #endif
2650*4882a593Smuzhiyun
2651*4882a593Smuzhiyun /* Workaround to enable 115200 baud on OMAP1510 internal ports */
2652*4882a593Smuzhiyun if (is_omap1510_8250(up)) {
2653*4882a593Smuzhiyun if (baud == 115200) {
2654*4882a593Smuzhiyun quot = 1;
2655*4882a593Smuzhiyun serial_port_out(port, UART_OMAP_OSC_12M_SEL, 1);
2656*4882a593Smuzhiyun } else
2657*4882a593Smuzhiyun serial_port_out(port, UART_OMAP_OSC_12M_SEL, 0);
2658*4882a593Smuzhiyun }
2659*4882a593Smuzhiyun
2660*4882a593Smuzhiyun /*
2661*4882a593Smuzhiyun * For NatSemi, switch to bank 2 not bank 1, to avoid resetting EXCR2,
2662*4882a593Smuzhiyun * otherwise just set DLAB
2663*4882a593Smuzhiyun */
2664*4882a593Smuzhiyun if (up->capabilities & UART_NATSEMI)
2665*4882a593Smuzhiyun serial_port_out(port, UART_LCR, 0xe0);
2666*4882a593Smuzhiyun else
2667*4882a593Smuzhiyun serial_port_out(port, UART_LCR, up->lcr | UART_LCR_DLAB);
2668*4882a593Smuzhiyun
2669*4882a593Smuzhiyun serial_dl_write(up, quot);
2670*4882a593Smuzhiyun #ifdef CONFIG_ARCH_ROCKCHIP
2671*4882a593Smuzhiyun if (quot != serial_dl_read(up))
2672*4882a593Smuzhiyun dev_warn_ratelimited(port->dev, "ttyS%d set divisor fail, quot:%d != dll,dlh:%d\n",
2673*4882a593Smuzhiyun serial_index(port), quot, serial_dl_read(up));
2674*4882a593Smuzhiyun #endif
2675*4882a593Smuzhiyun if (port->type != PORT_16750)
2676*4882a593Smuzhiyun serial_port_out(port, UART_LCR, up->lcr); /* reset DLAB */
2677*4882a593Smuzhiyun
2678*4882a593Smuzhiyun #ifdef CONFIG_ARCH_ROCKCHIP
2679*4882a593Smuzhiyun serial_port_out(port, UART_MCR, up->mcr);
2680*4882a593Smuzhiyun #endif
2681*4882a593Smuzhiyun }
2682*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(serial8250_do_set_divisor);
2683*4882a593Smuzhiyun
serial8250_set_divisor(struct uart_port * port,unsigned int baud,unsigned int quot,unsigned int quot_frac)2684*4882a593Smuzhiyun static void serial8250_set_divisor(struct uart_port *port, unsigned int baud,
2685*4882a593Smuzhiyun unsigned int quot, unsigned int quot_frac)
2686*4882a593Smuzhiyun {
2687*4882a593Smuzhiyun if (port->set_divisor)
2688*4882a593Smuzhiyun port->set_divisor(port, baud, quot, quot_frac);
2689*4882a593Smuzhiyun else
2690*4882a593Smuzhiyun serial8250_do_set_divisor(port, baud, quot, quot_frac);
2691*4882a593Smuzhiyun }
2692*4882a593Smuzhiyun
serial8250_get_baud_rate(struct uart_port * port,struct ktermios * termios,struct ktermios * old)2693*4882a593Smuzhiyun static unsigned int serial8250_get_baud_rate(struct uart_port *port,
2694*4882a593Smuzhiyun struct ktermios *termios,
2695*4882a593Smuzhiyun struct ktermios *old)
2696*4882a593Smuzhiyun {
2697*4882a593Smuzhiyun unsigned int tolerance = port->uartclk / 100;
2698*4882a593Smuzhiyun unsigned int min;
2699*4882a593Smuzhiyun unsigned int max;
2700*4882a593Smuzhiyun
2701*4882a593Smuzhiyun /*
2702*4882a593Smuzhiyun * Handle magic divisors for baud rates above baud_base on SMSC
2703*4882a593Smuzhiyun * Super I/O chips. Enable custom rates of clk/4 and clk/8, but
2704*4882a593Smuzhiyun * disable divisor values beyond 32767, which are unavailable.
2705*4882a593Smuzhiyun */
2706*4882a593Smuzhiyun if (port->flags & UPF_MAGIC_MULTIPLIER) {
2707*4882a593Smuzhiyun min = port->uartclk / 16 / UART_DIV_MAX >> 1;
2708*4882a593Smuzhiyun max = (port->uartclk + tolerance) / 4;
2709*4882a593Smuzhiyun } else {
2710*4882a593Smuzhiyun min = port->uartclk / 16 / UART_DIV_MAX;
2711*4882a593Smuzhiyun max = (port->uartclk + tolerance) / 16;
2712*4882a593Smuzhiyun }
2713*4882a593Smuzhiyun
2714*4882a593Smuzhiyun /*
2715*4882a593Smuzhiyun * Ask the core to calculate the divisor for us.
2716*4882a593Smuzhiyun * Allow 1% tolerance at the upper limit so uart clks marginally
2717*4882a593Smuzhiyun * slower than nominal still match standard baud rates without
2718*4882a593Smuzhiyun * causing transmission errors.
2719*4882a593Smuzhiyun */
2720*4882a593Smuzhiyun return uart_get_baud_rate(port, termios, old, min, max);
2721*4882a593Smuzhiyun }
2722*4882a593Smuzhiyun
2723*4882a593Smuzhiyun /*
2724*4882a593Smuzhiyun * Note in order to avoid the tty port mutex deadlock don't use the next method
2725*4882a593Smuzhiyun * within the uart port callbacks. Primarily it's supposed to be utilized to
2726*4882a593Smuzhiyun * handle a sudden reference clock rate change.
2727*4882a593Smuzhiyun */
serial8250_update_uartclk(struct uart_port * port,unsigned int uartclk)2728*4882a593Smuzhiyun void serial8250_update_uartclk(struct uart_port *port, unsigned int uartclk)
2729*4882a593Smuzhiyun {
2730*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
2731*4882a593Smuzhiyun struct tty_port *tport = &port->state->port;
2732*4882a593Smuzhiyun unsigned int baud, quot, frac = 0;
2733*4882a593Smuzhiyun struct ktermios *termios;
2734*4882a593Smuzhiyun struct tty_struct *tty;
2735*4882a593Smuzhiyun unsigned long flags;
2736*4882a593Smuzhiyun
2737*4882a593Smuzhiyun tty = tty_port_tty_get(tport);
2738*4882a593Smuzhiyun if (!tty) {
2739*4882a593Smuzhiyun mutex_lock(&tport->mutex);
2740*4882a593Smuzhiyun port->uartclk = uartclk;
2741*4882a593Smuzhiyun mutex_unlock(&tport->mutex);
2742*4882a593Smuzhiyun return;
2743*4882a593Smuzhiyun }
2744*4882a593Smuzhiyun
2745*4882a593Smuzhiyun down_write(&tty->termios_rwsem);
2746*4882a593Smuzhiyun mutex_lock(&tport->mutex);
2747*4882a593Smuzhiyun
2748*4882a593Smuzhiyun if (port->uartclk == uartclk)
2749*4882a593Smuzhiyun goto out_lock;
2750*4882a593Smuzhiyun
2751*4882a593Smuzhiyun port->uartclk = uartclk;
2752*4882a593Smuzhiyun
2753*4882a593Smuzhiyun if (!tty_port_initialized(tport))
2754*4882a593Smuzhiyun goto out_lock;
2755*4882a593Smuzhiyun
2756*4882a593Smuzhiyun termios = &tty->termios;
2757*4882a593Smuzhiyun
2758*4882a593Smuzhiyun baud = serial8250_get_baud_rate(port, termios, NULL);
2759*4882a593Smuzhiyun quot = serial8250_get_divisor(port, baud, &frac);
2760*4882a593Smuzhiyun
2761*4882a593Smuzhiyun serial8250_rpm_get(up);
2762*4882a593Smuzhiyun spin_lock_irqsave(&port->lock, flags);
2763*4882a593Smuzhiyun
2764*4882a593Smuzhiyun uart_update_timeout(port, termios->c_cflag, baud);
2765*4882a593Smuzhiyun
2766*4882a593Smuzhiyun serial8250_set_divisor(port, baud, quot, frac);
2767*4882a593Smuzhiyun serial_port_out(port, UART_LCR, up->lcr);
2768*4882a593Smuzhiyun
2769*4882a593Smuzhiyun spin_unlock_irqrestore(&port->lock, flags);
2770*4882a593Smuzhiyun serial8250_rpm_put(up);
2771*4882a593Smuzhiyun
2772*4882a593Smuzhiyun out_lock:
2773*4882a593Smuzhiyun mutex_unlock(&tport->mutex);
2774*4882a593Smuzhiyun up_write(&tty->termios_rwsem);
2775*4882a593Smuzhiyun tty_kref_put(tty);
2776*4882a593Smuzhiyun }
2777*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(serial8250_update_uartclk);
2778*4882a593Smuzhiyun
2779*4882a593Smuzhiyun void
serial8250_do_set_termios(struct uart_port * port,struct ktermios * termios,struct ktermios * old)2780*4882a593Smuzhiyun serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
2781*4882a593Smuzhiyun struct ktermios *old)
2782*4882a593Smuzhiyun {
2783*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
2784*4882a593Smuzhiyun unsigned char cval;
2785*4882a593Smuzhiyun unsigned long flags;
2786*4882a593Smuzhiyun unsigned int baud, quot, frac = 0;
2787*4882a593Smuzhiyun
2788*4882a593Smuzhiyun if (up->capabilities & UART_CAP_MINI) {
2789*4882a593Smuzhiyun termios->c_cflag &= ~(CSTOPB | PARENB | PARODD | CMSPAR);
2790*4882a593Smuzhiyun if ((termios->c_cflag & CSIZE) == CS5 ||
2791*4882a593Smuzhiyun (termios->c_cflag & CSIZE) == CS6)
2792*4882a593Smuzhiyun termios->c_cflag = (termios->c_cflag & ~CSIZE) | CS7;
2793*4882a593Smuzhiyun }
2794*4882a593Smuzhiyun cval = serial8250_compute_lcr(up, termios->c_cflag);
2795*4882a593Smuzhiyun
2796*4882a593Smuzhiyun baud = serial8250_get_baud_rate(port, termios, old);
2797*4882a593Smuzhiyun quot = serial8250_get_divisor(port, baud, &frac);
2798*4882a593Smuzhiyun
2799*4882a593Smuzhiyun /*
2800*4882a593Smuzhiyun * Ok, we're now changing the port state. Do it with
2801*4882a593Smuzhiyun * interrupts disabled.
2802*4882a593Smuzhiyun */
2803*4882a593Smuzhiyun serial8250_rpm_get(up);
2804*4882a593Smuzhiyun spin_lock_irqsave(&port->lock, flags);
2805*4882a593Smuzhiyun
2806*4882a593Smuzhiyun up->lcr = cval; /* Save computed LCR */
2807*4882a593Smuzhiyun
2808*4882a593Smuzhiyun if (up->capabilities & UART_CAP_FIFO && port->fifosize > 1) {
2809*4882a593Smuzhiyun /* NOTE: If fifo_bug is not set, a user can set RX_trigger. */
2810*4882a593Smuzhiyun if ((baud < 2400 && !up->dma) || up->fifo_bug) {
2811*4882a593Smuzhiyun up->fcr &= ~UART_FCR_TRIGGER_MASK;
2812*4882a593Smuzhiyun up->fcr |= UART_FCR_TRIGGER_1;
2813*4882a593Smuzhiyun }
2814*4882a593Smuzhiyun }
2815*4882a593Smuzhiyun
2816*4882a593Smuzhiyun /*
2817*4882a593Smuzhiyun * MCR-based auto flow control. When AFE is enabled, RTS will be
2818*4882a593Smuzhiyun * deasserted when the receive FIFO contains more characters than
2819*4882a593Smuzhiyun * the trigger, or the MCR RTS bit is cleared.
2820*4882a593Smuzhiyun */
2821*4882a593Smuzhiyun if (up->capabilities & UART_CAP_AFE) {
2822*4882a593Smuzhiyun up->mcr &= ~UART_MCR_AFE;
2823*4882a593Smuzhiyun if (termios->c_cflag & CRTSCTS)
2824*4882a593Smuzhiyun up->mcr |= UART_MCR_AFE;
2825*4882a593Smuzhiyun }
2826*4882a593Smuzhiyun
2827*4882a593Smuzhiyun /*
2828*4882a593Smuzhiyun * Update the per-port timeout.
2829*4882a593Smuzhiyun */
2830*4882a593Smuzhiyun uart_update_timeout(port, termios->c_cflag, baud);
2831*4882a593Smuzhiyun
2832*4882a593Smuzhiyun port->read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR;
2833*4882a593Smuzhiyun if (termios->c_iflag & INPCK)
2834*4882a593Smuzhiyun port->read_status_mask |= UART_LSR_FE | UART_LSR_PE;
2835*4882a593Smuzhiyun if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
2836*4882a593Smuzhiyun port->read_status_mask |= UART_LSR_BI;
2837*4882a593Smuzhiyun
2838*4882a593Smuzhiyun /*
2839*4882a593Smuzhiyun * Characteres to ignore
2840*4882a593Smuzhiyun */
2841*4882a593Smuzhiyun port->ignore_status_mask = 0;
2842*4882a593Smuzhiyun if (termios->c_iflag & IGNPAR)
2843*4882a593Smuzhiyun port->ignore_status_mask |= UART_LSR_PE | UART_LSR_FE;
2844*4882a593Smuzhiyun if (termios->c_iflag & IGNBRK) {
2845*4882a593Smuzhiyun port->ignore_status_mask |= UART_LSR_BI;
2846*4882a593Smuzhiyun /*
2847*4882a593Smuzhiyun * If we're ignoring parity and break indicators,
2848*4882a593Smuzhiyun * ignore overruns too (for real raw support).
2849*4882a593Smuzhiyun */
2850*4882a593Smuzhiyun if (termios->c_iflag & IGNPAR)
2851*4882a593Smuzhiyun port->ignore_status_mask |= UART_LSR_OE;
2852*4882a593Smuzhiyun }
2853*4882a593Smuzhiyun
2854*4882a593Smuzhiyun /*
2855*4882a593Smuzhiyun * ignore all characters if CREAD is not set
2856*4882a593Smuzhiyun */
2857*4882a593Smuzhiyun if ((termios->c_cflag & CREAD) == 0)
2858*4882a593Smuzhiyun port->ignore_status_mask |= UART_LSR_DR;
2859*4882a593Smuzhiyun
2860*4882a593Smuzhiyun #ifndef CONFIG_ARCH_ROCKCHIP
2861*4882a593Smuzhiyun /*
2862*4882a593Smuzhiyun * CTS flow control flag and modem status interrupts
2863*4882a593Smuzhiyun */
2864*4882a593Smuzhiyun up->ier &= ~UART_IER_MSI;
2865*4882a593Smuzhiyun if (!(up->bugs & UART_BUG_NOMSR) &&
2866*4882a593Smuzhiyun UART_ENABLE_MS(&up->port, termios->c_cflag))
2867*4882a593Smuzhiyun up->ier |= UART_IER_MSI;
2868*4882a593Smuzhiyun if (up->capabilities & UART_CAP_UUE)
2869*4882a593Smuzhiyun up->ier |= UART_IER_UUE;
2870*4882a593Smuzhiyun if (up->capabilities & UART_CAP_RTOIE)
2871*4882a593Smuzhiyun up->ier |= UART_IER_RTOIE;
2872*4882a593Smuzhiyun
2873*4882a593Smuzhiyun serial_port_out(port, UART_IER, up->ier);
2874*4882a593Smuzhiyun #endif
2875*4882a593Smuzhiyun
2876*4882a593Smuzhiyun if (up->capabilities & UART_CAP_EFR) {
2877*4882a593Smuzhiyun unsigned char efr = 0;
2878*4882a593Smuzhiyun /*
2879*4882a593Smuzhiyun * TI16C752/Startech hardware flow control. FIXME:
2880*4882a593Smuzhiyun * - TI16C752 requires control thresholds to be set.
2881*4882a593Smuzhiyun * - UART_MCR_RTS is ineffective if auto-RTS mode is enabled.
2882*4882a593Smuzhiyun */
2883*4882a593Smuzhiyun if (termios->c_cflag & CRTSCTS)
2884*4882a593Smuzhiyun efr |= UART_EFR_CTS;
2885*4882a593Smuzhiyun
2886*4882a593Smuzhiyun serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B);
2887*4882a593Smuzhiyun if (port->flags & UPF_EXAR_EFR)
2888*4882a593Smuzhiyun serial_port_out(port, UART_XR_EFR, efr);
2889*4882a593Smuzhiyun else
2890*4882a593Smuzhiyun serial_port_out(port, UART_EFR, efr);
2891*4882a593Smuzhiyun }
2892*4882a593Smuzhiyun
2893*4882a593Smuzhiyun #ifdef CONFIG_ARCH_ROCKCHIP
2894*4882a593Smuzhiyun /* Reset uart to make sure it is idle, then set baud rate */
2895*4882a593Smuzhiyun serial_port_out(port, 0x88 >> 2, 0x7);
2896*4882a593Smuzhiyun #endif
2897*4882a593Smuzhiyun
2898*4882a593Smuzhiyun serial8250_set_divisor(port, baud, quot, frac);
2899*4882a593Smuzhiyun
2900*4882a593Smuzhiyun #ifdef CONFIG_ARCH_ROCKCHIP
2901*4882a593Smuzhiyun up->fcr = UART_FCR_ENABLE_FIFO | UART_FCR_T_TRIG_10 | UART_FCR_R_TRIG_10;
2902*4882a593Smuzhiyun #endif
2903*4882a593Smuzhiyun /*
2904*4882a593Smuzhiyun * LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR
2905*4882a593Smuzhiyun * is written without DLAB set, this mode will be disabled.
2906*4882a593Smuzhiyun */
2907*4882a593Smuzhiyun if (port->type == PORT_16750) {
2908*4882a593Smuzhiyun serial_port_out(port, UART_FCR, up->fcr);
2909*4882a593Smuzhiyun serial_port_out(port, UART_LCR, up->lcr); /* reset DLAB */
2910*4882a593Smuzhiyun }
2911*4882a593Smuzhiyun
2912*4882a593Smuzhiyun if (port->type != PORT_16750) {
2913*4882a593Smuzhiyun /* emulated UARTs (Lucent Venus 167x) need two steps */
2914*4882a593Smuzhiyun if (up->fcr & UART_FCR_ENABLE_FIFO)
2915*4882a593Smuzhiyun serial_port_out(port, UART_FCR, UART_FCR_ENABLE_FIFO);
2916*4882a593Smuzhiyun serial_port_out(port, UART_FCR, up->fcr); /* set fcr */
2917*4882a593Smuzhiyun }
2918*4882a593Smuzhiyun serial8250_set_mctrl(port, port->mctrl);
2919*4882a593Smuzhiyun
2920*4882a593Smuzhiyun #ifdef CONFIG_ARCH_ROCKCHIP
2921*4882a593Smuzhiyun /*
2922*4882a593Smuzhiyun * CTS flow control flag and modem status interrupts
2923*4882a593Smuzhiyun */
2924*4882a593Smuzhiyun up->ier &= ~UART_IER_MSI;
2925*4882a593Smuzhiyun if (!(up->bugs & UART_BUG_NOMSR) &&
2926*4882a593Smuzhiyun UART_ENABLE_MS(&up->port, termios->c_cflag))
2927*4882a593Smuzhiyun up->ier |= UART_IER_MSI;
2928*4882a593Smuzhiyun if (up->capabilities & UART_CAP_UUE)
2929*4882a593Smuzhiyun up->ier |= UART_IER_UUE;
2930*4882a593Smuzhiyun if (up->capabilities & UART_CAP_RTOIE)
2931*4882a593Smuzhiyun up->ier |= UART_IER_RTOIE;
2932*4882a593Smuzhiyun
2933*4882a593Smuzhiyun serial_port_out(port, UART_IER, up->ier);
2934*4882a593Smuzhiyun #endif
2935*4882a593Smuzhiyun
2936*4882a593Smuzhiyun spin_unlock_irqrestore(&port->lock, flags);
2937*4882a593Smuzhiyun serial8250_rpm_put(up);
2938*4882a593Smuzhiyun
2939*4882a593Smuzhiyun /* Don't rewrite B0 */
2940*4882a593Smuzhiyun if (tty_termios_baud_rate(termios))
2941*4882a593Smuzhiyun tty_termios_encode_baud_rate(termios, baud, baud);
2942*4882a593Smuzhiyun }
2943*4882a593Smuzhiyun EXPORT_SYMBOL(serial8250_do_set_termios);
2944*4882a593Smuzhiyun
2945*4882a593Smuzhiyun static void
serial8250_set_termios(struct uart_port * port,struct ktermios * termios,struct ktermios * old)2946*4882a593Smuzhiyun serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
2947*4882a593Smuzhiyun struct ktermios *old)
2948*4882a593Smuzhiyun {
2949*4882a593Smuzhiyun if (port->set_termios)
2950*4882a593Smuzhiyun port->set_termios(port, termios, old);
2951*4882a593Smuzhiyun else
2952*4882a593Smuzhiyun serial8250_do_set_termios(port, termios, old);
2953*4882a593Smuzhiyun }
2954*4882a593Smuzhiyun
serial8250_do_set_ldisc(struct uart_port * port,struct ktermios * termios)2955*4882a593Smuzhiyun void serial8250_do_set_ldisc(struct uart_port *port, struct ktermios *termios)
2956*4882a593Smuzhiyun {
2957*4882a593Smuzhiyun if (termios->c_line == N_PPS) {
2958*4882a593Smuzhiyun port->flags |= UPF_HARDPPS_CD;
2959*4882a593Smuzhiyun spin_lock_irq(&port->lock);
2960*4882a593Smuzhiyun serial8250_enable_ms(port);
2961*4882a593Smuzhiyun spin_unlock_irq(&port->lock);
2962*4882a593Smuzhiyun } else {
2963*4882a593Smuzhiyun port->flags &= ~UPF_HARDPPS_CD;
2964*4882a593Smuzhiyun if (!UART_ENABLE_MS(port, termios->c_cflag)) {
2965*4882a593Smuzhiyun spin_lock_irq(&port->lock);
2966*4882a593Smuzhiyun serial8250_disable_ms(port);
2967*4882a593Smuzhiyun spin_unlock_irq(&port->lock);
2968*4882a593Smuzhiyun }
2969*4882a593Smuzhiyun }
2970*4882a593Smuzhiyun }
2971*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(serial8250_do_set_ldisc);
2972*4882a593Smuzhiyun
2973*4882a593Smuzhiyun static void
serial8250_set_ldisc(struct uart_port * port,struct ktermios * termios)2974*4882a593Smuzhiyun serial8250_set_ldisc(struct uart_port *port, struct ktermios *termios)
2975*4882a593Smuzhiyun {
2976*4882a593Smuzhiyun if (port->set_ldisc)
2977*4882a593Smuzhiyun port->set_ldisc(port, termios);
2978*4882a593Smuzhiyun else
2979*4882a593Smuzhiyun serial8250_do_set_ldisc(port, termios);
2980*4882a593Smuzhiyun }
2981*4882a593Smuzhiyun
serial8250_do_pm(struct uart_port * port,unsigned int state,unsigned int oldstate)2982*4882a593Smuzhiyun void serial8250_do_pm(struct uart_port *port, unsigned int state,
2983*4882a593Smuzhiyun unsigned int oldstate)
2984*4882a593Smuzhiyun {
2985*4882a593Smuzhiyun struct uart_8250_port *p = up_to_u8250p(port);
2986*4882a593Smuzhiyun
2987*4882a593Smuzhiyun serial8250_set_sleep(p, state != 0);
2988*4882a593Smuzhiyun }
2989*4882a593Smuzhiyun EXPORT_SYMBOL(serial8250_do_pm);
2990*4882a593Smuzhiyun
2991*4882a593Smuzhiyun static void
serial8250_pm(struct uart_port * port,unsigned int state,unsigned int oldstate)2992*4882a593Smuzhiyun serial8250_pm(struct uart_port *port, unsigned int state,
2993*4882a593Smuzhiyun unsigned int oldstate)
2994*4882a593Smuzhiyun {
2995*4882a593Smuzhiyun if (port->pm)
2996*4882a593Smuzhiyun port->pm(port, state, oldstate);
2997*4882a593Smuzhiyun else
2998*4882a593Smuzhiyun serial8250_do_pm(port, state, oldstate);
2999*4882a593Smuzhiyun }
3000*4882a593Smuzhiyun
serial8250_port_size(struct uart_8250_port * pt)3001*4882a593Smuzhiyun static unsigned int serial8250_port_size(struct uart_8250_port *pt)
3002*4882a593Smuzhiyun {
3003*4882a593Smuzhiyun if (pt->port.mapsize)
3004*4882a593Smuzhiyun return pt->port.mapsize;
3005*4882a593Smuzhiyun if (pt->port.iotype == UPIO_AU) {
3006*4882a593Smuzhiyun if (pt->port.type == PORT_RT2880)
3007*4882a593Smuzhiyun return 0x100;
3008*4882a593Smuzhiyun return 0x1000;
3009*4882a593Smuzhiyun }
3010*4882a593Smuzhiyun if (is_omap1_8250(pt))
3011*4882a593Smuzhiyun return 0x16 << pt->port.regshift;
3012*4882a593Smuzhiyun
3013*4882a593Smuzhiyun return 8 << pt->port.regshift;
3014*4882a593Smuzhiyun }
3015*4882a593Smuzhiyun
3016*4882a593Smuzhiyun /*
3017*4882a593Smuzhiyun * Resource handling.
3018*4882a593Smuzhiyun */
serial8250_request_std_resource(struct uart_8250_port * up)3019*4882a593Smuzhiyun static int serial8250_request_std_resource(struct uart_8250_port *up)
3020*4882a593Smuzhiyun {
3021*4882a593Smuzhiyun unsigned int size = serial8250_port_size(up);
3022*4882a593Smuzhiyun struct uart_port *port = &up->port;
3023*4882a593Smuzhiyun int ret = 0;
3024*4882a593Smuzhiyun
3025*4882a593Smuzhiyun switch (port->iotype) {
3026*4882a593Smuzhiyun case UPIO_AU:
3027*4882a593Smuzhiyun case UPIO_TSI:
3028*4882a593Smuzhiyun case UPIO_MEM32:
3029*4882a593Smuzhiyun case UPIO_MEM32BE:
3030*4882a593Smuzhiyun case UPIO_MEM16:
3031*4882a593Smuzhiyun case UPIO_MEM:
3032*4882a593Smuzhiyun if (!port->mapbase) {
3033*4882a593Smuzhiyun ret = -EINVAL;
3034*4882a593Smuzhiyun break;
3035*4882a593Smuzhiyun }
3036*4882a593Smuzhiyun
3037*4882a593Smuzhiyun if (!request_mem_region(port->mapbase, size, "serial")) {
3038*4882a593Smuzhiyun ret = -EBUSY;
3039*4882a593Smuzhiyun break;
3040*4882a593Smuzhiyun }
3041*4882a593Smuzhiyun
3042*4882a593Smuzhiyun if (port->flags & UPF_IOREMAP) {
3043*4882a593Smuzhiyun port->membase = ioremap(port->mapbase, size);
3044*4882a593Smuzhiyun if (!port->membase) {
3045*4882a593Smuzhiyun release_mem_region(port->mapbase, size);
3046*4882a593Smuzhiyun ret = -ENOMEM;
3047*4882a593Smuzhiyun }
3048*4882a593Smuzhiyun }
3049*4882a593Smuzhiyun break;
3050*4882a593Smuzhiyun
3051*4882a593Smuzhiyun case UPIO_HUB6:
3052*4882a593Smuzhiyun case UPIO_PORT:
3053*4882a593Smuzhiyun if (!request_region(port->iobase, size, "serial"))
3054*4882a593Smuzhiyun ret = -EBUSY;
3055*4882a593Smuzhiyun break;
3056*4882a593Smuzhiyun }
3057*4882a593Smuzhiyun return ret;
3058*4882a593Smuzhiyun }
3059*4882a593Smuzhiyun
serial8250_release_std_resource(struct uart_8250_port * up)3060*4882a593Smuzhiyun static void serial8250_release_std_resource(struct uart_8250_port *up)
3061*4882a593Smuzhiyun {
3062*4882a593Smuzhiyun unsigned int size = serial8250_port_size(up);
3063*4882a593Smuzhiyun struct uart_port *port = &up->port;
3064*4882a593Smuzhiyun
3065*4882a593Smuzhiyun switch (port->iotype) {
3066*4882a593Smuzhiyun case UPIO_AU:
3067*4882a593Smuzhiyun case UPIO_TSI:
3068*4882a593Smuzhiyun case UPIO_MEM32:
3069*4882a593Smuzhiyun case UPIO_MEM32BE:
3070*4882a593Smuzhiyun case UPIO_MEM16:
3071*4882a593Smuzhiyun case UPIO_MEM:
3072*4882a593Smuzhiyun if (!port->mapbase)
3073*4882a593Smuzhiyun break;
3074*4882a593Smuzhiyun
3075*4882a593Smuzhiyun if (port->flags & UPF_IOREMAP) {
3076*4882a593Smuzhiyun iounmap(port->membase);
3077*4882a593Smuzhiyun port->membase = NULL;
3078*4882a593Smuzhiyun }
3079*4882a593Smuzhiyun
3080*4882a593Smuzhiyun release_mem_region(port->mapbase, size);
3081*4882a593Smuzhiyun break;
3082*4882a593Smuzhiyun
3083*4882a593Smuzhiyun case UPIO_HUB6:
3084*4882a593Smuzhiyun case UPIO_PORT:
3085*4882a593Smuzhiyun release_region(port->iobase, size);
3086*4882a593Smuzhiyun break;
3087*4882a593Smuzhiyun }
3088*4882a593Smuzhiyun }
3089*4882a593Smuzhiyun
serial8250_release_port(struct uart_port * port)3090*4882a593Smuzhiyun static void serial8250_release_port(struct uart_port *port)
3091*4882a593Smuzhiyun {
3092*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
3093*4882a593Smuzhiyun
3094*4882a593Smuzhiyun serial8250_release_std_resource(up);
3095*4882a593Smuzhiyun }
3096*4882a593Smuzhiyun
serial8250_request_port(struct uart_port * port)3097*4882a593Smuzhiyun static int serial8250_request_port(struct uart_port *port)
3098*4882a593Smuzhiyun {
3099*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
3100*4882a593Smuzhiyun
3101*4882a593Smuzhiyun return serial8250_request_std_resource(up);
3102*4882a593Smuzhiyun }
3103*4882a593Smuzhiyun
fcr_get_rxtrig_bytes(struct uart_8250_port * up)3104*4882a593Smuzhiyun static int fcr_get_rxtrig_bytes(struct uart_8250_port *up)
3105*4882a593Smuzhiyun {
3106*4882a593Smuzhiyun const struct serial8250_config *conf_type = &uart_config[up->port.type];
3107*4882a593Smuzhiyun unsigned char bytes;
3108*4882a593Smuzhiyun
3109*4882a593Smuzhiyun bytes = conf_type->rxtrig_bytes[UART_FCR_R_TRIG_BITS(up->fcr)];
3110*4882a593Smuzhiyun
3111*4882a593Smuzhiyun return bytes ? bytes : -EOPNOTSUPP;
3112*4882a593Smuzhiyun }
3113*4882a593Smuzhiyun
bytes_to_fcr_rxtrig(struct uart_8250_port * up,unsigned char bytes)3114*4882a593Smuzhiyun static int bytes_to_fcr_rxtrig(struct uart_8250_port *up, unsigned char bytes)
3115*4882a593Smuzhiyun {
3116*4882a593Smuzhiyun const struct serial8250_config *conf_type = &uart_config[up->port.type];
3117*4882a593Smuzhiyun int i;
3118*4882a593Smuzhiyun
3119*4882a593Smuzhiyun if (!conf_type->rxtrig_bytes[UART_FCR_R_TRIG_BITS(UART_FCR_R_TRIG_00)])
3120*4882a593Smuzhiyun return -EOPNOTSUPP;
3121*4882a593Smuzhiyun
3122*4882a593Smuzhiyun for (i = 1; i < UART_FCR_R_TRIG_MAX_STATE; i++) {
3123*4882a593Smuzhiyun if (bytes < conf_type->rxtrig_bytes[i])
3124*4882a593Smuzhiyun /* Use the nearest lower value */
3125*4882a593Smuzhiyun return (--i) << UART_FCR_R_TRIG_SHIFT;
3126*4882a593Smuzhiyun }
3127*4882a593Smuzhiyun
3128*4882a593Smuzhiyun return UART_FCR_R_TRIG_11;
3129*4882a593Smuzhiyun }
3130*4882a593Smuzhiyun
do_get_rxtrig(struct tty_port * port)3131*4882a593Smuzhiyun static int do_get_rxtrig(struct tty_port *port)
3132*4882a593Smuzhiyun {
3133*4882a593Smuzhiyun struct uart_state *state = container_of(port, struct uart_state, port);
3134*4882a593Smuzhiyun struct uart_port *uport = state->uart_port;
3135*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(uport);
3136*4882a593Smuzhiyun
3137*4882a593Smuzhiyun if (!(up->capabilities & UART_CAP_FIFO) || uport->fifosize <= 1)
3138*4882a593Smuzhiyun return -EINVAL;
3139*4882a593Smuzhiyun
3140*4882a593Smuzhiyun return fcr_get_rxtrig_bytes(up);
3141*4882a593Smuzhiyun }
3142*4882a593Smuzhiyun
do_serial8250_get_rxtrig(struct tty_port * port)3143*4882a593Smuzhiyun static int do_serial8250_get_rxtrig(struct tty_port *port)
3144*4882a593Smuzhiyun {
3145*4882a593Smuzhiyun int rxtrig_bytes;
3146*4882a593Smuzhiyun
3147*4882a593Smuzhiyun mutex_lock(&port->mutex);
3148*4882a593Smuzhiyun rxtrig_bytes = do_get_rxtrig(port);
3149*4882a593Smuzhiyun mutex_unlock(&port->mutex);
3150*4882a593Smuzhiyun
3151*4882a593Smuzhiyun return rxtrig_bytes;
3152*4882a593Smuzhiyun }
3153*4882a593Smuzhiyun
rx_trig_bytes_show(struct device * dev,struct device_attribute * attr,char * buf)3154*4882a593Smuzhiyun static ssize_t rx_trig_bytes_show(struct device *dev,
3155*4882a593Smuzhiyun struct device_attribute *attr, char *buf)
3156*4882a593Smuzhiyun {
3157*4882a593Smuzhiyun struct tty_port *port = dev_get_drvdata(dev);
3158*4882a593Smuzhiyun int rxtrig_bytes;
3159*4882a593Smuzhiyun
3160*4882a593Smuzhiyun rxtrig_bytes = do_serial8250_get_rxtrig(port);
3161*4882a593Smuzhiyun if (rxtrig_bytes < 0)
3162*4882a593Smuzhiyun return rxtrig_bytes;
3163*4882a593Smuzhiyun
3164*4882a593Smuzhiyun return snprintf(buf, PAGE_SIZE, "%d\n", rxtrig_bytes);
3165*4882a593Smuzhiyun }
3166*4882a593Smuzhiyun
do_set_rxtrig(struct tty_port * port,unsigned char bytes)3167*4882a593Smuzhiyun static int do_set_rxtrig(struct tty_port *port, unsigned char bytes)
3168*4882a593Smuzhiyun {
3169*4882a593Smuzhiyun struct uart_state *state = container_of(port, struct uart_state, port);
3170*4882a593Smuzhiyun struct uart_port *uport = state->uart_port;
3171*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(uport);
3172*4882a593Smuzhiyun int rxtrig;
3173*4882a593Smuzhiyun
3174*4882a593Smuzhiyun if (!(up->capabilities & UART_CAP_FIFO) || uport->fifosize <= 1 ||
3175*4882a593Smuzhiyun up->fifo_bug)
3176*4882a593Smuzhiyun return -EINVAL;
3177*4882a593Smuzhiyun
3178*4882a593Smuzhiyun rxtrig = bytes_to_fcr_rxtrig(up, bytes);
3179*4882a593Smuzhiyun if (rxtrig < 0)
3180*4882a593Smuzhiyun return rxtrig;
3181*4882a593Smuzhiyun
3182*4882a593Smuzhiyun serial8250_clear_fifos(up);
3183*4882a593Smuzhiyun up->fcr &= ~UART_FCR_TRIGGER_MASK;
3184*4882a593Smuzhiyun up->fcr |= (unsigned char)rxtrig;
3185*4882a593Smuzhiyun serial_out(up, UART_FCR, up->fcr);
3186*4882a593Smuzhiyun return 0;
3187*4882a593Smuzhiyun }
3188*4882a593Smuzhiyun
do_serial8250_set_rxtrig(struct tty_port * port,unsigned char bytes)3189*4882a593Smuzhiyun static int do_serial8250_set_rxtrig(struct tty_port *port, unsigned char bytes)
3190*4882a593Smuzhiyun {
3191*4882a593Smuzhiyun int ret;
3192*4882a593Smuzhiyun
3193*4882a593Smuzhiyun mutex_lock(&port->mutex);
3194*4882a593Smuzhiyun ret = do_set_rxtrig(port, bytes);
3195*4882a593Smuzhiyun mutex_unlock(&port->mutex);
3196*4882a593Smuzhiyun
3197*4882a593Smuzhiyun return ret;
3198*4882a593Smuzhiyun }
3199*4882a593Smuzhiyun
rx_trig_bytes_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)3200*4882a593Smuzhiyun static ssize_t rx_trig_bytes_store(struct device *dev,
3201*4882a593Smuzhiyun struct device_attribute *attr, const char *buf, size_t count)
3202*4882a593Smuzhiyun {
3203*4882a593Smuzhiyun struct tty_port *port = dev_get_drvdata(dev);
3204*4882a593Smuzhiyun unsigned char bytes;
3205*4882a593Smuzhiyun int ret;
3206*4882a593Smuzhiyun
3207*4882a593Smuzhiyun if (!count)
3208*4882a593Smuzhiyun return -EINVAL;
3209*4882a593Smuzhiyun
3210*4882a593Smuzhiyun ret = kstrtou8(buf, 10, &bytes);
3211*4882a593Smuzhiyun if (ret < 0)
3212*4882a593Smuzhiyun return ret;
3213*4882a593Smuzhiyun
3214*4882a593Smuzhiyun ret = do_serial8250_set_rxtrig(port, bytes);
3215*4882a593Smuzhiyun if (ret < 0)
3216*4882a593Smuzhiyun return ret;
3217*4882a593Smuzhiyun
3218*4882a593Smuzhiyun return count;
3219*4882a593Smuzhiyun }
3220*4882a593Smuzhiyun
3221*4882a593Smuzhiyun static DEVICE_ATTR_RW(rx_trig_bytes);
3222*4882a593Smuzhiyun
3223*4882a593Smuzhiyun static struct attribute *serial8250_dev_attrs[] = {
3224*4882a593Smuzhiyun &dev_attr_rx_trig_bytes.attr,
3225*4882a593Smuzhiyun NULL
3226*4882a593Smuzhiyun };
3227*4882a593Smuzhiyun
3228*4882a593Smuzhiyun static struct attribute_group serial8250_dev_attr_group = {
3229*4882a593Smuzhiyun .attrs = serial8250_dev_attrs,
3230*4882a593Smuzhiyun };
3231*4882a593Smuzhiyun
register_dev_spec_attr_grp(struct uart_8250_port * up)3232*4882a593Smuzhiyun static void register_dev_spec_attr_grp(struct uart_8250_port *up)
3233*4882a593Smuzhiyun {
3234*4882a593Smuzhiyun const struct serial8250_config *conf_type = &uart_config[up->port.type];
3235*4882a593Smuzhiyun
3236*4882a593Smuzhiyun if (conf_type->rxtrig_bytes[0])
3237*4882a593Smuzhiyun up->port.attr_group = &serial8250_dev_attr_group;
3238*4882a593Smuzhiyun }
3239*4882a593Smuzhiyun
serial8250_config_port(struct uart_port * port,int flags)3240*4882a593Smuzhiyun static void serial8250_config_port(struct uart_port *port, int flags)
3241*4882a593Smuzhiyun {
3242*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
3243*4882a593Smuzhiyun int ret;
3244*4882a593Smuzhiyun
3245*4882a593Smuzhiyun /*
3246*4882a593Smuzhiyun * Find the region that we can probe for. This in turn
3247*4882a593Smuzhiyun * tells us whether we can probe for the type of port.
3248*4882a593Smuzhiyun */
3249*4882a593Smuzhiyun ret = serial8250_request_std_resource(up);
3250*4882a593Smuzhiyun if (ret < 0)
3251*4882a593Smuzhiyun return;
3252*4882a593Smuzhiyun
3253*4882a593Smuzhiyun if (port->iotype != up->cur_iotype)
3254*4882a593Smuzhiyun set_io_from_upio(port);
3255*4882a593Smuzhiyun
3256*4882a593Smuzhiyun if (flags & UART_CONFIG_TYPE)
3257*4882a593Smuzhiyun autoconfig(up);
3258*4882a593Smuzhiyun
3259*4882a593Smuzhiyun /* if access method is AU, it is a 16550 with a quirk */
3260*4882a593Smuzhiyun if (port->type == PORT_16550A && port->iotype == UPIO_AU)
3261*4882a593Smuzhiyun up->bugs |= UART_BUG_NOMSR;
3262*4882a593Smuzhiyun
3263*4882a593Smuzhiyun /* HW bugs may trigger IRQ while IIR == NO_INT */
3264*4882a593Smuzhiyun if (port->type == PORT_TEGRA)
3265*4882a593Smuzhiyun up->bugs |= UART_BUG_NOMSR;
3266*4882a593Smuzhiyun
3267*4882a593Smuzhiyun if (port->type != PORT_UNKNOWN && flags & UART_CONFIG_IRQ)
3268*4882a593Smuzhiyun autoconfig_irq(up);
3269*4882a593Smuzhiyun
3270*4882a593Smuzhiyun if (port->type == PORT_UNKNOWN)
3271*4882a593Smuzhiyun serial8250_release_std_resource(up);
3272*4882a593Smuzhiyun
3273*4882a593Smuzhiyun register_dev_spec_attr_grp(up);
3274*4882a593Smuzhiyun up->fcr = uart_config[up->port.type].fcr;
3275*4882a593Smuzhiyun }
3276*4882a593Smuzhiyun
3277*4882a593Smuzhiyun static int
serial8250_verify_port(struct uart_port * port,struct serial_struct * ser)3278*4882a593Smuzhiyun serial8250_verify_port(struct uart_port *port, struct serial_struct *ser)
3279*4882a593Smuzhiyun {
3280*4882a593Smuzhiyun if (ser->irq >= nr_irqs || ser->irq < 0 ||
3281*4882a593Smuzhiyun ser->baud_base < 9600 || ser->type < PORT_UNKNOWN ||
3282*4882a593Smuzhiyun ser->type >= ARRAY_SIZE(uart_config) || ser->type == PORT_CIRRUS ||
3283*4882a593Smuzhiyun ser->type == PORT_STARTECH)
3284*4882a593Smuzhiyun return -EINVAL;
3285*4882a593Smuzhiyun return 0;
3286*4882a593Smuzhiyun }
3287*4882a593Smuzhiyun
serial8250_type(struct uart_port * port)3288*4882a593Smuzhiyun static const char *serial8250_type(struct uart_port *port)
3289*4882a593Smuzhiyun {
3290*4882a593Smuzhiyun int type = port->type;
3291*4882a593Smuzhiyun
3292*4882a593Smuzhiyun if (type >= ARRAY_SIZE(uart_config))
3293*4882a593Smuzhiyun type = 0;
3294*4882a593Smuzhiyun return uart_config[type].name;
3295*4882a593Smuzhiyun }
3296*4882a593Smuzhiyun
3297*4882a593Smuzhiyun static const struct uart_ops serial8250_pops = {
3298*4882a593Smuzhiyun .tx_empty = serial8250_tx_empty,
3299*4882a593Smuzhiyun .set_mctrl = serial8250_set_mctrl,
3300*4882a593Smuzhiyun .get_mctrl = serial8250_get_mctrl,
3301*4882a593Smuzhiyun .stop_tx = serial8250_stop_tx,
3302*4882a593Smuzhiyun .start_tx = serial8250_start_tx,
3303*4882a593Smuzhiyun .throttle = serial8250_throttle,
3304*4882a593Smuzhiyun .unthrottle = serial8250_unthrottle,
3305*4882a593Smuzhiyun .stop_rx = serial8250_stop_rx,
3306*4882a593Smuzhiyun .enable_ms = serial8250_enable_ms,
3307*4882a593Smuzhiyun .break_ctl = serial8250_break_ctl,
3308*4882a593Smuzhiyun .startup = serial8250_startup,
3309*4882a593Smuzhiyun .shutdown = serial8250_shutdown,
3310*4882a593Smuzhiyun .set_termios = serial8250_set_termios,
3311*4882a593Smuzhiyun .set_ldisc = serial8250_set_ldisc,
3312*4882a593Smuzhiyun .pm = serial8250_pm,
3313*4882a593Smuzhiyun .type = serial8250_type,
3314*4882a593Smuzhiyun .release_port = serial8250_release_port,
3315*4882a593Smuzhiyun .request_port = serial8250_request_port,
3316*4882a593Smuzhiyun .config_port = serial8250_config_port,
3317*4882a593Smuzhiyun .verify_port = serial8250_verify_port,
3318*4882a593Smuzhiyun #ifdef CONFIG_CONSOLE_POLL
3319*4882a593Smuzhiyun .poll_get_char = serial8250_get_poll_char,
3320*4882a593Smuzhiyun .poll_put_char = serial8250_put_poll_char,
3321*4882a593Smuzhiyun #endif
3322*4882a593Smuzhiyun };
3323*4882a593Smuzhiyun
serial8250_init_port(struct uart_8250_port * up)3324*4882a593Smuzhiyun void serial8250_init_port(struct uart_8250_port *up)
3325*4882a593Smuzhiyun {
3326*4882a593Smuzhiyun struct uart_port *port = &up->port;
3327*4882a593Smuzhiyun
3328*4882a593Smuzhiyun spin_lock_init(&port->lock);
3329*4882a593Smuzhiyun port->ops = &serial8250_pops;
3330*4882a593Smuzhiyun port->has_sysrq = IS_ENABLED(CONFIG_SERIAL_8250_CONSOLE);
3331*4882a593Smuzhiyun
3332*4882a593Smuzhiyun up->cur_iotype = 0xFF;
3333*4882a593Smuzhiyun }
3334*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(serial8250_init_port);
3335*4882a593Smuzhiyun
serial8250_set_defaults(struct uart_8250_port * up)3336*4882a593Smuzhiyun void serial8250_set_defaults(struct uart_8250_port *up)
3337*4882a593Smuzhiyun {
3338*4882a593Smuzhiyun struct uart_port *port = &up->port;
3339*4882a593Smuzhiyun
3340*4882a593Smuzhiyun if (up->port.flags & UPF_FIXED_TYPE) {
3341*4882a593Smuzhiyun unsigned int type = up->port.type;
3342*4882a593Smuzhiyun
3343*4882a593Smuzhiyun if (!up->port.fifosize)
3344*4882a593Smuzhiyun up->port.fifosize = uart_config[type].fifo_size;
3345*4882a593Smuzhiyun if (!up->tx_loadsz)
3346*4882a593Smuzhiyun up->tx_loadsz = uart_config[type].tx_loadsz;
3347*4882a593Smuzhiyun if (!up->capabilities)
3348*4882a593Smuzhiyun up->capabilities = uart_config[type].flags;
3349*4882a593Smuzhiyun }
3350*4882a593Smuzhiyun
3351*4882a593Smuzhiyun set_io_from_upio(port);
3352*4882a593Smuzhiyun
3353*4882a593Smuzhiyun /* default dma handlers */
3354*4882a593Smuzhiyun if (up->dma) {
3355*4882a593Smuzhiyun if (!up->dma->tx_dma)
3356*4882a593Smuzhiyun up->dma->tx_dma = serial8250_tx_dma;
3357*4882a593Smuzhiyun if (!up->dma->rx_dma)
3358*4882a593Smuzhiyun up->dma->rx_dma = serial8250_rx_dma;
3359*4882a593Smuzhiyun }
3360*4882a593Smuzhiyun }
3361*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(serial8250_set_defaults);
3362*4882a593Smuzhiyun
3363*4882a593Smuzhiyun #ifdef CONFIG_SERIAL_8250_CONSOLE
3364*4882a593Smuzhiyun
serial8250_console_putchar(struct uart_port * port,int ch)3365*4882a593Smuzhiyun static void serial8250_console_putchar(struct uart_port *port, int ch)
3366*4882a593Smuzhiyun {
3367*4882a593Smuzhiyun struct uart_8250_port *up = up_to_u8250p(port);
3368*4882a593Smuzhiyun
3369*4882a593Smuzhiyun wait_for_xmitr(up, UART_LSR_THRE);
3370*4882a593Smuzhiyun serial_port_out(port, UART_TX, ch);
3371*4882a593Smuzhiyun }
3372*4882a593Smuzhiyun
3373*4882a593Smuzhiyun /*
3374*4882a593Smuzhiyun * Restore serial console when h/w power-off detected
3375*4882a593Smuzhiyun */
serial8250_console_restore(struct uart_8250_port * up)3376*4882a593Smuzhiyun static void serial8250_console_restore(struct uart_8250_port *up)
3377*4882a593Smuzhiyun {
3378*4882a593Smuzhiyun struct uart_port *port = &up->port;
3379*4882a593Smuzhiyun struct ktermios termios;
3380*4882a593Smuzhiyun unsigned int baud, quot, frac = 0;
3381*4882a593Smuzhiyun
3382*4882a593Smuzhiyun termios.c_cflag = port->cons->cflag;
3383*4882a593Smuzhiyun if (port->state->port.tty && termios.c_cflag == 0)
3384*4882a593Smuzhiyun termios.c_cflag = port->state->port.tty->termios.c_cflag;
3385*4882a593Smuzhiyun
3386*4882a593Smuzhiyun baud = serial8250_get_baud_rate(port, &termios, NULL);
3387*4882a593Smuzhiyun quot = serial8250_get_divisor(port, baud, &frac);
3388*4882a593Smuzhiyun
3389*4882a593Smuzhiyun serial8250_set_divisor(port, baud, quot, frac);
3390*4882a593Smuzhiyun serial_port_out(port, UART_LCR, up->lcr);
3391*4882a593Smuzhiyun serial8250_out_MCR(up, up->mcr | UART_MCR_DTR | UART_MCR_RTS);
3392*4882a593Smuzhiyun }
3393*4882a593Smuzhiyun
3394*4882a593Smuzhiyun /*
3395*4882a593Smuzhiyun * Print a string to the serial port trying not to disturb
3396*4882a593Smuzhiyun * any possible real use of the port...
3397*4882a593Smuzhiyun *
3398*4882a593Smuzhiyun * The console_lock must be held when we get here.
3399*4882a593Smuzhiyun *
3400*4882a593Smuzhiyun * Doing runtime PM is really a bad idea for the kernel console.
3401*4882a593Smuzhiyun * Thus, we assume the function is called when device is powered up.
3402*4882a593Smuzhiyun */
serial8250_console_write(struct uart_8250_port * up,const char * s,unsigned int count)3403*4882a593Smuzhiyun void serial8250_console_write(struct uart_8250_port *up, const char *s,
3404*4882a593Smuzhiyun unsigned int count)
3405*4882a593Smuzhiyun {
3406*4882a593Smuzhiyun struct uart_8250_em485 *em485 = up->em485;
3407*4882a593Smuzhiyun struct uart_port *port = &up->port;
3408*4882a593Smuzhiyun unsigned long flags;
3409*4882a593Smuzhiyun unsigned int ier;
3410*4882a593Smuzhiyun int locked = 1;
3411*4882a593Smuzhiyun
3412*4882a593Smuzhiyun touch_nmi_watchdog();
3413*4882a593Smuzhiyun
3414*4882a593Smuzhiyun if (oops_in_progress)
3415*4882a593Smuzhiyun locked = spin_trylock_irqsave(&port->lock, flags);
3416*4882a593Smuzhiyun else
3417*4882a593Smuzhiyun spin_lock_irqsave(&port->lock, flags);
3418*4882a593Smuzhiyun
3419*4882a593Smuzhiyun /*
3420*4882a593Smuzhiyun * First save the IER then disable the interrupts
3421*4882a593Smuzhiyun */
3422*4882a593Smuzhiyun ier = serial_port_in(port, UART_IER);
3423*4882a593Smuzhiyun
3424*4882a593Smuzhiyun if (up->capabilities & UART_CAP_UUE)
3425*4882a593Smuzhiyun serial_port_out(port, UART_IER, UART_IER_UUE);
3426*4882a593Smuzhiyun else
3427*4882a593Smuzhiyun serial_port_out(port, UART_IER, 0);
3428*4882a593Smuzhiyun
3429*4882a593Smuzhiyun /* check scratch reg to see if port powered off during system sleep */
3430*4882a593Smuzhiyun if (up->canary && (up->canary != serial_port_in(port, UART_SCR))) {
3431*4882a593Smuzhiyun serial8250_console_restore(up);
3432*4882a593Smuzhiyun up->canary = 0;
3433*4882a593Smuzhiyun }
3434*4882a593Smuzhiyun
3435*4882a593Smuzhiyun if (em485) {
3436*4882a593Smuzhiyun if (em485->tx_stopped)
3437*4882a593Smuzhiyun up->rs485_start_tx(up);
3438*4882a593Smuzhiyun mdelay(port->rs485.delay_rts_before_send);
3439*4882a593Smuzhiyun }
3440*4882a593Smuzhiyun
3441*4882a593Smuzhiyun uart_console_write(port, s, count, serial8250_console_putchar);
3442*4882a593Smuzhiyun
3443*4882a593Smuzhiyun /*
3444*4882a593Smuzhiyun * Finally, wait for transmitter to become empty
3445*4882a593Smuzhiyun * and restore the IER
3446*4882a593Smuzhiyun */
3447*4882a593Smuzhiyun wait_for_xmitr(up, BOTH_EMPTY);
3448*4882a593Smuzhiyun
3449*4882a593Smuzhiyun if (em485) {
3450*4882a593Smuzhiyun mdelay(port->rs485.delay_rts_after_send);
3451*4882a593Smuzhiyun if (em485->tx_stopped)
3452*4882a593Smuzhiyun up->rs485_stop_tx(up);
3453*4882a593Smuzhiyun }
3454*4882a593Smuzhiyun
3455*4882a593Smuzhiyun serial_port_out(port, UART_IER, ier);
3456*4882a593Smuzhiyun
3457*4882a593Smuzhiyun /*
3458*4882a593Smuzhiyun * The receive handling will happen properly because the
3459*4882a593Smuzhiyun * receive ready bit will still be set; it is not cleared
3460*4882a593Smuzhiyun * on read. However, modem control will not, we must
3461*4882a593Smuzhiyun * call it if we have saved something in the saved flags
3462*4882a593Smuzhiyun * while processing with interrupts off.
3463*4882a593Smuzhiyun */
3464*4882a593Smuzhiyun if (up->msr_saved_flags)
3465*4882a593Smuzhiyun serial8250_modem_status(up);
3466*4882a593Smuzhiyun
3467*4882a593Smuzhiyun if (locked)
3468*4882a593Smuzhiyun spin_unlock_irqrestore(&port->lock, flags);
3469*4882a593Smuzhiyun }
3470*4882a593Smuzhiyun
probe_baud(struct uart_port * port)3471*4882a593Smuzhiyun static unsigned int probe_baud(struct uart_port *port)
3472*4882a593Smuzhiyun {
3473*4882a593Smuzhiyun unsigned char lcr, dll, dlm;
3474*4882a593Smuzhiyun unsigned int quot;
3475*4882a593Smuzhiyun
3476*4882a593Smuzhiyun lcr = serial_port_in(port, UART_LCR);
3477*4882a593Smuzhiyun serial_port_out(port, UART_LCR, lcr | UART_LCR_DLAB);
3478*4882a593Smuzhiyun dll = serial_port_in(port, UART_DLL);
3479*4882a593Smuzhiyun dlm = serial_port_in(port, UART_DLM);
3480*4882a593Smuzhiyun serial_port_out(port, UART_LCR, lcr);
3481*4882a593Smuzhiyun
3482*4882a593Smuzhiyun quot = (dlm << 8) | dll;
3483*4882a593Smuzhiyun return (port->uartclk / 16) / quot;
3484*4882a593Smuzhiyun }
3485*4882a593Smuzhiyun
serial8250_console_setup(struct uart_port * port,char * options,bool probe)3486*4882a593Smuzhiyun int serial8250_console_setup(struct uart_port *port, char *options, bool probe)
3487*4882a593Smuzhiyun {
3488*4882a593Smuzhiyun int baud = 9600;
3489*4882a593Smuzhiyun int bits = 8;
3490*4882a593Smuzhiyun int parity = 'n';
3491*4882a593Smuzhiyun int flow = 'n';
3492*4882a593Smuzhiyun int ret;
3493*4882a593Smuzhiyun
3494*4882a593Smuzhiyun if (!port->iobase && !port->membase)
3495*4882a593Smuzhiyun return -ENODEV;
3496*4882a593Smuzhiyun
3497*4882a593Smuzhiyun if (options)
3498*4882a593Smuzhiyun uart_parse_options(options, &baud, &parity, &bits, &flow);
3499*4882a593Smuzhiyun else if (probe)
3500*4882a593Smuzhiyun baud = probe_baud(port);
3501*4882a593Smuzhiyun
3502*4882a593Smuzhiyun ret = uart_set_options(port, port->cons, baud, parity, bits, flow);
3503*4882a593Smuzhiyun if (ret)
3504*4882a593Smuzhiyun return ret;
3505*4882a593Smuzhiyun
3506*4882a593Smuzhiyun if (port->dev)
3507*4882a593Smuzhiyun pm_runtime_get_sync(port->dev);
3508*4882a593Smuzhiyun
3509*4882a593Smuzhiyun return 0;
3510*4882a593Smuzhiyun }
3511*4882a593Smuzhiyun
serial8250_console_exit(struct uart_port * port)3512*4882a593Smuzhiyun int serial8250_console_exit(struct uart_port *port)
3513*4882a593Smuzhiyun {
3514*4882a593Smuzhiyun if (port->dev)
3515*4882a593Smuzhiyun pm_runtime_put_sync(port->dev);
3516*4882a593Smuzhiyun
3517*4882a593Smuzhiyun return 0;
3518*4882a593Smuzhiyun }
3519*4882a593Smuzhiyun
3520*4882a593Smuzhiyun #endif /* CONFIG_SERIAL_8250_CONSOLE */
3521*4882a593Smuzhiyun
3522*4882a593Smuzhiyun MODULE_LICENSE("GPL");
3523