blob: 6a71716111aec12f2293de23ee55339284cc4bae [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,
283 .flags = UART_CAP_FIFO | UART_CAP_AFE | UART_CAP_EFR,
284 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700285};
286
Manuel Lauss12bf3f22010-07-15 21:45:05 +0200287#if defined(CONFIG_MIPS_ALCHEMY)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000288
289/* Au1x00 UART hardware has a weird register layout */
290static const u8 au_io_in_map[] = {
291 [UART_RX] = 0,
292 [UART_IER] = 2,
293 [UART_IIR] = 3,
294 [UART_LCR] = 5,
295 [UART_MCR] = 6,
296 [UART_LSR] = 7,
297 [UART_MSR] = 8,
298};
299
300static const u8 au_io_out_map[] = {
301 [UART_TX] = 1,
302 [UART_IER] = 2,
303 [UART_FCR] = 4,
304 [UART_LCR] = 5,
305 [UART_MCR] = 6,
306};
307
308/* sane hardware needs no mapping */
David Daney7d6a07d2009-01-02 13:49:47 +0000309static inline int map_8250_in_reg(struct uart_port *p, int offset)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000310{
David Daney7d6a07d2009-01-02 13:49:47 +0000311 if (p->iotype != UPIO_AU)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000312 return offset;
313 return au_io_in_map[offset];
314}
315
David Daney7d6a07d2009-01-02 13:49:47 +0000316static inline int map_8250_out_reg(struct uart_port *p, int offset)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000317{
David Daney7d6a07d2009-01-02 13:49:47 +0000318 if (p->iotype != UPIO_AU)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000319 return offset;
320 return au_io_out_map[offset];
321}
322
Alan Cox6f803cd2008-02-08 04:18:52 -0800323#elif defined(CONFIG_SERIAL_8250_RM9K)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700324
325static const u8
326 regmap_in[8] = {
327 [UART_RX] = 0x00,
328 [UART_IER] = 0x0c,
329 [UART_IIR] = 0x14,
330 [UART_LCR] = 0x1c,
331 [UART_MCR] = 0x20,
332 [UART_LSR] = 0x24,
333 [UART_MSR] = 0x28,
334 [UART_SCR] = 0x2c
335 },
336 regmap_out[8] = {
337 [UART_TX] = 0x04,
338 [UART_IER] = 0x0c,
339 [UART_FCR] = 0x18,
340 [UART_LCR] = 0x1c,
341 [UART_MCR] = 0x20,
342 [UART_LSR] = 0x24,
343 [UART_MSR] = 0x28,
344 [UART_SCR] = 0x2c
345 };
346
David Daney7d6a07d2009-01-02 13:49:47 +0000347static inline int map_8250_in_reg(struct uart_port *p, int offset)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700348{
David Daney7d6a07d2009-01-02 13:49:47 +0000349 if (p->iotype != UPIO_RM9000)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700350 return offset;
351 return regmap_in[offset];
352}
353
David Daney7d6a07d2009-01-02 13:49:47 +0000354static inline int map_8250_out_reg(struct uart_port *p, int offset)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700355{
David Daney7d6a07d2009-01-02 13:49:47 +0000356 if (p->iotype != UPIO_RM9000)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700357 return offset;
358 return regmap_out[offset];
359}
360
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000361#else
362
363/* sane hardware needs no mapping */
364#define map_8250_in_reg(up, offset) (offset)
365#define map_8250_out_reg(up, offset) (offset)
366
367#endif
368
David Daney7d6a07d2009-01-02 13:49:47 +0000369static unsigned int hub6_serial_in(struct uart_port *p, int offset)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700370{
David Daney7d6a07d2009-01-02 13:49:47 +0000371 offset = map_8250_in_reg(p, offset) << p->regshift;
372 outb(p->hub6 - 1 + offset, p->iobase);
373 return inb(p->iobase + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700374}
375
David Daney7d6a07d2009-01-02 13:49:47 +0000376static void hub6_serial_out(struct uart_port *p, int offset, int value)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700377{
David Daney7d6a07d2009-01-02 13:49:47 +0000378 offset = map_8250_out_reg(p, offset) << p->regshift;
379 outb(p->hub6 - 1 + offset, p->iobase);
380 outb(value, p->iobase + 1);
381}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700382
David Daney7d6a07d2009-01-02 13:49:47 +0000383static unsigned int mem_serial_in(struct uart_port *p, int offset)
384{
385 offset = map_8250_in_reg(p, offset) << p->regshift;
386 return readb(p->membase + offset);
387}
388
389static void mem_serial_out(struct uart_port *p, int offset, int value)
390{
391 offset = map_8250_out_reg(p, offset) << p->regshift;
392 writeb(value, p->membase + offset);
393}
394
395static void mem32_serial_out(struct uart_port *p, int offset, int value)
396{
397 offset = map_8250_out_reg(p, offset) << p->regshift;
398 writel(value, p->membase + offset);
399}
400
401static unsigned int mem32_serial_in(struct uart_port *p, int offset)
402{
403 offset = map_8250_in_reg(p, offset) << p->regshift;
404 return readl(p->membase + offset);
405}
406
David Daney7d6a07d2009-01-02 13:49:47 +0000407static unsigned int au_serial_in(struct uart_port *p, int offset)
408{
409 offset = map_8250_in_reg(p, offset) << p->regshift;
410 return __raw_readl(p->membase + offset);
411}
412
413static void au_serial_out(struct uart_port *p, int offset, int value)
414{
415 offset = map_8250_out_reg(p, offset) << p->regshift;
416 __raw_writel(value, p->membase + offset);
417}
David Daney7d6a07d2009-01-02 13:49:47 +0000418
David Daney7d6a07d2009-01-02 13:49:47 +0000419static unsigned int io_serial_in(struct uart_port *p, int offset)
420{
421 offset = map_8250_in_reg(p, offset) << p->regshift;
422 return inb(p->iobase + offset);
423}
424
425static void io_serial_out(struct uart_port *p, int offset, int value)
426{
427 offset = map_8250_out_reg(p, offset) << p->regshift;
428 outb(value, p->iobase + offset);
429}
430
Jamie Iles583d28e2011-08-15 10:17:52 +0100431static int serial8250_default_handle_irq(struct uart_port *port);
432
David Daney7d6a07d2009-01-02 13:49:47 +0000433static void set_io_from_upio(struct uart_port *p)
434{
Jamie Iles49d57412010-12-01 23:39:35 +0000435 struct uart_8250_port *up =
436 container_of(p, struct uart_8250_port, port);
David Daney7d6a07d2009-01-02 13:49:47 +0000437 switch (p->iotype) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700438 case UPIO_HUB6:
David Daney7d6a07d2009-01-02 13:49:47 +0000439 p->serial_in = hub6_serial_in;
440 p->serial_out = hub6_serial_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700441 break;
442
443 case UPIO_MEM:
David Daney7d6a07d2009-01-02 13:49:47 +0000444 p->serial_in = mem_serial_in;
445 p->serial_out = mem_serial_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700446 break;
447
Thomas Koellerbd71c182007-05-06 14:48:47 -0700448 case UPIO_RM9000:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700449 case UPIO_MEM32:
David Daney7d6a07d2009-01-02 13:49:47 +0000450 p->serial_in = mem32_serial_in;
451 p->serial_out = mem32_serial_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700452 break;
453
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000454 case UPIO_AU:
David Daney7d6a07d2009-01-02 13:49:47 +0000455 p->serial_in = au_serial_in;
456 p->serial_out = au_serial_out;
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000457 break;
Manuel Lauss12bf3f22010-07-15 21:45:05 +0200458
Linus Torvalds1da177e2005-04-16 15:20:36 -0700459 default:
David Daney7d6a07d2009-01-02 13:49:47 +0000460 p->serial_in = io_serial_in;
461 p->serial_out = io_serial_out;
462 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700463 }
Alan Coxb8e7e402009-05-28 14:01:35 +0100464 /* Remember loaded iotype */
465 up->cur_iotype = p->iotype;
Jamie Iles583d28e2011-08-15 10:17:52 +0100466 p->handle_irq = serial8250_default_handle_irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700467}
468
Alex Williamson40b36da2007-02-14 00:33:04 -0800469static void
470serial_out_sync(struct uart_8250_port *up, int offset, int value)
471{
David Daney7d6a07d2009-01-02 13:49:47 +0000472 struct uart_port *p = &up->port;
473 switch (p->iotype) {
Alex Williamson40b36da2007-02-14 00:33:04 -0800474 case UPIO_MEM:
475 case UPIO_MEM32:
Alex Williamson40b36da2007-02-14 00:33:04 -0800476 case UPIO_AU:
David Daney7d6a07d2009-01-02 13:49:47 +0000477 p->serial_out(p, offset, value);
478 p->serial_in(p, UART_LCR); /* safe, no side-effects */
Alex Williamson40b36da2007-02-14 00:33:04 -0800479 break;
480 default:
David Daney7d6a07d2009-01-02 13:49:47 +0000481 p->serial_out(p, offset, value);
Alex Williamson40b36da2007-02-14 00:33:04 -0800482 }
483}
484
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100485/* Uart divisor latch read */
486static inline int _serial_dl_read(struct uart_8250_port *up)
487{
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500488 return serial_in(up, UART_DLL) | serial_in(up, UART_DLM) << 8;
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100489}
490
491/* Uart divisor latch write */
492static inline void _serial_dl_write(struct uart_8250_port *up, int value)
493{
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500494 serial_out(up, UART_DLL, value & 0xff);
495 serial_out(up, UART_DLM, value >> 8 & 0xff);
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100496}
497
Manuel Lauss12bf3f22010-07-15 21:45:05 +0200498#if defined(CONFIG_MIPS_ALCHEMY)
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100499/* Au1x00 haven't got a standard divisor latch */
500static int serial_dl_read(struct uart_8250_port *up)
501{
502 if (up->port.iotype == UPIO_AU)
503 return __raw_readl(up->port.membase + 0x28);
504 else
505 return _serial_dl_read(up);
506}
507
508static void serial_dl_write(struct uart_8250_port *up, int value)
509{
510 if (up->port.iotype == UPIO_AU)
511 __raw_writel(value, up->port.membase + 0x28);
512 else
513 _serial_dl_write(up, value);
514}
Alan Cox6f803cd2008-02-08 04:18:52 -0800515#elif defined(CONFIG_SERIAL_8250_RM9K)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700516static int serial_dl_read(struct uart_8250_port *up)
517{
518 return (up->port.iotype == UPIO_RM9000) ?
519 (((__raw_readl(up->port.membase + 0x10) << 8) |
520 (__raw_readl(up->port.membase + 0x08) & 0xff)) & 0xffff) :
521 _serial_dl_read(up);
522}
523
524static void serial_dl_write(struct uart_8250_port *up, int value)
525{
526 if (up->port.iotype == UPIO_RM9000) {
527 __raw_writel(value, up->port.membase + 0x08);
528 __raw_writel(value >> 8, up->port.membase + 0x10);
529 } else {
530 _serial_dl_write(up, value);
531 }
532}
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100533#else
534#define serial_dl_read(up) _serial_dl_read(up)
535#define serial_dl_write(up, value) _serial_dl_write(up, value)
536#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700537
538/*
539 * For the 16C950
540 */
541static void serial_icr_write(struct uart_8250_port *up, int offset, int value)
542{
543 serial_out(up, UART_SCR, offset);
544 serial_out(up, UART_ICR, value);
545}
546
547static unsigned int serial_icr_read(struct uart_8250_port *up, int offset)
548{
549 unsigned int value;
550
551 serial_icr_write(up, UART_ACR, up->acr | UART_ACR_ICRRD);
552 serial_out(up, UART_SCR, offset);
553 value = serial_in(up, UART_ICR);
554 serial_icr_write(up, UART_ACR, up->acr);
555
556 return value;
557}
558
559/*
560 * FIFO support.
561 */
Will Newtonb5d674a2008-10-13 10:36:21 +0100562static void serial8250_clear_fifos(struct uart_8250_port *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700563{
564 if (p->capabilities & UART_CAP_FIFO) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500565 serial_out(p, UART_FCR, UART_FCR_ENABLE_FIFO);
566 serial_out(p, UART_FCR, UART_FCR_ENABLE_FIFO |
Linus Torvalds1da177e2005-04-16 15:20:36 -0700567 UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500568 serial_out(p, UART_FCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700569 }
570}
571
572/*
573 * IER sleep support. UARTs which have EFRs need the "extended
574 * capability" bit enabled. Note that on XR16C850s, we need to
575 * reset LCR to write to IER.
576 */
Will Newtonb5d674a2008-10-13 10:36:21 +0100577static void serial8250_set_sleep(struct uart_8250_port *p, int sleep)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700578{
579 if (p->capabilities & UART_CAP_SLEEP) {
580 if (p->capabilities & UART_CAP_EFR) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500581 serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B);
582 serial_out(p, UART_EFR, UART_EFR_ECB);
583 serial_out(p, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700584 }
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500585 serial_out(p, UART_IER, sleep ? UART_IERX_SLEEP : 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700586 if (p->capabilities & UART_CAP_EFR) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500587 serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B);
588 serial_out(p, UART_EFR, 0);
589 serial_out(p, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700590 }
591 }
592}
593
594#ifdef CONFIG_SERIAL_8250_RSA
595/*
596 * Attempts to turn on the RSA FIFO. Returns zero on failure.
597 * We set the port uart clock rate if we succeed.
598 */
599static int __enable_rsa(struct uart_8250_port *up)
600{
601 unsigned char mode;
602 int result;
603
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500604 mode = serial_in(up, UART_RSA_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700605 result = mode & UART_RSA_MSR_FIFO;
606
607 if (!result) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500608 serial_out(up, UART_RSA_MSR, mode | UART_RSA_MSR_FIFO);
609 mode = serial_in(up, UART_RSA_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700610 result = mode & UART_RSA_MSR_FIFO;
611 }
612
613 if (result)
614 up->port.uartclk = SERIAL_RSA_BAUD_BASE * 16;
615
616 return result;
617}
618
619static void enable_rsa(struct uart_8250_port *up)
620{
621 if (up->port.type == PORT_RSA) {
622 if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) {
623 spin_lock_irq(&up->port.lock);
624 __enable_rsa(up);
625 spin_unlock_irq(&up->port.lock);
626 }
627 if (up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16)
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500628 serial_out(up, UART_RSA_FRR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700629 }
630}
631
632/*
633 * Attempts to turn off the RSA FIFO. Returns zero on failure.
634 * It is unknown why interrupts were disabled in here. However,
635 * the caller is expected to preserve this behaviour by grabbing
636 * the spinlock before calling this function.
637 */
638static void disable_rsa(struct uart_8250_port *up)
639{
640 unsigned char mode;
641 int result;
642
643 if (up->port.type == PORT_RSA &&
644 up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) {
645 spin_lock_irq(&up->port.lock);
646
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500647 mode = serial_in(up, UART_RSA_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700648 result = !(mode & UART_RSA_MSR_FIFO);
649
650 if (!result) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500651 serial_out(up, UART_RSA_MSR, mode & ~UART_RSA_MSR_FIFO);
652 mode = serial_in(up, UART_RSA_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700653 result = !(mode & UART_RSA_MSR_FIFO);
654 }
655
656 if (result)
657 up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16;
658 spin_unlock_irq(&up->port.lock);
659 }
660}
661#endif /* CONFIG_SERIAL_8250_RSA */
662
663/*
664 * This is a quickie test to see how big the FIFO is.
665 * It doesn't work at all the time, more's the pity.
666 */
667static int size_fifo(struct uart_8250_port *up)
668{
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100669 unsigned char old_fcr, old_mcr, old_lcr;
670 unsigned short old_dl;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700671 int count;
672
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500673 old_lcr = serial_in(up, UART_LCR);
674 serial_out(up, UART_LCR, 0);
675 old_fcr = serial_in(up, UART_FCR);
676 old_mcr = serial_in(up, UART_MCR);
677 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO |
Linus Torvalds1da177e2005-04-16 15:20:36 -0700678 UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500679 serial_out(up, UART_MCR, UART_MCR_LOOP);
680 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100681 old_dl = serial_dl_read(up);
682 serial_dl_write(up, 0x0001);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500683 serial_out(up, UART_LCR, 0x03);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700684 for (count = 0; count < 256; count++)
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500685 serial_out(up, UART_TX, count);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700686 mdelay(20);/* FIXME - schedule_timeout */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500687 for (count = 0; (serial_in(up, UART_LSR) & UART_LSR_DR) &&
Linus Torvalds1da177e2005-04-16 15:20:36 -0700688 (count < 256); count++)
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500689 serial_in(up, UART_RX);
690 serial_out(up, UART_FCR, old_fcr);
691 serial_out(up, UART_MCR, old_mcr);
692 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100693 serial_dl_write(up, old_dl);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500694 serial_out(up, UART_LCR, old_lcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700695
696 return count;
697}
698
699/*
700 * Read UART ID using the divisor method - set DLL and DLM to zero
701 * and the revision will be in DLL and device type in DLM. We
702 * preserve the device state across this.
703 */
704static unsigned int autoconfig_read_divisor_id(struct uart_8250_port *p)
705{
706 unsigned char old_dll, old_dlm, old_lcr;
707 unsigned int id;
708
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500709 old_lcr = serial_in(p, UART_LCR);
710 serial_out(p, UART_LCR, UART_LCR_CONF_MODE_A);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700711
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500712 old_dll = serial_in(p, UART_DLL);
713 old_dlm = serial_in(p, UART_DLM);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700714
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500715 serial_out(p, UART_DLL, 0);
716 serial_out(p, UART_DLM, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700717
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500718 id = serial_in(p, UART_DLL) | serial_in(p, UART_DLM) << 8;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700719
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500720 serial_out(p, UART_DLL, old_dll);
721 serial_out(p, UART_DLM, old_dlm);
722 serial_out(p, UART_LCR, old_lcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700723
724 return id;
725}
726
727/*
728 * This is a helper routine to autodetect StarTech/Exar/Oxsemi UART's.
729 * When this function is called we know it is at least a StarTech
730 * 16650 V2, but it might be one of several StarTech UARTs, or one of
731 * its clones. (We treat the broken original StarTech 16650 V1 as a
732 * 16550, and why not? Startech doesn't seem to even acknowledge its
733 * existence.)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700734 *
Linus Torvalds1da177e2005-04-16 15:20:36 -0700735 * What evil have men's minds wrought...
736 */
737static void autoconfig_has_efr(struct uart_8250_port *up)
738{
739 unsigned int id1, id2, id3, rev;
740
741 /*
742 * Everything with an EFR has SLEEP
743 */
744 up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP;
745
746 /*
747 * First we check to see if it's an Oxford Semiconductor UART.
748 *
749 * If we have to do this here because some non-National
750 * Semiconductor clone chips lock up if you try writing to the
751 * LSR register (which serial_icr_read does)
752 */
753
754 /*
755 * Check for Oxford Semiconductor 16C950.
756 *
757 * EFR [4] must be set else this test fails.
758 *
759 * This shouldn't be necessary, but Mike Hudson (Exoray@isys.ca)
760 * claims that it's needed for 952 dual UART's (which are not
761 * recommended for new designs).
762 */
763 up->acr = 0;
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -0800764 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700765 serial_out(up, UART_EFR, UART_EFR_ECB);
766 serial_out(up, UART_LCR, 0x00);
767 id1 = serial_icr_read(up, UART_ID1);
768 id2 = serial_icr_read(up, UART_ID2);
769 id3 = serial_icr_read(up, UART_ID3);
770 rev = serial_icr_read(up, UART_REV);
771
772 DEBUG_AUTOCONF("950id=%02x:%02x:%02x:%02x ", id1, id2, id3, rev);
773
774 if (id1 == 0x16 && id2 == 0xC9 &&
775 (id3 == 0x50 || id3 == 0x52 || id3 == 0x54)) {
776 up->port.type = PORT_16C950;
Russell King4ba5e352005-06-23 10:43:04 +0100777
778 /*
779 * Enable work around for the Oxford Semiconductor 952 rev B
780 * chip which causes it to seriously miscalculate baud rates
781 * when DLL is 0.
782 */
783 if (id3 == 0x52 && rev == 0x01)
784 up->bugs |= UART_BUG_QUOT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700785 return;
786 }
Thomas Koellerbd71c182007-05-06 14:48:47 -0700787
Linus Torvalds1da177e2005-04-16 15:20:36 -0700788 /*
789 * We check for a XR16C850 by setting DLL and DLM to 0, and then
790 * reading back DLL and DLM. The chip type depends on the DLM
791 * value read back:
792 * 0x10 - XR16C850 and the DLL contains the chip revision.
793 * 0x12 - XR16C2850.
794 * 0x14 - XR16C854.
795 */
796 id1 = autoconfig_read_divisor_id(up);
797 DEBUG_AUTOCONF("850id=%04x ", id1);
798
799 id2 = id1 >> 8;
800 if (id2 == 0x10 || id2 == 0x12 || id2 == 0x14) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700801 up->port.type = PORT_16850;
802 return;
803 }
804
805 /*
806 * It wasn't an XR16C850.
807 *
808 * We distinguish between the '654 and the '650 by counting
809 * how many bytes are in the FIFO. I'm using this for now,
810 * since that's the technique that was sent to me in the
811 * serial driver update, but I'm not convinced this works.
812 * I've had problems doing this in the past. -TYT
813 */
814 if (size_fifo(up) == 64)
815 up->port.type = PORT_16654;
816 else
817 up->port.type = PORT_16650V2;
818}
819
820/*
821 * We detected a chip without a FIFO. Only two fall into
822 * this category - the original 8250 and the 16450. The
823 * 16450 has a scratch register (accessible with LCR=0)
824 */
825static void autoconfig_8250(struct uart_8250_port *up)
826{
827 unsigned char scratch, status1, status2;
828
829 up->port.type = PORT_8250;
830
831 scratch = serial_in(up, UART_SCR);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500832 serial_out(up, UART_SCR, 0xa5);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700833 status1 = serial_in(up, UART_SCR);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500834 serial_out(up, UART_SCR, 0x5a);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700835 status2 = serial_in(up, UART_SCR);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500836 serial_out(up, UART_SCR, scratch);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700837
838 if (status1 == 0xa5 && status2 == 0x5a)
839 up->port.type = PORT_16450;
840}
841
842static int broken_efr(struct uart_8250_port *up)
843{
844 /*
845 * Exar ST16C2550 "A2" devices incorrectly detect as
846 * having an EFR, and report an ID of 0x0201. See
Justin P. Mattock631dd1a2010-10-18 11:03:14 +0200847 * http://linux.derkeiler.com/Mailing-Lists/Kernel/2004-11/4812.html
Linus Torvalds1da177e2005-04-16 15:20:36 -0700848 */
849 if (autoconfig_read_divisor_id(up) == 0x0201 && size_fifo(up) == 16)
850 return 1;
851
852 return 0;
853}
854
Yin Kangkai0d0389e2011-02-09 11:35:18 +0800855static inline int ns16550a_goto_highspeed(struct uart_8250_port *up)
856{
857 unsigned char status;
858
859 status = serial_in(up, 0x04); /* EXCR2 */
860#define PRESL(x) ((x) & 0x30)
861 if (PRESL(status) == 0x10) {
862 /* already in high speed mode */
863 return 0;
864 } else {
865 status &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */
866 status |= 0x10; /* 1.625 divisor for baud_base --> 921600 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500867 serial_out(up, 0x04, status);
Yin Kangkai0d0389e2011-02-09 11:35:18 +0800868 }
869 return 1;
870}
871
Linus Torvalds1da177e2005-04-16 15:20:36 -0700872/*
873 * We know that the chip has FIFOs. Does it have an EFR? The
874 * EFR is located in the same register position as the IIR and
875 * we know the top two bits of the IIR are currently set. The
876 * EFR should contain zero. Try to read the EFR.
877 */
878static void autoconfig_16550a(struct uart_8250_port *up)
879{
880 unsigned char status1, status2;
881 unsigned int iersave;
882
883 up->port.type = PORT_16550A;
884 up->capabilities |= UART_CAP_FIFO;
885
886 /*
887 * Check for presence of the EFR when DLAB is set.
888 * Only ST16C650V1 UARTs pass this test.
889 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500890 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700891 if (serial_in(up, UART_EFR) == 0) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500892 serial_out(up, UART_EFR, 0xA8);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700893 if (serial_in(up, UART_EFR) != 0) {
894 DEBUG_AUTOCONF("EFRv1 ");
895 up->port.type = PORT_16650;
896 up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP;
897 } else {
898 DEBUG_AUTOCONF("Motorola 8xxx DUART ");
899 }
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500900 serial_out(up, UART_EFR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700901 return;
902 }
903
904 /*
905 * Maybe it requires 0xbf to be written to the LCR.
906 * (other ST16C650V2 UARTs, TI16C752A, etc)
907 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500908 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700909 if (serial_in(up, UART_EFR) == 0 && !broken_efr(up)) {
910 DEBUG_AUTOCONF("EFRv2 ");
911 autoconfig_has_efr(up);
912 return;
913 }
914
915 /*
916 * Check for a National Semiconductor SuperIO chip.
917 * Attempt to switch to bank 2, read the value of the LOOP bit
918 * from EXCR1. Switch back to bank 0, change it in MCR. Then
919 * switch back to bank 2, read it from EXCR1 again and check
920 * it's changed. If so, set baud_base in EXCR2 to 921600. -- dwmw2
Linus Torvalds1da177e2005-04-16 15:20:36 -0700921 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500922 serial_out(up, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700923 status1 = serial_in(up, UART_MCR);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500924 serial_out(up, UART_LCR, 0xE0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700925 status2 = serial_in(up, 0x02); /* EXCR1 */
926
927 if (!((status2 ^ status1) & UART_MCR_LOOP)) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500928 serial_out(up, UART_LCR, 0);
929 serial_out(up, UART_MCR, status1 ^ UART_MCR_LOOP);
930 serial_out(up, UART_LCR, 0xE0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700931 status2 = serial_in(up, 0x02); /* EXCR1 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500932 serial_out(up, UART_LCR, 0);
933 serial_out(up, UART_MCR, status1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700934
935 if ((status2 ^ status1) & UART_MCR_LOOP) {
David Woodhouse857dde22005-05-21 15:52:23 +0100936 unsigned short quot;
937
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500938 serial_out(up, UART_LCR, 0xE0);
David Woodhouse857dde22005-05-21 15:52:23 +0100939
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100940 quot = serial_dl_read(up);
David Woodhouse857dde22005-05-21 15:52:23 +0100941 quot <<= 3;
942
Yin Kangkai0d0389e2011-02-09 11:35:18 +0800943 if (ns16550a_goto_highspeed(up))
944 serial_dl_write(up, quot);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700945
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500946 serial_out(up, UART_LCR, 0);
David Woodhouse857dde22005-05-21 15:52:23 +0100947
948 up->port.uartclk = 921600*16;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700949 up->port.type = PORT_NS16550A;
950 up->capabilities |= UART_NATSEMI;
951 return;
952 }
953 }
954
955 /*
956 * No EFR. Try to detect a TI16750, which only sets bit 5 of
957 * the IIR when 64 byte FIFO mode is enabled when DLAB is set.
958 * Try setting it with and without DLAB set. Cheap clones
959 * set bit 5 without DLAB set.
960 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500961 serial_out(up, UART_LCR, 0);
962 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700963 status1 = serial_in(up, UART_IIR) >> 5;
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500964 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
965 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
966 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700967 status2 = serial_in(up, UART_IIR) >> 5;
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500968 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
969 serial_out(up, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700970
971 DEBUG_AUTOCONF("iir1=%d iir2=%d ", status1, status2);
972
973 if (status1 == 6 && status2 == 7) {
974 up->port.type = PORT_16750;
975 up->capabilities |= UART_CAP_AFE | UART_CAP_SLEEP;
976 return;
977 }
978
979 /*
980 * Try writing and reading the UART_IER_UUE bit (b6).
981 * If it works, this is probably one of the Xscale platform's
982 * internal UARTs.
983 * We're going to explicitly set the UUE bit to 0 before
984 * trying to write and read a 1 just to make sure it's not
985 * already a 1 and maybe locked there before we even start start.
986 */
987 iersave = serial_in(up, UART_IER);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500988 serial_out(up, UART_IER, iersave & ~UART_IER_UUE);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700989 if (!(serial_in(up, UART_IER) & UART_IER_UUE)) {
990 /*
991 * OK it's in a known zero state, try writing and reading
992 * without disturbing the current state of the other bits.
993 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500994 serial_out(up, UART_IER, iersave | UART_IER_UUE);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700995 if (serial_in(up, UART_IER) & UART_IER_UUE) {
996 /*
997 * It's an Xscale.
998 * We'll leave the UART_IER_UUE bit set to 1 (enabled).
999 */
1000 DEBUG_AUTOCONF("Xscale ");
1001 up->port.type = PORT_XSCALE;
Stephen Warren55681812011-06-17 09:45:07 -06001002 up->capabilities |= UART_CAP_UUE | UART_CAP_RTOIE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001003 return;
1004 }
1005 } else {
1006 /*
1007 * If we got here we couldn't force the IER_UUE bit to 0.
1008 * Log it and continue.
1009 */
1010 DEBUG_AUTOCONF("Couldn't force IER_UUE to 0 ");
1011 }
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001012 serial_out(up, UART_IER, iersave);
Philippe Langlais235dae52010-07-29 17:13:57 +02001013
1014 /*
Søren Holm06315342011-09-02 22:55:37 +02001015 * Exar uarts have EFR in a weird location
1016 */
1017 if (up->port.flags & UPF_EXAR_EFR) {
1018 up->port.type = PORT_XR17D15X;
1019 up->capabilities |= UART_CAP_AFE | UART_CAP_EFR;
1020 }
1021
1022 /*
Philippe Langlais235dae52010-07-29 17:13:57 +02001023 * We distinguish between 16550A and U6 16550A by counting
1024 * how many bytes are in the FIFO.
1025 */
1026 if (up->port.type == PORT_16550A && size_fifo(up) == 64) {
1027 up->port.type = PORT_U6_16550A;
1028 up->capabilities |= UART_CAP_AFE;
1029 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001030}
1031
1032/*
1033 * This routine is called by rs_init() to initialize a specific serial
1034 * port. It determines what type of UART chip this serial port is
1035 * using: 8250, 16450, 16550, 16550A. The important question is
1036 * whether or not this UART is a 16550A or not, since this will
1037 * determine whether or not we can use its FIFO features or not.
1038 */
1039static void autoconfig(struct uart_8250_port *up, unsigned int probeflags)
1040{
1041 unsigned char status1, scratch, scratch2, scratch3;
1042 unsigned char save_lcr, save_mcr;
1043 unsigned long flags;
1044
1045 if (!up->port.iobase && !up->port.mapbase && !up->port.membase)
1046 return;
1047
Lennert Buytenhek80647b92009-11-11 14:26:41 -08001048 DEBUG_AUTOCONF("ttyS%d: autoconf (0x%04lx, 0x%p): ",
David S. Miller84408382008-10-13 10:45:26 +01001049 serial_index(&up->port), up->port.iobase, up->port.membase);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001050
1051 /*
1052 * We really do need global IRQs disabled here - we're going to
1053 * be frobbing the chips IRQ enable register to see if it exists.
1054 */
1055 spin_lock_irqsave(&up->port.lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001056
1057 up->capabilities = 0;
Russell King4ba5e352005-06-23 10:43:04 +01001058 up->bugs = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001059
1060 if (!(up->port.flags & UPF_BUGGY_UART)) {
1061 /*
1062 * Do a simple existence test first; if we fail this,
1063 * there's no point trying anything else.
Thomas Koellerbd71c182007-05-06 14:48:47 -07001064 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001065 * 0x80 is used as a nonsense port to prevent against
1066 * false positives due to ISA bus float. The
1067 * assumption is that 0x80 is a non-existent port;
1068 * which should be safe since include/asm/io.h also
1069 * makes this assumption.
1070 *
1071 * Note: this is safe as long as MCR bit 4 is clear
1072 * and the device is in "PC" mode.
1073 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001074 scratch = serial_in(up, UART_IER);
1075 serial_out(up, UART_IER, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001076#ifdef __i386__
1077 outb(0xff, 0x080);
1078#endif
Thomas Hoehn48212002007-02-10 01:46:05 -08001079 /*
1080 * Mask out IER[7:4] bits for test as some UARTs (e.g. TL
1081 * 16C754B) allow only to modify them if an EFR bit is set.
1082 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001083 scratch2 = serial_in(up, UART_IER) & 0x0f;
1084 serial_out(up, UART_IER, 0x0F);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001085#ifdef __i386__
1086 outb(0, 0x080);
1087#endif
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001088 scratch3 = serial_in(up, UART_IER) & 0x0f;
1089 serial_out(up, UART_IER, scratch);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001090 if (scratch2 != 0 || scratch3 != 0x0F) {
1091 /*
1092 * We failed; there's nothing here
1093 */
1094 DEBUG_AUTOCONF("IER test failed (%02x, %02x) ",
1095 scratch2, scratch3);
1096 goto out;
1097 }
1098 }
1099
1100 save_mcr = serial_in(up, UART_MCR);
1101 save_lcr = serial_in(up, UART_LCR);
1102
Thomas Koellerbd71c182007-05-06 14:48:47 -07001103 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001104 * Check to see if a UART is really there. Certain broken
1105 * internal modems based on the Rockwell chipset fail this
1106 * test, because they apparently don't implement the loopback
1107 * test mode. So this test is skipped on the COM 1 through
1108 * COM 4 ports. This *should* be safe, since no board
1109 * manufacturer would be stupid enough to design a board
1110 * that conflicts with COM 1-4 --- we hope!
1111 */
1112 if (!(up->port.flags & UPF_SKIP_TEST)) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001113 serial_out(up, UART_MCR, UART_MCR_LOOP | 0x0A);
1114 status1 = serial_in(up, UART_MSR) & 0xF0;
1115 serial_out(up, UART_MCR, save_mcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001116 if (status1 != 0x90) {
1117 DEBUG_AUTOCONF("LOOP test failed (%02x) ",
1118 status1);
1119 goto out;
1120 }
1121 }
1122
1123 /*
1124 * We're pretty sure there's a port here. Lets find out what
1125 * type of port it is. The IIR top two bits allows us to find
Russell King6f0d6182005-09-09 16:17:58 +01001126 * out if it's 8250 or 16450, 16550, 16550A or later. This
Linus Torvalds1da177e2005-04-16 15:20:36 -07001127 * determines what we test for next.
1128 *
1129 * We also initialise the EFR (if any) to zero for later. The
1130 * EFR occupies the same register location as the FCR and IIR.
1131 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001132 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
1133 serial_out(up, UART_EFR, 0);
1134 serial_out(up, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001135
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001136 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001137 scratch = serial_in(up, UART_IIR) >> 6;
1138
1139 DEBUG_AUTOCONF("iir=%d ", scratch);
1140
1141 switch (scratch) {
1142 case 0:
1143 autoconfig_8250(up);
1144 break;
1145 case 1:
1146 up->port.type = PORT_UNKNOWN;
1147 break;
1148 case 2:
1149 up->port.type = PORT_16550;
1150 break;
1151 case 3:
1152 autoconfig_16550a(up);
1153 break;
1154 }
1155
1156#ifdef CONFIG_SERIAL_8250_RSA
1157 /*
1158 * Only probe for RSA ports if we got the region.
1159 */
1160 if (up->port.type == PORT_16550A && probeflags & PROBE_RSA) {
1161 int i;
1162
1163 for (i = 0 ; i < probe_rsa_count; ++i) {
1164 if (probe_rsa[i] == up->port.iobase &&
1165 __enable_rsa(up)) {
1166 up->port.type = PORT_RSA;
1167 break;
1168 }
1169 }
1170 }
1171#endif
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00001172
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001173 serial_out(up, UART_LCR, save_lcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001174
1175 if (up->capabilities != uart_config[up->port.type].flags) {
1176 printk(KERN_WARNING
1177 "ttyS%d: detected caps %08x should be %08x\n",
David S. Miller84408382008-10-13 10:45:26 +01001178 serial_index(&up->port), up->capabilities,
1179 uart_config[up->port.type].flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001180 }
1181
1182 up->port.fifosize = uart_config[up->port.type].fifo_size;
1183 up->capabilities = uart_config[up->port.type].flags;
1184 up->tx_loadsz = uart_config[up->port.type].tx_loadsz;
1185
1186 if (up->port.type == PORT_UNKNOWN)
1187 goto out;
1188
1189 /*
1190 * Reset the UART.
1191 */
1192#ifdef CONFIG_SERIAL_8250_RSA
1193 if (up->port.type == PORT_RSA)
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001194 serial_out(up, UART_RSA_FRR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001195#endif
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001196 serial_out(up, UART_MCR, save_mcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001197 serial8250_clear_fifos(up);
Alex Williamson40b36da2007-02-14 00:33:04 -08001198 serial_in(up, UART_RX);
Lennert Buytenhek5c8c7552005-11-12 21:58:05 +00001199 if (up->capabilities & UART_CAP_UUE)
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001200 serial_out(up, UART_IER, UART_IER_UUE);
Lennert Buytenhek5c8c7552005-11-12 21:58:05 +00001201 else
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001202 serial_out(up, UART_IER, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001203
Thomas Koellerbd71c182007-05-06 14:48:47 -07001204 out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001205 spin_unlock_irqrestore(&up->port.lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001206 DEBUG_AUTOCONF("type=%s\n", uart_config[up->port.type].name);
1207}
1208
1209static void autoconfig_irq(struct uart_8250_port *up)
1210{
1211 unsigned char save_mcr, save_ier;
1212 unsigned char save_ICP = 0;
1213 unsigned int ICP = 0;
1214 unsigned long irqs;
1215 int irq;
1216
1217 if (up->port.flags & UPF_FOURPORT) {
1218 ICP = (up->port.iobase & 0xfe0) | 0x1f;
1219 save_ICP = inb_p(ICP);
1220 outb_p(0x80, ICP);
Paul Gortmaker0d263a22012-03-08 19:12:10 -05001221 inb_p(ICP);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001222 }
1223
1224 /* forget possible initially masked and pending IRQ */
1225 probe_irq_off(probe_irq_on());
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001226 save_mcr = serial_in(up, UART_MCR);
1227 save_ier = serial_in(up, UART_IER);
1228 serial_out(up, UART_MCR, UART_MCR_OUT1 | UART_MCR_OUT2);
Thomas Koellerbd71c182007-05-06 14:48:47 -07001229
Linus Torvalds1da177e2005-04-16 15:20:36 -07001230 irqs = probe_irq_on();
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001231 serial_out(up, UART_MCR, 0);
Alan Cox6f803cd2008-02-08 04:18:52 -08001232 udelay(10);
1233 if (up->port.flags & UPF_FOURPORT) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001234 serial_out(up, UART_MCR,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001235 UART_MCR_DTR | UART_MCR_RTS);
1236 } else {
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001237 serial_out(up, UART_MCR,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001238 UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2);
1239 }
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001240 serial_out(up, UART_IER, 0x0f); /* enable all intrs */
Paul Gortmaker0d263a22012-03-08 19:12:10 -05001241 serial_in(up, UART_LSR);
1242 serial_in(up, UART_RX);
1243 serial_in(up, UART_IIR);
1244 serial_in(up, UART_MSR);
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001245 serial_out(up, UART_TX, 0xFF);
Alan Cox6f803cd2008-02-08 04:18:52 -08001246 udelay(20);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001247 irq = probe_irq_off(irqs);
1248
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001249 serial_out(up, UART_MCR, save_mcr);
1250 serial_out(up, UART_IER, save_ier);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001251
1252 if (up->port.flags & UPF_FOURPORT)
1253 outb_p(save_ICP, ICP);
1254
1255 up->port.irq = (irq > 0) ? irq : 0;
1256}
1257
Russell Kinge763b902005-06-29 18:41:51 +01001258static inline void __stop_tx(struct uart_8250_port *p)
1259{
1260 if (p->ier & UART_IER_THRI) {
1261 p->ier &= ~UART_IER_THRI;
1262 serial_out(p, UART_IER, p->ier);
1263 }
1264}
1265
Russell Kingb129a8c2005-08-31 10:12:14 +01001266static void serial8250_stop_tx(struct uart_port *port)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001267{
Jamie Iles49d57412010-12-01 23:39:35 +00001268 struct uart_8250_port *up =
1269 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001270
Russell Kinge763b902005-06-29 18:41:51 +01001271 __stop_tx(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001272
1273 /*
Russell Kinge763b902005-06-29 18:41:51 +01001274 * We really want to stop the transmitter from sending.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001275 */
Russell Kinge763b902005-06-29 18:41:51 +01001276 if (up->port.type == PORT_16C950) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001277 up->acr |= UART_ACR_TXDIS;
1278 serial_icr_write(up, UART_ACR, up->acr);
1279 }
1280}
1281
Russell Kingb129a8c2005-08-31 10:12:14 +01001282static void serial8250_start_tx(struct uart_port *port)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001283{
Jamie Iles49d57412010-12-01 23:39:35 +00001284 struct uart_8250_port *up =
1285 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001286
1287 if (!(up->ier & UART_IER_THRI)) {
1288 up->ier |= UART_IER_THRI;
1289 serial_out(up, UART_IER, up->ier);
Russell King55d3b282005-06-23 15:05:41 +01001290
Russell King67f76542005-06-23 22:26:43 +01001291 if (up->bugs & UART_BUG_TXEN) {
Ian Jackson68cb4f82009-11-18 11:08:11 +01001292 unsigned char lsr;
Russell King55d3b282005-06-23 15:05:41 +01001293 lsr = serial_in(up, UART_LSR);
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001294 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
Thomas Koellerbd71c182007-05-06 14:48:47 -07001295 if ((up->port.type == PORT_RM9000) ?
Ian Jackson68cb4f82009-11-18 11:08:11 +01001296 (lsr & UART_LSR_THRE) :
1297 (lsr & UART_LSR_TEMT))
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001298 serial8250_tx_chars(up);
Russell King55d3b282005-06-23 15:05:41 +01001299 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001300 }
Russell Kinge763b902005-06-29 18:41:51 +01001301
Linus Torvalds1da177e2005-04-16 15:20:36 -07001302 /*
Russell Kinge763b902005-06-29 18:41:51 +01001303 * Re-enable the transmitter if we disabled it.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001304 */
Russell Kinge763b902005-06-29 18:41:51 +01001305 if (up->port.type == PORT_16C950 && up->acr & UART_ACR_TXDIS) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001306 up->acr &= ~UART_ACR_TXDIS;
1307 serial_icr_write(up, UART_ACR, up->acr);
1308 }
1309}
1310
1311static void serial8250_stop_rx(struct uart_port *port)
1312{
Jamie Iles49d57412010-12-01 23:39:35 +00001313 struct uart_8250_port *up =
1314 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001315
1316 up->ier &= ~UART_IER_RLSI;
1317 up->port.read_status_mask &= ~UART_LSR_DR;
1318 serial_out(up, UART_IER, up->ier);
1319}
1320
1321static void serial8250_enable_ms(struct uart_port *port)
1322{
Jamie Iles49d57412010-12-01 23:39:35 +00001323 struct uart_8250_port *up =
1324 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001325
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00001326 /* no MSR capabilities */
1327 if (up->bugs & UART_BUG_NOMSR)
1328 return;
1329
Linus Torvalds1da177e2005-04-16 15:20:36 -07001330 up->ier |= UART_IER_MSI;
1331 serial_out(up, UART_IER, up->ier);
1332}
1333
Stephen Warren5f873ba2011-05-17 16:12:37 -06001334/*
1335 * Clear the Tegra rx fifo after a break
1336 *
1337 * FIXME: This needs to become a port specific callback once we have a
1338 * framework for this
1339 */
1340static void clear_rx_fifo(struct uart_8250_port *up)
1341{
1342 unsigned int status, tmout = 10000;
1343 do {
1344 status = serial_in(up, UART_LSR);
1345 if (status & (UART_LSR_FIFOE | UART_LSR_BRK_ERROR_BITS))
1346 status = serial_in(up, UART_RX);
1347 else
1348 break;
1349 if (--tmout == 0)
1350 break;
1351 udelay(1);
1352 } while (1);
1353}
1354
Paul Gortmaker0690f412011-12-04 18:42:19 -05001355/*
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001356 * serial8250_rx_chars: processes according to the passed in LSR
Paul Gortmaker0690f412011-12-04 18:42:19 -05001357 * value, and returns the remaining LSR bits not handled
1358 * by this Rx routine.
1359 */
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001360unsigned char
1361serial8250_rx_chars(struct uart_8250_port *up, unsigned char lsr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001362{
Alan Coxebd2c8f2009-09-19 13:13:28 -07001363 struct tty_struct *tty = up->port.state->port.tty;
Paul Gortmaker0690f412011-12-04 18:42:19 -05001364 unsigned char ch;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001365 int max_count = 256;
1366 char flag;
1367
1368 do {
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001369 if (likely(lsr & UART_LSR_DR))
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001370 ch = serial_in(up, UART_RX);
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001371 else
1372 /*
1373 * Intel 82571 has a Serial Over Lan device that will
1374 * set UART_LSR_BI without setting UART_LSR_DR when
1375 * it receives a break. To avoid reading from the
1376 * receive buffer without UART_LSR_DR bit set, we
1377 * just force the read character to be 0
1378 */
1379 ch = 0;
1380
Linus Torvalds1da177e2005-04-16 15:20:36 -07001381 flag = TTY_NORMAL;
1382 up->port.icount.rx++;
1383
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001384 lsr |= up->lsr_saved_flags;
1385 up->lsr_saved_flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001386
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001387 if (unlikely(lsr & UART_LSR_BRK_ERROR_BITS)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001388 /*
1389 * For statistics only
1390 */
1391 if (lsr & UART_LSR_BI) {
1392 lsr &= ~(UART_LSR_FE | UART_LSR_PE);
1393 up->port.icount.brk++;
1394 /*
Stephen Warren5f873ba2011-05-17 16:12:37 -06001395 * If tegra port then clear the rx fifo to
1396 * accept another break/character.
1397 */
1398 if (up->port.type == PORT_TEGRA)
1399 clear_rx_fifo(up);
1400
1401 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001402 * We do the SysRQ and SAK checking
1403 * here because otherwise the break
1404 * may get masked by ignore_status_mask
1405 * or read_status_mask.
1406 */
1407 if (uart_handle_break(&up->port))
1408 goto ignore_char;
1409 } else if (lsr & UART_LSR_PE)
1410 up->port.icount.parity++;
1411 else if (lsr & UART_LSR_FE)
1412 up->port.icount.frame++;
1413 if (lsr & UART_LSR_OE)
1414 up->port.icount.overrun++;
1415
1416 /*
Russell King23907eb2005-04-16 15:26:39 -07001417 * Mask off conditions which should be ignored.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001418 */
1419 lsr &= up->port.read_status_mask;
1420
1421 if (lsr & UART_LSR_BI) {
1422 DEBUG_INTR("handling break....");
1423 flag = TTY_BREAK;
1424 } else if (lsr & UART_LSR_PE)
1425 flag = TTY_PARITY;
1426 else if (lsr & UART_LSR_FE)
1427 flag = TTY_FRAME;
1428 }
David Howells7d12e782006-10-05 14:55:46 +01001429 if (uart_handle_sysrq_char(&up->port, ch))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001430 goto ignore_char;
Russell King05ab3012005-05-09 23:21:59 +01001431
1432 uart_insert_char(&up->port, lsr, UART_LSR_OE, ch, flag);
1433
Alan Cox6f803cd2008-02-08 04:18:52 -08001434ignore_char:
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001435 lsr = serial_in(up, UART_LSR);
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001436 } while ((lsr & (UART_LSR_DR | UART_LSR_BI)) && (max_count-- > 0));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001437 spin_unlock(&up->port.lock);
1438 tty_flip_buffer_push(tty);
1439 spin_lock(&up->port.lock);
Paul Gortmaker0690f412011-12-04 18:42:19 -05001440 return lsr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001441}
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001442EXPORT_SYMBOL_GPL(serial8250_rx_chars);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001443
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001444void serial8250_tx_chars(struct uart_8250_port *up)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001445{
Alan Coxebd2c8f2009-09-19 13:13:28 -07001446 struct circ_buf *xmit = &up->port.state->xmit;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001447 int count;
1448
1449 if (up->port.x_char) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001450 serial_out(up, UART_TX, up->port.x_char);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001451 up->port.icount.tx++;
1452 up->port.x_char = 0;
1453 return;
1454 }
Russell Kingb129a8c2005-08-31 10:12:14 +01001455 if (uart_tx_stopped(&up->port)) {
1456 serial8250_stop_tx(&up->port);
1457 return;
1458 }
1459 if (uart_circ_empty(xmit)) {
Russell Kinge763b902005-06-29 18:41:51 +01001460 __stop_tx(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001461 return;
1462 }
1463
1464 count = up->tx_loadsz;
1465 do {
1466 serial_out(up, UART_TX, xmit->buf[xmit->tail]);
1467 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
1468 up->port.icount.tx++;
1469 if (uart_circ_empty(xmit))
1470 break;
1471 } while (--count > 0);
1472
1473 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
1474 uart_write_wakeup(&up->port);
1475
1476 DEBUG_INTR("THRE...");
1477
1478 if (uart_circ_empty(xmit))
Russell Kinge763b902005-06-29 18:41:51 +01001479 __stop_tx(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001480}
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001481EXPORT_SYMBOL_GPL(serial8250_tx_chars);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001482
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001483unsigned int serial8250_modem_status(struct uart_8250_port *up)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001484{
Russell King2af7cd62006-01-04 16:55:09 +00001485 unsigned int status = serial_in(up, UART_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001486
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001487 status |= up->msr_saved_flags;
1488 up->msr_saved_flags = 0;
Taku Izumifdc30b32007-04-23 14:41:00 -07001489 if (status & UART_MSR_ANY_DELTA && up->ier & UART_IER_MSI &&
Alan Coxebd2c8f2009-09-19 13:13:28 -07001490 up->port.state != NULL) {
Russell King2af7cd62006-01-04 16:55:09 +00001491 if (status & UART_MSR_TERI)
1492 up->port.icount.rng++;
1493 if (status & UART_MSR_DDSR)
1494 up->port.icount.dsr++;
1495 if (status & UART_MSR_DDCD)
1496 uart_handle_dcd_change(&up->port, status & UART_MSR_DCD);
1497 if (status & UART_MSR_DCTS)
1498 uart_handle_cts_change(&up->port, status & UART_MSR_CTS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001499
Alan Coxbdc04e32009-09-19 13:13:31 -07001500 wake_up_interruptible(&up->port.state->port.delta_msr_wait);
Russell King2af7cd62006-01-04 16:55:09 +00001501 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001502
Russell King2af7cd62006-01-04 16:55:09 +00001503 return status;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001504}
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001505EXPORT_SYMBOL_GPL(serial8250_modem_status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001506
1507/*
1508 * This handles the interrupt from one port.
1509 */
Paul Gortmaker86b21192011-12-04 18:42:22 -05001510int serial8250_handle_irq(struct uart_port *port, unsigned int iir)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001511{
Paul Gortmaker0690f412011-12-04 18:42:19 -05001512 unsigned char status;
Jiri Kosina4bf36312007-04-23 14:41:21 -07001513 unsigned long flags;
Paul Gortmaker86b21192011-12-04 18:42:22 -05001514 struct uart_8250_port *up =
1515 container_of(port, struct uart_8250_port, port);
1516
1517 if (iir & UART_IIR_NO_INT)
1518 return 0;
Russell King45e24602006-01-04 19:19:06 +00001519
Jiri Kosina4bf36312007-04-23 14:41:21 -07001520 spin_lock_irqsave(&up->port.lock, flags);
Russell King45e24602006-01-04 19:19:06 +00001521
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001522 status = serial_in(up, UART_LSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001523
1524 DEBUG_INTR("status = %x...", status);
1525
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001526 if (status & (UART_LSR_DR | UART_LSR_BI))
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001527 status = serial8250_rx_chars(up, status);
1528 serial8250_modem_status(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001529 if (status & UART_LSR_THRE)
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001530 serial8250_tx_chars(up);
Russell King45e24602006-01-04 19:19:06 +00001531
Jiri Kosina4bf36312007-04-23 14:41:21 -07001532 spin_unlock_irqrestore(&up->port.lock, flags);
Paul Gortmaker86b21192011-12-04 18:42:22 -05001533 return 1;
Jamie Iles583d28e2011-08-15 10:17:52 +01001534}
Jamie Ilesc7a1bdc2011-08-26 19:04:49 +01001535EXPORT_SYMBOL_GPL(serial8250_handle_irq);
Jamie Iles583d28e2011-08-15 10:17:52 +01001536
1537static int serial8250_default_handle_irq(struct uart_port *port)
1538{
1539 struct uart_8250_port *up =
1540 container_of(port, struct uart_8250_port, port);
1541 unsigned int iir = serial_in(up, UART_IIR);
1542
1543 return serial8250_handle_irq(port, iir);
1544}
1545
Linus Torvalds1da177e2005-04-16 15:20:36 -07001546/*
1547 * This is the serial driver's interrupt routine.
1548 *
1549 * Arjan thinks the old way was overly complex, so it got simplified.
1550 * Alan disagrees, saying that need the complexity to handle the weird
1551 * nature of ISA shared interrupts. (This is a special exception.)
1552 *
1553 * In order to handle ISA shared interrupts properly, we need to check
1554 * that all ports have been serviced, and therefore the ISA interrupt
1555 * line has been de-asserted.
1556 *
1557 * This means we need to loop through all ports. checking that they
1558 * don't have an interrupt pending.
1559 */
David Howells7d12e782006-10-05 14:55:46 +01001560static irqreturn_t serial8250_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001561{
1562 struct irq_info *i = dev_id;
1563 struct list_head *l, *end = NULL;
1564 int pass_counter = 0, handled = 0;
1565
1566 DEBUG_INTR("serial8250_interrupt(%d)...", irq);
1567
1568 spin_lock(&i->lock);
1569
1570 l = i->head;
1571 do {
1572 struct uart_8250_port *up;
Jamie Iles583d28e2011-08-15 10:17:52 +01001573 struct uart_port *port;
Dan Williams448ac152011-11-22 13:41:24 -08001574 bool skip;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001575
1576 up = list_entry(l, struct uart_8250_port, list);
Jamie Iles583d28e2011-08-15 10:17:52 +01001577 port = &up->port;
Dan Williams448ac152011-11-22 13:41:24 -08001578 skip = pass_counter && up->port.flags & UPF_IIR_ONCE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001579
Dan Williams448ac152011-11-22 13:41:24 -08001580 if (!skip && port->handle_irq(port)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001581 handled = 1;
Marc St-Jeanbeab6972007-05-06 14:48:45 -07001582 end = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001583 } else if (end == NULL)
1584 end = l;
1585
1586 l = l->next;
1587
1588 if (l == i->head && pass_counter++ > PASS_LIMIT) {
1589 /* If we hit this, we're dead. */
Daniel Drakecd3ecad2010-10-20 16:00:48 -07001590 printk_ratelimited(KERN_ERR
1591 "serial8250: too much work for irq%d\n", irq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001592 break;
1593 }
1594 } while (l != end);
1595
1596 spin_unlock(&i->lock);
1597
1598 DEBUG_INTR("end.\n");
1599
1600 return IRQ_RETVAL(handled);
1601}
1602
1603/*
1604 * To support ISA shared interrupts, we need to have one interrupt
1605 * handler that ensures that the IRQ line has been deasserted
1606 * before returning. Failing to do this will result in the IRQ
1607 * line being stuck active, and, since ISA irqs are edge triggered,
1608 * no more IRQs will be seen.
1609 */
1610static void serial_do_unlink(struct irq_info *i, struct uart_8250_port *up)
1611{
1612 spin_lock_irq(&i->lock);
1613
1614 if (!list_empty(i->head)) {
1615 if (i->head == &up->list)
1616 i->head = i->head->next;
1617 list_del(&up->list);
1618 } else {
1619 BUG_ON(i->head != &up->list);
1620 i->head = NULL;
1621 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001622 spin_unlock_irq(&i->lock);
Alan Cox25db8ad2008-08-19 20:49:40 -07001623 /* List empty so throw away the hash node */
1624 if (i->head == NULL) {
1625 hlist_del(&i->node);
1626 kfree(i);
1627 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001628}
1629
1630static int serial_link_irq_chain(struct uart_8250_port *up)
1631{
Alan Cox25db8ad2008-08-19 20:49:40 -07001632 struct hlist_head *h;
1633 struct hlist_node *n;
1634 struct irq_info *i;
Thomas Gleixner40663cc2006-07-01 19:29:43 -07001635 int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? IRQF_SHARED : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001636
Alan Cox25db8ad2008-08-19 20:49:40 -07001637 mutex_lock(&hash_mutex);
1638
1639 h = &irq_lists[up->port.irq % NR_IRQ_HASH];
1640
1641 hlist_for_each(n, h) {
1642 i = hlist_entry(n, struct irq_info, node);
1643 if (i->irq == up->port.irq)
1644 break;
1645 }
1646
1647 if (n == NULL) {
1648 i = kzalloc(sizeof(struct irq_info), GFP_KERNEL);
1649 if (i == NULL) {
1650 mutex_unlock(&hash_mutex);
1651 return -ENOMEM;
1652 }
1653 spin_lock_init(&i->lock);
1654 i->irq = up->port.irq;
1655 hlist_add_head(&i->node, h);
1656 }
1657 mutex_unlock(&hash_mutex);
1658
Linus Torvalds1da177e2005-04-16 15:20:36 -07001659 spin_lock_irq(&i->lock);
1660
1661 if (i->head) {
1662 list_add(&up->list, i->head);
1663 spin_unlock_irq(&i->lock);
1664
1665 ret = 0;
1666 } else {
1667 INIT_LIST_HEAD(&up->list);
1668 i->head = &up->list;
1669 spin_unlock_irq(&i->lock);
Vikram Pandita1c2f0492009-09-19 13:13:19 -07001670 irq_flags |= up->port.irqflags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001671 ret = request_irq(up->port.irq, serial8250_interrupt,
1672 irq_flags, "serial", i);
1673 if (ret < 0)
1674 serial_do_unlink(i, up);
1675 }
1676
1677 return ret;
1678}
1679
1680static void serial_unlink_irq_chain(struct uart_8250_port *up)
1681{
Alan Cox25db8ad2008-08-19 20:49:40 -07001682 struct irq_info *i;
1683 struct hlist_node *n;
1684 struct hlist_head *h;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001685
Alan Cox25db8ad2008-08-19 20:49:40 -07001686 mutex_lock(&hash_mutex);
1687
1688 h = &irq_lists[up->port.irq % NR_IRQ_HASH];
1689
1690 hlist_for_each(n, h) {
1691 i = hlist_entry(n, struct irq_info, node);
1692 if (i->irq == up->port.irq)
1693 break;
1694 }
1695
1696 BUG_ON(n == NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001697 BUG_ON(i->head == NULL);
1698
1699 if (list_empty(i->head))
1700 free_irq(up->port.irq, i);
1701
1702 serial_do_unlink(i, up);
Alan Cox25db8ad2008-08-19 20:49:40 -07001703 mutex_unlock(&hash_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001704}
1705
1706/*
1707 * This function is used to handle ports that do not have an
1708 * interrupt. This doesn't work very well for 16450's, but gives
1709 * barely passable results for a 16550A. (Although at the expense
1710 * of much CPU overhead).
1711 */
1712static void serial8250_timeout(unsigned long data)
1713{
1714 struct uart_8250_port *up = (struct uart_8250_port *)data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001715
Paul Gortmakera0431472011-12-04 18:42:21 -05001716 up->port.handle_irq(&up->port);
Anton Vorontsov54381062010-10-01 17:21:25 +04001717 mod_timer(&up->timer, jiffies + uart_poll_timeout(&up->port));
Alex Williamson40b36da2007-02-14 00:33:04 -08001718}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001719
Alex Williamson40b36da2007-02-14 00:33:04 -08001720static void serial8250_backup_timeout(unsigned long data)
1721{
1722 struct uart_8250_port *up = (struct uart_8250_port *)data;
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001723 unsigned int iir, ier = 0, lsr;
1724 unsigned long flags;
Alex Williamson40b36da2007-02-14 00:33:04 -08001725
Al Cooperdbb3b1c2011-07-25 16:19:52 -04001726 spin_lock_irqsave(&up->port.lock, flags);
1727
Alex Williamson40b36da2007-02-14 00:33:04 -08001728 /*
1729 * Must disable interrupts or else we risk racing with the interrupt
1730 * based handler.
1731 */
Alan Coxd4e33fa2012-01-26 17:44:09 +00001732 if (up->port.irq) {
Alex Williamson40b36da2007-02-14 00:33:04 -08001733 ier = serial_in(up, UART_IER);
1734 serial_out(up, UART_IER, 0);
1735 }
1736
1737 iir = serial_in(up, UART_IIR);
1738
1739 /*
1740 * This should be a safe test for anyone who doesn't trust the
1741 * IIR bits on their UART, but it's specifically designed for
1742 * the "Diva" UART used on the management processor on many HP
1743 * ia64 and parisc boxes.
1744 */
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001745 lsr = serial_in(up, UART_LSR);
1746 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
Alex Williamson40b36da2007-02-14 00:33:04 -08001747 if ((iir & UART_IIR_NO_INT) && (up->ier & UART_IER_THRI) &&
Alan Coxebd2c8f2009-09-19 13:13:28 -07001748 (!uart_circ_empty(&up->port.state->xmit) || up->port.x_char) &&
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001749 (lsr & UART_LSR_THRE)) {
Alex Williamson40b36da2007-02-14 00:33:04 -08001750 iir &= ~(UART_IIR_ID | UART_IIR_NO_INT);
1751 iir |= UART_IIR_THRI;
1752 }
1753
1754 if (!(iir & UART_IIR_NO_INT))
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001755 serial8250_tx_chars(up);
Alex Williamson40b36da2007-02-14 00:33:04 -08001756
Alan Coxd4e33fa2012-01-26 17:44:09 +00001757 if (up->port.irq)
Alex Williamson40b36da2007-02-14 00:33:04 -08001758 serial_out(up, UART_IER, ier);
1759
Al Cooperdbb3b1c2011-07-25 16:19:52 -04001760 spin_unlock_irqrestore(&up->port.lock, flags);
1761
Alex Williamson40b36da2007-02-14 00:33:04 -08001762 /* Standard timer interval plus 0.2s to keep the port running */
Alan Cox6f803cd2008-02-08 04:18:52 -08001763 mod_timer(&up->timer,
Anton Vorontsov54381062010-10-01 17:21:25 +04001764 jiffies + uart_poll_timeout(&up->port) + HZ / 5);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001765}
1766
1767static unsigned int serial8250_tx_empty(struct uart_port *port)
1768{
Jamie Iles49d57412010-12-01 23:39:35 +00001769 struct uart_8250_port *up =
1770 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001771 unsigned long flags;
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001772 unsigned int lsr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001773
1774 spin_lock_irqsave(&up->port.lock, flags);
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001775 lsr = serial_in(up, UART_LSR);
1776 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001777 spin_unlock_irqrestore(&up->port.lock, flags);
1778
Dick Hollenbeckbca47612009-12-09 12:31:34 -08001779 return (lsr & BOTH_EMPTY) == BOTH_EMPTY ? TIOCSER_TEMT : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001780}
1781
1782static unsigned int serial8250_get_mctrl(struct uart_port *port)
1783{
Jamie Iles49d57412010-12-01 23:39:35 +00001784 struct uart_8250_port *up =
1785 container_of(port, struct uart_8250_port, port);
Russell King2af7cd62006-01-04 16:55:09 +00001786 unsigned int status;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001787 unsigned int ret;
1788
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001789 status = serial8250_modem_status(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001790
1791 ret = 0;
1792 if (status & UART_MSR_DCD)
1793 ret |= TIOCM_CAR;
1794 if (status & UART_MSR_RI)
1795 ret |= TIOCM_RNG;
1796 if (status & UART_MSR_DSR)
1797 ret |= TIOCM_DSR;
1798 if (status & UART_MSR_CTS)
1799 ret |= TIOCM_CTS;
1800 return ret;
1801}
1802
1803static void serial8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
1804{
Jamie Iles49d57412010-12-01 23:39:35 +00001805 struct uart_8250_port *up =
1806 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001807 unsigned char mcr = 0;
1808
1809 if (mctrl & TIOCM_RTS)
1810 mcr |= UART_MCR_RTS;
1811 if (mctrl & TIOCM_DTR)
1812 mcr |= UART_MCR_DTR;
1813 if (mctrl & TIOCM_OUT1)
1814 mcr |= UART_MCR_OUT1;
1815 if (mctrl & TIOCM_OUT2)
1816 mcr |= UART_MCR_OUT2;
1817 if (mctrl & TIOCM_LOOP)
1818 mcr |= UART_MCR_LOOP;
1819
1820 mcr = (mcr & up->mcr_mask) | up->mcr_force | up->mcr;
1821
1822 serial_out(up, UART_MCR, mcr);
1823}
1824
1825static void serial8250_break_ctl(struct uart_port *port, int break_state)
1826{
Jamie Iles49d57412010-12-01 23:39:35 +00001827 struct uart_8250_port *up =
1828 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001829 unsigned long flags;
1830
1831 spin_lock_irqsave(&up->port.lock, flags);
1832 if (break_state == -1)
1833 up->lcr |= UART_LCR_SBC;
1834 else
1835 up->lcr &= ~UART_LCR_SBC;
1836 serial_out(up, UART_LCR, up->lcr);
1837 spin_unlock_irqrestore(&up->port.lock, flags);
1838}
1839
Alex Williamson40b36da2007-02-14 00:33:04 -08001840/*
1841 * Wait for transmitter & holding register to empty
1842 */
Will Newtonb5d674a2008-10-13 10:36:21 +01001843static void wait_for_xmitr(struct uart_8250_port *up, int bits)
Alex Williamson40b36da2007-02-14 00:33:04 -08001844{
1845 unsigned int status, tmout = 10000;
1846
1847 /* Wait up to 10ms for the character(s) to be sent. */
David Daney97d303b2010-10-05 11:40:07 -07001848 for (;;) {
Alex Williamson40b36da2007-02-14 00:33:04 -08001849 status = serial_in(up, UART_LSR);
1850
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001851 up->lsr_saved_flags |= status & LSR_SAVE_FLAGS;
Alex Williamson40b36da2007-02-14 00:33:04 -08001852
David Daney97d303b2010-10-05 11:40:07 -07001853 if ((status & bits) == bits)
1854 break;
Alex Williamson40b36da2007-02-14 00:33:04 -08001855 if (--tmout == 0)
1856 break;
1857 udelay(1);
David Daney97d303b2010-10-05 11:40:07 -07001858 }
Alex Williamson40b36da2007-02-14 00:33:04 -08001859
1860 /* Wait up to 1s for flow control if necessary */
1861 if (up->port.flags & UPF_CONS_FLOW) {
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001862 unsigned int tmout;
1863 for (tmout = 1000000; tmout; tmout--) {
1864 unsigned int msr = serial_in(up, UART_MSR);
1865 up->msr_saved_flags |= msr & MSR_SAVE_FLAGS;
1866 if (msr & UART_MSR_CTS)
1867 break;
Alex Williamson40b36da2007-02-14 00:33:04 -08001868 udelay(1);
1869 touch_nmi_watchdog();
1870 }
1871 }
1872}
1873
Jason Wesself2d937f2008-04-17 20:05:37 +02001874#ifdef CONFIG_CONSOLE_POLL
1875/*
1876 * Console polling routines for writing and reading from the uart while
1877 * in an interrupt or debug context.
1878 */
1879
1880static int serial8250_get_poll_char(struct uart_port *port)
1881{
Jamie Iles49d57412010-12-01 23:39:35 +00001882 struct uart_8250_port *up =
1883 container_of(port, struct uart_8250_port, port);
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001884 unsigned char lsr = serial_in(up, UART_LSR);
Jason Wesself2d937f2008-04-17 20:05:37 +02001885
Jason Wesself5316b42010-05-20 21:04:22 -05001886 if (!(lsr & UART_LSR_DR))
1887 return NO_POLL_CHAR;
Jason Wesself2d937f2008-04-17 20:05:37 +02001888
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001889 return serial_in(up, UART_RX);
Jason Wesself2d937f2008-04-17 20:05:37 +02001890}
1891
1892
1893static void serial8250_put_poll_char(struct uart_port *port,
1894 unsigned char c)
1895{
1896 unsigned int ier;
Jamie Iles49d57412010-12-01 23:39:35 +00001897 struct uart_8250_port *up =
1898 container_of(port, struct uart_8250_port, port);
Jason Wesself2d937f2008-04-17 20:05:37 +02001899
1900 /*
1901 * First save the IER then disable the interrupts
1902 */
1903 ier = serial_in(up, UART_IER);
1904 if (up->capabilities & UART_CAP_UUE)
1905 serial_out(up, UART_IER, UART_IER_UUE);
1906 else
1907 serial_out(up, UART_IER, 0);
1908
1909 wait_for_xmitr(up, BOTH_EMPTY);
1910 /*
1911 * Send the character out.
1912 * If a LF, also do CR...
1913 */
1914 serial_out(up, UART_TX, c);
1915 if (c == 10) {
1916 wait_for_xmitr(up, BOTH_EMPTY);
1917 serial_out(up, UART_TX, 13);
1918 }
1919
1920 /*
1921 * Finally, wait for transmitter to become empty
1922 * and restore the IER
1923 */
1924 wait_for_xmitr(up, BOTH_EMPTY);
1925 serial_out(up, UART_IER, ier);
1926}
1927
1928#endif /* CONFIG_CONSOLE_POLL */
1929
Linus Torvalds1da177e2005-04-16 15:20:36 -07001930static int serial8250_startup(struct uart_port *port)
1931{
Jamie Iles49d57412010-12-01 23:39:35 +00001932 struct uart_8250_port *up =
1933 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001934 unsigned long flags;
Russell King55d3b282005-06-23 15:05:41 +01001935 unsigned char lsr, iir;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001936 int retval;
1937
Ondrej Puzmane4f05af2010-12-04 21:17:38 +01001938 up->port.fifosize = uart_config[up->port.type].fifo_size;
1939 up->tx_loadsz = uart_config[up->port.type].tx_loadsz;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001940 up->capabilities = uart_config[up->port.type].flags;
1941 up->mcr = 0;
1942
Alan Coxb8e7e402009-05-28 14:01:35 +01001943 if (up->port.iotype != up->cur_iotype)
1944 set_io_from_upio(port);
1945
Linus Torvalds1da177e2005-04-16 15:20:36 -07001946 if (up->port.type == PORT_16C950) {
1947 /* Wake up and initialize UART */
1948 up->acr = 0;
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001949 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
1950 serial_out(up, UART_EFR, UART_EFR_ECB);
1951 serial_out(up, UART_IER, 0);
1952 serial_out(up, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001953 serial_icr_write(up, UART_CSR, 0); /* Reset the UART */
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001954 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
1955 serial_out(up, UART_EFR, UART_EFR_ECB);
1956 serial_out(up, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001957 }
1958
1959#ifdef CONFIG_SERIAL_8250_RSA
1960 /*
1961 * If this is an RSA port, see if we can kick it up to the
1962 * higher speed clock.
1963 */
1964 enable_rsa(up);
1965#endif
1966
1967 /*
1968 * Clear the FIFO buffers and disable them.
Alexey Dobriyan7f927fc2006-03-28 01:56:53 -08001969 * (they will be reenabled in set_termios())
Linus Torvalds1da177e2005-04-16 15:20:36 -07001970 */
1971 serial8250_clear_fifos(up);
1972
1973 /*
1974 * Clear the interrupt registers.
1975 */
Paul Gortmaker0d263a22012-03-08 19:12:10 -05001976 serial_in(up, UART_LSR);
1977 serial_in(up, UART_RX);
1978 serial_in(up, UART_IIR);
1979 serial_in(up, UART_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001980
1981 /*
1982 * At this point, there's no way the LSR could still be 0xff;
1983 * if it is, then bail out, because there's likely no UART
1984 * here.
1985 */
1986 if (!(up->port.flags & UPF_BUGGY_UART) &&
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001987 (serial_in(up, UART_LSR) == 0xff)) {
Konrad Rzeszutek Wilk7808a4c2011-09-26 09:14:34 -04001988 printk_ratelimited(KERN_INFO "ttyS%d: LSR safety check engaged!\n",
1989 serial_index(&up->port));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001990 return -ENODEV;
1991 }
1992
1993 /*
1994 * For a XR16C850, we need to set the trigger levels
1995 */
1996 if (up->port.type == PORT_16850) {
1997 unsigned char fctr;
1998
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001999 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002000
Paul Gortmaker0acf5192012-03-08 19:12:08 -05002001 fctr = serial_in(up, UART_FCTR) & ~(UART_FCTR_RX|UART_FCTR_TX);
2002 serial_out(up, UART_FCTR, fctr | UART_FCTR_TRGD | UART_FCTR_RX);
2003 serial_out(up, UART_TRG, UART_TRG_96);
2004 serial_out(up, UART_FCTR, fctr | UART_FCTR_TRGD | UART_FCTR_TX);
2005 serial_out(up, UART_TRG, UART_TRG_96);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002006
Paul Gortmaker0acf5192012-03-08 19:12:08 -05002007 serial_out(up, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002008 }
2009
Alan Coxd4e33fa2012-01-26 17:44:09 +00002010 if (up->port.irq) {
Alex Williamson01c194d2008-04-28 02:14:09 -07002011 unsigned char iir1;
Alex Williamson40b36da2007-02-14 00:33:04 -08002012 /*
2013 * Test for UARTs that do not reassert THRE when the
2014 * transmitter is idle and the interrupt has already
2015 * been cleared. Real 16550s should always reassert
2016 * this interrupt whenever the transmitter is idle and
2017 * the interrupt is enabled. Delays are necessary to
2018 * allow register changes to become visible.
2019 */
Borislav Petkovc389d272008-07-29 22:33:32 -07002020 spin_lock_irqsave(&up->port.lock, flags);
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002021 if (up->port.irqflags & IRQF_SHARED)
Anton Vorontsov768aec02008-07-22 11:21:07 +01002022 disable_irq_nosync(up->port.irq);
Alex Williamson40b36da2007-02-14 00:33:04 -08002023
2024 wait_for_xmitr(up, UART_LSR_THRE);
2025 serial_out_sync(up, UART_IER, UART_IER_THRI);
2026 udelay(1); /* allow THRE to set */
Alex Williamson01c194d2008-04-28 02:14:09 -07002027 iir1 = serial_in(up, UART_IIR);
Alex Williamson40b36da2007-02-14 00:33:04 -08002028 serial_out(up, UART_IER, 0);
2029 serial_out_sync(up, UART_IER, UART_IER_THRI);
2030 udelay(1); /* allow a working UART time to re-assert THRE */
2031 iir = serial_in(up, UART_IIR);
2032 serial_out(up, UART_IER, 0);
2033
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002034 if (up->port.irqflags & IRQF_SHARED)
Anton Vorontsov768aec02008-07-22 11:21:07 +01002035 enable_irq(up->port.irq);
Borislav Petkovc389d272008-07-29 22:33:32 -07002036 spin_unlock_irqrestore(&up->port.lock, flags);
Alex Williamson40b36da2007-02-14 00:33:04 -08002037
2038 /*
2039 * If the interrupt is not reasserted, setup a timer to
2040 * kick the UART on a regular basis.
2041 */
Alex Williamson01c194d2008-04-28 02:14:09 -07002042 if (!(iir1 & UART_IIR_NO_INT) && (iir & UART_IIR_NO_INT)) {
Will Newton363f66f2008-09-02 14:35:44 -07002043 up->bugs |= UART_BUG_THRE;
David S. Miller84408382008-10-13 10:45:26 +01002044 pr_debug("ttyS%d - using backup timer\n",
2045 serial_index(port));
Alex Williamson40b36da2007-02-14 00:33:04 -08002046 }
2047 }
2048
Linus Torvalds1da177e2005-04-16 15:20:36 -07002049 /*
Will Newton363f66f2008-09-02 14:35:44 -07002050 * The above check will only give an accurate result the first time
2051 * the port is opened so this value needs to be preserved.
2052 */
2053 if (up->bugs & UART_BUG_THRE) {
2054 up->timer.function = serial8250_backup_timeout;
2055 up->timer.data = (unsigned long)up;
2056 mod_timer(&up->timer, jiffies +
Anton Vorontsov54381062010-10-01 17:21:25 +04002057 uart_poll_timeout(port) + HZ / 5);
Will Newton363f66f2008-09-02 14:35:44 -07002058 }
2059
2060 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002061 * If the "interrupt" for this port doesn't correspond with any
2062 * hardware interrupt, we use a timer-based system. The original
2063 * driver used to do this with IRQ0.
2064 */
Alan Coxd4e33fa2012-01-26 17:44:09 +00002065 if (!up->port.irq) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002066 up->timer.data = (unsigned long)up;
Anton Vorontsov54381062010-10-01 17:21:25 +04002067 mod_timer(&up->timer, jiffies + uart_poll_timeout(port));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002068 } else {
2069 retval = serial_link_irq_chain(up);
2070 if (retval)
2071 return retval;
2072 }
2073
2074 /*
2075 * Now, initialize the UART
2076 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -05002077 serial_out(up, UART_LCR, UART_LCR_WLEN8);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002078
2079 spin_lock_irqsave(&up->port.lock, flags);
2080 if (up->port.flags & UPF_FOURPORT) {
Alan Coxd4e33fa2012-01-26 17:44:09 +00002081 if (!up->port.irq)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002082 up->port.mctrl |= TIOCM_OUT1;
2083 } else
2084 /*
2085 * Most PC uarts need OUT2 raised to enable interrupts.
2086 */
Alan Coxd4e33fa2012-01-26 17:44:09 +00002087 if (up->port.irq)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002088 up->port.mctrl |= TIOCM_OUT2;
2089
2090 serial8250_set_mctrl(&up->port, up->port.mctrl);
Russell King55d3b282005-06-23 15:05:41 +01002091
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002092 /* Serial over Lan (SoL) hack:
2093 Intel 8257x Gigabit ethernet chips have a
2094 16550 emulation, to be used for Serial Over Lan.
2095 Those chips take a longer time than a normal
2096 serial device to signalize that a transmission
2097 data was queued. Due to that, the above test generally
2098 fails. One solution would be to delay the reading of
2099 iir. However, this is not reliable, since the timeout
2100 is variable. So, let's just don't test if we receive
2101 TX irq. This way, we'll never enable UART_BUG_TXEN.
2102 */
Chuck Ebbertd41a4b52009-10-01 15:44:26 -07002103 if (skip_txen_test || up->port.flags & UPF_NO_TXEN_TEST)
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002104 goto dont_test_tx_en;
2105
Russell King55d3b282005-06-23 15:05:41 +01002106 /*
2107 * Do a quick test to see if we receive an
2108 * interrupt when we enable the TX irq.
2109 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -05002110 serial_out(up, UART_IER, UART_IER_THRI);
Russell King55d3b282005-06-23 15:05:41 +01002111 lsr = serial_in(up, UART_LSR);
2112 iir = serial_in(up, UART_IIR);
Paul Gortmaker0acf5192012-03-08 19:12:08 -05002113 serial_out(up, UART_IER, 0);
Russell King55d3b282005-06-23 15:05:41 +01002114
2115 if (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT) {
Russell King67f76542005-06-23 22:26:43 +01002116 if (!(up->bugs & UART_BUG_TXEN)) {
2117 up->bugs |= UART_BUG_TXEN;
Russell King55d3b282005-06-23 15:05:41 +01002118 pr_debug("ttyS%d - enabling bad tx status workarounds\n",
David S. Miller84408382008-10-13 10:45:26 +01002119 serial_index(port));
Russell King55d3b282005-06-23 15:05:41 +01002120 }
2121 } else {
Russell King67f76542005-06-23 22:26:43 +01002122 up->bugs &= ~UART_BUG_TXEN;
Russell King55d3b282005-06-23 15:05:41 +01002123 }
2124
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002125dont_test_tx_en:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002126 spin_unlock_irqrestore(&up->port.lock, flags);
2127
2128 /*
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002129 * Clear the interrupt registers again for luck, and clear the
2130 * saved flags to avoid getting false values from polling
2131 * routines or the previous session.
2132 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -05002133 serial_in(up, UART_LSR);
2134 serial_in(up, UART_RX);
2135 serial_in(up, UART_IIR);
2136 serial_in(up, UART_MSR);
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002137 up->lsr_saved_flags = 0;
2138 up->msr_saved_flags = 0;
2139
2140 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002141 * Finally, enable interrupts. Note: Modem status interrupts
2142 * are set via set_termios(), which will be occurring imminently
2143 * anyway, so we don't enable them here.
2144 */
2145 up->ier = UART_IER_RLSI | UART_IER_RDI;
Paul Gortmaker0acf5192012-03-08 19:12:08 -05002146 serial_out(up, UART_IER, up->ier);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002147
2148 if (up->port.flags & UPF_FOURPORT) {
2149 unsigned int icp;
2150 /*
2151 * Enable interrupts on the AST Fourport board
2152 */
2153 icp = (up->port.iobase & 0xfe0) | 0x01f;
2154 outb_p(0x80, icp);
Paul Gortmaker0d263a22012-03-08 19:12:10 -05002155 inb_p(icp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002156 }
2157
Linus Torvalds1da177e2005-04-16 15:20:36 -07002158 return 0;
2159}
2160
2161static void serial8250_shutdown(struct uart_port *port)
2162{
Jamie Iles49d57412010-12-01 23:39:35 +00002163 struct uart_8250_port *up =
2164 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002165 unsigned long flags;
2166
2167 /*
2168 * Disable interrupts from this port
2169 */
2170 up->ier = 0;
Paul Gortmaker0acf5192012-03-08 19:12:08 -05002171 serial_out(up, UART_IER, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002172
2173 spin_lock_irqsave(&up->port.lock, flags);
2174 if (up->port.flags & UPF_FOURPORT) {
2175 /* reset interrupts on the AST Fourport board */
2176 inb((up->port.iobase & 0xfe0) | 0x1f);
2177 up->port.mctrl |= TIOCM_OUT1;
2178 } else
2179 up->port.mctrl &= ~TIOCM_OUT2;
2180
2181 serial8250_set_mctrl(&up->port, up->port.mctrl);
2182 spin_unlock_irqrestore(&up->port.lock, flags);
2183
2184 /*
2185 * Disable break condition and FIFOs
2186 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -05002187 serial_out(up, UART_LCR, serial_in(up, UART_LCR) & ~UART_LCR_SBC);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002188 serial8250_clear_fifos(up);
2189
2190#ifdef CONFIG_SERIAL_8250_RSA
2191 /*
2192 * Reset the RSA board back to 115kbps compat mode.
2193 */
2194 disable_rsa(up);
2195#endif
2196
2197 /*
2198 * Read data port to reset things, and then unlink from
2199 * the IRQ chain.
2200 */
Paul Gortmaker0d263a22012-03-08 19:12:10 -05002201 serial_in(up, UART_RX);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002202
Alex Williamson40b36da2007-02-14 00:33:04 -08002203 del_timer_sync(&up->timer);
2204 up->timer.function = serial8250_timeout;
Alan Coxd4e33fa2012-01-26 17:44:09 +00002205 if (up->port.irq)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002206 serial_unlink_irq_chain(up);
2207}
2208
2209static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud)
2210{
2211 unsigned int quot;
2212
2213 /*
2214 * Handle magic divisors for baud rates above baud_base on
2215 * SMSC SuperIO chips.
2216 */
2217 if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
2218 baud == (port->uartclk/4))
2219 quot = 0x8001;
2220 else if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
2221 baud == (port->uartclk/8))
2222 quot = 0x8002;
2223 else
2224 quot = uart_get_divisor(port, baud);
2225
2226 return quot;
2227}
2228
Philippe Langlais235dae52010-07-29 17:13:57 +02002229void
2230serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
2231 struct ktermios *old)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002232{
Jamie Iles49d57412010-12-01 23:39:35 +00002233 struct uart_8250_port *up =
2234 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002235 unsigned char cval, fcr = 0;
2236 unsigned long flags;
2237 unsigned int baud, quot;
2238
2239 switch (termios->c_cflag & CSIZE) {
2240 case CS5:
Russell King0a8b80c52005-06-24 19:48:22 +01002241 cval = UART_LCR_WLEN5;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002242 break;
2243 case CS6:
Russell King0a8b80c52005-06-24 19:48:22 +01002244 cval = UART_LCR_WLEN6;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002245 break;
2246 case CS7:
Russell King0a8b80c52005-06-24 19:48:22 +01002247 cval = UART_LCR_WLEN7;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002248 break;
2249 default:
2250 case CS8:
Russell King0a8b80c52005-06-24 19:48:22 +01002251 cval = UART_LCR_WLEN8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002252 break;
2253 }
2254
2255 if (termios->c_cflag & CSTOPB)
Russell King0a8b80c52005-06-24 19:48:22 +01002256 cval |= UART_LCR_STOP;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002257 if (termios->c_cflag & PARENB)
2258 cval |= UART_LCR_PARITY;
2259 if (!(termios->c_cflag & PARODD))
2260 cval |= UART_LCR_EPAR;
2261#ifdef CMSPAR
2262 if (termios->c_cflag & CMSPAR)
2263 cval |= UART_LCR_SPAR;
2264#endif
2265
2266 /*
2267 * Ask the core to calculate the divisor for us.
2268 */
Anton Vorontsov24d481e2009-09-19 13:13:20 -07002269 baud = uart_get_baud_rate(port, termios, old,
2270 port->uartclk / 16 / 0xffff,
2271 port->uartclk / 16);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002272 quot = serial8250_get_divisor(port, baud);
2273
2274 /*
Russell King4ba5e352005-06-23 10:43:04 +01002275 * Oxford Semi 952 rev B workaround
Linus Torvalds1da177e2005-04-16 15:20:36 -07002276 */
Russell King4ba5e352005-06-23 10:43:04 +01002277 if (up->bugs & UART_BUG_QUOT && (quot & 0xff) == 0)
Alan Cox3e8d4e22008-02-04 22:27:53 -08002278 quot++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002279
2280 if (up->capabilities & UART_CAP_FIFO && up->port.fifosize > 1) {
2281 if (baud < 2400)
2282 fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1;
2283 else
2284 fcr = uart_config[up->port.type].fcr;
2285 }
2286
2287 /*
2288 * MCR-based auto flow control. When AFE is enabled, RTS will be
2289 * deasserted when the receive FIFO contains more characters than
2290 * the trigger, or the MCR RTS bit is cleared. In the case where
2291 * the remote UART is not using CTS auto flow control, we must
2292 * have sufficient FIFO entries for the latency of the remote
2293 * UART to respond. IOW, at least 32 bytes of FIFO.
2294 */
2295 if (up->capabilities & UART_CAP_AFE && up->port.fifosize >= 32) {
2296 up->mcr &= ~UART_MCR_AFE;
2297 if (termios->c_cflag & CRTSCTS)
2298 up->mcr |= UART_MCR_AFE;
2299 }
2300
2301 /*
2302 * Ok, we're now changing the port state. Do it with
2303 * interrupts disabled.
2304 */
2305 spin_lock_irqsave(&up->port.lock, flags);
2306
2307 /*
2308 * Update the per-port timeout.
2309 */
2310 uart_update_timeout(port, termios->c_cflag, baud);
2311
2312 up->port.read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR;
2313 if (termios->c_iflag & INPCK)
2314 up->port.read_status_mask |= UART_LSR_FE | UART_LSR_PE;
2315 if (termios->c_iflag & (BRKINT | PARMRK))
2316 up->port.read_status_mask |= UART_LSR_BI;
2317
2318 /*
2319 * Characteres to ignore
2320 */
2321 up->port.ignore_status_mask = 0;
2322 if (termios->c_iflag & IGNPAR)
2323 up->port.ignore_status_mask |= UART_LSR_PE | UART_LSR_FE;
2324 if (termios->c_iflag & IGNBRK) {
2325 up->port.ignore_status_mask |= UART_LSR_BI;
2326 /*
2327 * If we're ignoring parity and break indicators,
2328 * ignore overruns too (for real raw support).
2329 */
2330 if (termios->c_iflag & IGNPAR)
2331 up->port.ignore_status_mask |= UART_LSR_OE;
2332 }
2333
2334 /*
2335 * ignore all characters if CREAD is not set
2336 */
2337 if ((termios->c_cflag & CREAD) == 0)
2338 up->port.ignore_status_mask |= UART_LSR_DR;
2339
2340 /*
2341 * CTS flow control flag and modem status interrupts
2342 */
Ingo Molnarf8b372a2010-11-13 16:21:58 +01002343 up->ier &= ~UART_IER_MSI;
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00002344 if (!(up->bugs & UART_BUG_NOMSR) &&
2345 UART_ENABLE_MS(&up->port, termios->c_cflag))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002346 up->ier |= UART_IER_MSI;
2347 if (up->capabilities & UART_CAP_UUE)
Stephen Warren4539c242011-05-17 16:12:36 -06002348 up->ier |= UART_IER_UUE;
2349 if (up->capabilities & UART_CAP_RTOIE)
2350 up->ier |= UART_IER_RTOIE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002351
2352 serial_out(up, UART_IER, up->ier);
2353
2354 if (up->capabilities & UART_CAP_EFR) {
2355 unsigned char efr = 0;
2356 /*
2357 * TI16C752/Startech hardware flow control. FIXME:
2358 * - TI16C752 requires control thresholds to be set.
2359 * - UART_MCR_RTS is ineffective if auto-RTS mode is enabled.
2360 */
2361 if (termios->c_cflag & CRTSCTS)
2362 efr |= UART_EFR_CTS;
2363
Paul Gortmaker0acf5192012-03-08 19:12:08 -05002364 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
Søren Holm06315342011-09-02 22:55:37 +02002365 if (up->port.flags & UPF_EXAR_EFR)
Paul Gortmaker0acf5192012-03-08 19:12:08 -05002366 serial_out(up, UART_XR_EFR, efr);
Søren Holm06315342011-09-02 22:55:37 +02002367 else
Paul Gortmaker0acf5192012-03-08 19:12:08 -05002368 serial_out(up, UART_EFR, efr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002369 }
2370
Russell Kingf2eda272008-09-01 21:47:59 +01002371#ifdef CONFIG_ARCH_OMAP
Jonathan McDowell255341c2006-08-14 23:05:32 -07002372 /* Workaround to enable 115200 baud on OMAP1510 internal ports */
Russell King56685452008-09-01 21:25:33 +01002373 if (cpu_is_omap1510() && is_omap_port(up)) {
Jonathan McDowell255341c2006-08-14 23:05:32 -07002374 if (baud == 115200) {
2375 quot = 1;
2376 serial_out(up, UART_OMAP_OSC_12M_SEL, 1);
2377 } else
2378 serial_out(up, UART_OMAP_OSC_12M_SEL, 0);
2379 }
2380#endif
2381
Linus Torvalds1da177e2005-04-16 15:20:36 -07002382 if (up->capabilities & UART_NATSEMI) {
2383 /* Switch to bank 2 not bank 1, to avoid resetting EXCR2 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -05002384 serial_out(up, UART_LCR, 0xe0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002385 } else {
Paul Gortmaker0acf5192012-03-08 19:12:08 -05002386 serial_out(up, UART_LCR, cval | UART_LCR_DLAB);/* set DLAB */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002387 }
2388
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +01002389 serial_dl_write(up, quot);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002390
2391 /*
2392 * LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR
2393 * is written without DLAB set, this mode will be disabled.
2394 */
2395 if (up->port.type == PORT_16750)
Paul Gortmaker0acf5192012-03-08 19:12:08 -05002396 serial_out(up, UART_FCR, fcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002397
Paul Gortmaker0acf5192012-03-08 19:12:08 -05002398 serial_out(up, UART_LCR, cval); /* reset DLAB */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002399 up->lcr = cval; /* Save LCR */
2400 if (up->port.type != PORT_16750) {
2401 if (fcr & UART_FCR_ENABLE_FIFO) {
2402 /* emulated UARTs (Lucent Venus 167x) need two steps */
Paul Gortmaker0acf5192012-03-08 19:12:08 -05002403 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002404 }
Paul Gortmaker0acf5192012-03-08 19:12:08 -05002405 serial_out(up, UART_FCR, fcr); /* set fcr */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002406 }
2407 serial8250_set_mctrl(&up->port, up->port.mctrl);
2408 spin_unlock_irqrestore(&up->port.lock, flags);
Alan Coxe991a2b2008-04-28 02:14:06 -07002409 /* Don't rewrite B0 */
2410 if (tty_termios_baud_rate(termios))
2411 tty_termios_encode_baud_rate(termios, baud, baud);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002412}
Philippe Langlais235dae52010-07-29 17:13:57 +02002413EXPORT_SYMBOL(serial8250_do_set_termios);
2414
2415static void
2416serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
2417 struct ktermios *old)
2418{
2419 if (port->set_termios)
2420 port->set_termios(port, termios, old);
2421 else
2422 serial8250_do_set_termios(port, termios, old);
2423}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002424
2425static void
Arnd Bergmanna0821df2010-06-01 22:53:11 +02002426serial8250_set_ldisc(struct uart_port *port, int new)
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002427{
Arnd Bergmanna0821df2010-06-01 22:53:11 +02002428 if (new == N_PPS) {
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002429 port->flags |= UPF_HARDPPS_CD;
2430 serial8250_enable_ms(port);
2431 } else
2432 port->flags &= ~UPF_HARDPPS_CD;
2433}
2434
Manuel Laussc161afe2010-09-25 15:13:45 +02002435
2436void serial8250_do_pm(struct uart_port *port, unsigned int state,
2437 unsigned int oldstate)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002438{
Jamie Iles49d57412010-12-01 23:39:35 +00002439 struct uart_8250_port *p =
2440 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002441
2442 serial8250_set_sleep(p, state != 0);
Manuel Laussc161afe2010-09-25 15:13:45 +02002443}
2444EXPORT_SYMBOL(serial8250_do_pm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002445
Manuel Laussc161afe2010-09-25 15:13:45 +02002446static void
2447serial8250_pm(struct uart_port *port, unsigned int state,
2448 unsigned int oldstate)
2449{
2450 if (port->pm)
2451 port->pm(port, state, oldstate);
2452 else
2453 serial8250_do_pm(port, state, oldstate);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002454}
2455
Russell Kingf2eda272008-09-01 21:47:59 +01002456static unsigned int serial8250_port_size(struct uart_8250_port *pt)
2457{
2458 if (pt->port.iotype == UPIO_AU)
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002459 return 0x1000;
Russell Kingf2eda272008-09-01 21:47:59 +01002460#ifdef CONFIG_ARCH_OMAP
2461 if (is_omap_port(pt))
2462 return 0x16 << pt->port.regshift;
2463#endif
2464 return 8 << pt->port.regshift;
2465}
2466
Linus Torvalds1da177e2005-04-16 15:20:36 -07002467/*
2468 * Resource handling.
2469 */
2470static int serial8250_request_std_resource(struct uart_8250_port *up)
2471{
Russell Kingf2eda272008-09-01 21:47:59 +01002472 unsigned int size = serial8250_port_size(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002473 int ret = 0;
2474
2475 switch (up->port.iotype) {
Sergei Shtylyov85835f42006-04-30 11:15:58 +01002476 case UPIO_AU:
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002477 case UPIO_TSI:
2478 case UPIO_MEM32:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002479 case UPIO_MEM:
2480 if (!up->port.mapbase)
2481 break;
2482
2483 if (!request_mem_region(up->port.mapbase, size, "serial")) {
2484 ret = -EBUSY;
2485 break;
2486 }
2487
2488 if (up->port.flags & UPF_IOREMAP) {
Alan Cox6f441fe2008-05-01 04:34:59 -07002489 up->port.membase = ioremap_nocache(up->port.mapbase,
2490 size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002491 if (!up->port.membase) {
2492 release_mem_region(up->port.mapbase, size);
2493 ret = -ENOMEM;
2494 }
2495 }
2496 break;
2497
2498 case UPIO_HUB6:
2499 case UPIO_PORT:
2500 if (!request_region(up->port.iobase, size, "serial"))
2501 ret = -EBUSY;
2502 break;
2503 }
2504 return ret;
2505}
2506
2507static void serial8250_release_std_resource(struct uart_8250_port *up)
2508{
Russell Kingf2eda272008-09-01 21:47:59 +01002509 unsigned int size = serial8250_port_size(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002510
2511 switch (up->port.iotype) {
Sergei Shtylyov85835f42006-04-30 11:15:58 +01002512 case UPIO_AU:
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002513 case UPIO_TSI:
2514 case UPIO_MEM32:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002515 case UPIO_MEM:
2516 if (!up->port.mapbase)
2517 break;
2518
2519 if (up->port.flags & UPF_IOREMAP) {
2520 iounmap(up->port.membase);
2521 up->port.membase = NULL;
2522 }
2523
2524 release_mem_region(up->port.mapbase, size);
2525 break;
2526
2527 case UPIO_HUB6:
2528 case UPIO_PORT:
2529 release_region(up->port.iobase, size);
2530 break;
2531 }
2532}
2533
2534static int serial8250_request_rsa_resource(struct uart_8250_port *up)
2535{
2536 unsigned long start = UART_RSA_BASE << up->port.regshift;
2537 unsigned int size = 8 << up->port.regshift;
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002538 int ret = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002539
2540 switch (up->port.iotype) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002541 case UPIO_HUB6:
2542 case UPIO_PORT:
2543 start += up->port.iobase;
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002544 if (request_region(start, size, "serial-rsa"))
2545 ret = 0;
2546 else
Linus Torvalds1da177e2005-04-16 15:20:36 -07002547 ret = -EBUSY;
2548 break;
2549 }
2550
2551 return ret;
2552}
2553
2554static void serial8250_release_rsa_resource(struct uart_8250_port *up)
2555{
2556 unsigned long offset = UART_RSA_BASE << up->port.regshift;
2557 unsigned int size = 8 << up->port.regshift;
2558
2559 switch (up->port.iotype) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002560 case UPIO_HUB6:
2561 case UPIO_PORT:
2562 release_region(up->port.iobase + offset, size);
2563 break;
2564 }
2565}
2566
2567static void serial8250_release_port(struct uart_port *port)
2568{
Jamie Iles49d57412010-12-01 23:39:35 +00002569 struct uart_8250_port *up =
2570 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002571
2572 serial8250_release_std_resource(up);
2573 if (up->port.type == PORT_RSA)
2574 serial8250_release_rsa_resource(up);
2575}
2576
2577static int serial8250_request_port(struct uart_port *port)
2578{
Jamie Iles49d57412010-12-01 23:39:35 +00002579 struct uart_8250_port *up =
2580 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002581 int ret = 0;
2582
2583 ret = serial8250_request_std_resource(up);
2584 if (ret == 0 && up->port.type == PORT_RSA) {
2585 ret = serial8250_request_rsa_resource(up);
2586 if (ret < 0)
2587 serial8250_release_std_resource(up);
2588 }
2589
2590 return ret;
2591}
2592
2593static void serial8250_config_port(struct uart_port *port, int flags)
2594{
Jamie Iles49d57412010-12-01 23:39:35 +00002595 struct uart_8250_port *up =
2596 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002597 int probeflags = PROBE_ANY;
2598 int ret;
2599
2600 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002601 * Find the region that we can probe for. This in turn
2602 * tells us whether we can probe for the type of port.
2603 */
2604 ret = serial8250_request_std_resource(up);
2605 if (ret < 0)
2606 return;
2607
2608 ret = serial8250_request_rsa_resource(up);
2609 if (ret < 0)
2610 probeflags &= ~PROBE_RSA;
2611
Alan Coxb8e7e402009-05-28 14:01:35 +01002612 if (up->port.iotype != up->cur_iotype)
2613 set_io_from_upio(port);
2614
Linus Torvalds1da177e2005-04-16 15:20:36 -07002615 if (flags & UART_CONFIG_TYPE)
2616 autoconfig(up, probeflags);
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002617
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002618 /* if access method is AU, it is a 16550 with a quirk */
2619 if (up->port.type == PORT_16550A && up->port.iotype == UPIO_AU)
2620 up->bugs |= UART_BUG_NOMSR;
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002621
Linus Torvalds1da177e2005-04-16 15:20:36 -07002622 if (up->port.type != PORT_UNKNOWN && flags & UART_CONFIG_IRQ)
2623 autoconfig_irq(up);
2624
2625 if (up->port.type != PORT_RSA && probeflags & PROBE_RSA)
2626 serial8250_release_rsa_resource(up);
2627 if (up->port.type == PORT_UNKNOWN)
2628 serial8250_release_std_resource(up);
2629}
2630
2631static int
2632serial8250_verify_port(struct uart_port *port, struct serial_struct *ser)
2633{
Yinghai Lua62c4132008-08-19 20:49:55 -07002634 if (ser->irq >= nr_irqs || ser->irq < 0 ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07002635 ser->baud_base < 9600 || ser->type < PORT_UNKNOWN ||
2636 ser->type >= ARRAY_SIZE(uart_config) || ser->type == PORT_CIRRUS ||
2637 ser->type == PORT_STARTECH)
2638 return -EINVAL;
2639 return 0;
2640}
2641
2642static const char *
2643serial8250_type(struct uart_port *port)
2644{
2645 int type = port->type;
2646
2647 if (type >= ARRAY_SIZE(uart_config))
2648 type = 0;
2649 return uart_config[type].name;
2650}
2651
2652static struct uart_ops serial8250_pops = {
2653 .tx_empty = serial8250_tx_empty,
2654 .set_mctrl = serial8250_set_mctrl,
2655 .get_mctrl = serial8250_get_mctrl,
2656 .stop_tx = serial8250_stop_tx,
2657 .start_tx = serial8250_start_tx,
2658 .stop_rx = serial8250_stop_rx,
2659 .enable_ms = serial8250_enable_ms,
2660 .break_ctl = serial8250_break_ctl,
2661 .startup = serial8250_startup,
2662 .shutdown = serial8250_shutdown,
2663 .set_termios = serial8250_set_termios,
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002664 .set_ldisc = serial8250_set_ldisc,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002665 .pm = serial8250_pm,
2666 .type = serial8250_type,
2667 .release_port = serial8250_release_port,
2668 .request_port = serial8250_request_port,
2669 .config_port = serial8250_config_port,
2670 .verify_port = serial8250_verify_port,
Jason Wesself2d937f2008-04-17 20:05:37 +02002671#ifdef CONFIG_CONSOLE_POLL
2672 .poll_get_char = serial8250_get_poll_char,
2673 .poll_put_char = serial8250_put_poll_char,
2674#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07002675};
2676
2677static struct uart_8250_port serial8250_ports[UART_NR];
2678
Alan Coxaf7f3742010-10-18 11:38:02 -07002679static void (*serial8250_isa_config)(int port, struct uart_port *up,
2680 unsigned short *capabilities);
2681
2682void serial8250_set_isa_configurator(
2683 void (*v)(int port, struct uart_port *up, unsigned short *capabilities))
2684{
2685 serial8250_isa_config = v;
2686}
2687EXPORT_SYMBOL(serial8250_set_isa_configurator);
2688
Linus Torvalds1da177e2005-04-16 15:20:36 -07002689static void __init serial8250_isa_init_ports(void)
2690{
2691 struct uart_8250_port *up;
2692 static int first = 1;
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02002693 int i, irqflag = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002694
2695 if (!first)
2696 return;
2697 first = 0;
2698
Dave Jonesa61c2d72006-01-07 23:18:19 +00002699 for (i = 0; i < nr_uarts; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002700 struct uart_8250_port *up = &serial8250_ports[i];
2701
2702 up->port.line = i;
2703 spin_lock_init(&up->port.lock);
2704
2705 init_timer(&up->timer);
2706 up->timer.function = serial8250_timeout;
2707
2708 /*
2709 * ALPHA_KLUDGE_MCR needs to be killed.
2710 */
2711 up->mcr_mask = ~ALPHA_KLUDGE_MCR;
2712 up->mcr_force = ALPHA_KLUDGE_MCR;
2713
2714 up->port.ops = &serial8250_pops;
2715 }
2716
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02002717 if (share_irqs)
2718 irqflag = IRQF_SHARED;
2719
Russell King44454bc2005-06-30 22:41:22 +01002720 for (i = 0, up = serial8250_ports;
Dave Jonesa61c2d72006-01-07 23:18:19 +00002721 i < ARRAY_SIZE(old_serial_port) && i < nr_uarts;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002722 i++, up++) {
2723 up->port.iobase = old_serial_port[i].port;
2724 up->port.irq = irq_canonicalize(old_serial_port[i].irq);
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002725 up->port.irqflags = old_serial_port[i].irqflags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002726 up->port.uartclk = old_serial_port[i].baud_base * 16;
2727 up->port.flags = old_serial_port[i].flags;
2728 up->port.hub6 = old_serial_port[i].hub6;
2729 up->port.membase = old_serial_port[i].iomem_base;
2730 up->port.iotype = old_serial_port[i].io_type;
2731 up->port.regshift = old_serial_port[i].iomem_reg_shift;
David Daney7d6a07d2009-01-02 13:49:47 +00002732 set_io_from_upio(&up->port);
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02002733 up->port.irqflags |= irqflag;
Alan Coxaf7f3742010-10-18 11:38:02 -07002734 if (serial8250_isa_config != NULL)
2735 serial8250_isa_config(i, &up->port, &up->capabilities);
2736
Linus Torvalds1da177e2005-04-16 15:20:36 -07002737 }
2738}
2739
Shmulik Ladkanib5d228c2009-12-09 12:31:29 -08002740static void
2741serial8250_init_fixed_type_port(struct uart_8250_port *up, unsigned int type)
2742{
2743 up->port.type = type;
2744 up->port.fifosize = uart_config[type].fifo_size;
2745 up->capabilities = uart_config[type].flags;
2746 up->tx_loadsz = uart_config[type].tx_loadsz;
2747}
2748
Linus Torvalds1da177e2005-04-16 15:20:36 -07002749static void __init
2750serial8250_register_ports(struct uart_driver *drv, struct device *dev)
2751{
2752 int i;
2753
Alan Coxb8e7e402009-05-28 14:01:35 +01002754 for (i = 0; i < nr_uarts; i++) {
2755 struct uart_8250_port *up = &serial8250_ports[i];
2756 up->cur_iotype = 0xFF;
2757 }
2758
Linus Torvalds1da177e2005-04-16 15:20:36 -07002759 serial8250_isa_init_ports();
2760
Dave Jonesa61c2d72006-01-07 23:18:19 +00002761 for (i = 0; i < nr_uarts; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002762 struct uart_8250_port *up = &serial8250_ports[i];
2763
2764 up->port.dev = dev;
Shmulik Ladkanib5d228c2009-12-09 12:31:29 -08002765
2766 if (up->port.flags & UPF_FIXED_TYPE)
2767 serial8250_init_fixed_type_port(up, up->port.type);
2768
Linus Torvalds1da177e2005-04-16 15:20:36 -07002769 uart_add_one_port(drv, &up->port);
2770 }
2771}
2772
2773#ifdef CONFIG_SERIAL_8250_CONSOLE
2774
Russell Kingd3587882006-03-20 20:00:09 +00002775static void serial8250_console_putchar(struct uart_port *port, int ch)
2776{
Jamie Iles49d57412010-12-01 23:39:35 +00002777 struct uart_8250_port *up =
2778 container_of(port, struct uart_8250_port, port);
Russell Kingd3587882006-03-20 20:00:09 +00002779
2780 wait_for_xmitr(up, UART_LSR_THRE);
2781 serial_out(up, UART_TX, ch);
2782}
2783
Linus Torvalds1da177e2005-04-16 15:20:36 -07002784/*
2785 * Print a string to the serial port trying not to disturb
2786 * any possible real use of the port...
2787 *
2788 * The console_lock must be held when we get here.
2789 */
2790static void
2791serial8250_console_write(struct console *co, const char *s, unsigned int count)
2792{
2793 struct uart_8250_port *up = &serial8250_ports[co->index];
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002794 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002795 unsigned int ier;
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002796 int locked = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002797
Andrew Morton78512ec2005-11-07 00:59:13 -08002798 touch_nmi_watchdog();
2799
Andrew Morton68aa2c02006-06-30 02:29:59 -07002800 local_irq_save(flags);
2801 if (up->port.sysrq) {
Paul Gortmaker86b21192011-12-04 18:42:22 -05002802 /* serial8250_handle_irq() already took the lock */
Andrew Morton68aa2c02006-06-30 02:29:59 -07002803 locked = 0;
2804 } else if (oops_in_progress) {
2805 locked = spin_trylock(&up->port.lock);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002806 } else
Andrew Morton68aa2c02006-06-30 02:29:59 -07002807 spin_lock(&up->port.lock);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002808
Linus Torvalds1da177e2005-04-16 15:20:36 -07002809 /*
Ralf Baechledc7bf132006-02-15 09:59:47 +00002810 * First save the IER then disable the interrupts
Linus Torvalds1da177e2005-04-16 15:20:36 -07002811 */
2812 ier = serial_in(up, UART_IER);
2813
2814 if (up->capabilities & UART_CAP_UUE)
2815 serial_out(up, UART_IER, UART_IER_UUE);
2816 else
2817 serial_out(up, UART_IER, 0);
2818
Russell Kingd3587882006-03-20 20:00:09 +00002819 uart_console_write(&up->port, s, count, serial8250_console_putchar);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002820
2821 /*
2822 * Finally, wait for transmitter to become empty
2823 * and restore the IER
2824 */
Alan Coxf91a3712006-01-21 14:59:12 +00002825 wait_for_xmitr(up, BOTH_EMPTY);
Russell Kinga88d75b2006-04-30 11:30:15 +01002826 serial_out(up, UART_IER, ier);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002827
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002828 /*
2829 * The receive handling will happen properly because the
2830 * receive ready bit will still be set; it is not cleared
2831 * on read. However, modem control will not, we must
2832 * call it if we have saved something in the saved flags
2833 * while processing with interrupts off.
2834 */
2835 if (up->msr_saved_flags)
Paul Gortmaker3986fb22011-12-04 18:42:20 -05002836 serial8250_modem_status(up);
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002837
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002838 if (locked)
Andrew Morton68aa2c02006-06-30 02:29:59 -07002839 spin_unlock(&up->port.lock);
2840 local_irq_restore(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002841}
2842
Vivek Goyal118c0ac2007-01-11 01:52:44 +01002843static int __init serial8250_console_setup(struct console *co, char *options)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002844{
2845 struct uart_port *port;
2846 int baud = 9600;
2847 int bits = 8;
2848 int parity = 'n';
2849 int flow = 'n';
2850
2851 /*
2852 * Check whether an invalid uart number has been specified, and
2853 * if so, search for the first available port that does have
2854 * console support.
2855 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00002856 if (co->index >= nr_uarts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002857 co->index = 0;
2858 port = &serial8250_ports[co->index].port;
2859 if (!port->iobase && !port->membase)
2860 return -ENODEV;
2861
2862 if (options)
2863 uart_parse_options(options, &baud, &parity, &bits, &flow);
2864
2865 return uart_set_options(port, co, baud, parity, bits, flow);
2866}
2867
Daniel Ritzb6b1d872007-08-03 16:07:43 +02002868static int serial8250_console_early_setup(void)
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002869{
2870 return serial8250_find_port_for_earlycon();
2871}
2872
Linus Torvalds1da177e2005-04-16 15:20:36 -07002873static struct console serial8250_console = {
2874 .name = "ttyS",
2875 .write = serial8250_console_write,
2876 .device = uart_console_device,
2877 .setup = serial8250_console_setup,
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002878 .early_setup = serial8250_console_early_setup,
Peter Zijlstraa80c49d2010-11-15 21:11:12 +01002879 .flags = CON_PRINTBUFFER | CON_ANYTIME,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002880 .index = -1,
2881 .data = &serial8250_reg,
2882};
2883
2884static int __init serial8250_console_init(void)
2885{
Eric W. Biederman05d81d22008-07-12 13:47:53 -07002886 if (nr_uarts > UART_NR)
2887 nr_uarts = UART_NR;
2888
Linus Torvalds1da177e2005-04-16 15:20:36 -07002889 serial8250_isa_init_ports();
2890 register_console(&serial8250_console);
2891 return 0;
2892}
2893console_initcall(serial8250_console_init);
2894
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002895int serial8250_find_port(struct uart_port *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002896{
2897 int line;
2898 struct uart_port *port;
2899
Dave Jonesa61c2d72006-01-07 23:18:19 +00002900 for (line = 0; line < nr_uarts; line++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002901 port = &serial8250_ports[line].port;
Russell King50aec3b2006-01-04 18:13:03 +00002902 if (uart_match_port(p, port))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002903 return line;
2904 }
2905 return -ENODEV;
2906}
2907
Linus Torvalds1da177e2005-04-16 15:20:36 -07002908#define SERIAL8250_CONSOLE &serial8250_console
2909#else
2910#define SERIAL8250_CONSOLE NULL
2911#endif
2912
2913static struct uart_driver serial8250_reg = {
2914 .owner = THIS_MODULE,
2915 .driver_name = "serial",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002916 .dev_name = "ttyS",
2917 .major = TTY_MAJOR,
2918 .minor = 64,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002919 .cons = SERIAL8250_CONSOLE,
2920};
2921
Russell Kingd856c662006-02-23 10:22:13 +00002922/*
2923 * early_serial_setup - early registration for 8250 ports
2924 *
2925 * Setup an 8250 port structure prior to console initialisation. Use
2926 * after console initialisation will cause undefined behaviour.
2927 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002928int __init early_serial_setup(struct uart_port *port)
2929{
David Daneyb4304282009-01-02 13:49:41 +00002930 struct uart_port *p;
2931
Linus Torvalds1da177e2005-04-16 15:20:36 -07002932 if (port->line >= ARRAY_SIZE(serial8250_ports))
2933 return -ENODEV;
2934
2935 serial8250_isa_init_ports();
David Daneyb4304282009-01-02 13:49:41 +00002936 p = &serial8250_ports[port->line].port;
2937 p->iobase = port->iobase;
2938 p->membase = port->membase;
2939 p->irq = port->irq;
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002940 p->irqflags = port->irqflags;
David Daneyb4304282009-01-02 13:49:41 +00002941 p->uartclk = port->uartclk;
2942 p->fifosize = port->fifosize;
2943 p->regshift = port->regshift;
2944 p->iotype = port->iotype;
2945 p->flags = port->flags;
2946 p->mapbase = port->mapbase;
2947 p->private_data = port->private_data;
Helge Deller125c97d2009-01-13 22:51:07 +01002948 p->type = port->type;
2949 p->line = port->line;
David Daney7d6a07d2009-01-02 13:49:47 +00002950
2951 set_io_from_upio(p);
2952 if (port->serial_in)
2953 p->serial_in = port->serial_in;
2954 if (port->serial_out)
2955 p->serial_out = port->serial_out;
Jamie Iles583d28e2011-08-15 10:17:52 +01002956 if (port->handle_irq)
2957 p->handle_irq = port->handle_irq;
2958 else
2959 p->handle_irq = serial8250_default_handle_irq;
David Daney7d6a07d2009-01-02 13:49:47 +00002960
Linus Torvalds1da177e2005-04-16 15:20:36 -07002961 return 0;
2962}
2963
2964/**
2965 * serial8250_suspend_port - suspend one serial port
2966 * @line: serial line number
Linus Torvalds1da177e2005-04-16 15:20:36 -07002967 *
2968 * Suspend one serial port.
2969 */
2970void serial8250_suspend_port(int line)
2971{
2972 uart_suspend_port(&serial8250_reg, &serial8250_ports[line].port);
2973}
2974
2975/**
2976 * serial8250_resume_port - resume one serial port
2977 * @line: serial line number
Linus Torvalds1da177e2005-04-16 15:20:36 -07002978 *
2979 * Resume one serial port.
2980 */
2981void serial8250_resume_port(int line)
2982{
David Woodhouseb5b82df2007-05-17 14:27:39 +08002983 struct uart_8250_port *up = &serial8250_ports[line];
2984
2985 if (up->capabilities & UART_NATSEMI) {
David Woodhouseb5b82df2007-05-17 14:27:39 +08002986 /* Ensure it's still in high speed mode */
Paul Gortmaker0acf5192012-03-08 19:12:08 -05002987 serial_out(up, UART_LCR, 0xE0);
David Woodhouseb5b82df2007-05-17 14:27:39 +08002988
Yin Kangkai0d0389e2011-02-09 11:35:18 +08002989 ns16550a_goto_highspeed(up);
David Woodhouseb5b82df2007-05-17 14:27:39 +08002990
Paul Gortmaker0acf5192012-03-08 19:12:08 -05002991 serial_out(up, UART_LCR, 0);
Yin Kangkai95926d22011-02-09 11:34:20 +08002992 up->port.uartclk = 921600*16;
David Woodhouseb5b82df2007-05-17 14:27:39 +08002993 }
2994 uart_resume_port(&serial8250_reg, &up->port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002995}
2996
2997/*
2998 * Register a set of serial devices attached to a platform device. The
2999 * list is terminated with a zero flags entry, which means we expect
3000 * all entries to have at least UPF_BOOT_AUTOCONF set.
3001 */
Russell King3ae5eae2005-11-09 22:32:44 +00003002static int __devinit serial8250_probe(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003003{
Russell King3ae5eae2005-11-09 22:32:44 +00003004 struct plat_serial8250_port *p = dev->dev.platform_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003005 struct uart_port port;
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02003006 int ret, i, irqflag = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003007
3008 memset(&port, 0, sizeof(struct uart_port));
3009
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02003010 if (share_irqs)
3011 irqflag = IRQF_SHARED;
3012
Russell Kingec9f47c2005-06-27 11:12:54 +01003013 for (i = 0; p && p->flags != 0; p++, i++) {
Will Newton74a197412008-02-04 22:27:50 -08003014 port.iobase = p->iobase;
3015 port.membase = p->membase;
3016 port.irq = p->irq;
Vikram Pandita1c2f0492009-09-19 13:13:19 -07003017 port.irqflags = p->irqflags;
Will Newton74a197412008-02-04 22:27:50 -08003018 port.uartclk = p->uartclk;
3019 port.regshift = p->regshift;
3020 port.iotype = p->iotype;
3021 port.flags = p->flags;
3022 port.mapbase = p->mapbase;
3023 port.hub6 = p->hub6;
3024 port.private_data = p->private_data;
David Daney8e23fcc2009-01-02 13:49:54 +00003025 port.type = p->type;
David Daney7d6a07d2009-01-02 13:49:47 +00003026 port.serial_in = p->serial_in;
3027 port.serial_out = p->serial_out;
Jamie Iles583d28e2011-08-15 10:17:52 +01003028 port.handle_irq = p->handle_irq;
Philippe Langlais235dae52010-07-29 17:13:57 +02003029 port.set_termios = p->set_termios;
Manuel Laussc161afe2010-09-25 15:13:45 +02003030 port.pm = p->pm;
Will Newton74a197412008-02-04 22:27:50 -08003031 port.dev = &dev->dev;
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02003032 port.irqflags |= irqflag;
Russell Kingec9f47c2005-06-27 11:12:54 +01003033 ret = serial8250_register_port(&port);
3034 if (ret < 0) {
Russell King3ae5eae2005-11-09 22:32:44 +00003035 dev_err(&dev->dev, "unable to register port at index %d "
Josh Boyer4f640ef2007-07-23 18:43:44 -07003036 "(IO%lx MEM%llx IRQ%d): %d\n", i,
3037 p->iobase, (unsigned long long)p->mapbase,
3038 p->irq, ret);
Russell Kingec9f47c2005-06-27 11:12:54 +01003039 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003040 }
3041 return 0;
3042}
3043
3044/*
3045 * Remove serial ports registered against a platform device.
3046 */
Russell King3ae5eae2005-11-09 22:32:44 +00003047static int __devexit serial8250_remove(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003048{
3049 int i;
3050
Dave Jonesa61c2d72006-01-07 23:18:19 +00003051 for (i = 0; i < nr_uarts; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003052 struct uart_8250_port *up = &serial8250_ports[i];
3053
Russell King3ae5eae2005-11-09 22:32:44 +00003054 if (up->port.dev == &dev->dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003055 serial8250_unregister_port(i);
3056 }
3057 return 0;
3058}
3059
Russell King3ae5eae2005-11-09 22:32:44 +00003060static int serial8250_suspend(struct platform_device *dev, pm_message_t state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003061{
3062 int i;
3063
Linus Torvalds1da177e2005-04-16 15:20:36 -07003064 for (i = 0; i < UART_NR; i++) {
3065 struct uart_8250_port *up = &serial8250_ports[i];
3066
Russell King3ae5eae2005-11-09 22:32:44 +00003067 if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003068 uart_suspend_port(&serial8250_reg, &up->port);
3069 }
3070
3071 return 0;
3072}
3073
Russell King3ae5eae2005-11-09 22:32:44 +00003074static int serial8250_resume(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003075{
3076 int i;
3077
Linus Torvalds1da177e2005-04-16 15:20:36 -07003078 for (i = 0; i < UART_NR; i++) {
3079 struct uart_8250_port *up = &serial8250_ports[i];
3080
Russell King3ae5eae2005-11-09 22:32:44 +00003081 if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
David Woodhouseb5b82df2007-05-17 14:27:39 +08003082 serial8250_resume_port(i);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003083 }
3084
3085 return 0;
3086}
3087
Russell King3ae5eae2005-11-09 22:32:44 +00003088static struct platform_driver serial8250_isa_driver = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003089 .probe = serial8250_probe,
3090 .remove = __devexit_p(serial8250_remove),
3091 .suspend = serial8250_suspend,
3092 .resume = serial8250_resume,
Russell King3ae5eae2005-11-09 22:32:44 +00003093 .driver = {
3094 .name = "serial8250",
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003095 .owner = THIS_MODULE,
Russell King3ae5eae2005-11-09 22:32:44 +00003096 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07003097};
3098
3099/*
3100 * This "device" covers _all_ ISA 8250-compatible serial devices listed
3101 * in the table in include/asm/serial.h
3102 */
3103static struct platform_device *serial8250_isa_devs;
3104
3105/*
3106 * serial8250_register_port and serial8250_unregister_port allows for
3107 * 16x50 serial ports to be configured at run-time, to support PCMCIA
3108 * modems and PCI multiport cards.
3109 */
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003110static DEFINE_MUTEX(serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003111
3112static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *port)
3113{
3114 int i;
3115
3116 /*
3117 * First, find a port entry which matches.
3118 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003119 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003120 if (uart_match_port(&serial8250_ports[i].port, port))
3121 return &serial8250_ports[i];
3122
3123 /*
3124 * We didn't find a matching entry, so look for the first
3125 * free entry. We look for one which hasn't been previously
3126 * used (indicated by zero iobase).
3127 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003128 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003129 if (serial8250_ports[i].port.type == PORT_UNKNOWN &&
3130 serial8250_ports[i].port.iobase == 0)
3131 return &serial8250_ports[i];
3132
3133 /*
3134 * That also failed. Last resort is to find any entry which
3135 * doesn't have a real port associated with it.
3136 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003137 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003138 if (serial8250_ports[i].port.type == PORT_UNKNOWN)
3139 return &serial8250_ports[i];
3140
3141 return NULL;
3142}
3143
3144/**
3145 * serial8250_register_port - register a serial port
3146 * @port: serial port template
3147 *
3148 * Configure the serial port specified by the request. If the
3149 * port exists and is in use, it is hung up and unregistered
3150 * first.
3151 *
3152 * The port is then probed and if necessary the IRQ is autodetected
3153 * If this fails an error is returned.
3154 *
3155 * On success the port is ready to use and the line number is returned.
3156 */
3157int serial8250_register_port(struct uart_port *port)
3158{
3159 struct uart_8250_port *uart;
3160 int ret = -ENOSPC;
3161
3162 if (port->uartclk == 0)
3163 return -EINVAL;
3164
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003165 mutex_lock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003166
3167 uart = serial8250_find_match_or_unused(port);
3168 if (uart) {
3169 uart_remove_one_port(&serial8250_reg, &uart->port);
3170
Will Newton74a197412008-02-04 22:27:50 -08003171 uart->port.iobase = port->iobase;
3172 uart->port.membase = port->membase;
3173 uart->port.irq = port->irq;
Vikram Pandita1c2f0492009-09-19 13:13:19 -07003174 uart->port.irqflags = port->irqflags;
Will Newton74a197412008-02-04 22:27:50 -08003175 uart->port.uartclk = port->uartclk;
3176 uart->port.fifosize = port->fifosize;
3177 uart->port.regshift = port->regshift;
3178 uart->port.iotype = port->iotype;
3179 uart->port.flags = port->flags | UPF_BOOT_AUTOCONF;
3180 uart->port.mapbase = port->mapbase;
3181 uart->port.private_data = port->private_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003182 if (port->dev)
3183 uart->port.dev = port->dev;
David Daney8e23fcc2009-01-02 13:49:54 +00003184
Shmulik Ladkanib5d228c2009-12-09 12:31:29 -08003185 if (port->flags & UPF_FIXED_TYPE)
3186 serial8250_init_fixed_type_port(uart, port->type);
David Daney8e23fcc2009-01-02 13:49:54 +00003187
David Daney7d6a07d2009-01-02 13:49:47 +00003188 set_io_from_upio(&uart->port);
3189 /* Possibly override default I/O functions. */
3190 if (port->serial_in)
3191 uart->port.serial_in = port->serial_in;
3192 if (port->serial_out)
3193 uart->port.serial_out = port->serial_out;
Jamie Iles583d28e2011-08-15 10:17:52 +01003194 if (port->handle_irq)
3195 uart->port.handle_irq = port->handle_irq;
Philippe Langlais235dae52010-07-29 17:13:57 +02003196 /* Possibly override set_termios call */
3197 if (port->set_termios)
3198 uart->port.set_termios = port->set_termios;
Manuel Laussc161afe2010-09-25 15:13:45 +02003199 if (port->pm)
3200 uart->port.pm = port->pm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003201
Alan Coxaf7f3742010-10-18 11:38:02 -07003202 if (serial8250_isa_config != NULL)
3203 serial8250_isa_config(0, &uart->port,
3204 &uart->capabilities);
3205
Linus Torvalds1da177e2005-04-16 15:20:36 -07003206 ret = uart_add_one_port(&serial8250_reg, &uart->port);
3207 if (ret == 0)
3208 ret = uart->port.line;
3209 }
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003210 mutex_unlock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003211
3212 return ret;
3213}
3214EXPORT_SYMBOL(serial8250_register_port);
3215
3216/**
3217 * serial8250_unregister_port - remove a 16x50 serial port at runtime
3218 * @line: serial line number
3219 *
3220 * Remove one serial port. This may not be called from interrupt
3221 * context. We hand the port back to the our control.
3222 */
3223void serial8250_unregister_port(int line)
3224{
3225 struct uart_8250_port *uart = &serial8250_ports[line];
3226
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003227 mutex_lock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003228 uart_remove_one_port(&serial8250_reg, &uart->port);
3229 if (serial8250_isa_devs) {
3230 uart->port.flags &= ~UPF_BOOT_AUTOCONF;
3231 uart->port.type = PORT_UNKNOWN;
3232 uart->port.dev = &serial8250_isa_devs->dev;
leitao@linux.vnet.ibm.comcb01ece2011-05-26 11:18:39 -03003233 uart->capabilities = uart_config[uart->port.type].flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003234 uart_add_one_port(&serial8250_reg, &uart->port);
3235 } else {
3236 uart->port.dev = NULL;
3237 }
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003238 mutex_unlock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003239}
3240EXPORT_SYMBOL(serial8250_unregister_port);
3241
3242static int __init serial8250_init(void)
3243{
Alan Cox25db8ad2008-08-19 20:49:40 -07003244 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003245
Dave Jonesa61c2d72006-01-07 23:18:19 +00003246 if (nr_uarts > UART_NR)
3247 nr_uarts = UART_NR;
3248
Paul Bollef1fb9bb2008-12-30 14:06:43 +01003249 printk(KERN_INFO "Serial: 8250/16550 driver, "
Dave Jonesa61c2d72006-01-07 23:18:19 +00003250 "%d ports, IRQ sharing %sabled\n", nr_uarts,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003251 share_irqs ? "en" : "dis");
3252
David Millerb70ac772008-10-13 10:36:31 +01003253#ifdef CONFIG_SPARC
3254 ret = sunserial_register_minors(&serial8250_reg, UART_NR);
3255#else
3256 serial8250_reg.nr = UART_NR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003257 ret = uart_register_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003258#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003259 if (ret)
3260 goto out;
3261
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003262 serial8250_isa_devs = platform_device_alloc("serial8250",
3263 PLAT8250_DEV_LEGACY);
3264 if (!serial8250_isa_devs) {
3265 ret = -ENOMEM;
Russell Kingbc965a72006-01-18 09:54:29 +00003266 goto unreg_uart_drv;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003267 }
3268
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003269 ret = platform_device_add(serial8250_isa_devs);
3270 if (ret)
3271 goto put_dev;
3272
Linus Torvalds1da177e2005-04-16 15:20:36 -07003273 serial8250_register_ports(&serial8250_reg, &serial8250_isa_devs->dev);
3274
Russell Kingbc965a72006-01-18 09:54:29 +00003275 ret = platform_driver_register(&serial8250_isa_driver);
3276 if (ret == 0)
3277 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003278
Russell Kingbc965a72006-01-18 09:54:29 +00003279 platform_device_del(serial8250_isa_devs);
Alan Cox25db8ad2008-08-19 20:49:40 -07003280put_dev:
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003281 platform_device_put(serial8250_isa_devs);
Alan Cox25db8ad2008-08-19 20:49:40 -07003282unreg_uart_drv:
David Millerb70ac772008-10-13 10:36:31 +01003283#ifdef CONFIG_SPARC
3284 sunserial_unregister_minors(&serial8250_reg, UART_NR);
3285#else
Linus Torvalds1da177e2005-04-16 15:20:36 -07003286 uart_unregister_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003287#endif
Alan Cox25db8ad2008-08-19 20:49:40 -07003288out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07003289 return ret;
3290}
3291
3292static void __exit serial8250_exit(void)
3293{
3294 struct platform_device *isa_dev = serial8250_isa_devs;
3295
3296 /*
3297 * This tells serial8250_unregister_port() not to re-register
3298 * the ports (thereby making serial8250_isa_driver permanently
3299 * in use.)
3300 */
3301 serial8250_isa_devs = NULL;
3302
Russell King3ae5eae2005-11-09 22:32:44 +00003303 platform_driver_unregister(&serial8250_isa_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003304 platform_device_unregister(isa_dev);
3305
David Millerb70ac772008-10-13 10:36:31 +01003306#ifdef CONFIG_SPARC
3307 sunserial_unregister_minors(&serial8250_reg, UART_NR);
3308#else
Linus Torvalds1da177e2005-04-16 15:20:36 -07003309 uart_unregister_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003310#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003311}
3312
3313module_init(serial8250_init);
3314module_exit(serial8250_exit);
3315
3316EXPORT_SYMBOL(serial8250_suspend_port);
3317EXPORT_SYMBOL(serial8250_resume_port);
3318
3319MODULE_LICENSE("GPL");
Adrian Bunkd87a6d92008-07-16 21:53:31 +01003320MODULE_DESCRIPTION("Generic 8250/16x50 serial driver");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003321
3322module_param(share_irqs, uint, 0644);
3323MODULE_PARM_DESC(share_irqs, "Share IRQs with other non-8250/16x50 devices"
3324 " (unsafe)");
3325
Dave Jonesa61c2d72006-01-07 23:18:19 +00003326module_param(nr_uarts, uint, 0644);
3327MODULE_PARM_DESC(nr_uarts, "Maximum number of UARTs supported. (1-" __MODULE_STRING(CONFIG_SERIAL_8250_NR_UARTS) ")");
3328
Chuck Ebbertd41a4b52009-10-01 15:44:26 -07003329module_param(skip_txen_test, uint, 0644);
3330MODULE_PARM_DESC(skip_txen_test, "Skip checking for the TXEN bug at init time");
3331
Linus Torvalds1da177e2005-04-16 15:20:36 -07003332#ifdef CONFIG_SERIAL_8250_RSA
3333module_param_array(probe_rsa, ulong, &probe_rsa_count, 0444);
3334MODULE_PARM_DESC(probe_rsa, "Probe I/O ports for RSA");
3335#endif
3336MODULE_ALIAS_CHARDEV_MAJOR(TTY_MAJOR);