blob: f9320437a64971c605b3e153d2a8aa4b160155bf [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 * Driver for 8250/16550-type serial ports
3 *
4 * Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
5 *
6 * Copyright (C) 2001 Russell King.
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070013 * A note about mapbase / membase
14 *
15 * mapbase is the physical address of the IO port.
16 * membase is an 'ioremapped' cookie.
17 */
Linus Torvalds1da177e2005-04-16 15:20:36 -070018
19#if defined(CONFIG_SERIAL_8250_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
20#define SUPPORT_SYSRQ
21#endif
22
23#include <linux/module.h>
24#include <linux/moduleparam.h>
25#include <linux/ioport.h>
26#include <linux/init.h>
27#include <linux/console.h>
28#include <linux/sysrq.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070029#include <linux/delay.h>
Russell Kingd052d1b2005-10-29 19:07:23 +010030#include <linux/platform_device.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include <linux/tty.h>
Daniel Drakecd3ecad2010-10-20 16:00:48 -070032#include <linux/ratelimit.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070033#include <linux/tty_flip.h>
34#include <linux/serial_reg.h>
35#include <linux/serial_core.h>
36#include <linux/serial.h>
37#include <linux/serial_8250.h>
Andrew Morton78512ec2005-11-07 00:59:13 -080038#include <linux/nmi.h>
Arjan van de Venf392ecf2006-01-12 18:44:32 +000039#include <linux/mutex.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090040#include <linux/slab.h>
Paul Gortmaker68163832012-02-09 18:48:19 -050041#ifdef CONFIG_SPARC
42#include <linux/sunserialcore.h>
43#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070044
45#include <asm/io.h>
46#include <asm/irq.h>
47
48#include "8250.h"
49
50/*
51 * Configuration:
Thomas Gleixner40663cc2006-07-01 19:29:43 -070052 * share_irqs - whether we pass IRQF_SHARED to request_irq(). This option
Linus Torvalds1da177e2005-04-16 15:20:36 -070053 * is unsafe when used on edge-triggered interrupts.
54 */
Adrian Bunk408b6642005-05-01 08:59:29 -070055static unsigned int share_irqs = SERIAL8250_SHARE_IRQS;
Linus Torvalds1da177e2005-04-16 15:20:36 -070056
Dave Jonesa61c2d72006-01-07 23:18:19 +000057static unsigned int nr_uarts = CONFIG_SERIAL_8250_RUNTIME_UARTS;
58
David S. Miller84408382008-10-13 10:45:26 +010059static struct uart_driver serial8250_reg;
60
61static int serial_index(struct uart_port *port)
62{
63 return (serial8250_reg.minor - 64) + port->line;
64}
65
Chuck Ebbertd41a4b52009-10-01 15:44:26 -070066static unsigned int skip_txen_test; /* force skip of txen test at init time */
67
Linus Torvalds1da177e2005-04-16 15:20:36 -070068/*
69 * Debugging.
70 */
71#if 0
72#define DEBUG_AUTOCONF(fmt...) printk(fmt)
73#else
74#define DEBUG_AUTOCONF(fmt...) do { } while (0)
75#endif
76
77#if 0
78#define DEBUG_INTR(fmt...) printk(fmt)
79#else
80#define DEBUG_INTR(fmt...) do { } while (0)
81#endif
82
Jiri Slabye7328ae2011-06-05 22:51:49 +020083#define PASS_LIMIT 512
Linus Torvalds1da177e2005-04-16 15:20:36 -070084
Dick Hollenbeckbca47612009-12-09 12:31:34 -080085#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
86
87
Linus Torvalds1da177e2005-04-16 15:20:36 -070088#ifdef CONFIG_SERIAL_8250_DETECT_IRQ
89#define CONFIG_SERIAL_DETECT_IRQ 1
90#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070091#ifdef CONFIG_SERIAL_8250_MANY_PORTS
92#define CONFIG_SERIAL_MANY_PORTS 1
93#endif
94
95/*
96 * HUB6 is always on. This will be removed once the header
97 * files have been cleaned.
98 */
99#define CONFIG_HUB6 1
100
Bryan Wua4ed1e42008-05-31 16:10:04 +0800101#include <asm/serial.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102/*
103 * SERIAL_PORT_DFNS tells us about built-in ports that have no
104 * standard enumeration mechanism. Platforms that can find all
105 * serial ports via mechanisms like ACPI or PCI need not supply it.
106 */
107#ifndef SERIAL_PORT_DFNS
108#define SERIAL_PORT_DFNS
109#endif
110
Arjan van de Vencb3592b2005-11-28 21:04:11 +0000111static const struct old_serial_port old_serial_port[] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112 SERIAL_PORT_DFNS /* defined in asm/serial.h */
113};
114
Russell King026d02a2005-06-29 18:45:19 +0100115#define UART_NR CONFIG_SERIAL_8250_NR_UARTS
Linus Torvalds1da177e2005-04-16 15:20:36 -0700116
117#ifdef CONFIG_SERIAL_8250_RSA
118
119#define PORT_RSA_MAX 4
120static unsigned long probe_rsa[PORT_RSA_MAX];
121static unsigned int probe_rsa_count;
122#endif /* CONFIG_SERIAL_8250_RSA */
123
Linus Torvalds1da177e2005-04-16 15:20:36 -0700124struct irq_info {
Alan Cox25db8ad2008-08-19 20:49:40 -0700125 struct hlist_node node;
126 int irq;
127 spinlock_t lock; /* Protects list not the hash */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700128 struct list_head *head;
129};
130
Alan Cox25db8ad2008-08-19 20:49:40 -0700131#define NR_IRQ_HASH 32 /* Can be adjusted later */
132static struct hlist_head irq_lists[NR_IRQ_HASH];
133static DEFINE_MUTEX(hash_mutex); /* Used to walk the hash */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700134
135/*
136 * Here we define the default xmit fifo size used for each type of UART.
137 */
138static const struct serial8250_config uart_config[] = {
139 [PORT_UNKNOWN] = {
140 .name = "unknown",
141 .fifo_size = 1,
142 .tx_loadsz = 1,
143 },
144 [PORT_8250] = {
145 .name = "8250",
146 .fifo_size = 1,
147 .tx_loadsz = 1,
148 },
149 [PORT_16450] = {
150 .name = "16450",
151 .fifo_size = 1,
152 .tx_loadsz = 1,
153 },
154 [PORT_16550] = {
155 .name = "16550",
156 .fifo_size = 1,
157 .tx_loadsz = 1,
158 },
159 [PORT_16550A] = {
160 .name = "16550A",
161 .fifo_size = 16,
162 .tx_loadsz = 16,
163 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
164 .flags = UART_CAP_FIFO,
165 },
166 [PORT_CIRRUS] = {
167 .name = "Cirrus",
168 .fifo_size = 1,
169 .tx_loadsz = 1,
170 },
171 [PORT_16650] = {
172 .name = "ST16650",
173 .fifo_size = 1,
174 .tx_loadsz = 1,
175 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
176 },
177 [PORT_16650V2] = {
178 .name = "ST16650V2",
179 .fifo_size = 32,
180 .tx_loadsz = 16,
181 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
182 UART_FCR_T_TRIG_00,
183 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
184 },
185 [PORT_16750] = {
186 .name = "TI16750",
187 .fifo_size = 64,
188 .tx_loadsz = 64,
189 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 |
190 UART_FCR7_64BYTE,
191 .flags = UART_CAP_FIFO | UART_CAP_SLEEP | UART_CAP_AFE,
192 },
193 [PORT_STARTECH] = {
194 .name = "Startech",
195 .fifo_size = 1,
196 .tx_loadsz = 1,
197 },
198 [PORT_16C950] = {
199 .name = "16C950/954",
200 .fifo_size = 128,
201 .tx_loadsz = 128,
202 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
Pavel Machekd0694e22011-01-09 08:38:48 +0100203 /* UART_CAP_EFR breaks billionon CF bluetooth card. */
204 .flags = UART_CAP_FIFO | UART_CAP_SLEEP,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700205 },
206 [PORT_16654] = {
207 .name = "ST16654",
208 .fifo_size = 64,
209 .tx_loadsz = 32,
210 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
211 UART_FCR_T_TRIG_10,
212 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
213 },
214 [PORT_16850] = {
215 .name = "XR16850",
216 .fifo_size = 128,
217 .tx_loadsz = 128,
218 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
219 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
220 },
221 [PORT_RSA] = {
222 .name = "RSA",
223 .fifo_size = 2048,
224 .tx_loadsz = 2048,
225 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_11,
226 .flags = UART_CAP_FIFO,
227 },
228 [PORT_NS16550A] = {
229 .name = "NS16550A",
230 .fifo_size = 16,
231 .tx_loadsz = 16,
232 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
233 .flags = UART_CAP_FIFO | UART_NATSEMI,
234 },
235 [PORT_XSCALE] = {
236 .name = "XScale",
237 .fifo_size = 32,
238 .tx_loadsz = 32,
239 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
Stephen Warren4539c242011-05-17 16:12:36 -0600240 .flags = UART_CAP_FIFO | UART_CAP_UUE | UART_CAP_RTOIE,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700241 },
Thomas Koellerbd71c182007-05-06 14:48:47 -0700242 [PORT_RM9000] = {
243 .name = "RM9000",
244 .fifo_size = 16,
245 .tx_loadsz = 16,
246 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
247 .flags = UART_CAP_FIFO,
248 },
David Daney6b06f192009-01-02 13:50:00 +0000249 [PORT_OCTEON] = {
250 .name = "OCTEON",
251 .fifo_size = 64,
252 .tx_loadsz = 64,
253 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
254 .flags = UART_CAP_FIFO,
255 },
Florian Fainelli08e09922009-06-11 13:21:24 +0100256 [PORT_AR7] = {
257 .name = "AR7",
258 .fifo_size = 16,
259 .tx_loadsz = 16,
260 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_00,
261 .flags = UART_CAP_FIFO | UART_CAP_AFE,
262 },
Philippe Langlais235dae52010-07-29 17:13:57 +0200263 [PORT_U6_16550A] = {
264 .name = "U6_16550A",
265 .fifo_size = 64,
266 .tx_loadsz = 64,
267 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
268 .flags = UART_CAP_FIFO | UART_CAP_AFE,
269 },
Stephen Warren4539c242011-05-17 16:12:36 -0600270 [PORT_TEGRA] = {
271 .name = "Tegra",
272 .fifo_size = 32,
273 .tx_loadsz = 8,
274 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
275 UART_FCR_T_TRIG_01,
276 .flags = UART_CAP_FIFO | UART_CAP_RTOIE,
277 },
Søren Holm06315342011-09-02 22:55:37 +0200278 [PORT_XR17D15X] = {
279 .name = "XR17D15X",
280 .fifo_size = 64,
281 .tx_loadsz = 64,
282 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
Matt Schulte81db0772012-11-21 09:39:07 -0600283 .flags = UART_CAP_FIFO | UART_CAP_AFE | UART_CAP_EFR |
284 UART_CAP_SLEEP,
Søren Holm06315342011-09-02 22:55:37 +0200285 },
Matt Schultedc96efb2012-11-19 09:12:04 -0600286 [PORT_XR17V35X] = {
287 .name = "XR17V35X",
288 .fifo_size = 256,
289 .tx_loadsz = 256,
290 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_11 |
291 UART_FCR_T_TRIG_11,
292 .flags = UART_CAP_FIFO | UART_CAP_AFE | UART_CAP_EFR |
293 UART_CAP_SLEEP,
294 },
Roland Stigge7a514592012-06-11 21:57:13 +0200295 [PORT_LPC3220] = {
296 .name = "LPC3220",
297 .fifo_size = 64,
298 .tx_loadsz = 32,
299 .fcr = UART_FCR_DMA_SELECT | UART_FCR_ENABLE_FIFO |
300 UART_FCR_R_TRIG_00 | UART_FCR_T_TRIG_00,
301 .flags = UART_CAP_FIFO,
302 },
Stephen Hurdebebd492013-01-17 14:14:53 -0800303 [PORT_BRCM_TRUMANAGE] = {
304 .name = "TruManage",
305 .fifo_size = 1,
306 .tx_loadsz = 1024,
307 .flags = UART_CAP_HFIFO,
308 },
Sean Young65ecc9c2012-09-07 19:06:24 +0100309 [PORT_8250_CIR] = {
310 .name = "CIR port"
311 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700312};
313
Magnus Dammcc419fa02012-05-02 21:46:51 +0900314/* Uart divisor latch read */
Magnus Damme8155622012-05-02 21:47:18 +0900315static int default_serial_dl_read(struct uart_8250_port *up)
Magnus Dammcc419fa02012-05-02 21:46:51 +0900316{
317 return serial_in(up, UART_DLL) | serial_in(up, UART_DLM) << 8;
318}
319
320/* Uart divisor latch write */
Magnus Damme8155622012-05-02 21:47:18 +0900321static void default_serial_dl_write(struct uart_8250_port *up, int value)
Magnus Dammcc419fa02012-05-02 21:46:51 +0900322{
323 serial_out(up, UART_DLL, value & 0xff);
324 serial_out(up, UART_DLM, value >> 8 & 0xff);
325}
326
Magnus Damm6b416032012-05-02 21:47:00 +0900327#ifdef CONFIG_MIPS_ALCHEMY
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000328
329/* Au1x00 UART hardware has a weird register layout */
330static const u8 au_io_in_map[] = {
331 [UART_RX] = 0,
332 [UART_IER] = 2,
333 [UART_IIR] = 3,
334 [UART_LCR] = 5,
335 [UART_MCR] = 6,
336 [UART_LSR] = 7,
337 [UART_MSR] = 8,
338};
339
340static const u8 au_io_out_map[] = {
341 [UART_TX] = 1,
342 [UART_IER] = 2,
343 [UART_FCR] = 4,
344 [UART_LCR] = 5,
345 [UART_MCR] = 6,
346};
347
Magnus Damm6b416032012-05-02 21:47:00 +0900348static unsigned int au_serial_in(struct uart_port *p, int offset)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000349{
Magnus Damm6b416032012-05-02 21:47:00 +0900350 offset = au_io_in_map[offset] << p->regshift;
351 return __raw_readl(p->membase + offset);
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000352}
353
Magnus Damm6b416032012-05-02 21:47:00 +0900354static void au_serial_out(struct uart_port *p, int offset, int value)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000355{
Magnus Damm6b416032012-05-02 21:47:00 +0900356 offset = au_io_out_map[offset] << p->regshift;
357 __raw_writel(value, p->membase + offset);
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000358}
359
Magnus Damm6b416032012-05-02 21:47:00 +0900360/* Au1x00 haven't got a standard divisor latch */
361static int au_serial_dl_read(struct uart_8250_port *up)
362{
363 return __raw_readl(up->port.membase + 0x28);
364}
365
366static void au_serial_dl_write(struct uart_8250_port *up, int value)
367{
368 __raw_writel(value, up->port.membase + 0x28);
369}
370
371#endif
372
Magnus Damm28bf4cf2012-05-02 21:47:09 +0900373#ifdef CONFIG_SERIAL_8250_RM9K
Thomas Koellerbd71c182007-05-06 14:48:47 -0700374
375static const u8
376 regmap_in[8] = {
377 [UART_RX] = 0x00,
378 [UART_IER] = 0x0c,
379 [UART_IIR] = 0x14,
380 [UART_LCR] = 0x1c,
381 [UART_MCR] = 0x20,
382 [UART_LSR] = 0x24,
383 [UART_MSR] = 0x28,
384 [UART_SCR] = 0x2c
385 },
386 regmap_out[8] = {
387 [UART_TX] = 0x04,
388 [UART_IER] = 0x0c,
389 [UART_FCR] = 0x18,
390 [UART_LCR] = 0x1c,
391 [UART_MCR] = 0x20,
392 [UART_LSR] = 0x24,
393 [UART_MSR] = 0x28,
394 [UART_SCR] = 0x2c
395 };
396
Magnus Damm28bf4cf2012-05-02 21:47:09 +0900397static unsigned int rm9k_serial_in(struct uart_port *p, int offset)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700398{
Magnus Damm28bf4cf2012-05-02 21:47:09 +0900399 offset = regmap_in[offset] << p->regshift;
400 return readl(p->membase + offset);
Thomas Koellerbd71c182007-05-06 14:48:47 -0700401}
402
Magnus Damm28bf4cf2012-05-02 21:47:09 +0900403static void rm9k_serial_out(struct uart_port *p, int offset, int value)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700404{
Magnus Damm28bf4cf2012-05-02 21:47:09 +0900405 offset = regmap_out[offset] << p->regshift;
406 writel(value, p->membase + offset);
Thomas Koellerbd71c182007-05-06 14:48:47 -0700407}
408
Magnus Damm28bf4cf2012-05-02 21:47:09 +0900409static int rm9k_serial_dl_read(struct uart_8250_port *up)
410{
411 return ((__raw_readl(up->port.membase + 0x10) << 8) |
412 (__raw_readl(up->port.membase + 0x08) & 0xff)) & 0xffff;
413}
414
415static void rm9k_serial_dl_write(struct uart_8250_port *up, int value)
416{
417 __raw_writel(value, up->port.membase + 0x08);
418 __raw_writel(value >> 8, up->port.membase + 0x10);
419}
420
421#endif
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000422
David Daney7d6a07d2009-01-02 13:49:47 +0000423static unsigned int hub6_serial_in(struct uart_port *p, int offset)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700424{
Magnus Damme8155622012-05-02 21:47:18 +0900425 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000426 outb(p->hub6 - 1 + offset, p->iobase);
427 return inb(p->iobase + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700428}
429
David Daney7d6a07d2009-01-02 13:49:47 +0000430static void hub6_serial_out(struct uart_port *p, int offset, int value)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700431{
Magnus Damme8155622012-05-02 21:47:18 +0900432 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000433 outb(p->hub6 - 1 + offset, p->iobase);
434 outb(value, p->iobase + 1);
435}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700436
David Daney7d6a07d2009-01-02 13:49:47 +0000437static unsigned int mem_serial_in(struct uart_port *p, int offset)
438{
Magnus Damme8155622012-05-02 21:47:18 +0900439 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000440 return readb(p->membase + offset);
441}
442
443static void mem_serial_out(struct uart_port *p, int offset, int value)
444{
Magnus Damme8155622012-05-02 21:47:18 +0900445 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000446 writeb(value, p->membase + offset);
447}
448
449static void mem32_serial_out(struct uart_port *p, int offset, int value)
450{
Magnus Damme8155622012-05-02 21:47:18 +0900451 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000452 writel(value, p->membase + offset);
453}
454
455static unsigned int mem32_serial_in(struct uart_port *p, int offset)
456{
Magnus Damme8155622012-05-02 21:47:18 +0900457 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000458 return readl(p->membase + offset);
459}
460
David Daney7d6a07d2009-01-02 13:49:47 +0000461static unsigned int io_serial_in(struct uart_port *p, int offset)
462{
Magnus Damme8155622012-05-02 21:47:18 +0900463 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000464 return inb(p->iobase + offset);
465}
466
467static void io_serial_out(struct uart_port *p, int offset, int value)
468{
Magnus Damme8155622012-05-02 21:47:18 +0900469 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000470 outb(value, p->iobase + offset);
471}
472
Jamie Iles583d28e2011-08-15 10:17:52 +0100473static int serial8250_default_handle_irq(struct uart_port *port);
Matt Schultedc96efb2012-11-19 09:12:04 -0600474static int exar_handle_irq(struct uart_port *port);
Jamie Iles583d28e2011-08-15 10:17:52 +0100475
David Daney7d6a07d2009-01-02 13:49:47 +0000476static void set_io_from_upio(struct uart_port *p)
477{
Jamie Iles49d57412010-12-01 23:39:35 +0000478 struct uart_8250_port *up =
479 container_of(p, struct uart_8250_port, port);
Magnus Dammcc419fa02012-05-02 21:46:51 +0900480
Magnus Damme8155622012-05-02 21:47:18 +0900481 up->dl_read = default_serial_dl_read;
482 up->dl_write = default_serial_dl_write;
Magnus Dammcc419fa02012-05-02 21:46:51 +0900483
David Daney7d6a07d2009-01-02 13:49:47 +0000484 switch (p->iotype) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700485 case UPIO_HUB6:
David Daney7d6a07d2009-01-02 13:49:47 +0000486 p->serial_in = hub6_serial_in;
487 p->serial_out = hub6_serial_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700488 break;
489
490 case UPIO_MEM:
David Daney7d6a07d2009-01-02 13:49:47 +0000491 p->serial_in = mem_serial_in;
492 p->serial_out = mem_serial_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700493 break;
494
495 case UPIO_MEM32:
David Daney7d6a07d2009-01-02 13:49:47 +0000496 p->serial_in = mem32_serial_in;
497 p->serial_out = mem32_serial_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700498 break;
499
Magnus Damm28bf4cf2012-05-02 21:47:09 +0900500#ifdef CONFIG_SERIAL_8250_RM9K
501 case UPIO_RM9000:
502 p->serial_in = rm9k_serial_in;
503 p->serial_out = rm9k_serial_out;
504 up->dl_read = rm9k_serial_dl_read;
505 up->dl_write = rm9k_serial_dl_write;
506 break;
507#endif
508
Magnus Damm6b416032012-05-02 21:47:00 +0900509#ifdef CONFIG_MIPS_ALCHEMY
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000510 case UPIO_AU:
David Daney7d6a07d2009-01-02 13:49:47 +0000511 p->serial_in = au_serial_in;
512 p->serial_out = au_serial_out;
Magnus Damm6b416032012-05-02 21:47:00 +0900513 up->dl_read = au_serial_dl_read;
514 up->dl_write = au_serial_dl_write;
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000515 break;
Magnus Damm6b416032012-05-02 21:47:00 +0900516#endif
Manuel Lauss12bf3f22010-07-15 21:45:05 +0200517
Linus Torvalds1da177e2005-04-16 15:20:36 -0700518 default:
David Daney7d6a07d2009-01-02 13:49:47 +0000519 p->serial_in = io_serial_in;
520 p->serial_out = io_serial_out;
521 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700522 }
Alan Coxb8e7e402009-05-28 14:01:35 +0100523 /* Remember loaded iotype */
524 up->cur_iotype = p->iotype;
Jamie Iles583d28e2011-08-15 10:17:52 +0100525 p->handle_irq = serial8250_default_handle_irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700526}
527
Alex Williamson40b36da2007-02-14 00:33:04 -0800528static void
Paul Gortmaker55e40162012-03-08 19:12:14 -0500529serial_port_out_sync(struct uart_port *p, int offset, int value)
Alex Williamson40b36da2007-02-14 00:33:04 -0800530{
David Daney7d6a07d2009-01-02 13:49:47 +0000531 switch (p->iotype) {
Alex Williamson40b36da2007-02-14 00:33:04 -0800532 case UPIO_MEM:
533 case UPIO_MEM32:
Alex Williamson40b36da2007-02-14 00:33:04 -0800534 case UPIO_AU:
David Daney7d6a07d2009-01-02 13:49:47 +0000535 p->serial_out(p, offset, value);
536 p->serial_in(p, UART_LCR); /* safe, no side-effects */
Alex Williamson40b36da2007-02-14 00:33:04 -0800537 break;
538 default:
David Daney7d6a07d2009-01-02 13:49:47 +0000539 p->serial_out(p, offset, value);
Alex Williamson40b36da2007-02-14 00:33:04 -0800540 }
541}
542
Linus Torvalds1da177e2005-04-16 15:20:36 -0700543/*
544 * For the 16C950
545 */
546static void serial_icr_write(struct uart_8250_port *up, int offset, int value)
547{
548 serial_out(up, UART_SCR, offset);
549 serial_out(up, UART_ICR, value);
550}
551
552static unsigned int serial_icr_read(struct uart_8250_port *up, int offset)
553{
554 unsigned int value;
555
556 serial_icr_write(up, UART_ACR, up->acr | UART_ACR_ICRRD);
557 serial_out(up, UART_SCR, offset);
558 value = serial_in(up, UART_ICR);
559 serial_icr_write(up, UART_ACR, up->acr);
560
561 return value;
562}
563
564/*
565 * FIFO support.
566 */
Will Newtonb5d674a2008-10-13 10:36:21 +0100567static void serial8250_clear_fifos(struct uart_8250_port *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700568{
569 if (p->capabilities & UART_CAP_FIFO) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500570 serial_out(p, UART_FCR, UART_FCR_ENABLE_FIFO);
571 serial_out(p, UART_FCR, UART_FCR_ENABLE_FIFO |
Linus Torvalds1da177e2005-04-16 15:20:36 -0700572 UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500573 serial_out(p, UART_FCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700574 }
575}
576
Sudhakar Mamillapalli0ad372b2012-04-10 14:10:58 -0700577void serial8250_clear_and_reinit_fifos(struct uart_8250_port *p)
578{
579 unsigned char fcr;
580
581 serial8250_clear_fifos(p);
582 fcr = uart_config[p->port.type].fcr;
583 serial_out(p, UART_FCR, fcr);
584}
585EXPORT_SYMBOL_GPL(serial8250_clear_and_reinit_fifos);
586
Linus Torvalds1da177e2005-04-16 15:20:36 -0700587/*
588 * IER sleep support. UARTs which have EFRs need the "extended
589 * capability" bit enabled. Note that on XR16C850s, we need to
590 * reset LCR to write to IER.
591 */
Will Newtonb5d674a2008-10-13 10:36:21 +0100592static void serial8250_set_sleep(struct uart_8250_port *p, int sleep)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700593{
Matt Schultedc96efb2012-11-19 09:12:04 -0600594 /*
595 * Exar UARTs have a SLEEP register that enables or disables
596 * each UART to enter sleep mode separately. On the XR17V35x the
597 * register is accessible to each UART at the UART_EXAR_SLEEP
598 * offset but the UART channel may only write to the corresponding
599 * bit.
600 */
Matt Schulte81db0772012-11-21 09:39:07 -0600601 if ((p->port.type == PORT_XR17V35X) ||
602 (p->port.type == PORT_XR17D15X)) {
Matt Schultedc96efb2012-11-19 09:12:04 -0600603 serial_out(p, UART_EXAR_SLEEP, 0xff);
604 return;
605 }
606
Linus Torvalds1da177e2005-04-16 15:20:36 -0700607 if (p->capabilities & UART_CAP_SLEEP) {
608 if (p->capabilities & UART_CAP_EFR) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500609 serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B);
610 serial_out(p, UART_EFR, UART_EFR_ECB);
611 serial_out(p, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700612 }
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500613 serial_out(p, UART_IER, sleep ? UART_IERX_SLEEP : 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700614 if (p->capabilities & UART_CAP_EFR) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500615 serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B);
616 serial_out(p, UART_EFR, 0);
617 serial_out(p, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700618 }
619 }
620}
621
622#ifdef CONFIG_SERIAL_8250_RSA
623/*
624 * Attempts to turn on the RSA FIFO. Returns zero on failure.
625 * We set the port uart clock rate if we succeed.
626 */
627static int __enable_rsa(struct uart_8250_port *up)
628{
629 unsigned char mode;
630 int result;
631
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500632 mode = serial_in(up, UART_RSA_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700633 result = mode & UART_RSA_MSR_FIFO;
634
635 if (!result) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500636 serial_out(up, UART_RSA_MSR, mode | UART_RSA_MSR_FIFO);
637 mode = serial_in(up, UART_RSA_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700638 result = mode & UART_RSA_MSR_FIFO;
639 }
640
641 if (result)
642 up->port.uartclk = SERIAL_RSA_BAUD_BASE * 16;
643
644 return result;
645}
646
647static void enable_rsa(struct uart_8250_port *up)
648{
649 if (up->port.type == PORT_RSA) {
650 if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) {
651 spin_lock_irq(&up->port.lock);
652 __enable_rsa(up);
653 spin_unlock_irq(&up->port.lock);
654 }
655 if (up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16)
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500656 serial_out(up, UART_RSA_FRR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700657 }
658}
659
660/*
661 * Attempts to turn off the RSA FIFO. Returns zero on failure.
662 * It is unknown why interrupts were disabled in here. However,
663 * the caller is expected to preserve this behaviour by grabbing
664 * the spinlock before calling this function.
665 */
666static void disable_rsa(struct uart_8250_port *up)
667{
668 unsigned char mode;
669 int result;
670
671 if (up->port.type == PORT_RSA &&
672 up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) {
673 spin_lock_irq(&up->port.lock);
674
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500675 mode = serial_in(up, UART_RSA_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700676 result = !(mode & UART_RSA_MSR_FIFO);
677
678 if (!result) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500679 serial_out(up, UART_RSA_MSR, mode & ~UART_RSA_MSR_FIFO);
680 mode = serial_in(up, UART_RSA_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700681 result = !(mode & UART_RSA_MSR_FIFO);
682 }
683
684 if (result)
685 up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16;
686 spin_unlock_irq(&up->port.lock);
687 }
688}
689#endif /* CONFIG_SERIAL_8250_RSA */
690
691/*
692 * This is a quickie test to see how big the FIFO is.
693 * It doesn't work at all the time, more's the pity.
694 */
695static int size_fifo(struct uart_8250_port *up)
696{
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100697 unsigned char old_fcr, old_mcr, old_lcr;
698 unsigned short old_dl;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700699 int count;
700
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500701 old_lcr = serial_in(up, UART_LCR);
702 serial_out(up, UART_LCR, 0);
703 old_fcr = serial_in(up, UART_FCR);
704 old_mcr = serial_in(up, UART_MCR);
705 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO |
Linus Torvalds1da177e2005-04-16 15:20:36 -0700706 UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500707 serial_out(up, UART_MCR, UART_MCR_LOOP);
708 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100709 old_dl = serial_dl_read(up);
710 serial_dl_write(up, 0x0001);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500711 serial_out(up, UART_LCR, 0x03);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700712 for (count = 0; count < 256; count++)
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500713 serial_out(up, UART_TX, count);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700714 mdelay(20);/* FIXME - schedule_timeout */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500715 for (count = 0; (serial_in(up, UART_LSR) & UART_LSR_DR) &&
Linus Torvalds1da177e2005-04-16 15:20:36 -0700716 (count < 256); count++)
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500717 serial_in(up, UART_RX);
718 serial_out(up, UART_FCR, old_fcr);
719 serial_out(up, UART_MCR, old_mcr);
720 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100721 serial_dl_write(up, old_dl);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500722 serial_out(up, UART_LCR, old_lcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700723
724 return count;
725}
726
727/*
728 * Read UART ID using the divisor method - set DLL and DLM to zero
729 * and the revision will be in DLL and device type in DLM. We
730 * preserve the device state across this.
731 */
732static unsigned int autoconfig_read_divisor_id(struct uart_8250_port *p)
733{
734 unsigned char old_dll, old_dlm, old_lcr;
735 unsigned int id;
736
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500737 old_lcr = serial_in(p, UART_LCR);
738 serial_out(p, UART_LCR, UART_LCR_CONF_MODE_A);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700739
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500740 old_dll = serial_in(p, UART_DLL);
741 old_dlm = serial_in(p, UART_DLM);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700742
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500743 serial_out(p, UART_DLL, 0);
744 serial_out(p, UART_DLM, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700745
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500746 id = serial_in(p, UART_DLL) | serial_in(p, UART_DLM) << 8;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700747
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500748 serial_out(p, UART_DLL, old_dll);
749 serial_out(p, UART_DLM, old_dlm);
750 serial_out(p, UART_LCR, old_lcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700751
752 return id;
753}
754
755/*
756 * This is a helper routine to autodetect StarTech/Exar/Oxsemi UART's.
757 * When this function is called we know it is at least a StarTech
758 * 16650 V2, but it might be one of several StarTech UARTs, or one of
759 * its clones. (We treat the broken original StarTech 16650 V1 as a
760 * 16550, and why not? Startech doesn't seem to even acknowledge its
761 * existence.)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700762 *
Linus Torvalds1da177e2005-04-16 15:20:36 -0700763 * What evil have men's minds wrought...
764 */
765static void autoconfig_has_efr(struct uart_8250_port *up)
766{
767 unsigned int id1, id2, id3, rev;
768
769 /*
770 * Everything with an EFR has SLEEP
771 */
772 up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP;
773
774 /*
775 * First we check to see if it's an Oxford Semiconductor UART.
776 *
777 * If we have to do this here because some non-National
778 * Semiconductor clone chips lock up if you try writing to the
779 * LSR register (which serial_icr_read does)
780 */
781
782 /*
783 * Check for Oxford Semiconductor 16C950.
784 *
785 * EFR [4] must be set else this test fails.
786 *
787 * This shouldn't be necessary, but Mike Hudson (Exoray@isys.ca)
788 * claims that it's needed for 952 dual UART's (which are not
789 * recommended for new designs).
790 */
791 up->acr = 0;
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -0800792 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700793 serial_out(up, UART_EFR, UART_EFR_ECB);
794 serial_out(up, UART_LCR, 0x00);
795 id1 = serial_icr_read(up, UART_ID1);
796 id2 = serial_icr_read(up, UART_ID2);
797 id3 = serial_icr_read(up, UART_ID3);
798 rev = serial_icr_read(up, UART_REV);
799
800 DEBUG_AUTOCONF("950id=%02x:%02x:%02x:%02x ", id1, id2, id3, rev);
801
802 if (id1 == 0x16 && id2 == 0xC9 &&
803 (id3 == 0x50 || id3 == 0x52 || id3 == 0x54)) {
804 up->port.type = PORT_16C950;
Russell King4ba5e352005-06-23 10:43:04 +0100805
806 /*
807 * Enable work around for the Oxford Semiconductor 952 rev B
808 * chip which causes it to seriously miscalculate baud rates
809 * when DLL is 0.
810 */
811 if (id3 == 0x52 && rev == 0x01)
812 up->bugs |= UART_BUG_QUOT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700813 return;
814 }
Thomas Koellerbd71c182007-05-06 14:48:47 -0700815
Linus Torvalds1da177e2005-04-16 15:20:36 -0700816 /*
817 * We check for a XR16C850 by setting DLL and DLM to 0, and then
818 * reading back DLL and DLM. The chip type depends on the DLM
819 * value read back:
820 * 0x10 - XR16C850 and the DLL contains the chip revision.
821 * 0x12 - XR16C2850.
822 * 0x14 - XR16C854.
823 */
824 id1 = autoconfig_read_divisor_id(up);
825 DEBUG_AUTOCONF("850id=%04x ", id1);
826
827 id2 = id1 >> 8;
828 if (id2 == 0x10 || id2 == 0x12 || id2 == 0x14) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700829 up->port.type = PORT_16850;
830 return;
831 }
832
833 /*
834 * It wasn't an XR16C850.
835 *
836 * We distinguish between the '654 and the '650 by counting
837 * how many bytes are in the FIFO. I'm using this for now,
838 * since that's the technique that was sent to me in the
839 * serial driver update, but I'm not convinced this works.
840 * I've had problems doing this in the past. -TYT
841 */
842 if (size_fifo(up) == 64)
843 up->port.type = PORT_16654;
844 else
845 up->port.type = PORT_16650V2;
846}
847
848/*
849 * We detected a chip without a FIFO. Only two fall into
850 * this category - the original 8250 and the 16450. The
851 * 16450 has a scratch register (accessible with LCR=0)
852 */
853static void autoconfig_8250(struct uart_8250_port *up)
854{
855 unsigned char scratch, status1, status2;
856
857 up->port.type = PORT_8250;
858
859 scratch = serial_in(up, UART_SCR);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500860 serial_out(up, UART_SCR, 0xa5);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700861 status1 = serial_in(up, UART_SCR);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500862 serial_out(up, UART_SCR, 0x5a);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700863 status2 = serial_in(up, UART_SCR);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500864 serial_out(up, UART_SCR, scratch);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700865
866 if (status1 == 0xa5 && status2 == 0x5a)
867 up->port.type = PORT_16450;
868}
869
870static int broken_efr(struct uart_8250_port *up)
871{
872 /*
873 * Exar ST16C2550 "A2" devices incorrectly detect as
874 * having an EFR, and report an ID of 0x0201. See
Justin P. Mattock631dd1a2010-10-18 11:03:14 +0200875 * http://linux.derkeiler.com/Mailing-Lists/Kernel/2004-11/4812.html
Linus Torvalds1da177e2005-04-16 15:20:36 -0700876 */
877 if (autoconfig_read_divisor_id(up) == 0x0201 && size_fifo(up) == 16)
878 return 1;
879
880 return 0;
881}
882
Yin Kangkai0d0389e2011-02-09 11:35:18 +0800883static inline int ns16550a_goto_highspeed(struct uart_8250_port *up)
884{
885 unsigned char status;
886
887 status = serial_in(up, 0x04); /* EXCR2 */
888#define PRESL(x) ((x) & 0x30)
889 if (PRESL(status) == 0x10) {
890 /* already in high speed mode */
891 return 0;
892 } else {
893 status &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */
894 status |= 0x10; /* 1.625 divisor for baud_base --> 921600 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500895 serial_out(up, 0x04, status);
Yin Kangkai0d0389e2011-02-09 11:35:18 +0800896 }
897 return 1;
898}
899
Linus Torvalds1da177e2005-04-16 15:20:36 -0700900/*
901 * We know that the chip has FIFOs. Does it have an EFR? The
902 * EFR is located in the same register position as the IIR and
903 * we know the top two bits of the IIR are currently set. The
904 * EFR should contain zero. Try to read the EFR.
905 */
906static void autoconfig_16550a(struct uart_8250_port *up)
907{
908 unsigned char status1, status2;
909 unsigned int iersave;
910
911 up->port.type = PORT_16550A;
912 up->capabilities |= UART_CAP_FIFO;
913
914 /*
Matt Schultedc96efb2012-11-19 09:12:04 -0600915 * XR17V35x UARTs have an extra divisor register, DLD
916 * that gets enabled with when DLAB is set which will
917 * cause the device to incorrectly match and assign
918 * port type to PORT_16650. The EFR for this UART is
919 * found at offset 0x09. Instead check the Deice ID (DVID)
920 * register for a 2, 4 or 8 port UART.
921 */
Matt Schulteb7a7e142012-11-20 11:23:56 -0600922 if (up->port.flags & UPF_EXAR_EFR) {
923 status1 = serial_in(up, UART_EXAR_DVID);
924 if (status1 == 0x82 || status1 == 0x84 || status1 == 0x88) {
Matt Schultedc96efb2012-11-19 09:12:04 -0600925 DEBUG_AUTOCONF("Exar XR17V35x ");
926 up->port.type = PORT_XR17V35X;
927 up->capabilities |= UART_CAP_AFE | UART_CAP_EFR |
928 UART_CAP_SLEEP;
929
930 return;
931 }
932
933 }
934
935 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700936 * Check for presence of the EFR when DLAB is set.
937 * Only ST16C650V1 UARTs pass this test.
938 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500939 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700940 if (serial_in(up, UART_EFR) == 0) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500941 serial_out(up, UART_EFR, 0xA8);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700942 if (serial_in(up, UART_EFR) != 0) {
943 DEBUG_AUTOCONF("EFRv1 ");
944 up->port.type = PORT_16650;
945 up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP;
946 } else {
947 DEBUG_AUTOCONF("Motorola 8xxx DUART ");
948 }
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500949 serial_out(up, UART_EFR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700950 return;
951 }
952
953 /*
954 * Maybe it requires 0xbf to be written to the LCR.
955 * (other ST16C650V2 UARTs, TI16C752A, etc)
956 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500957 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700958 if (serial_in(up, UART_EFR) == 0 && !broken_efr(up)) {
959 DEBUG_AUTOCONF("EFRv2 ");
960 autoconfig_has_efr(up);
961 return;
962 }
963
964 /*
965 * Check for a National Semiconductor SuperIO chip.
966 * Attempt to switch to bank 2, read the value of the LOOP bit
967 * from EXCR1. Switch back to bank 0, change it in MCR. Then
968 * switch back to bank 2, read it from EXCR1 again and check
969 * it's changed. If so, set baud_base in EXCR2 to 921600. -- dwmw2
Linus Torvalds1da177e2005-04-16 15:20:36 -0700970 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500971 serial_out(up, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700972 status1 = serial_in(up, UART_MCR);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500973 serial_out(up, UART_LCR, 0xE0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700974 status2 = serial_in(up, 0x02); /* EXCR1 */
975
976 if (!((status2 ^ status1) & UART_MCR_LOOP)) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500977 serial_out(up, UART_LCR, 0);
978 serial_out(up, UART_MCR, status1 ^ UART_MCR_LOOP);
979 serial_out(up, UART_LCR, 0xE0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700980 status2 = serial_in(up, 0x02); /* EXCR1 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500981 serial_out(up, UART_LCR, 0);
982 serial_out(up, UART_MCR, status1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700983
984 if ((status2 ^ status1) & UART_MCR_LOOP) {
David Woodhouse857dde22005-05-21 15:52:23 +0100985 unsigned short quot;
986
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500987 serial_out(up, UART_LCR, 0xE0);
David Woodhouse857dde22005-05-21 15:52:23 +0100988
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100989 quot = serial_dl_read(up);
David Woodhouse857dde22005-05-21 15:52:23 +0100990 quot <<= 3;
991
Yin Kangkai0d0389e2011-02-09 11:35:18 +0800992 if (ns16550a_goto_highspeed(up))
993 serial_dl_write(up, quot);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700994
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500995 serial_out(up, UART_LCR, 0);
David Woodhouse857dde22005-05-21 15:52:23 +0100996
997 up->port.uartclk = 921600*16;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700998 up->port.type = PORT_NS16550A;
999 up->capabilities |= UART_NATSEMI;
1000 return;
1001 }
1002 }
1003
1004 /*
1005 * No EFR. Try to detect a TI16750, which only sets bit 5 of
1006 * the IIR when 64 byte FIFO mode is enabled when DLAB is set.
1007 * Try setting it with and without DLAB set. Cheap clones
1008 * set bit 5 without DLAB set.
1009 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001010 serial_out(up, UART_LCR, 0);
1011 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001012 status1 = serial_in(up, UART_IIR) >> 5;
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001013 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
1014 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
1015 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001016 status2 = serial_in(up, UART_IIR) >> 5;
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001017 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
1018 serial_out(up, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001019
1020 DEBUG_AUTOCONF("iir1=%d iir2=%d ", status1, status2);
1021
1022 if (status1 == 6 && status2 == 7) {
1023 up->port.type = PORT_16750;
1024 up->capabilities |= UART_CAP_AFE | UART_CAP_SLEEP;
1025 return;
1026 }
1027
1028 /*
1029 * Try writing and reading the UART_IER_UUE bit (b6).
1030 * If it works, this is probably one of the Xscale platform's
1031 * internal UARTs.
1032 * We're going to explicitly set the UUE bit to 0 before
1033 * trying to write and read a 1 just to make sure it's not
1034 * already a 1 and maybe locked there before we even start start.
1035 */
1036 iersave = serial_in(up, UART_IER);
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001037 serial_out(up, UART_IER, iersave & ~UART_IER_UUE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001038 if (!(serial_in(up, UART_IER) & UART_IER_UUE)) {
1039 /*
1040 * OK it's in a known zero state, try writing and reading
1041 * without disturbing the current state of the other bits.
1042 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001043 serial_out(up, UART_IER, iersave | UART_IER_UUE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001044 if (serial_in(up, UART_IER) & UART_IER_UUE) {
1045 /*
1046 * It's an Xscale.
1047 * We'll leave the UART_IER_UUE bit set to 1 (enabled).
1048 */
1049 DEBUG_AUTOCONF("Xscale ");
1050 up->port.type = PORT_XSCALE;
Stephen Warren55681812011-06-17 09:45:07 -06001051 up->capabilities |= UART_CAP_UUE | UART_CAP_RTOIE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001052 return;
1053 }
1054 } else {
1055 /*
1056 * If we got here we couldn't force the IER_UUE bit to 0.
1057 * Log it and continue.
1058 */
1059 DEBUG_AUTOCONF("Couldn't force IER_UUE to 0 ");
1060 }
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001061 serial_out(up, UART_IER, iersave);
Philippe Langlais235dae52010-07-29 17:13:57 +02001062
1063 /*
Søren Holm06315342011-09-02 22:55:37 +02001064 * Exar uarts have EFR in a weird location
1065 */
1066 if (up->port.flags & UPF_EXAR_EFR) {
Matt Schulte81db0772012-11-21 09:39:07 -06001067 DEBUG_AUTOCONF("Exar XR17D15x ");
Søren Holm06315342011-09-02 22:55:37 +02001068 up->port.type = PORT_XR17D15X;
Matt Schulte81db0772012-11-21 09:39:07 -06001069 up->capabilities |= UART_CAP_AFE | UART_CAP_EFR |
1070 UART_CAP_SLEEP;
1071
1072 return;
Søren Holm06315342011-09-02 22:55:37 +02001073 }
1074
1075 /*
Philippe Langlais235dae52010-07-29 17:13:57 +02001076 * We distinguish between 16550A and U6 16550A by counting
1077 * how many bytes are in the FIFO.
1078 */
1079 if (up->port.type == PORT_16550A && size_fifo(up) == 64) {
1080 up->port.type = PORT_U6_16550A;
1081 up->capabilities |= UART_CAP_AFE;
1082 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001083}
1084
1085/*
1086 * This routine is called by rs_init() to initialize a specific serial
1087 * port. It determines what type of UART chip this serial port is
1088 * using: 8250, 16450, 16550, 16550A. The important question is
1089 * whether or not this UART is a 16550A or not, since this will
1090 * determine whether or not we can use its FIFO features or not.
1091 */
1092static void autoconfig(struct uart_8250_port *up, unsigned int probeflags)
1093{
1094 unsigned char status1, scratch, scratch2, scratch3;
1095 unsigned char save_lcr, save_mcr;
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001096 struct uart_port *port = &up->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001097 unsigned long flags;
Flavio Leitnerbd21f552012-09-18 16:21:32 -03001098 unsigned int old_capabilities;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001099
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001100 if (!port->iobase && !port->mapbase && !port->membase)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001101 return;
1102
Lennert Buytenhek80647b92009-11-11 14:26:41 -08001103 DEBUG_AUTOCONF("ttyS%d: autoconf (0x%04lx, 0x%p): ",
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001104 serial_index(port), port->iobase, port->membase);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001105
1106 /*
1107 * We really do need global IRQs disabled here - we're going to
1108 * be frobbing the chips IRQ enable register to see if it exists.
1109 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001110 spin_lock_irqsave(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001111
1112 up->capabilities = 0;
Russell King4ba5e352005-06-23 10:43:04 +01001113 up->bugs = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001114
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001115 if (!(port->flags & UPF_BUGGY_UART)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001116 /*
1117 * Do a simple existence test first; if we fail this,
1118 * there's no point trying anything else.
Thomas Koellerbd71c182007-05-06 14:48:47 -07001119 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001120 * 0x80 is used as a nonsense port to prevent against
1121 * false positives due to ISA bus float. The
1122 * assumption is that 0x80 is a non-existent port;
1123 * which should be safe since include/asm/io.h also
1124 * makes this assumption.
1125 *
1126 * Note: this is safe as long as MCR bit 4 is clear
1127 * and the device is in "PC" mode.
1128 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001129 scratch = serial_in(up, UART_IER);
1130 serial_out(up, UART_IER, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001131#ifdef __i386__
1132 outb(0xff, 0x080);
1133#endif
Thomas Hoehn48212002007-02-10 01:46:05 -08001134 /*
1135 * Mask out IER[7:4] bits for test as some UARTs (e.g. TL
1136 * 16C754B) allow only to modify them if an EFR bit is set.
1137 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001138 scratch2 = serial_in(up, UART_IER) & 0x0f;
1139 serial_out(up, UART_IER, 0x0F);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001140#ifdef __i386__
1141 outb(0, 0x080);
1142#endif
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001143 scratch3 = serial_in(up, UART_IER) & 0x0f;
1144 serial_out(up, UART_IER, scratch);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001145 if (scratch2 != 0 || scratch3 != 0x0F) {
1146 /*
1147 * We failed; there's nothing here
1148 */
Flavio Leitnerbd21f552012-09-18 16:21:32 -03001149 spin_unlock_irqrestore(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001150 DEBUG_AUTOCONF("IER test failed (%02x, %02x) ",
1151 scratch2, scratch3);
1152 goto out;
1153 }
1154 }
1155
1156 save_mcr = serial_in(up, UART_MCR);
1157 save_lcr = serial_in(up, UART_LCR);
1158
Thomas Koellerbd71c182007-05-06 14:48:47 -07001159 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001160 * Check to see if a UART is really there. Certain broken
1161 * internal modems based on the Rockwell chipset fail this
1162 * test, because they apparently don't implement the loopback
1163 * test mode. So this test is skipped on the COM 1 through
1164 * COM 4 ports. This *should* be safe, since no board
1165 * manufacturer would be stupid enough to design a board
1166 * that conflicts with COM 1-4 --- we hope!
1167 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001168 if (!(port->flags & UPF_SKIP_TEST)) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001169 serial_out(up, UART_MCR, UART_MCR_LOOP | 0x0A);
1170 status1 = serial_in(up, UART_MSR) & 0xF0;
1171 serial_out(up, UART_MCR, save_mcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001172 if (status1 != 0x90) {
Flavio Leitnerbd21f552012-09-18 16:21:32 -03001173 spin_unlock_irqrestore(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001174 DEBUG_AUTOCONF("LOOP test failed (%02x) ",
1175 status1);
1176 goto out;
1177 }
1178 }
1179
1180 /*
1181 * We're pretty sure there's a port here. Lets find out what
1182 * type of port it is. The IIR top two bits allows us to find
Russell King6f0d6182005-09-09 16:17:58 +01001183 * out if it's 8250 or 16450, 16550, 16550A or later. This
Linus Torvalds1da177e2005-04-16 15:20:36 -07001184 * determines what we test for next.
1185 *
1186 * We also initialise the EFR (if any) to zero for later. The
1187 * EFR occupies the same register location as the FCR and IIR.
1188 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001189 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
1190 serial_out(up, UART_EFR, 0);
1191 serial_out(up, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001192
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001193 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001194 scratch = serial_in(up, UART_IIR) >> 6;
1195
Linus Torvalds1da177e2005-04-16 15:20:36 -07001196 switch (scratch) {
1197 case 0:
1198 autoconfig_8250(up);
1199 break;
1200 case 1:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001201 port->type = PORT_UNKNOWN;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001202 break;
1203 case 2:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001204 port->type = PORT_16550;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001205 break;
1206 case 3:
1207 autoconfig_16550a(up);
1208 break;
1209 }
1210
1211#ifdef CONFIG_SERIAL_8250_RSA
1212 /*
1213 * Only probe for RSA ports if we got the region.
1214 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001215 if (port->type == PORT_16550A && probeflags & PROBE_RSA) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001216 int i;
1217
1218 for (i = 0 ; i < probe_rsa_count; ++i) {
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001219 if (probe_rsa[i] == port->iobase && __enable_rsa(up)) {
1220 port->type = PORT_RSA;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001221 break;
1222 }
1223 }
1224 }
1225#endif
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00001226
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001227 serial_out(up, UART_LCR, save_lcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001228
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001229 port->fifosize = uart_config[up->port.type].fifo_size;
Flavio Leitnerbd21f552012-09-18 16:21:32 -03001230 old_capabilities = up->capabilities;
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001231 up->capabilities = uart_config[port->type].flags;
1232 up->tx_loadsz = uart_config[port->type].tx_loadsz;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001233
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001234 if (port->type == PORT_UNKNOWN)
Flavio Leitnerbd21f552012-09-18 16:21:32 -03001235 goto out_lock;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001236
1237 /*
1238 * Reset the UART.
1239 */
1240#ifdef CONFIG_SERIAL_8250_RSA
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001241 if (port->type == PORT_RSA)
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001242 serial_out(up, UART_RSA_FRR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001243#endif
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001244 serial_out(up, UART_MCR, save_mcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001245 serial8250_clear_fifos(up);
Alex Williamson40b36da2007-02-14 00:33:04 -08001246 serial_in(up, UART_RX);
Lennert Buytenhek5c8c7552005-11-12 21:58:05 +00001247 if (up->capabilities & UART_CAP_UUE)
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001248 serial_out(up, UART_IER, UART_IER_UUE);
Lennert Buytenhek5c8c7552005-11-12 21:58:05 +00001249 else
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001250 serial_out(up, UART_IER, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001251
Flavio Leitnerbd21f552012-09-18 16:21:32 -03001252out_lock:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001253 spin_unlock_irqrestore(&port->lock, flags);
Flavio Leitnerbd21f552012-09-18 16:21:32 -03001254 if (up->capabilities != old_capabilities) {
1255 printk(KERN_WARNING
1256 "ttyS%d: detected caps %08x should be %08x\n",
1257 serial_index(port), old_capabilities,
1258 up->capabilities);
1259 }
1260out:
1261 DEBUG_AUTOCONF("iir=%d ", scratch);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001262 DEBUG_AUTOCONF("type=%s\n", uart_config[port->type].name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001263}
1264
1265static void autoconfig_irq(struct uart_8250_port *up)
1266{
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001267 struct uart_port *port = &up->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001268 unsigned char save_mcr, save_ier;
1269 unsigned char save_ICP = 0;
1270 unsigned int ICP = 0;
1271 unsigned long irqs;
1272 int irq;
1273
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001274 if (port->flags & UPF_FOURPORT) {
1275 ICP = (port->iobase & 0xfe0) | 0x1f;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001276 save_ICP = inb_p(ICP);
1277 outb_p(0x80, ICP);
Paul Gortmaker0d263a22012-03-08 19:12:10 -05001278 inb_p(ICP);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001279 }
1280
1281 /* forget possible initially masked and pending IRQ */
1282 probe_irq_off(probe_irq_on());
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001283 save_mcr = serial_in(up, UART_MCR);
1284 save_ier = serial_in(up, UART_IER);
1285 serial_out(up, UART_MCR, UART_MCR_OUT1 | UART_MCR_OUT2);
Thomas Koellerbd71c182007-05-06 14:48:47 -07001286
Linus Torvalds1da177e2005-04-16 15:20:36 -07001287 irqs = probe_irq_on();
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001288 serial_out(up, UART_MCR, 0);
Alan Cox6f803cd2008-02-08 04:18:52 -08001289 udelay(10);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001290 if (port->flags & UPF_FOURPORT) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001291 serial_out(up, UART_MCR,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001292 UART_MCR_DTR | UART_MCR_RTS);
1293 } else {
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001294 serial_out(up, UART_MCR,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001295 UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2);
1296 }
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001297 serial_out(up, UART_IER, 0x0f); /* enable all intrs */
Paul Gortmaker0d263a22012-03-08 19:12:10 -05001298 serial_in(up, UART_LSR);
1299 serial_in(up, UART_RX);
1300 serial_in(up, UART_IIR);
1301 serial_in(up, UART_MSR);
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001302 serial_out(up, UART_TX, 0xFF);
Alan Cox6f803cd2008-02-08 04:18:52 -08001303 udelay(20);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001304 irq = probe_irq_off(irqs);
1305
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001306 serial_out(up, UART_MCR, save_mcr);
1307 serial_out(up, UART_IER, save_ier);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001308
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001309 if (port->flags & UPF_FOURPORT)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001310 outb_p(save_ICP, ICP);
1311
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001312 port->irq = (irq > 0) ? irq : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001313}
1314
Russell Kinge763b902005-06-29 18:41:51 +01001315static inline void __stop_tx(struct uart_8250_port *p)
1316{
1317 if (p->ier & UART_IER_THRI) {
1318 p->ier &= ~UART_IER_THRI;
1319 serial_out(p, UART_IER, p->ier);
1320 }
1321}
1322
Russell Kingb129a8c2005-08-31 10:12:14 +01001323static void serial8250_stop_tx(struct uart_port *port)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001324{
Jamie Iles49d57412010-12-01 23:39:35 +00001325 struct uart_8250_port *up =
1326 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001327
Russell Kinge763b902005-06-29 18:41:51 +01001328 __stop_tx(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001329
1330 /*
Russell Kinge763b902005-06-29 18:41:51 +01001331 * We really want to stop the transmitter from sending.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001332 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001333 if (port->type == PORT_16C950) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001334 up->acr |= UART_ACR_TXDIS;
1335 serial_icr_write(up, UART_ACR, up->acr);
1336 }
1337}
1338
Russell Kingb129a8c2005-08-31 10:12:14 +01001339static void serial8250_start_tx(struct uart_port *port)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001340{
Jamie Iles49d57412010-12-01 23:39:35 +00001341 struct uart_8250_port *up =
1342 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001343
1344 if (!(up->ier & UART_IER_THRI)) {
1345 up->ier |= UART_IER_THRI;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001346 serial_port_out(port, UART_IER, up->ier);
Russell King55d3b282005-06-23 15:05:41 +01001347
Russell King67f76542005-06-23 22:26:43 +01001348 if (up->bugs & UART_BUG_TXEN) {
Ian Jackson68cb4f82009-11-18 11:08:11 +01001349 unsigned char lsr;
Russell King55d3b282005-06-23 15:05:41 +01001350 lsr = serial_in(up, UART_LSR);
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001351 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001352 if ((port->type == PORT_RM9000) ?
Ian Jackson68cb4f82009-11-18 11:08:11 +01001353 (lsr & UART_LSR_THRE) :
1354 (lsr & UART_LSR_TEMT))
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001355 serial8250_tx_chars(up);
Russell King55d3b282005-06-23 15:05:41 +01001356 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001357 }
Russell Kinge763b902005-06-29 18:41:51 +01001358
Linus Torvalds1da177e2005-04-16 15:20:36 -07001359 /*
Russell Kinge763b902005-06-29 18:41:51 +01001360 * Re-enable the transmitter if we disabled it.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001361 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001362 if (port->type == PORT_16C950 && up->acr & UART_ACR_TXDIS) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001363 up->acr &= ~UART_ACR_TXDIS;
1364 serial_icr_write(up, UART_ACR, up->acr);
1365 }
1366}
1367
1368static void serial8250_stop_rx(struct uart_port *port)
1369{
Jamie Iles49d57412010-12-01 23:39:35 +00001370 struct uart_8250_port *up =
1371 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001372
1373 up->ier &= ~UART_IER_RLSI;
1374 up->port.read_status_mask &= ~UART_LSR_DR;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001375 serial_port_out(port, UART_IER, up->ier);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001376}
1377
1378static void serial8250_enable_ms(struct uart_port *port)
1379{
Jamie Iles49d57412010-12-01 23:39:35 +00001380 struct uart_8250_port *up =
1381 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001382
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00001383 /* no MSR capabilities */
1384 if (up->bugs & UART_BUG_NOMSR)
1385 return;
1386
Linus Torvalds1da177e2005-04-16 15:20:36 -07001387 up->ier |= UART_IER_MSI;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001388 serial_port_out(port, UART_IER, up->ier);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001389}
1390
Stephen Warren5f873ba2011-05-17 16:12:37 -06001391/*
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001392 * serial8250_rx_chars: processes according to the passed in LSR
Paul Gortmaker0690f412011-12-04 18:42:19 -05001393 * value, and returns the remaining LSR bits not handled
1394 * by this Rx routine.
1395 */
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001396unsigned char
1397serial8250_rx_chars(struct uart_8250_port *up, unsigned char lsr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001398{
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001399 struct uart_port *port = &up->port;
1400 struct tty_struct *tty = port->state->port.tty;
Paul Gortmaker0690f412011-12-04 18:42:19 -05001401 unsigned char ch;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001402 int max_count = 256;
1403 char flag;
1404
1405 do {
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001406 if (likely(lsr & UART_LSR_DR))
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001407 ch = serial_in(up, UART_RX);
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001408 else
1409 /*
1410 * Intel 82571 has a Serial Over Lan device that will
1411 * set UART_LSR_BI without setting UART_LSR_DR when
1412 * it receives a break. To avoid reading from the
1413 * receive buffer without UART_LSR_DR bit set, we
1414 * just force the read character to be 0
1415 */
1416 ch = 0;
1417
Linus Torvalds1da177e2005-04-16 15:20:36 -07001418 flag = TTY_NORMAL;
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001419 port->icount.rx++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001420
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001421 lsr |= up->lsr_saved_flags;
1422 up->lsr_saved_flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001423
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001424 if (unlikely(lsr & UART_LSR_BRK_ERROR_BITS)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001425 if (lsr & UART_LSR_BI) {
1426 lsr &= ~(UART_LSR_FE | UART_LSR_PE);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001427 port->icount.brk++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001428 /*
1429 * We do the SysRQ and SAK checking
1430 * here because otherwise the break
1431 * may get masked by ignore_status_mask
1432 * or read_status_mask.
1433 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001434 if (uart_handle_break(port))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001435 goto ignore_char;
1436 } else if (lsr & UART_LSR_PE)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001437 port->icount.parity++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001438 else if (lsr & UART_LSR_FE)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001439 port->icount.frame++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001440 if (lsr & UART_LSR_OE)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001441 port->icount.overrun++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001442
1443 /*
Russell King23907eb2005-04-16 15:26:39 -07001444 * Mask off conditions which should be ignored.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001445 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001446 lsr &= port->read_status_mask;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001447
1448 if (lsr & UART_LSR_BI) {
1449 DEBUG_INTR("handling break....");
1450 flag = TTY_BREAK;
1451 } else if (lsr & UART_LSR_PE)
1452 flag = TTY_PARITY;
1453 else if (lsr & UART_LSR_FE)
1454 flag = TTY_FRAME;
1455 }
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001456 if (uart_handle_sysrq_char(port, ch))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001457 goto ignore_char;
Russell King05ab3012005-05-09 23:21:59 +01001458
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001459 uart_insert_char(port, lsr, UART_LSR_OE, ch, flag);
Russell King05ab3012005-05-09 23:21:59 +01001460
Alan Cox6f803cd2008-02-08 04:18:52 -08001461ignore_char:
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001462 lsr = serial_in(up, UART_LSR);
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001463 } while ((lsr & (UART_LSR_DR | UART_LSR_BI)) && (max_count-- > 0));
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001464 spin_unlock(&port->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001465 tty_flip_buffer_push(tty);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001466 spin_lock(&port->lock);
Paul Gortmaker0690f412011-12-04 18:42:19 -05001467 return lsr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001468}
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001469EXPORT_SYMBOL_GPL(serial8250_rx_chars);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001470
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001471void serial8250_tx_chars(struct uart_8250_port *up)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001472{
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001473 struct uart_port *port = &up->port;
1474 struct circ_buf *xmit = &port->state->xmit;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001475 int count;
1476
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001477 if (port->x_char) {
1478 serial_out(up, UART_TX, port->x_char);
1479 port->icount.tx++;
1480 port->x_char = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001481 return;
1482 }
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001483 if (uart_tx_stopped(port)) {
1484 serial8250_stop_tx(port);
Russell Kingb129a8c2005-08-31 10:12:14 +01001485 return;
1486 }
1487 if (uart_circ_empty(xmit)) {
Russell Kinge763b902005-06-29 18:41:51 +01001488 __stop_tx(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001489 return;
1490 }
1491
1492 count = up->tx_loadsz;
1493 do {
1494 serial_out(up, UART_TX, xmit->buf[xmit->tail]);
1495 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001496 port->icount.tx++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001497 if (uart_circ_empty(xmit))
1498 break;
Stephen Hurdebebd492013-01-17 14:14:53 -08001499 if (up->capabilities & UART_CAP_HFIFO) {
1500 if ((serial_port_in(port, UART_LSR) & BOTH_EMPTY) !=
1501 BOTH_EMPTY)
1502 break;
1503 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001504 } while (--count > 0);
1505
1506 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001507 uart_write_wakeup(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001508
1509 DEBUG_INTR("THRE...");
1510
1511 if (uart_circ_empty(xmit))
Russell Kinge763b902005-06-29 18:41:51 +01001512 __stop_tx(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001513}
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001514EXPORT_SYMBOL_GPL(serial8250_tx_chars);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001515
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001516unsigned int serial8250_modem_status(struct uart_8250_port *up)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001517{
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001518 struct uart_port *port = &up->port;
Russell King2af7cd62006-01-04 16:55:09 +00001519 unsigned int status = serial_in(up, UART_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001520
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001521 status |= up->msr_saved_flags;
1522 up->msr_saved_flags = 0;
Taku Izumifdc30b32007-04-23 14:41:00 -07001523 if (status & UART_MSR_ANY_DELTA && up->ier & UART_IER_MSI &&
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001524 port->state != NULL) {
Russell King2af7cd62006-01-04 16:55:09 +00001525 if (status & UART_MSR_TERI)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001526 port->icount.rng++;
Russell King2af7cd62006-01-04 16:55:09 +00001527 if (status & UART_MSR_DDSR)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001528 port->icount.dsr++;
Russell King2af7cd62006-01-04 16:55:09 +00001529 if (status & UART_MSR_DDCD)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001530 uart_handle_dcd_change(port, status & UART_MSR_DCD);
Russell King2af7cd62006-01-04 16:55:09 +00001531 if (status & UART_MSR_DCTS)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001532 uart_handle_cts_change(port, status & UART_MSR_CTS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001533
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001534 wake_up_interruptible(&port->state->port.delta_msr_wait);
Russell King2af7cd62006-01-04 16:55:09 +00001535 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001536
Russell King2af7cd62006-01-04 16:55:09 +00001537 return status;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001538}
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001539EXPORT_SYMBOL_GPL(serial8250_modem_status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001540
1541/*
1542 * This handles the interrupt from one port.
1543 */
Paul Gortmaker86b21192011-12-04 18:42:22 -05001544int serial8250_handle_irq(struct uart_port *port, unsigned int iir)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001545{
Paul Gortmaker0690f412011-12-04 18:42:19 -05001546 unsigned char status;
Jiri Kosina4bf36312007-04-23 14:41:21 -07001547 unsigned long flags;
Paul Gortmaker86b21192011-12-04 18:42:22 -05001548 struct uart_8250_port *up =
1549 container_of(port, struct uart_8250_port, port);
1550
1551 if (iir & UART_IIR_NO_INT)
1552 return 0;
Russell King45e24602006-01-04 19:19:06 +00001553
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001554 spin_lock_irqsave(&port->lock, flags);
Russell King45e24602006-01-04 19:19:06 +00001555
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001556 status = serial_port_in(port, UART_LSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001557
1558 DEBUG_INTR("status = %x...", status);
1559
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001560 if (status & (UART_LSR_DR | UART_LSR_BI))
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001561 status = serial8250_rx_chars(up, status);
1562 serial8250_modem_status(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001563 if (status & UART_LSR_THRE)
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001564 serial8250_tx_chars(up);
Russell King45e24602006-01-04 19:19:06 +00001565
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001566 spin_unlock_irqrestore(&port->lock, flags);
Paul Gortmaker86b21192011-12-04 18:42:22 -05001567 return 1;
Jamie Iles583d28e2011-08-15 10:17:52 +01001568}
Jamie Ilesc7a1bdc2011-08-26 19:04:49 +01001569EXPORT_SYMBOL_GPL(serial8250_handle_irq);
Jamie Iles583d28e2011-08-15 10:17:52 +01001570
1571static int serial8250_default_handle_irq(struct uart_port *port)
1572{
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001573 unsigned int iir = serial_port_in(port, UART_IIR);
Jamie Iles583d28e2011-08-15 10:17:52 +01001574
1575 return serial8250_handle_irq(port, iir);
1576}
1577
Linus Torvalds1da177e2005-04-16 15:20:36 -07001578/*
Matt Schultedc96efb2012-11-19 09:12:04 -06001579 * These Exar UARTs have an extra interrupt indicator that could
1580 * fire for a few unimplemented interrupts. One of which is a
1581 * wakeup event when coming out of sleep. Put this here just
1582 * to be on the safe side that these interrupts don't go unhandled.
1583 */
1584static int exar_handle_irq(struct uart_port *port)
1585{
1586 unsigned char int0, int1, int2, int3;
1587 unsigned int iir = serial_port_in(port, UART_IIR);
1588 int ret;
1589
1590 ret = serial8250_handle_irq(port, iir);
1591
Matt Schulte30fa96a2012-11-21 09:40:49 -06001592 if ((port->type == PORT_XR17V35X) ||
1593 (port->type == PORT_XR17D15X)) {
Matt Schultedc96efb2012-11-19 09:12:04 -06001594 int0 = serial_port_in(port, 0x80);
1595 int1 = serial_port_in(port, 0x81);
1596 int2 = serial_port_in(port, 0x82);
1597 int3 = serial_port_in(port, 0x83);
1598 }
1599
1600 return ret;
1601}
1602
1603/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001604 * This is the serial driver's interrupt routine.
1605 *
1606 * Arjan thinks the old way was overly complex, so it got simplified.
1607 * Alan disagrees, saying that need the complexity to handle the weird
1608 * nature of ISA shared interrupts. (This is a special exception.)
1609 *
1610 * In order to handle ISA shared interrupts properly, we need to check
1611 * that all ports have been serviced, and therefore the ISA interrupt
1612 * line has been de-asserted.
1613 *
1614 * This means we need to loop through all ports. checking that they
1615 * don't have an interrupt pending.
1616 */
David Howells7d12e782006-10-05 14:55:46 +01001617static irqreturn_t serial8250_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001618{
1619 struct irq_info *i = dev_id;
1620 struct list_head *l, *end = NULL;
1621 int pass_counter = 0, handled = 0;
1622
1623 DEBUG_INTR("serial8250_interrupt(%d)...", irq);
1624
1625 spin_lock(&i->lock);
1626
1627 l = i->head;
1628 do {
1629 struct uart_8250_port *up;
Jamie Iles583d28e2011-08-15 10:17:52 +01001630 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001631
1632 up = list_entry(l, struct uart_8250_port, list);
Jamie Iles583d28e2011-08-15 10:17:52 +01001633 port = &up->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001634
Dan Williams49b532f2012-04-06 11:49:44 -07001635 if (port->handle_irq(port)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001636 handled = 1;
Marc St-Jeanbeab6972007-05-06 14:48:45 -07001637 end = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001638 } else if (end == NULL)
1639 end = l;
1640
1641 l = l->next;
1642
1643 if (l == i->head && pass_counter++ > PASS_LIMIT) {
1644 /* If we hit this, we're dead. */
Daniel Drakecd3ecad2010-10-20 16:00:48 -07001645 printk_ratelimited(KERN_ERR
1646 "serial8250: too much work for irq%d\n", irq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001647 break;
1648 }
1649 } while (l != end);
1650
1651 spin_unlock(&i->lock);
1652
1653 DEBUG_INTR("end.\n");
1654
1655 return IRQ_RETVAL(handled);
1656}
1657
1658/*
1659 * To support ISA shared interrupts, we need to have one interrupt
1660 * handler that ensures that the IRQ line has been deasserted
1661 * before returning. Failing to do this will result in the IRQ
1662 * line being stuck active, and, since ISA irqs are edge triggered,
1663 * no more IRQs will be seen.
1664 */
1665static void serial_do_unlink(struct irq_info *i, struct uart_8250_port *up)
1666{
1667 spin_lock_irq(&i->lock);
1668
1669 if (!list_empty(i->head)) {
1670 if (i->head == &up->list)
1671 i->head = i->head->next;
1672 list_del(&up->list);
1673 } else {
1674 BUG_ON(i->head != &up->list);
1675 i->head = NULL;
1676 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001677 spin_unlock_irq(&i->lock);
Alan Cox25db8ad2008-08-19 20:49:40 -07001678 /* List empty so throw away the hash node */
1679 if (i->head == NULL) {
1680 hlist_del(&i->node);
1681 kfree(i);
1682 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001683}
1684
1685static int serial_link_irq_chain(struct uart_8250_port *up)
1686{
Alan Cox25db8ad2008-08-19 20:49:40 -07001687 struct hlist_head *h;
1688 struct hlist_node *n;
1689 struct irq_info *i;
Thomas Gleixner40663cc2006-07-01 19:29:43 -07001690 int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? IRQF_SHARED : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001691
Alan Cox25db8ad2008-08-19 20:49:40 -07001692 mutex_lock(&hash_mutex);
1693
1694 h = &irq_lists[up->port.irq % NR_IRQ_HASH];
1695
1696 hlist_for_each(n, h) {
1697 i = hlist_entry(n, struct irq_info, node);
1698 if (i->irq == up->port.irq)
1699 break;
1700 }
1701
1702 if (n == NULL) {
1703 i = kzalloc(sizeof(struct irq_info), GFP_KERNEL);
1704 if (i == NULL) {
1705 mutex_unlock(&hash_mutex);
1706 return -ENOMEM;
1707 }
1708 spin_lock_init(&i->lock);
1709 i->irq = up->port.irq;
1710 hlist_add_head(&i->node, h);
1711 }
1712 mutex_unlock(&hash_mutex);
1713
Linus Torvalds1da177e2005-04-16 15:20:36 -07001714 spin_lock_irq(&i->lock);
1715
1716 if (i->head) {
1717 list_add(&up->list, i->head);
1718 spin_unlock_irq(&i->lock);
1719
1720 ret = 0;
1721 } else {
1722 INIT_LIST_HEAD(&up->list);
1723 i->head = &up->list;
1724 spin_unlock_irq(&i->lock);
Vikram Pandita1c2f0492009-09-19 13:13:19 -07001725 irq_flags |= up->port.irqflags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001726 ret = request_irq(up->port.irq, serial8250_interrupt,
1727 irq_flags, "serial", i);
1728 if (ret < 0)
1729 serial_do_unlink(i, up);
1730 }
1731
1732 return ret;
1733}
1734
1735static void serial_unlink_irq_chain(struct uart_8250_port *up)
1736{
Alan Cox25db8ad2008-08-19 20:49:40 -07001737 struct irq_info *i;
1738 struct hlist_node *n;
1739 struct hlist_head *h;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001740
Alan Cox25db8ad2008-08-19 20:49:40 -07001741 mutex_lock(&hash_mutex);
1742
1743 h = &irq_lists[up->port.irq % NR_IRQ_HASH];
1744
1745 hlist_for_each(n, h) {
1746 i = hlist_entry(n, struct irq_info, node);
1747 if (i->irq == up->port.irq)
1748 break;
1749 }
1750
1751 BUG_ON(n == NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001752 BUG_ON(i->head == NULL);
1753
1754 if (list_empty(i->head))
1755 free_irq(up->port.irq, i);
1756
1757 serial_do_unlink(i, up);
Alan Cox25db8ad2008-08-19 20:49:40 -07001758 mutex_unlock(&hash_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001759}
1760
1761/*
1762 * This function is used to handle ports that do not have an
1763 * interrupt. This doesn't work very well for 16450's, but gives
1764 * barely passable results for a 16550A. (Although at the expense
1765 * of much CPU overhead).
1766 */
1767static void serial8250_timeout(unsigned long data)
1768{
1769 struct uart_8250_port *up = (struct uart_8250_port *)data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001770
Paul Gortmakera0431472011-12-04 18:42:21 -05001771 up->port.handle_irq(&up->port);
Anton Vorontsov54381062010-10-01 17:21:25 +04001772 mod_timer(&up->timer, jiffies + uart_poll_timeout(&up->port));
Alex Williamson40b36da2007-02-14 00:33:04 -08001773}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001774
Alex Williamson40b36da2007-02-14 00:33:04 -08001775static void serial8250_backup_timeout(unsigned long data)
1776{
1777 struct uart_8250_port *up = (struct uart_8250_port *)data;
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001778 unsigned int iir, ier = 0, lsr;
1779 unsigned long flags;
Alex Williamson40b36da2007-02-14 00:33:04 -08001780
Al Cooperdbb3b1c2011-07-25 16:19:52 -04001781 spin_lock_irqsave(&up->port.lock, flags);
1782
Alex Williamson40b36da2007-02-14 00:33:04 -08001783 /*
1784 * Must disable interrupts or else we risk racing with the interrupt
1785 * based handler.
1786 */
Alan Coxd4e33fa2012-01-26 17:44:09 +00001787 if (up->port.irq) {
Alex Williamson40b36da2007-02-14 00:33:04 -08001788 ier = serial_in(up, UART_IER);
1789 serial_out(up, UART_IER, 0);
1790 }
1791
1792 iir = serial_in(up, UART_IIR);
1793
1794 /*
1795 * This should be a safe test for anyone who doesn't trust the
1796 * IIR bits on their UART, but it's specifically designed for
1797 * the "Diva" UART used on the management processor on many HP
1798 * ia64 and parisc boxes.
1799 */
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001800 lsr = serial_in(up, UART_LSR);
1801 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
Alex Williamson40b36da2007-02-14 00:33:04 -08001802 if ((iir & UART_IIR_NO_INT) && (up->ier & UART_IER_THRI) &&
Alan Coxebd2c8f2009-09-19 13:13:28 -07001803 (!uart_circ_empty(&up->port.state->xmit) || up->port.x_char) &&
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001804 (lsr & UART_LSR_THRE)) {
Alex Williamson40b36da2007-02-14 00:33:04 -08001805 iir &= ~(UART_IIR_ID | UART_IIR_NO_INT);
1806 iir |= UART_IIR_THRI;
1807 }
1808
1809 if (!(iir & UART_IIR_NO_INT))
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001810 serial8250_tx_chars(up);
Alex Williamson40b36da2007-02-14 00:33:04 -08001811
Alan Coxd4e33fa2012-01-26 17:44:09 +00001812 if (up->port.irq)
Alex Williamson40b36da2007-02-14 00:33:04 -08001813 serial_out(up, UART_IER, ier);
1814
Al Cooperdbb3b1c2011-07-25 16:19:52 -04001815 spin_unlock_irqrestore(&up->port.lock, flags);
1816
Alex Williamson40b36da2007-02-14 00:33:04 -08001817 /* Standard timer interval plus 0.2s to keep the port running */
Alan Cox6f803cd2008-02-08 04:18:52 -08001818 mod_timer(&up->timer,
Anton Vorontsov54381062010-10-01 17:21:25 +04001819 jiffies + uart_poll_timeout(&up->port) + HZ / 5);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001820}
1821
1822static unsigned int serial8250_tx_empty(struct uart_port *port)
1823{
Jamie Iles49d57412010-12-01 23:39:35 +00001824 struct uart_8250_port *up =
1825 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001826 unsigned long flags;
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001827 unsigned int lsr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001828
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001829 spin_lock_irqsave(&port->lock, flags);
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001830 lsr = serial_port_in(port, UART_LSR);
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001831 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001832 spin_unlock_irqrestore(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001833
Dick Hollenbeckbca47612009-12-09 12:31:34 -08001834 return (lsr & BOTH_EMPTY) == BOTH_EMPTY ? TIOCSER_TEMT : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001835}
1836
1837static unsigned int serial8250_get_mctrl(struct uart_port *port)
1838{
Jamie Iles49d57412010-12-01 23:39:35 +00001839 struct uart_8250_port *up =
1840 container_of(port, struct uart_8250_port, port);
Russell King2af7cd62006-01-04 16:55:09 +00001841 unsigned int status;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001842 unsigned int ret;
1843
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001844 status = serial8250_modem_status(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001845
1846 ret = 0;
1847 if (status & UART_MSR_DCD)
1848 ret |= TIOCM_CAR;
1849 if (status & UART_MSR_RI)
1850 ret |= TIOCM_RNG;
1851 if (status & UART_MSR_DSR)
1852 ret |= TIOCM_DSR;
1853 if (status & UART_MSR_CTS)
1854 ret |= TIOCM_CTS;
1855 return ret;
1856}
1857
1858static void serial8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
1859{
Jamie Iles49d57412010-12-01 23:39:35 +00001860 struct uart_8250_port *up =
1861 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001862 unsigned char mcr = 0;
1863
1864 if (mctrl & TIOCM_RTS)
1865 mcr |= UART_MCR_RTS;
1866 if (mctrl & TIOCM_DTR)
1867 mcr |= UART_MCR_DTR;
1868 if (mctrl & TIOCM_OUT1)
1869 mcr |= UART_MCR_OUT1;
1870 if (mctrl & TIOCM_OUT2)
1871 mcr |= UART_MCR_OUT2;
1872 if (mctrl & TIOCM_LOOP)
1873 mcr |= UART_MCR_LOOP;
1874
1875 mcr = (mcr & up->mcr_mask) | up->mcr_force | up->mcr;
1876
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001877 serial_port_out(port, UART_MCR, mcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001878}
1879
1880static void serial8250_break_ctl(struct uart_port *port, int break_state)
1881{
Jamie Iles49d57412010-12-01 23:39:35 +00001882 struct uart_8250_port *up =
1883 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001884 unsigned long flags;
1885
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001886 spin_lock_irqsave(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001887 if (break_state == -1)
1888 up->lcr |= UART_LCR_SBC;
1889 else
1890 up->lcr &= ~UART_LCR_SBC;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001891 serial_port_out(port, UART_LCR, up->lcr);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001892 spin_unlock_irqrestore(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001893}
1894
Alex Williamson40b36da2007-02-14 00:33:04 -08001895/*
1896 * Wait for transmitter & holding register to empty
1897 */
Will Newtonb5d674a2008-10-13 10:36:21 +01001898static void wait_for_xmitr(struct uart_8250_port *up, int bits)
Alex Williamson40b36da2007-02-14 00:33:04 -08001899{
1900 unsigned int status, tmout = 10000;
1901
1902 /* Wait up to 10ms for the character(s) to be sent. */
David Daney97d303b2010-10-05 11:40:07 -07001903 for (;;) {
Alex Williamson40b36da2007-02-14 00:33:04 -08001904 status = serial_in(up, UART_LSR);
1905
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001906 up->lsr_saved_flags |= status & LSR_SAVE_FLAGS;
Alex Williamson40b36da2007-02-14 00:33:04 -08001907
David Daney97d303b2010-10-05 11:40:07 -07001908 if ((status & bits) == bits)
1909 break;
Alex Williamson40b36da2007-02-14 00:33:04 -08001910 if (--tmout == 0)
1911 break;
1912 udelay(1);
David Daney97d303b2010-10-05 11:40:07 -07001913 }
Alex Williamson40b36da2007-02-14 00:33:04 -08001914
1915 /* Wait up to 1s for flow control if necessary */
1916 if (up->port.flags & UPF_CONS_FLOW) {
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001917 unsigned int tmout;
1918 for (tmout = 1000000; tmout; tmout--) {
1919 unsigned int msr = serial_in(up, UART_MSR);
1920 up->msr_saved_flags |= msr & MSR_SAVE_FLAGS;
1921 if (msr & UART_MSR_CTS)
1922 break;
Alex Williamson40b36da2007-02-14 00:33:04 -08001923 udelay(1);
1924 touch_nmi_watchdog();
1925 }
1926 }
1927}
1928
Jason Wesself2d937f2008-04-17 20:05:37 +02001929#ifdef CONFIG_CONSOLE_POLL
1930/*
1931 * Console polling routines for writing and reading from the uart while
1932 * in an interrupt or debug context.
1933 */
1934
1935static int serial8250_get_poll_char(struct uart_port *port)
1936{
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001937 unsigned char lsr = serial_port_in(port, UART_LSR);
Jason Wesself2d937f2008-04-17 20:05:37 +02001938
Jason Wesself5316b42010-05-20 21:04:22 -05001939 if (!(lsr & UART_LSR_DR))
1940 return NO_POLL_CHAR;
Jason Wesself2d937f2008-04-17 20:05:37 +02001941
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001942 return serial_port_in(port, UART_RX);
Jason Wesself2d937f2008-04-17 20:05:37 +02001943}
1944
1945
1946static void serial8250_put_poll_char(struct uart_port *port,
1947 unsigned char c)
1948{
1949 unsigned int ier;
Jamie Iles49d57412010-12-01 23:39:35 +00001950 struct uart_8250_port *up =
1951 container_of(port, struct uart_8250_port, port);
Jason Wesself2d937f2008-04-17 20:05:37 +02001952
1953 /*
1954 * First save the IER then disable the interrupts
1955 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001956 ier = serial_port_in(port, UART_IER);
Jason Wesself2d937f2008-04-17 20:05:37 +02001957 if (up->capabilities & UART_CAP_UUE)
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001958 serial_port_out(port, UART_IER, UART_IER_UUE);
Jason Wesself2d937f2008-04-17 20:05:37 +02001959 else
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001960 serial_port_out(port, UART_IER, 0);
Jason Wesself2d937f2008-04-17 20:05:37 +02001961
1962 wait_for_xmitr(up, BOTH_EMPTY);
1963 /*
1964 * Send the character out.
1965 * If a LF, also do CR...
1966 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001967 serial_port_out(port, UART_TX, c);
Jason Wesself2d937f2008-04-17 20:05:37 +02001968 if (c == 10) {
1969 wait_for_xmitr(up, BOTH_EMPTY);
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001970 serial_port_out(port, UART_TX, 13);
Jason Wesself2d937f2008-04-17 20:05:37 +02001971 }
1972
1973 /*
1974 * Finally, wait for transmitter to become empty
1975 * and restore the IER
1976 */
1977 wait_for_xmitr(up, BOTH_EMPTY);
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001978 serial_port_out(port, UART_IER, ier);
Jason Wesself2d937f2008-04-17 20:05:37 +02001979}
1980
1981#endif /* CONFIG_CONSOLE_POLL */
1982
Linus Torvalds1da177e2005-04-16 15:20:36 -07001983static int serial8250_startup(struct uart_port *port)
1984{
Jamie Iles49d57412010-12-01 23:39:35 +00001985 struct uart_8250_port *up =
1986 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001987 unsigned long flags;
Russell King55d3b282005-06-23 15:05:41 +01001988 unsigned char lsr, iir;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001989 int retval;
1990
Sean Young65ecc9c2012-09-07 19:06:24 +01001991 if (port->type == PORT_8250_CIR)
1992 return -ENODEV;
1993
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001994 port->fifosize = uart_config[up->port.type].fifo_size;
Ondrej Puzmane4f05af2010-12-04 21:17:38 +01001995 up->tx_loadsz = uart_config[up->port.type].tx_loadsz;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001996 up->capabilities = uart_config[up->port.type].flags;
1997 up->mcr = 0;
1998
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001999 if (port->iotype != up->cur_iotype)
Alan Coxb8e7e402009-05-28 14:01:35 +01002000 set_io_from_upio(port);
2001
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002002 if (port->type == PORT_16C950) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002003 /* Wake up and initialize UART */
2004 up->acr = 0;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002005 serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B);
2006 serial_port_out(port, UART_EFR, UART_EFR_ECB);
2007 serial_port_out(port, UART_IER, 0);
2008 serial_port_out(port, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002009 serial_icr_write(up, UART_CSR, 0); /* Reset the UART */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002010 serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B);
2011 serial_port_out(port, UART_EFR, UART_EFR_ECB);
2012 serial_port_out(port, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002013 }
2014
2015#ifdef CONFIG_SERIAL_8250_RSA
2016 /*
2017 * If this is an RSA port, see if we can kick it up to the
2018 * higher speed clock.
2019 */
2020 enable_rsa(up);
2021#endif
2022
2023 /*
2024 * Clear the FIFO buffers and disable them.
Alexey Dobriyan7f927fc2006-03-28 01:56:53 -08002025 * (they will be reenabled in set_termios())
Linus Torvalds1da177e2005-04-16 15:20:36 -07002026 */
2027 serial8250_clear_fifos(up);
2028
2029 /*
2030 * Clear the interrupt registers.
2031 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002032 serial_port_in(port, UART_LSR);
2033 serial_port_in(port, UART_RX);
2034 serial_port_in(port, UART_IIR);
2035 serial_port_in(port, UART_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002036
2037 /*
2038 * At this point, there's no way the LSR could still be 0xff;
2039 * if it is, then bail out, because there's likely no UART
2040 * here.
2041 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002042 if (!(port->flags & UPF_BUGGY_UART) &&
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002043 (serial_port_in(port, UART_LSR) == 0xff)) {
Konrad Rzeszutek Wilk7808a4c2011-09-26 09:14:34 -04002044 printk_ratelimited(KERN_INFO "ttyS%d: LSR safety check engaged!\n",
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002045 serial_index(port));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002046 return -ENODEV;
2047 }
2048
2049 /*
2050 * For a XR16C850, we need to set the trigger levels
2051 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002052 if (port->type == PORT_16850) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002053 unsigned char fctr;
2054
Paul Gortmaker0acf5192012-03-08 19:12:08 -05002055 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002056
Paul Gortmaker0acf5192012-03-08 19:12:08 -05002057 fctr = serial_in(up, UART_FCTR) & ~(UART_FCTR_RX|UART_FCTR_TX);
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002058 serial_port_out(port, UART_FCTR,
2059 fctr | UART_FCTR_TRGD | UART_FCTR_RX);
2060 serial_port_out(port, UART_TRG, UART_TRG_96);
2061 serial_port_out(port, UART_FCTR,
2062 fctr | UART_FCTR_TRGD | UART_FCTR_TX);
2063 serial_port_out(port, UART_TRG, UART_TRG_96);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002064
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002065 serial_port_out(port, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002066 }
2067
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002068 if (port->irq) {
Alex Williamson01c194d2008-04-28 02:14:09 -07002069 unsigned char iir1;
Alex Williamson40b36da2007-02-14 00:33:04 -08002070 /*
2071 * Test for UARTs that do not reassert THRE when the
2072 * transmitter is idle and the interrupt has already
2073 * been cleared. Real 16550s should always reassert
2074 * this interrupt whenever the transmitter is idle and
2075 * the interrupt is enabled. Delays are necessary to
2076 * allow register changes to become visible.
2077 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002078 spin_lock_irqsave(&port->lock, flags);
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002079 if (up->port.irqflags & IRQF_SHARED)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002080 disable_irq_nosync(port->irq);
Alex Williamson40b36da2007-02-14 00:33:04 -08002081
2082 wait_for_xmitr(up, UART_LSR_THRE);
Paul Gortmaker55e40162012-03-08 19:12:14 -05002083 serial_port_out_sync(port, UART_IER, UART_IER_THRI);
Alex Williamson40b36da2007-02-14 00:33:04 -08002084 udelay(1); /* allow THRE to set */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002085 iir1 = serial_port_in(port, UART_IIR);
2086 serial_port_out(port, UART_IER, 0);
Paul Gortmaker55e40162012-03-08 19:12:14 -05002087 serial_port_out_sync(port, UART_IER, UART_IER_THRI);
Alex Williamson40b36da2007-02-14 00:33:04 -08002088 udelay(1); /* allow a working UART time to re-assert THRE */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002089 iir = serial_port_in(port, UART_IIR);
2090 serial_port_out(port, UART_IER, 0);
Alex Williamson40b36da2007-02-14 00:33:04 -08002091
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002092 if (port->irqflags & IRQF_SHARED)
2093 enable_irq(port->irq);
2094 spin_unlock_irqrestore(&port->lock, flags);
Alex Williamson40b36da2007-02-14 00:33:04 -08002095
2096 /*
Dan Williamsbc02d152012-04-06 11:49:50 -07002097 * If the interrupt is not reasserted, or we otherwise
2098 * don't trust the iir, setup a timer to kick the UART
2099 * on a regular basis.
Alex Williamson40b36da2007-02-14 00:33:04 -08002100 */
Dan Williamsbc02d152012-04-06 11:49:50 -07002101 if ((!(iir1 & UART_IIR_NO_INT) && (iir & UART_IIR_NO_INT)) ||
2102 up->port.flags & UPF_BUG_THRE) {
Will Newton363f66f2008-09-02 14:35:44 -07002103 up->bugs |= UART_BUG_THRE;
David S. Miller84408382008-10-13 10:45:26 +01002104 pr_debug("ttyS%d - using backup timer\n",
2105 serial_index(port));
Alex Williamson40b36da2007-02-14 00:33:04 -08002106 }
2107 }
2108
Linus Torvalds1da177e2005-04-16 15:20:36 -07002109 /*
Will Newton363f66f2008-09-02 14:35:44 -07002110 * The above check will only give an accurate result the first time
2111 * the port is opened so this value needs to be preserved.
2112 */
2113 if (up->bugs & UART_BUG_THRE) {
2114 up->timer.function = serial8250_backup_timeout;
2115 up->timer.data = (unsigned long)up;
2116 mod_timer(&up->timer, jiffies +
Anton Vorontsov54381062010-10-01 17:21:25 +04002117 uart_poll_timeout(port) + HZ / 5);
Will Newton363f66f2008-09-02 14:35:44 -07002118 }
2119
2120 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002121 * If the "interrupt" for this port doesn't correspond with any
2122 * hardware interrupt, we use a timer-based system. The original
2123 * driver used to do this with IRQ0.
2124 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002125 if (!port->irq) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002126 up->timer.data = (unsigned long)up;
Anton Vorontsov54381062010-10-01 17:21:25 +04002127 mod_timer(&up->timer, jiffies + uart_poll_timeout(port));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002128 } else {
2129 retval = serial_link_irq_chain(up);
2130 if (retval)
2131 return retval;
2132 }
2133
2134 /*
2135 * Now, initialize the UART
2136 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002137 serial_port_out(port, UART_LCR, UART_LCR_WLEN8);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002138
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002139 spin_lock_irqsave(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002140 if (up->port.flags & UPF_FOURPORT) {
Alan Coxd4e33fa2012-01-26 17:44:09 +00002141 if (!up->port.irq)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002142 up->port.mctrl |= TIOCM_OUT1;
2143 } else
2144 /*
2145 * Most PC uarts need OUT2 raised to enable interrupts.
2146 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002147 if (port->irq)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002148 up->port.mctrl |= TIOCM_OUT2;
2149
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002150 serial8250_set_mctrl(port, port->mctrl);
Russell King55d3b282005-06-23 15:05:41 +01002151
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002152 /* Serial over Lan (SoL) hack:
2153 Intel 8257x Gigabit ethernet chips have a
2154 16550 emulation, to be used for Serial Over Lan.
2155 Those chips take a longer time than a normal
2156 serial device to signalize that a transmission
2157 data was queued. Due to that, the above test generally
2158 fails. One solution would be to delay the reading of
2159 iir. However, this is not reliable, since the timeout
2160 is variable. So, let's just don't test if we receive
2161 TX irq. This way, we'll never enable UART_BUG_TXEN.
2162 */
Chuck Ebbertd41a4b52009-10-01 15:44:26 -07002163 if (skip_txen_test || up->port.flags & UPF_NO_TXEN_TEST)
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002164 goto dont_test_tx_en;
2165
Russell King55d3b282005-06-23 15:05:41 +01002166 /*
2167 * Do a quick test to see if we receive an
2168 * interrupt when we enable the TX irq.
2169 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002170 serial_port_out(port, UART_IER, UART_IER_THRI);
2171 lsr = serial_port_in(port, UART_LSR);
2172 iir = serial_port_in(port, UART_IIR);
2173 serial_port_out(port, UART_IER, 0);
Russell King55d3b282005-06-23 15:05:41 +01002174
2175 if (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT) {
Russell King67f76542005-06-23 22:26:43 +01002176 if (!(up->bugs & UART_BUG_TXEN)) {
2177 up->bugs |= UART_BUG_TXEN;
Russell King55d3b282005-06-23 15:05:41 +01002178 pr_debug("ttyS%d - enabling bad tx status workarounds\n",
David S. Miller84408382008-10-13 10:45:26 +01002179 serial_index(port));
Russell King55d3b282005-06-23 15:05:41 +01002180 }
2181 } else {
Russell King67f76542005-06-23 22:26:43 +01002182 up->bugs &= ~UART_BUG_TXEN;
Russell King55d3b282005-06-23 15:05:41 +01002183 }
2184
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002185dont_test_tx_en:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002186 spin_unlock_irqrestore(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002187
2188 /*
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002189 * Clear the interrupt registers again for luck, and clear the
2190 * saved flags to avoid getting false values from polling
2191 * routines or the previous session.
2192 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002193 serial_port_in(port, UART_LSR);
2194 serial_port_in(port, UART_RX);
2195 serial_port_in(port, UART_IIR);
2196 serial_port_in(port, UART_MSR);
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002197 up->lsr_saved_flags = 0;
2198 up->msr_saved_flags = 0;
2199
2200 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002201 * Finally, enable interrupts. Note: Modem status interrupts
2202 * are set via set_termios(), which will be occurring imminently
2203 * anyway, so we don't enable them here.
2204 */
2205 up->ier = UART_IER_RLSI | UART_IER_RDI;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002206 serial_port_out(port, UART_IER, up->ier);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002207
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002208 if (port->flags & UPF_FOURPORT) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002209 unsigned int icp;
2210 /*
2211 * Enable interrupts on the AST Fourport board
2212 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002213 icp = (port->iobase & 0xfe0) | 0x01f;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002214 outb_p(0x80, icp);
Paul Gortmaker0d263a22012-03-08 19:12:10 -05002215 inb_p(icp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002216 }
2217
Linus Torvalds1da177e2005-04-16 15:20:36 -07002218 return 0;
2219}
2220
2221static void serial8250_shutdown(struct uart_port *port)
2222{
Jamie Iles49d57412010-12-01 23:39:35 +00002223 struct uart_8250_port *up =
2224 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002225 unsigned long flags;
2226
2227 /*
2228 * Disable interrupts from this port
2229 */
2230 up->ier = 0;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002231 serial_port_out(port, UART_IER, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002232
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002233 spin_lock_irqsave(&port->lock, flags);
2234 if (port->flags & UPF_FOURPORT) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002235 /* reset interrupts on the AST Fourport board */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002236 inb((port->iobase & 0xfe0) | 0x1f);
2237 port->mctrl |= TIOCM_OUT1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002238 } else
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002239 port->mctrl &= ~TIOCM_OUT2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002240
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002241 serial8250_set_mctrl(port, port->mctrl);
2242 spin_unlock_irqrestore(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002243
2244 /*
2245 * Disable break condition and FIFOs
2246 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002247 serial_port_out(port, UART_LCR,
2248 serial_port_in(port, UART_LCR) & ~UART_LCR_SBC);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002249 serial8250_clear_fifos(up);
2250
2251#ifdef CONFIG_SERIAL_8250_RSA
2252 /*
2253 * Reset the RSA board back to 115kbps compat mode.
2254 */
2255 disable_rsa(up);
2256#endif
2257
2258 /*
2259 * Read data port to reset things, and then unlink from
2260 * the IRQ chain.
2261 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002262 serial_port_in(port, UART_RX);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002263
Alex Williamson40b36da2007-02-14 00:33:04 -08002264 del_timer_sync(&up->timer);
2265 up->timer.function = serial8250_timeout;
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002266 if (port->irq)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002267 serial_unlink_irq_chain(up);
2268}
2269
2270static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud)
2271{
2272 unsigned int quot;
2273
2274 /*
2275 * Handle magic divisors for baud rates above baud_base on
2276 * SMSC SuperIO chips.
2277 */
2278 if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
2279 baud == (port->uartclk/4))
2280 quot = 0x8001;
2281 else if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
2282 baud == (port->uartclk/8))
2283 quot = 0x8002;
2284 else
2285 quot = uart_get_divisor(port, baud);
2286
2287 return quot;
2288}
2289
Philippe Langlais235dae52010-07-29 17:13:57 +02002290void
2291serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
2292 struct ktermios *old)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002293{
Jamie Iles49d57412010-12-01 23:39:35 +00002294 struct uart_8250_port *up =
2295 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002296 unsigned char cval, fcr = 0;
2297 unsigned long flags;
2298 unsigned int baud, quot;
Alan Coxeb26dfe2012-07-12 13:00:31 +01002299 int fifo_bug = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002300
2301 switch (termios->c_cflag & CSIZE) {
2302 case CS5:
Russell King0a8b80c52005-06-24 19:48:22 +01002303 cval = UART_LCR_WLEN5;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002304 break;
2305 case CS6:
Russell King0a8b80c52005-06-24 19:48:22 +01002306 cval = UART_LCR_WLEN6;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002307 break;
2308 case CS7:
Russell King0a8b80c52005-06-24 19:48:22 +01002309 cval = UART_LCR_WLEN7;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002310 break;
2311 default:
2312 case CS8:
Russell King0a8b80c52005-06-24 19:48:22 +01002313 cval = UART_LCR_WLEN8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002314 break;
2315 }
2316
2317 if (termios->c_cflag & CSTOPB)
Russell King0a8b80c52005-06-24 19:48:22 +01002318 cval |= UART_LCR_STOP;
Alan Coxeb26dfe2012-07-12 13:00:31 +01002319 if (termios->c_cflag & PARENB) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002320 cval |= UART_LCR_PARITY;
Alan Coxeb26dfe2012-07-12 13:00:31 +01002321 if (up->bugs & UART_BUG_PARITY)
2322 fifo_bug = 1;
2323 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002324 if (!(termios->c_cflag & PARODD))
2325 cval |= UART_LCR_EPAR;
2326#ifdef CMSPAR
2327 if (termios->c_cflag & CMSPAR)
2328 cval |= UART_LCR_SPAR;
2329#endif
2330
2331 /*
2332 * Ask the core to calculate the divisor for us.
2333 */
Anton Vorontsov24d481e2009-09-19 13:13:20 -07002334 baud = uart_get_baud_rate(port, termios, old,
2335 port->uartclk / 16 / 0xffff,
2336 port->uartclk / 16);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002337 quot = serial8250_get_divisor(port, baud);
2338
2339 /*
Russell King4ba5e352005-06-23 10:43:04 +01002340 * Oxford Semi 952 rev B workaround
Linus Torvalds1da177e2005-04-16 15:20:36 -07002341 */
Russell King4ba5e352005-06-23 10:43:04 +01002342 if (up->bugs & UART_BUG_QUOT && (quot & 0xff) == 0)
Alan Cox3e8d4e22008-02-04 22:27:53 -08002343 quot++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002344
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002345 if (up->capabilities & UART_CAP_FIFO && port->fifosize > 1) {
Christian Melkif9a91112012-04-30 11:21:26 +02002346 fcr = uart_config[port->type].fcr;
Alan Coxeb26dfe2012-07-12 13:00:31 +01002347 if (baud < 2400 || fifo_bug) {
Christian Melkif9a91112012-04-30 11:21:26 +02002348 fcr &= ~UART_FCR_TRIGGER_MASK;
2349 fcr |= UART_FCR_TRIGGER_1;
2350 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002351 }
2352
2353 /*
2354 * MCR-based auto flow control. When AFE is enabled, RTS will be
2355 * deasserted when the receive FIFO contains more characters than
2356 * the trigger, or the MCR RTS bit is cleared. In the case where
2357 * the remote UART is not using CTS auto flow control, we must
2358 * have sufficient FIFO entries for the latency of the remote
2359 * UART to respond. IOW, at least 32 bytes of FIFO.
2360 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002361 if (up->capabilities & UART_CAP_AFE && port->fifosize >= 32) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002362 up->mcr &= ~UART_MCR_AFE;
2363 if (termios->c_cflag & CRTSCTS)
2364 up->mcr |= UART_MCR_AFE;
2365 }
2366
2367 /*
2368 * Ok, we're now changing the port state. Do it with
2369 * interrupts disabled.
2370 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002371 spin_lock_irqsave(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002372
2373 /*
2374 * Update the per-port timeout.
2375 */
2376 uart_update_timeout(port, termios->c_cflag, baud);
2377
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002378 port->read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002379 if (termios->c_iflag & INPCK)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002380 port->read_status_mask |= UART_LSR_FE | UART_LSR_PE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002381 if (termios->c_iflag & (BRKINT | PARMRK))
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002382 port->read_status_mask |= UART_LSR_BI;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002383
2384 /*
2385 * Characteres to ignore
2386 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002387 port->ignore_status_mask = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002388 if (termios->c_iflag & IGNPAR)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002389 port->ignore_status_mask |= UART_LSR_PE | UART_LSR_FE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002390 if (termios->c_iflag & IGNBRK) {
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002391 port->ignore_status_mask |= UART_LSR_BI;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002392 /*
2393 * If we're ignoring parity and break indicators,
2394 * ignore overruns too (for real raw support).
2395 */
2396 if (termios->c_iflag & IGNPAR)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002397 port->ignore_status_mask |= UART_LSR_OE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002398 }
2399
2400 /*
2401 * ignore all characters if CREAD is not set
2402 */
2403 if ((termios->c_cflag & CREAD) == 0)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002404 port->ignore_status_mask |= UART_LSR_DR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002405
2406 /*
2407 * CTS flow control flag and modem status interrupts
2408 */
Ingo Molnarf8b372a2010-11-13 16:21:58 +01002409 up->ier &= ~UART_IER_MSI;
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00002410 if (!(up->bugs & UART_BUG_NOMSR) &&
2411 UART_ENABLE_MS(&up->port, termios->c_cflag))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002412 up->ier |= UART_IER_MSI;
2413 if (up->capabilities & UART_CAP_UUE)
Stephen Warren4539c242011-05-17 16:12:36 -06002414 up->ier |= UART_IER_UUE;
2415 if (up->capabilities & UART_CAP_RTOIE)
2416 up->ier |= UART_IER_RTOIE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002417
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002418 serial_port_out(port, UART_IER, up->ier);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002419
2420 if (up->capabilities & UART_CAP_EFR) {
2421 unsigned char efr = 0;
2422 /*
2423 * TI16C752/Startech hardware flow control. FIXME:
2424 * - TI16C752 requires control thresholds to be set.
2425 * - UART_MCR_RTS is ineffective if auto-RTS mode is enabled.
2426 */
2427 if (termios->c_cflag & CRTSCTS)
2428 efr |= UART_EFR_CTS;
2429
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002430 serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002431 if (port->flags & UPF_EXAR_EFR)
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002432 serial_port_out(port, UART_XR_EFR, efr);
Søren Holm06315342011-09-02 22:55:37 +02002433 else
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002434 serial_port_out(port, UART_EFR, efr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002435 }
2436
Jonathan McDowell255341c2006-08-14 23:05:32 -07002437 /* Workaround to enable 115200 baud on OMAP1510 internal ports */
Tony Lindgren54ec52b2012-10-03 15:31:58 -07002438 if (is_omap1510_8250(up)) {
Jonathan McDowell255341c2006-08-14 23:05:32 -07002439 if (baud == 115200) {
2440 quot = 1;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002441 serial_port_out(port, UART_OMAP_OSC_12M_SEL, 1);
Jonathan McDowell255341c2006-08-14 23:05:32 -07002442 } else
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002443 serial_port_out(port, UART_OMAP_OSC_12M_SEL, 0);
Jonathan McDowell255341c2006-08-14 23:05:32 -07002444 }
Jonathan McDowell255341c2006-08-14 23:05:32 -07002445
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002446 /*
2447 * For NatSemi, switch to bank 2 not bank 1, to avoid resetting EXCR2,
2448 * otherwise just set DLAB
2449 */
2450 if (up->capabilities & UART_NATSEMI)
2451 serial_port_out(port, UART_LCR, 0xe0);
2452 else
2453 serial_port_out(port, UART_LCR, cval | UART_LCR_DLAB);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002454
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +01002455 serial_dl_write(up, quot);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002456
2457 /*
2458 * LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR
2459 * is written without DLAB set, this mode will be disabled.
2460 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002461 if (port->type == PORT_16750)
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002462 serial_port_out(port, UART_FCR, fcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002463
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002464 serial_port_out(port, UART_LCR, cval); /* reset DLAB */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002465 up->lcr = cval; /* Save LCR */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002466 if (port->type != PORT_16750) {
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002467 /* emulated UARTs (Lucent Venus 167x) need two steps */
2468 if (fcr & UART_FCR_ENABLE_FIFO)
2469 serial_port_out(port, UART_FCR, UART_FCR_ENABLE_FIFO);
2470 serial_port_out(port, UART_FCR, fcr); /* set fcr */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002471 }
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002472 serial8250_set_mctrl(port, port->mctrl);
2473 spin_unlock_irqrestore(&port->lock, flags);
Alan Coxe991a2b2008-04-28 02:14:06 -07002474 /* Don't rewrite B0 */
2475 if (tty_termios_baud_rate(termios))
2476 tty_termios_encode_baud_rate(termios, baud, baud);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002477}
Philippe Langlais235dae52010-07-29 17:13:57 +02002478EXPORT_SYMBOL(serial8250_do_set_termios);
2479
2480static void
2481serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
2482 struct ktermios *old)
2483{
2484 if (port->set_termios)
2485 port->set_termios(port, termios, old);
2486 else
2487 serial8250_do_set_termios(port, termios, old);
2488}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002489
2490static void
Arnd Bergmanna0821df2010-06-01 22:53:11 +02002491serial8250_set_ldisc(struct uart_port *port, int new)
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002492{
Arnd Bergmanna0821df2010-06-01 22:53:11 +02002493 if (new == N_PPS) {
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002494 port->flags |= UPF_HARDPPS_CD;
2495 serial8250_enable_ms(port);
2496 } else
2497 port->flags &= ~UPF_HARDPPS_CD;
2498}
2499
Manuel Laussc161afe2010-09-25 15:13:45 +02002500
2501void serial8250_do_pm(struct uart_port *port, unsigned int state,
2502 unsigned int oldstate)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002503{
Jamie Iles49d57412010-12-01 23:39:35 +00002504 struct uart_8250_port *p =
2505 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002506
2507 serial8250_set_sleep(p, state != 0);
Manuel Laussc161afe2010-09-25 15:13:45 +02002508}
2509EXPORT_SYMBOL(serial8250_do_pm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002510
Manuel Laussc161afe2010-09-25 15:13:45 +02002511static void
2512serial8250_pm(struct uart_port *port, unsigned int state,
2513 unsigned int oldstate)
2514{
2515 if (port->pm)
2516 port->pm(port, state, oldstate);
2517 else
2518 serial8250_do_pm(port, state, oldstate);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002519}
2520
Russell Kingf2eda272008-09-01 21:47:59 +01002521static unsigned int serial8250_port_size(struct uart_8250_port *pt)
2522{
2523 if (pt->port.iotype == UPIO_AU)
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002524 return 0x1000;
Tony Lindgren54ec52b2012-10-03 15:31:58 -07002525 if (is_omap1_8250(pt))
Russell Kingf2eda272008-09-01 21:47:59 +01002526 return 0x16 << pt->port.regshift;
Tony Lindgren54ec52b2012-10-03 15:31:58 -07002527
Russell Kingf2eda272008-09-01 21:47:59 +01002528 return 8 << pt->port.regshift;
2529}
2530
Linus Torvalds1da177e2005-04-16 15:20:36 -07002531/*
2532 * Resource handling.
2533 */
2534static int serial8250_request_std_resource(struct uart_8250_port *up)
2535{
Russell Kingf2eda272008-09-01 21:47:59 +01002536 unsigned int size = serial8250_port_size(up);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002537 struct uart_port *port = &up->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002538 int ret = 0;
2539
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002540 switch (port->iotype) {
Sergei Shtylyov85835f42006-04-30 11:15:58 +01002541 case UPIO_AU:
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002542 case UPIO_TSI:
2543 case UPIO_MEM32:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002544 case UPIO_MEM:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002545 if (!port->mapbase)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002546 break;
2547
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002548 if (!request_mem_region(port->mapbase, size, "serial")) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002549 ret = -EBUSY;
2550 break;
2551 }
2552
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002553 if (port->flags & UPF_IOREMAP) {
2554 port->membase = ioremap_nocache(port->mapbase, size);
2555 if (!port->membase) {
2556 release_mem_region(port->mapbase, size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002557 ret = -ENOMEM;
2558 }
2559 }
2560 break;
2561
2562 case UPIO_HUB6:
2563 case UPIO_PORT:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002564 if (!request_region(port->iobase, size, "serial"))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002565 ret = -EBUSY;
2566 break;
2567 }
2568 return ret;
2569}
2570
2571static void serial8250_release_std_resource(struct uart_8250_port *up)
2572{
Russell Kingf2eda272008-09-01 21:47:59 +01002573 unsigned int size = serial8250_port_size(up);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002574 struct uart_port *port = &up->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002575
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002576 switch (port->iotype) {
Sergei Shtylyov85835f42006-04-30 11:15:58 +01002577 case UPIO_AU:
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002578 case UPIO_TSI:
2579 case UPIO_MEM32:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002580 case UPIO_MEM:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002581 if (!port->mapbase)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002582 break;
2583
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002584 if (port->flags & UPF_IOREMAP) {
2585 iounmap(port->membase);
2586 port->membase = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002587 }
2588
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002589 release_mem_region(port->mapbase, size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002590 break;
2591
2592 case UPIO_HUB6:
2593 case UPIO_PORT:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002594 release_region(port->iobase, size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002595 break;
2596 }
2597}
2598
2599static int serial8250_request_rsa_resource(struct uart_8250_port *up)
2600{
2601 unsigned long start = UART_RSA_BASE << up->port.regshift;
2602 unsigned int size = 8 << up->port.regshift;
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002603 struct uart_port *port = &up->port;
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002604 int ret = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002605
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002606 switch (port->iotype) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002607 case UPIO_HUB6:
2608 case UPIO_PORT:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002609 start += port->iobase;
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002610 if (request_region(start, size, "serial-rsa"))
2611 ret = 0;
2612 else
Linus Torvalds1da177e2005-04-16 15:20:36 -07002613 ret = -EBUSY;
2614 break;
2615 }
2616
2617 return ret;
2618}
2619
2620static void serial8250_release_rsa_resource(struct uart_8250_port *up)
2621{
2622 unsigned long offset = UART_RSA_BASE << up->port.regshift;
2623 unsigned int size = 8 << up->port.regshift;
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002624 struct uart_port *port = &up->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002625
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002626 switch (port->iotype) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002627 case UPIO_HUB6:
2628 case UPIO_PORT:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002629 release_region(port->iobase + offset, size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002630 break;
2631 }
2632}
2633
2634static void serial8250_release_port(struct uart_port *port)
2635{
Jamie Iles49d57412010-12-01 23:39:35 +00002636 struct uart_8250_port *up =
2637 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002638
2639 serial8250_release_std_resource(up);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002640 if (port->type == PORT_RSA)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002641 serial8250_release_rsa_resource(up);
2642}
2643
2644static int serial8250_request_port(struct uart_port *port)
2645{
Jamie Iles49d57412010-12-01 23:39:35 +00002646 struct uart_8250_port *up =
2647 container_of(port, struct uart_8250_port, port);
Sean Young65ecc9c2012-09-07 19:06:24 +01002648 int ret;
2649
2650 if (port->type == PORT_8250_CIR)
2651 return -ENODEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002652
2653 ret = serial8250_request_std_resource(up);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002654 if (ret == 0 && port->type == PORT_RSA) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002655 ret = serial8250_request_rsa_resource(up);
2656 if (ret < 0)
2657 serial8250_release_std_resource(up);
2658 }
2659
2660 return ret;
2661}
2662
2663static void serial8250_config_port(struct uart_port *port, int flags)
2664{
Jamie Iles49d57412010-12-01 23:39:35 +00002665 struct uart_8250_port *up =
2666 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002667 int probeflags = PROBE_ANY;
2668 int ret;
2669
Sean Young65ecc9c2012-09-07 19:06:24 +01002670 if (port->type == PORT_8250_CIR)
2671 return;
2672
Linus Torvalds1da177e2005-04-16 15:20:36 -07002673 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002674 * Find the region that we can probe for. This in turn
2675 * tells us whether we can probe for the type of port.
2676 */
2677 ret = serial8250_request_std_resource(up);
2678 if (ret < 0)
2679 return;
2680
2681 ret = serial8250_request_rsa_resource(up);
2682 if (ret < 0)
2683 probeflags &= ~PROBE_RSA;
2684
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002685 if (port->iotype != up->cur_iotype)
Alan Coxb8e7e402009-05-28 14:01:35 +01002686 set_io_from_upio(port);
2687
Linus Torvalds1da177e2005-04-16 15:20:36 -07002688 if (flags & UART_CONFIG_TYPE)
2689 autoconfig(up, probeflags);
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002690
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002691 /* if access method is AU, it is a 16550 with a quirk */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002692 if (port->type == PORT_16550A && port->iotype == UPIO_AU)
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002693 up->bugs |= UART_BUG_NOMSR;
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002694
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002695 if (port->type != PORT_UNKNOWN && flags & UART_CONFIG_IRQ)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002696 autoconfig_irq(up);
2697
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002698 if (port->type != PORT_RSA && probeflags & PROBE_RSA)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002699 serial8250_release_rsa_resource(up);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002700 if (port->type == PORT_UNKNOWN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002701 serial8250_release_std_resource(up);
Matt Schultedc96efb2012-11-19 09:12:04 -06002702
2703 /* Fixme: probably not the best place for this */
Matt Schulte30fa96a2012-11-21 09:40:49 -06002704 if ((port->type == PORT_XR17V35X) ||
2705 (port->type == PORT_XR17D15X))
Matt Schultedc96efb2012-11-19 09:12:04 -06002706 port->handle_irq = exar_handle_irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002707}
2708
2709static int
2710serial8250_verify_port(struct uart_port *port, struct serial_struct *ser)
2711{
Yinghai Lua62c4132008-08-19 20:49:55 -07002712 if (ser->irq >= nr_irqs || ser->irq < 0 ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07002713 ser->baud_base < 9600 || ser->type < PORT_UNKNOWN ||
2714 ser->type >= ARRAY_SIZE(uart_config) || ser->type == PORT_CIRRUS ||
2715 ser->type == PORT_STARTECH)
2716 return -EINVAL;
2717 return 0;
2718}
2719
2720static const char *
2721serial8250_type(struct uart_port *port)
2722{
2723 int type = port->type;
2724
2725 if (type >= ARRAY_SIZE(uart_config))
2726 type = 0;
2727 return uart_config[type].name;
2728}
2729
2730static struct uart_ops serial8250_pops = {
2731 .tx_empty = serial8250_tx_empty,
2732 .set_mctrl = serial8250_set_mctrl,
2733 .get_mctrl = serial8250_get_mctrl,
2734 .stop_tx = serial8250_stop_tx,
2735 .start_tx = serial8250_start_tx,
2736 .stop_rx = serial8250_stop_rx,
2737 .enable_ms = serial8250_enable_ms,
2738 .break_ctl = serial8250_break_ctl,
2739 .startup = serial8250_startup,
2740 .shutdown = serial8250_shutdown,
2741 .set_termios = serial8250_set_termios,
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002742 .set_ldisc = serial8250_set_ldisc,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002743 .pm = serial8250_pm,
2744 .type = serial8250_type,
2745 .release_port = serial8250_release_port,
2746 .request_port = serial8250_request_port,
2747 .config_port = serial8250_config_port,
2748 .verify_port = serial8250_verify_port,
Jason Wesself2d937f2008-04-17 20:05:37 +02002749#ifdef CONFIG_CONSOLE_POLL
2750 .poll_get_char = serial8250_get_poll_char,
2751 .poll_put_char = serial8250_put_poll_char,
2752#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07002753};
2754
2755static struct uart_8250_port serial8250_ports[UART_NR];
2756
Alan Coxaf7f3742010-10-18 11:38:02 -07002757static void (*serial8250_isa_config)(int port, struct uart_port *up,
2758 unsigned short *capabilities);
2759
2760void serial8250_set_isa_configurator(
2761 void (*v)(int port, struct uart_port *up, unsigned short *capabilities))
2762{
2763 serial8250_isa_config = v;
2764}
2765EXPORT_SYMBOL(serial8250_set_isa_configurator);
2766
Linus Torvalds1da177e2005-04-16 15:20:36 -07002767static void __init serial8250_isa_init_ports(void)
2768{
2769 struct uart_8250_port *up;
2770 static int first = 1;
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02002771 int i, irqflag = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002772
2773 if (!first)
2774 return;
2775 first = 0;
2776
Sean Young835d8442012-09-07 19:06:23 +01002777 if (nr_uarts > UART_NR)
2778 nr_uarts = UART_NR;
2779
Dave Jonesa61c2d72006-01-07 23:18:19 +00002780 for (i = 0; i < nr_uarts; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002781 struct uart_8250_port *up = &serial8250_ports[i];
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002782 struct uart_port *port = &up->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002783
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002784 port->line = i;
2785 spin_lock_init(&port->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002786
2787 init_timer(&up->timer);
2788 up->timer.function = serial8250_timeout;
Sean Young835d8442012-09-07 19:06:23 +01002789 up->cur_iotype = 0xFF;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002790
2791 /*
2792 * ALPHA_KLUDGE_MCR needs to be killed.
2793 */
2794 up->mcr_mask = ~ALPHA_KLUDGE_MCR;
2795 up->mcr_force = ALPHA_KLUDGE_MCR;
2796
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002797 port->ops = &serial8250_pops;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002798 }
2799
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02002800 if (share_irqs)
2801 irqflag = IRQF_SHARED;
2802
Russell King44454bc2005-06-30 22:41:22 +01002803 for (i = 0, up = serial8250_ports;
Dave Jonesa61c2d72006-01-07 23:18:19 +00002804 i < ARRAY_SIZE(old_serial_port) && i < nr_uarts;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002805 i++, up++) {
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002806 struct uart_port *port = &up->port;
2807
2808 port->iobase = old_serial_port[i].port;
2809 port->irq = irq_canonicalize(old_serial_port[i].irq);
2810 port->irqflags = old_serial_port[i].irqflags;
2811 port->uartclk = old_serial_port[i].baud_base * 16;
2812 port->flags = old_serial_port[i].flags;
2813 port->hub6 = old_serial_port[i].hub6;
2814 port->membase = old_serial_port[i].iomem_base;
2815 port->iotype = old_serial_port[i].io_type;
2816 port->regshift = old_serial_port[i].iomem_reg_shift;
2817 set_io_from_upio(port);
2818 port->irqflags |= irqflag;
Alan Coxaf7f3742010-10-18 11:38:02 -07002819 if (serial8250_isa_config != NULL)
2820 serial8250_isa_config(i, &up->port, &up->capabilities);
2821
Linus Torvalds1da177e2005-04-16 15:20:36 -07002822 }
2823}
2824
Shmulik Ladkanib5d228c2009-12-09 12:31:29 -08002825static void
2826serial8250_init_fixed_type_port(struct uart_8250_port *up, unsigned int type)
2827{
2828 up->port.type = type;
2829 up->port.fifosize = uart_config[type].fifo_size;
2830 up->capabilities = uart_config[type].flags;
2831 up->tx_loadsz = uart_config[type].tx_loadsz;
2832}
2833
Linus Torvalds1da177e2005-04-16 15:20:36 -07002834static void __init
2835serial8250_register_ports(struct uart_driver *drv, struct device *dev)
2836{
2837 int i;
2838
Alan Coxb8e7e402009-05-28 14:01:35 +01002839 for (i = 0; i < nr_uarts; i++) {
2840 struct uart_8250_port *up = &serial8250_ports[i];
Alan Coxb8e7e402009-05-28 14:01:35 +01002841
Sean Young835d8442012-09-07 19:06:23 +01002842 if (up->port.dev)
2843 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002844
2845 up->port.dev = dev;
Shmulik Ladkanib5d228c2009-12-09 12:31:29 -08002846
2847 if (up->port.flags & UPF_FIXED_TYPE)
2848 serial8250_init_fixed_type_port(up, up->port.type);
2849
Linus Torvalds1da177e2005-04-16 15:20:36 -07002850 uart_add_one_port(drv, &up->port);
2851 }
2852}
2853
2854#ifdef CONFIG_SERIAL_8250_CONSOLE
2855
Russell Kingd3587882006-03-20 20:00:09 +00002856static void serial8250_console_putchar(struct uart_port *port, int ch)
2857{
Jamie Iles49d57412010-12-01 23:39:35 +00002858 struct uart_8250_port *up =
2859 container_of(port, struct uart_8250_port, port);
Russell Kingd3587882006-03-20 20:00:09 +00002860
2861 wait_for_xmitr(up, UART_LSR_THRE);
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002862 serial_port_out(port, UART_TX, ch);
Russell Kingd3587882006-03-20 20:00:09 +00002863}
2864
Linus Torvalds1da177e2005-04-16 15:20:36 -07002865/*
2866 * Print a string to the serial port trying not to disturb
2867 * any possible real use of the port...
2868 *
2869 * The console_lock must be held when we get here.
2870 */
2871static void
2872serial8250_console_write(struct console *co, const char *s, unsigned int count)
2873{
2874 struct uart_8250_port *up = &serial8250_ports[co->index];
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002875 struct uart_port *port = &up->port;
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002876 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002877 unsigned int ier;
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002878 int locked = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002879
Andrew Morton78512ec2005-11-07 00:59:13 -08002880 touch_nmi_watchdog();
2881
Andrew Morton68aa2c02006-06-30 02:29:59 -07002882 local_irq_save(flags);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002883 if (port->sysrq) {
Paul Gortmaker86b21192011-12-04 18:42:22 -05002884 /* serial8250_handle_irq() already took the lock */
Andrew Morton68aa2c02006-06-30 02:29:59 -07002885 locked = 0;
2886 } else if (oops_in_progress) {
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002887 locked = spin_trylock(&port->lock);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002888 } else
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002889 spin_lock(&port->lock);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002890
Linus Torvalds1da177e2005-04-16 15:20:36 -07002891 /*
Ralf Baechledc7bf132006-02-15 09:59:47 +00002892 * First save the IER then disable the interrupts
Linus Torvalds1da177e2005-04-16 15:20:36 -07002893 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002894 ier = serial_port_in(port, UART_IER);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002895
2896 if (up->capabilities & UART_CAP_UUE)
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002897 serial_port_out(port, UART_IER, UART_IER_UUE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002898 else
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002899 serial_port_out(port, UART_IER, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002900
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002901 uart_console_write(port, s, count, serial8250_console_putchar);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002902
2903 /*
2904 * Finally, wait for transmitter to become empty
2905 * and restore the IER
2906 */
Alan Coxf91a3712006-01-21 14:59:12 +00002907 wait_for_xmitr(up, BOTH_EMPTY);
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002908 serial_port_out(port, UART_IER, ier);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002909
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002910 /*
2911 * The receive handling will happen properly because the
2912 * receive ready bit will still be set; it is not cleared
2913 * on read. However, modem control will not, we must
2914 * call it if we have saved something in the saved flags
2915 * while processing with interrupts off.
2916 */
2917 if (up->msr_saved_flags)
Paul Gortmaker3986fb22011-12-04 18:42:20 -05002918 serial8250_modem_status(up);
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002919
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002920 if (locked)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002921 spin_unlock(&port->lock);
Andrew Morton68aa2c02006-06-30 02:29:59 -07002922 local_irq_restore(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002923}
2924
Vivek Goyal118c0ac2007-01-11 01:52:44 +01002925static int __init serial8250_console_setup(struct console *co, char *options)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002926{
2927 struct uart_port *port;
2928 int baud = 9600;
2929 int bits = 8;
2930 int parity = 'n';
2931 int flow = 'n';
2932
2933 /*
2934 * Check whether an invalid uart number has been specified, and
2935 * if so, search for the first available port that does have
2936 * console support.
2937 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00002938 if (co->index >= nr_uarts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002939 co->index = 0;
2940 port = &serial8250_ports[co->index].port;
2941 if (!port->iobase && !port->membase)
2942 return -ENODEV;
2943
2944 if (options)
2945 uart_parse_options(options, &baud, &parity, &bits, &flow);
2946
2947 return uart_set_options(port, co, baud, parity, bits, flow);
2948}
2949
Daniel Ritzb6b1d872007-08-03 16:07:43 +02002950static int serial8250_console_early_setup(void)
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002951{
2952 return serial8250_find_port_for_earlycon();
2953}
2954
Linus Torvalds1da177e2005-04-16 15:20:36 -07002955static struct console serial8250_console = {
2956 .name = "ttyS",
2957 .write = serial8250_console_write,
2958 .device = uart_console_device,
2959 .setup = serial8250_console_setup,
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002960 .early_setup = serial8250_console_early_setup,
Peter Zijlstraa80c49d2010-11-15 21:11:12 +01002961 .flags = CON_PRINTBUFFER | CON_ANYTIME,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002962 .index = -1,
2963 .data = &serial8250_reg,
2964};
2965
2966static int __init serial8250_console_init(void)
2967{
2968 serial8250_isa_init_ports();
2969 register_console(&serial8250_console);
2970 return 0;
2971}
2972console_initcall(serial8250_console_init);
2973
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002974int serial8250_find_port(struct uart_port *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002975{
2976 int line;
2977 struct uart_port *port;
2978
Dave Jonesa61c2d72006-01-07 23:18:19 +00002979 for (line = 0; line < nr_uarts; line++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002980 port = &serial8250_ports[line].port;
Russell King50aec3b52006-01-04 18:13:03 +00002981 if (uart_match_port(p, port))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002982 return line;
2983 }
2984 return -ENODEV;
2985}
2986
Linus Torvalds1da177e2005-04-16 15:20:36 -07002987#define SERIAL8250_CONSOLE &serial8250_console
2988#else
2989#define SERIAL8250_CONSOLE NULL
2990#endif
2991
2992static struct uart_driver serial8250_reg = {
2993 .owner = THIS_MODULE,
2994 .driver_name = "serial",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002995 .dev_name = "ttyS",
2996 .major = TTY_MAJOR,
2997 .minor = 64,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002998 .cons = SERIAL8250_CONSOLE,
2999};
3000
Russell Kingd856c662006-02-23 10:22:13 +00003001/*
3002 * early_serial_setup - early registration for 8250 ports
3003 *
3004 * Setup an 8250 port structure prior to console initialisation. Use
3005 * after console initialisation will cause undefined behaviour.
3006 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003007int __init early_serial_setup(struct uart_port *port)
3008{
David Daneyb4304282009-01-02 13:49:41 +00003009 struct uart_port *p;
3010
Linus Torvalds1da177e2005-04-16 15:20:36 -07003011 if (port->line >= ARRAY_SIZE(serial8250_ports))
3012 return -ENODEV;
3013
3014 serial8250_isa_init_ports();
David Daneyb4304282009-01-02 13:49:41 +00003015 p = &serial8250_ports[port->line].port;
3016 p->iobase = port->iobase;
3017 p->membase = port->membase;
3018 p->irq = port->irq;
Vikram Pandita1c2f0492009-09-19 13:13:19 -07003019 p->irqflags = port->irqflags;
David Daneyb4304282009-01-02 13:49:41 +00003020 p->uartclk = port->uartclk;
3021 p->fifosize = port->fifosize;
3022 p->regshift = port->regshift;
3023 p->iotype = port->iotype;
3024 p->flags = port->flags;
3025 p->mapbase = port->mapbase;
3026 p->private_data = port->private_data;
Helge Deller125c97d2009-01-13 22:51:07 +01003027 p->type = port->type;
3028 p->line = port->line;
David Daney7d6a07d2009-01-02 13:49:47 +00003029
3030 set_io_from_upio(p);
3031 if (port->serial_in)
3032 p->serial_in = port->serial_in;
3033 if (port->serial_out)
3034 p->serial_out = port->serial_out;
Jamie Iles583d28e2011-08-15 10:17:52 +01003035 if (port->handle_irq)
3036 p->handle_irq = port->handle_irq;
3037 else
3038 p->handle_irq = serial8250_default_handle_irq;
David Daney7d6a07d2009-01-02 13:49:47 +00003039
Linus Torvalds1da177e2005-04-16 15:20:36 -07003040 return 0;
3041}
3042
3043/**
3044 * serial8250_suspend_port - suspend one serial port
3045 * @line: serial line number
Linus Torvalds1da177e2005-04-16 15:20:36 -07003046 *
3047 * Suspend one serial port.
3048 */
3049void serial8250_suspend_port(int line)
3050{
3051 uart_suspend_port(&serial8250_reg, &serial8250_ports[line].port);
3052}
3053
3054/**
3055 * serial8250_resume_port - resume one serial port
3056 * @line: serial line number
Linus Torvalds1da177e2005-04-16 15:20:36 -07003057 *
3058 * Resume one serial port.
3059 */
3060void serial8250_resume_port(int line)
3061{
David Woodhouseb5b82df2007-05-17 14:27:39 +08003062 struct uart_8250_port *up = &serial8250_ports[line];
Paul Gortmakerdfe42442012-03-08 19:12:11 -05003063 struct uart_port *port = &up->port;
David Woodhouseb5b82df2007-05-17 14:27:39 +08003064
3065 if (up->capabilities & UART_NATSEMI) {
David Woodhouseb5b82df2007-05-17 14:27:39 +08003066 /* Ensure it's still in high speed mode */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05003067 serial_port_out(port, UART_LCR, 0xE0);
David Woodhouseb5b82df2007-05-17 14:27:39 +08003068
Yin Kangkai0d0389e2011-02-09 11:35:18 +08003069 ns16550a_goto_highspeed(up);
David Woodhouseb5b82df2007-05-17 14:27:39 +08003070
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05003071 serial_port_out(port, UART_LCR, 0);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05003072 port->uartclk = 921600*16;
David Woodhouseb5b82df2007-05-17 14:27:39 +08003073 }
Paul Gortmakerdfe42442012-03-08 19:12:11 -05003074 uart_resume_port(&serial8250_reg, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003075}
3076
3077/*
3078 * Register a set of serial devices attached to a platform device. The
3079 * list is terminated with a zero flags entry, which means we expect
3080 * all entries to have at least UPF_BOOT_AUTOCONF set.
3081 */
Bill Pemberton9671f092012-11-19 13:21:50 -05003082static int serial8250_probe(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003083{
Russell King3ae5eae2005-11-09 22:32:44 +00003084 struct plat_serial8250_port *p = dev->dev.platform_data;
Alan Cox2655a2c2012-07-12 12:59:50 +01003085 struct uart_8250_port uart;
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02003086 int ret, i, irqflag = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003087
Alan Cox2655a2c2012-07-12 12:59:50 +01003088 memset(&uart, 0, sizeof(uart));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003089
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02003090 if (share_irqs)
3091 irqflag = IRQF_SHARED;
3092
Russell Kingec9f47c2005-06-27 11:12:54 +01003093 for (i = 0; p && p->flags != 0; p++, i++) {
Alan Cox2655a2c2012-07-12 12:59:50 +01003094 uart.port.iobase = p->iobase;
3095 uart.port.membase = p->membase;
3096 uart.port.irq = p->irq;
3097 uart.port.irqflags = p->irqflags;
3098 uart.port.uartclk = p->uartclk;
3099 uart.port.regshift = p->regshift;
3100 uart.port.iotype = p->iotype;
3101 uart.port.flags = p->flags;
3102 uart.port.mapbase = p->mapbase;
3103 uart.port.hub6 = p->hub6;
3104 uart.port.private_data = p->private_data;
3105 uart.port.type = p->type;
3106 uart.port.serial_in = p->serial_in;
3107 uart.port.serial_out = p->serial_out;
3108 uart.port.handle_irq = p->handle_irq;
3109 uart.port.handle_break = p->handle_break;
3110 uart.port.set_termios = p->set_termios;
3111 uart.port.pm = p->pm;
3112 uart.port.dev = &dev->dev;
3113 uart.port.irqflags |= irqflag;
3114 ret = serial8250_register_8250_port(&uart);
Russell Kingec9f47c2005-06-27 11:12:54 +01003115 if (ret < 0) {
Russell King3ae5eae2005-11-09 22:32:44 +00003116 dev_err(&dev->dev, "unable to register port at index %d "
Josh Boyer4f640ef2007-07-23 18:43:44 -07003117 "(IO%lx MEM%llx IRQ%d): %d\n", i,
3118 p->iobase, (unsigned long long)p->mapbase,
3119 p->irq, ret);
Russell Kingec9f47c2005-06-27 11:12:54 +01003120 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003121 }
3122 return 0;
3123}
3124
3125/*
3126 * Remove serial ports registered against a platform device.
3127 */
Bill Pembertonae8d8a12012-11-19 13:26:18 -05003128static int serial8250_remove(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003129{
3130 int i;
3131
Dave Jonesa61c2d72006-01-07 23:18:19 +00003132 for (i = 0; i < nr_uarts; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003133 struct uart_8250_port *up = &serial8250_ports[i];
3134
Russell King3ae5eae2005-11-09 22:32:44 +00003135 if (up->port.dev == &dev->dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003136 serial8250_unregister_port(i);
3137 }
3138 return 0;
3139}
3140
Russell King3ae5eae2005-11-09 22:32:44 +00003141static int serial8250_suspend(struct platform_device *dev, pm_message_t state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003142{
3143 int i;
3144
Linus Torvalds1da177e2005-04-16 15:20:36 -07003145 for (i = 0; i < UART_NR; i++) {
3146 struct uart_8250_port *up = &serial8250_ports[i];
3147
Russell King3ae5eae2005-11-09 22:32:44 +00003148 if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003149 uart_suspend_port(&serial8250_reg, &up->port);
3150 }
3151
3152 return 0;
3153}
3154
Russell King3ae5eae2005-11-09 22:32:44 +00003155static int serial8250_resume(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003156{
3157 int i;
3158
Linus Torvalds1da177e2005-04-16 15:20:36 -07003159 for (i = 0; i < UART_NR; i++) {
3160 struct uart_8250_port *up = &serial8250_ports[i];
3161
Russell King3ae5eae2005-11-09 22:32:44 +00003162 if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
David Woodhouseb5b82df2007-05-17 14:27:39 +08003163 serial8250_resume_port(i);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003164 }
3165
3166 return 0;
3167}
3168
Russell King3ae5eae2005-11-09 22:32:44 +00003169static struct platform_driver serial8250_isa_driver = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003170 .probe = serial8250_probe,
Bill Pemberton2d47b712012-11-19 13:21:34 -05003171 .remove = serial8250_remove,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003172 .suspend = serial8250_suspend,
3173 .resume = serial8250_resume,
Russell King3ae5eae2005-11-09 22:32:44 +00003174 .driver = {
3175 .name = "serial8250",
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003176 .owner = THIS_MODULE,
Russell King3ae5eae2005-11-09 22:32:44 +00003177 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07003178};
3179
3180/*
3181 * This "device" covers _all_ ISA 8250-compatible serial devices listed
3182 * in the table in include/asm/serial.h
3183 */
3184static struct platform_device *serial8250_isa_devs;
3185
3186/*
Alan Cox2655a2c2012-07-12 12:59:50 +01003187 * serial8250_register_8250_port and serial8250_unregister_port allows for
Linus Torvalds1da177e2005-04-16 15:20:36 -07003188 * 16x50 serial ports to be configured at run-time, to support PCMCIA
3189 * modems and PCI multiport cards.
3190 */
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003191static DEFINE_MUTEX(serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003192
3193static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *port)
3194{
3195 int i;
3196
3197 /*
3198 * First, find a port entry which matches.
3199 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003200 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003201 if (uart_match_port(&serial8250_ports[i].port, port))
3202 return &serial8250_ports[i];
3203
3204 /*
3205 * We didn't find a matching entry, so look for the first
3206 * free entry. We look for one which hasn't been previously
3207 * used (indicated by zero iobase).
3208 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003209 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003210 if (serial8250_ports[i].port.type == PORT_UNKNOWN &&
3211 serial8250_ports[i].port.iobase == 0)
3212 return &serial8250_ports[i];
3213
3214 /*
3215 * That also failed. Last resort is to find any entry which
3216 * doesn't have a real port associated with it.
3217 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003218 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003219 if (serial8250_ports[i].port.type == PORT_UNKNOWN)
3220 return &serial8250_ports[i];
3221
3222 return NULL;
3223}
3224
3225/**
Magnus Dammf73fa052012-05-02 21:47:27 +09003226 * serial8250_register_8250_port - register a serial port
Randy Dunlap58bcd332012-06-08 18:51:23 -07003227 * @up: serial port template
Magnus Dammf73fa052012-05-02 21:47:27 +09003228 *
3229 * Configure the serial port specified by the request. If the
3230 * port exists and is in use, it is hung up and unregistered
3231 * first.
3232 *
3233 * The port is then probed and if necessary the IRQ is autodetected
3234 * If this fails an error is returned.
3235 *
3236 * On success the port is ready to use and the line number is returned.
3237 */
3238int serial8250_register_8250_port(struct uart_8250_port *up)
3239{
3240 struct uart_8250_port *uart;
3241 int ret = -ENOSPC;
3242
3243 if (up->port.uartclk == 0)
3244 return -EINVAL;
3245
3246 mutex_lock(&serial_mutex);
3247
3248 uart = serial8250_find_match_or_unused(&up->port);
Sean Young65ecc9c2012-09-07 19:06:24 +01003249 if (uart && uart->port.type != PORT_8250_CIR) {
Sean Young835d8442012-09-07 19:06:23 +01003250 if (uart->port.dev)
3251 uart_remove_one_port(&serial8250_reg, &uart->port);
Magnus Dammf73fa052012-05-02 21:47:27 +09003252
3253 uart->port.iobase = up->port.iobase;
3254 uart->port.membase = up->port.membase;
3255 uart->port.irq = up->port.irq;
3256 uart->port.irqflags = up->port.irqflags;
3257 uart->port.uartclk = up->port.uartclk;
3258 uart->port.fifosize = up->port.fifosize;
3259 uart->port.regshift = up->port.regshift;
3260 uart->port.iotype = up->port.iotype;
3261 uart->port.flags = up->port.flags | UPF_BOOT_AUTOCONF;
Alan Coxa2d33d82012-07-12 13:00:06 +01003262 uart->bugs = up->bugs;
Magnus Dammf73fa052012-05-02 21:47:27 +09003263 uart->port.mapbase = up->port.mapbase;
3264 uart->port.private_data = up->port.private_data;
3265 if (up->port.dev)
3266 uart->port.dev = up->port.dev;
3267
3268 if (up->port.flags & UPF_FIXED_TYPE)
3269 serial8250_init_fixed_type_port(uart, up->port.type);
3270
3271 set_io_from_upio(&uart->port);
3272 /* Possibly override default I/O functions. */
3273 if (up->port.serial_in)
3274 uart->port.serial_in = up->port.serial_in;
3275 if (up->port.serial_out)
3276 uart->port.serial_out = up->port.serial_out;
3277 if (up->port.handle_irq)
3278 uart->port.handle_irq = up->port.handle_irq;
3279 /* Possibly override set_termios call */
3280 if (up->port.set_termios)
3281 uart->port.set_termios = up->port.set_termios;
3282 if (up->port.pm)
3283 uart->port.pm = up->port.pm;
3284 if (up->port.handle_break)
3285 uart->port.handle_break = up->port.handle_break;
3286 if (up->dl_read)
3287 uart->dl_read = up->dl_read;
3288 if (up->dl_write)
3289 uart->dl_write = up->dl_write;
3290
3291 if (serial8250_isa_config != NULL)
3292 serial8250_isa_config(0, &uart->port,
3293 &uart->capabilities);
3294
3295 ret = uart_add_one_port(&serial8250_reg, &uart->port);
3296 if (ret == 0)
3297 ret = uart->port.line;
3298 }
3299 mutex_unlock(&serial_mutex);
3300
3301 return ret;
3302}
3303EXPORT_SYMBOL(serial8250_register_8250_port);
3304
3305/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07003306 * serial8250_unregister_port - remove a 16x50 serial port at runtime
3307 * @line: serial line number
3308 *
3309 * Remove one serial port. This may not be called from interrupt
3310 * context. We hand the port back to the our control.
3311 */
3312void serial8250_unregister_port(int line)
3313{
3314 struct uart_8250_port *uart = &serial8250_ports[line];
3315
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003316 mutex_lock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003317 uart_remove_one_port(&serial8250_reg, &uart->port);
3318 if (serial8250_isa_devs) {
3319 uart->port.flags &= ~UPF_BOOT_AUTOCONF;
3320 uart->port.type = PORT_UNKNOWN;
3321 uart->port.dev = &serial8250_isa_devs->dev;
leitao@linux.vnet.ibm.comcb01ece2011-05-26 11:18:39 -03003322 uart->capabilities = uart_config[uart->port.type].flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003323 uart_add_one_port(&serial8250_reg, &uart->port);
3324 } else {
3325 uart->port.dev = NULL;
3326 }
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003327 mutex_unlock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003328}
3329EXPORT_SYMBOL(serial8250_unregister_port);
3330
3331static int __init serial8250_init(void)
3332{
Alan Cox25db8ad2008-08-19 20:49:40 -07003333 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003334
Sean Young835d8442012-09-07 19:06:23 +01003335 serial8250_isa_init_ports();
Dave Jonesa61c2d72006-01-07 23:18:19 +00003336
Paul Bollef1fb9bb2008-12-30 14:06:43 +01003337 printk(KERN_INFO "Serial: 8250/16550 driver, "
Dave Jonesa61c2d72006-01-07 23:18:19 +00003338 "%d ports, IRQ sharing %sabled\n", nr_uarts,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003339 share_irqs ? "en" : "dis");
3340
David Millerb70ac772008-10-13 10:36:31 +01003341#ifdef CONFIG_SPARC
3342 ret = sunserial_register_minors(&serial8250_reg, UART_NR);
3343#else
3344 serial8250_reg.nr = UART_NR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003345 ret = uart_register_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003346#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003347 if (ret)
3348 goto out;
3349
Sean Young835d8442012-09-07 19:06:23 +01003350 ret = serial8250_pnp_init();
3351 if (ret)
3352 goto unreg_uart_drv;
3353
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003354 serial8250_isa_devs = platform_device_alloc("serial8250",
3355 PLAT8250_DEV_LEGACY);
3356 if (!serial8250_isa_devs) {
3357 ret = -ENOMEM;
Sean Young835d8442012-09-07 19:06:23 +01003358 goto unreg_pnp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003359 }
3360
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003361 ret = platform_device_add(serial8250_isa_devs);
3362 if (ret)
3363 goto put_dev;
3364
Linus Torvalds1da177e2005-04-16 15:20:36 -07003365 serial8250_register_ports(&serial8250_reg, &serial8250_isa_devs->dev);
3366
Russell Kingbc965a72006-01-18 09:54:29 +00003367 ret = platform_driver_register(&serial8250_isa_driver);
3368 if (ret == 0)
3369 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003370
Russell Kingbc965a72006-01-18 09:54:29 +00003371 platform_device_del(serial8250_isa_devs);
Alan Cox25db8ad2008-08-19 20:49:40 -07003372put_dev:
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003373 platform_device_put(serial8250_isa_devs);
Sean Young835d8442012-09-07 19:06:23 +01003374unreg_pnp:
3375 serial8250_pnp_exit();
Alan Cox25db8ad2008-08-19 20:49:40 -07003376unreg_uart_drv:
David Millerb70ac772008-10-13 10:36:31 +01003377#ifdef CONFIG_SPARC
3378 sunserial_unregister_minors(&serial8250_reg, UART_NR);
3379#else
Linus Torvalds1da177e2005-04-16 15:20:36 -07003380 uart_unregister_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003381#endif
Alan Cox25db8ad2008-08-19 20:49:40 -07003382out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07003383 return ret;
3384}
3385
3386static void __exit serial8250_exit(void)
3387{
3388 struct platform_device *isa_dev = serial8250_isa_devs;
3389
3390 /*
3391 * This tells serial8250_unregister_port() not to re-register
3392 * the ports (thereby making serial8250_isa_driver permanently
3393 * in use.)
3394 */
3395 serial8250_isa_devs = NULL;
3396
Russell King3ae5eae2005-11-09 22:32:44 +00003397 platform_driver_unregister(&serial8250_isa_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003398 platform_device_unregister(isa_dev);
3399
Sean Young835d8442012-09-07 19:06:23 +01003400 serial8250_pnp_exit();
3401
David Millerb70ac772008-10-13 10:36:31 +01003402#ifdef CONFIG_SPARC
3403 sunserial_unregister_minors(&serial8250_reg, UART_NR);
3404#else
Linus Torvalds1da177e2005-04-16 15:20:36 -07003405 uart_unregister_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003406#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003407}
3408
3409module_init(serial8250_init);
3410module_exit(serial8250_exit);
3411
3412EXPORT_SYMBOL(serial8250_suspend_port);
3413EXPORT_SYMBOL(serial8250_resume_port);
3414
3415MODULE_LICENSE("GPL");
Adrian Bunkd87a6d92008-07-16 21:53:31 +01003416MODULE_DESCRIPTION("Generic 8250/16x50 serial driver");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003417
3418module_param(share_irqs, uint, 0644);
3419MODULE_PARM_DESC(share_irqs, "Share IRQs with other non-8250/16x50 devices"
3420 " (unsafe)");
3421
Dave Jonesa61c2d72006-01-07 23:18:19 +00003422module_param(nr_uarts, uint, 0644);
3423MODULE_PARM_DESC(nr_uarts, "Maximum number of UARTs supported. (1-" __MODULE_STRING(CONFIG_SERIAL_8250_NR_UARTS) ")");
3424
Chuck Ebbertd41a4b52009-10-01 15:44:26 -07003425module_param(skip_txen_test, uint, 0644);
3426MODULE_PARM_DESC(skip_txen_test, "Skip checking for the TXEN bug at init time");
3427
Linus Torvalds1da177e2005-04-16 15:20:36 -07003428#ifdef CONFIG_SERIAL_8250_RSA
3429module_param_array(probe_rsa, ulong, &probe_rsa_count, 0444);
3430MODULE_PARM_DESC(probe_rsa, "Probe I/O ports for RSA");
3431#endif
3432MODULE_ALIAS_CHARDEV_MAJOR(TTY_MAJOR);