blob: 580d12c898cf39c6831fcabab9df9fe24ccb7031 [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>
Linus Torvalds1da177e2005-04-16 15:20:36 -070041
42#include <asm/io.h>
43#include <asm/irq.h>
44
45#include "8250.h"
46
David Millerb70ac772008-10-13 10:36:31 +010047#ifdef CONFIG_SPARC
48#include "suncore.h"
49#endif
50
Linus Torvalds1da177e2005-04-16 15:20:36 -070051/*
52 * Configuration:
Thomas Gleixner40663cc2006-07-01 19:29:43 -070053 * share_irqs - whether we pass IRQF_SHARED to request_irq(). This option
Linus Torvalds1da177e2005-04-16 15:20:36 -070054 * is unsafe when used on edge-triggered interrupts.
55 */
Adrian Bunk408b6642005-05-01 08:59:29 -070056static unsigned int share_irqs = SERIAL8250_SHARE_IRQS;
Linus Torvalds1da177e2005-04-16 15:20:36 -070057
Dave Jonesa61c2d72006-01-07 23:18:19 +000058static unsigned int nr_uarts = CONFIG_SERIAL_8250_RUNTIME_UARTS;
59
David S. Miller84408382008-10-13 10:45:26 +010060static struct uart_driver serial8250_reg;
61
62static int serial_index(struct uart_port *port)
63{
64 return (serial8250_reg.minor - 64) + port->line;
65}
66
Chuck Ebbertd41a4b52009-10-01 15:44:26 -070067static unsigned int skip_txen_test; /* force skip of txen test at init time */
68
Linus Torvalds1da177e2005-04-16 15:20:36 -070069/*
70 * Debugging.
71 */
72#if 0
73#define DEBUG_AUTOCONF(fmt...) printk(fmt)
74#else
75#define DEBUG_AUTOCONF(fmt...) do { } while (0)
76#endif
77
78#if 0
79#define DEBUG_INTR(fmt...) printk(fmt)
80#else
81#define DEBUG_INTR(fmt...) do { } while (0)
82#endif
83
Jiri Slabye7328ae2011-06-05 22:51:49 +020084#define PASS_LIMIT 512
Linus Torvalds1da177e2005-04-16 15:20:36 -070085
Dick Hollenbeckbca47612009-12-09 12:31:34 -080086#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
87
88
Linus Torvalds1da177e2005-04-16 15:20:36 -070089/*
90 * We default to IRQ0 for the "no irq" hack. Some
91 * machine types want others as well - they're free
92 * to redefine this in their header file.
93 */
94#define is_real_interrupt(irq) ((irq) != 0)
95
Linus Torvalds1da177e2005-04-16 15:20:36 -070096#ifdef CONFIG_SERIAL_8250_DETECT_IRQ
97#define CONFIG_SERIAL_DETECT_IRQ 1
98#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070099#ifdef CONFIG_SERIAL_8250_MANY_PORTS
100#define CONFIG_SERIAL_MANY_PORTS 1
101#endif
102
103/*
104 * HUB6 is always on. This will be removed once the header
105 * files have been cleaned.
106 */
107#define CONFIG_HUB6 1
108
Bryan Wua4ed1e42008-05-31 16:10:04 +0800109#include <asm/serial.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700110/*
111 * SERIAL_PORT_DFNS tells us about built-in ports that have no
112 * standard enumeration mechanism. Platforms that can find all
113 * serial ports via mechanisms like ACPI or PCI need not supply it.
114 */
115#ifndef SERIAL_PORT_DFNS
116#define SERIAL_PORT_DFNS
117#endif
118
Arjan van de Vencb3592b2005-11-28 21:04:11 +0000119static const struct old_serial_port old_serial_port[] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700120 SERIAL_PORT_DFNS /* defined in asm/serial.h */
121};
122
Russell King026d02a2005-06-29 18:45:19 +0100123#define UART_NR CONFIG_SERIAL_8250_NR_UARTS
Linus Torvalds1da177e2005-04-16 15:20:36 -0700124
125#ifdef CONFIG_SERIAL_8250_RSA
126
127#define PORT_RSA_MAX 4
128static unsigned long probe_rsa[PORT_RSA_MAX];
129static unsigned int probe_rsa_count;
130#endif /* CONFIG_SERIAL_8250_RSA */
131
132struct uart_8250_port {
133 struct uart_port port;
134 struct timer_list timer; /* "no irq" timer */
135 struct list_head list; /* ports on this IRQ */
Russell King4ba5e352005-06-23 10:43:04 +0100136 unsigned short capabilities; /* port capabilities */
137 unsigned short bugs; /* port bugs */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700138 unsigned int tx_loadsz; /* transmit fifo load size */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700139 unsigned char acr;
140 unsigned char ier;
141 unsigned char lcr;
142 unsigned char mcr;
143 unsigned char mcr_mask; /* mask of user bits */
144 unsigned char mcr_force; /* mask of forced bits */
Alan Coxb8e7e402009-05-28 14:01:35 +0100145 unsigned char cur_iotype; /* Running I/O type */
Corey Minyardad4c2aa2007-08-22 14:01:18 -0700146
147 /*
148 * Some bits in registers are cleared on a read, so they must
149 * be saved whenever the register is read but the bits will not
150 * be immediately processed.
151 */
152#define LSR_SAVE_FLAGS UART_LSR_BRK_ERROR_BITS
153 unsigned char lsr_saved_flags;
154#define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA
155 unsigned char msr_saved_flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700156};
157
158struct irq_info {
Alan Cox25db8ad2008-08-19 20:49:40 -0700159 struct hlist_node node;
160 int irq;
161 spinlock_t lock; /* Protects list not the hash */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700162 struct list_head *head;
163};
164
Alan Cox25db8ad2008-08-19 20:49:40 -0700165#define NR_IRQ_HASH 32 /* Can be adjusted later */
166static struct hlist_head irq_lists[NR_IRQ_HASH];
167static DEFINE_MUTEX(hash_mutex); /* Used to walk the hash */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700168
169/*
170 * Here we define the default xmit fifo size used for each type of UART.
171 */
172static const struct serial8250_config uart_config[] = {
173 [PORT_UNKNOWN] = {
174 .name = "unknown",
175 .fifo_size = 1,
176 .tx_loadsz = 1,
177 },
178 [PORT_8250] = {
179 .name = "8250",
180 .fifo_size = 1,
181 .tx_loadsz = 1,
182 },
183 [PORT_16450] = {
184 .name = "16450",
185 .fifo_size = 1,
186 .tx_loadsz = 1,
187 },
188 [PORT_16550] = {
189 .name = "16550",
190 .fifo_size = 1,
191 .tx_loadsz = 1,
192 },
193 [PORT_16550A] = {
194 .name = "16550A",
195 .fifo_size = 16,
196 .tx_loadsz = 16,
197 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
198 .flags = UART_CAP_FIFO,
199 },
200 [PORT_CIRRUS] = {
201 .name = "Cirrus",
202 .fifo_size = 1,
203 .tx_loadsz = 1,
204 },
205 [PORT_16650] = {
206 .name = "ST16650",
207 .fifo_size = 1,
208 .tx_loadsz = 1,
209 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
210 },
211 [PORT_16650V2] = {
212 .name = "ST16650V2",
213 .fifo_size = 32,
214 .tx_loadsz = 16,
215 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
216 UART_FCR_T_TRIG_00,
217 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
218 },
219 [PORT_16750] = {
220 .name = "TI16750",
221 .fifo_size = 64,
222 .tx_loadsz = 64,
223 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 |
224 UART_FCR7_64BYTE,
225 .flags = UART_CAP_FIFO | UART_CAP_SLEEP | UART_CAP_AFE,
226 },
227 [PORT_STARTECH] = {
228 .name = "Startech",
229 .fifo_size = 1,
230 .tx_loadsz = 1,
231 },
232 [PORT_16C950] = {
233 .name = "16C950/954",
234 .fifo_size = 128,
235 .tx_loadsz = 128,
236 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
Pavel Machekd0694e22011-01-09 08:38:48 +0100237 /* UART_CAP_EFR breaks billionon CF bluetooth card. */
238 .flags = UART_CAP_FIFO | UART_CAP_SLEEP,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700239 },
240 [PORT_16654] = {
241 .name = "ST16654",
242 .fifo_size = 64,
243 .tx_loadsz = 32,
244 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
245 UART_FCR_T_TRIG_10,
246 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
247 },
248 [PORT_16850] = {
249 .name = "XR16850",
250 .fifo_size = 128,
251 .tx_loadsz = 128,
252 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
253 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
254 },
255 [PORT_RSA] = {
256 .name = "RSA",
257 .fifo_size = 2048,
258 .tx_loadsz = 2048,
259 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_11,
260 .flags = UART_CAP_FIFO,
261 },
262 [PORT_NS16550A] = {
263 .name = "NS16550A",
264 .fifo_size = 16,
265 .tx_loadsz = 16,
266 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
267 .flags = UART_CAP_FIFO | UART_NATSEMI,
268 },
269 [PORT_XSCALE] = {
270 .name = "XScale",
271 .fifo_size = 32,
272 .tx_loadsz = 32,
273 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
Stephen Warren4539c242011-05-17 16:12:36 -0600274 .flags = UART_CAP_FIFO | UART_CAP_UUE | UART_CAP_RTOIE,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700275 },
Thomas Koellerbd71c182007-05-06 14:48:47 -0700276 [PORT_RM9000] = {
277 .name = "RM9000",
278 .fifo_size = 16,
279 .tx_loadsz = 16,
280 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
281 .flags = UART_CAP_FIFO,
282 },
David Daney6b06f192009-01-02 13:50:00 +0000283 [PORT_OCTEON] = {
284 .name = "OCTEON",
285 .fifo_size = 64,
286 .tx_loadsz = 64,
287 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
288 .flags = UART_CAP_FIFO,
289 },
Florian Fainelli08e09922009-06-11 13:21:24 +0100290 [PORT_AR7] = {
291 .name = "AR7",
292 .fifo_size = 16,
293 .tx_loadsz = 16,
294 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_00,
295 .flags = UART_CAP_FIFO | UART_CAP_AFE,
296 },
Philippe Langlais235dae52010-07-29 17:13:57 +0200297 [PORT_U6_16550A] = {
298 .name = "U6_16550A",
299 .fifo_size = 64,
300 .tx_loadsz = 64,
301 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
302 .flags = UART_CAP_FIFO | UART_CAP_AFE,
303 },
Stephen Warren4539c242011-05-17 16:12:36 -0600304 [PORT_TEGRA] = {
305 .name = "Tegra",
306 .fifo_size = 32,
307 .tx_loadsz = 8,
308 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
309 UART_FCR_T_TRIG_01,
310 .flags = UART_CAP_FIFO | UART_CAP_RTOIE,
311 },
Søren Holm06315342011-09-02 22:55:37 +0200312 [PORT_XR17D15X] = {
313 .name = "XR17D15X",
314 .fifo_size = 64,
315 .tx_loadsz = 64,
316 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
317 .flags = UART_CAP_FIFO | UART_CAP_AFE | UART_CAP_EFR,
318 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700319};
320
Manuel Lauss12bf3f22010-07-15 21:45:05 +0200321#if defined(CONFIG_MIPS_ALCHEMY)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000322
323/* Au1x00 UART hardware has a weird register layout */
324static const u8 au_io_in_map[] = {
325 [UART_RX] = 0,
326 [UART_IER] = 2,
327 [UART_IIR] = 3,
328 [UART_LCR] = 5,
329 [UART_MCR] = 6,
330 [UART_LSR] = 7,
331 [UART_MSR] = 8,
332};
333
334static const u8 au_io_out_map[] = {
335 [UART_TX] = 1,
336 [UART_IER] = 2,
337 [UART_FCR] = 4,
338 [UART_LCR] = 5,
339 [UART_MCR] = 6,
340};
341
342/* sane hardware needs no mapping */
David Daney7d6a07d2009-01-02 13:49:47 +0000343static inline int map_8250_in_reg(struct uart_port *p, int offset)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000344{
David Daney7d6a07d2009-01-02 13:49:47 +0000345 if (p->iotype != UPIO_AU)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000346 return offset;
347 return au_io_in_map[offset];
348}
349
David Daney7d6a07d2009-01-02 13:49:47 +0000350static inline int map_8250_out_reg(struct uart_port *p, int offset)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000351{
David Daney7d6a07d2009-01-02 13:49:47 +0000352 if (p->iotype != UPIO_AU)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000353 return offset;
354 return au_io_out_map[offset];
355}
356
Alan Cox6f803cd2008-02-08 04:18:52 -0800357#elif defined(CONFIG_SERIAL_8250_RM9K)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700358
359static const u8
360 regmap_in[8] = {
361 [UART_RX] = 0x00,
362 [UART_IER] = 0x0c,
363 [UART_IIR] = 0x14,
364 [UART_LCR] = 0x1c,
365 [UART_MCR] = 0x20,
366 [UART_LSR] = 0x24,
367 [UART_MSR] = 0x28,
368 [UART_SCR] = 0x2c
369 },
370 regmap_out[8] = {
371 [UART_TX] = 0x04,
372 [UART_IER] = 0x0c,
373 [UART_FCR] = 0x18,
374 [UART_LCR] = 0x1c,
375 [UART_MCR] = 0x20,
376 [UART_LSR] = 0x24,
377 [UART_MSR] = 0x28,
378 [UART_SCR] = 0x2c
379 };
380
David Daney7d6a07d2009-01-02 13:49:47 +0000381static inline int map_8250_in_reg(struct uart_port *p, int offset)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700382{
David Daney7d6a07d2009-01-02 13:49:47 +0000383 if (p->iotype != UPIO_RM9000)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700384 return offset;
385 return regmap_in[offset];
386}
387
David Daney7d6a07d2009-01-02 13:49:47 +0000388static inline int map_8250_out_reg(struct uart_port *p, int offset)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700389{
David Daney7d6a07d2009-01-02 13:49:47 +0000390 if (p->iotype != UPIO_RM9000)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700391 return offset;
392 return regmap_out[offset];
393}
394
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000395#else
396
397/* sane hardware needs no mapping */
398#define map_8250_in_reg(up, offset) (offset)
399#define map_8250_out_reg(up, offset) (offset)
400
401#endif
402
David Daney7d6a07d2009-01-02 13:49:47 +0000403static unsigned int hub6_serial_in(struct uart_port *p, int offset)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700404{
David Daney7d6a07d2009-01-02 13:49:47 +0000405 offset = map_8250_in_reg(p, offset) << p->regshift;
406 outb(p->hub6 - 1 + offset, p->iobase);
407 return inb(p->iobase + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700408}
409
David Daney7d6a07d2009-01-02 13:49:47 +0000410static void hub6_serial_out(struct uart_port *p, int offset, int value)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700411{
David Daney7d6a07d2009-01-02 13:49:47 +0000412 offset = map_8250_out_reg(p, offset) << p->regshift;
413 outb(p->hub6 - 1 + offset, p->iobase);
414 outb(value, p->iobase + 1);
415}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700416
David Daney7d6a07d2009-01-02 13:49:47 +0000417static unsigned int mem_serial_in(struct uart_port *p, int offset)
418{
419 offset = map_8250_in_reg(p, offset) << p->regshift;
420 return readb(p->membase + offset);
421}
422
423static void mem_serial_out(struct uart_port *p, int offset, int value)
424{
425 offset = map_8250_out_reg(p, offset) << p->regshift;
426 writeb(value, p->membase + offset);
427}
428
429static void mem32_serial_out(struct uart_port *p, int offset, int value)
430{
431 offset = map_8250_out_reg(p, offset) << p->regshift;
432 writel(value, p->membase + offset);
433}
434
435static unsigned int mem32_serial_in(struct uart_port *p, int offset)
436{
437 offset = map_8250_in_reg(p, offset) << p->regshift;
438 return readl(p->membase + offset);
439}
440
David Daney7d6a07d2009-01-02 13:49:47 +0000441static unsigned int au_serial_in(struct uart_port *p, int offset)
442{
443 offset = map_8250_in_reg(p, offset) << p->regshift;
444 return __raw_readl(p->membase + offset);
445}
446
447static void au_serial_out(struct uart_port *p, int offset, int value)
448{
449 offset = map_8250_out_reg(p, offset) << p->regshift;
450 __raw_writel(value, p->membase + offset);
451}
David Daney7d6a07d2009-01-02 13:49:47 +0000452
David Daney7d6a07d2009-01-02 13:49:47 +0000453static unsigned int io_serial_in(struct uart_port *p, int offset)
454{
455 offset = map_8250_in_reg(p, offset) << p->regshift;
456 return inb(p->iobase + offset);
457}
458
459static void io_serial_out(struct uart_port *p, int offset, int value)
460{
461 offset = map_8250_out_reg(p, offset) << p->regshift;
462 outb(value, p->iobase + offset);
463}
464
Jamie Iles583d28e2011-08-15 10:17:52 +0100465static int serial8250_default_handle_irq(struct uart_port *port);
466
David Daney7d6a07d2009-01-02 13:49:47 +0000467static void set_io_from_upio(struct uart_port *p)
468{
Jamie Iles49d57412010-12-01 23:39:35 +0000469 struct uart_8250_port *up =
470 container_of(p, struct uart_8250_port, port);
David Daney7d6a07d2009-01-02 13:49:47 +0000471 switch (p->iotype) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700472 case UPIO_HUB6:
David Daney7d6a07d2009-01-02 13:49:47 +0000473 p->serial_in = hub6_serial_in;
474 p->serial_out = hub6_serial_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700475 break;
476
477 case UPIO_MEM:
David Daney7d6a07d2009-01-02 13:49:47 +0000478 p->serial_in = mem_serial_in;
479 p->serial_out = mem_serial_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700480 break;
481
Thomas Koellerbd71c182007-05-06 14:48:47 -0700482 case UPIO_RM9000:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700483 case UPIO_MEM32:
David Daney7d6a07d2009-01-02 13:49:47 +0000484 p->serial_in = mem32_serial_in;
485 p->serial_out = mem32_serial_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700486 break;
487
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000488 case UPIO_AU:
David Daney7d6a07d2009-01-02 13:49:47 +0000489 p->serial_in = au_serial_in;
490 p->serial_out = au_serial_out;
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000491 break;
Manuel Lauss12bf3f22010-07-15 21:45:05 +0200492
Linus Torvalds1da177e2005-04-16 15:20:36 -0700493 default:
David Daney7d6a07d2009-01-02 13:49:47 +0000494 p->serial_in = io_serial_in;
495 p->serial_out = io_serial_out;
496 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700497 }
Alan Coxb8e7e402009-05-28 14:01:35 +0100498 /* Remember loaded iotype */
499 up->cur_iotype = p->iotype;
Jamie Iles583d28e2011-08-15 10:17:52 +0100500 p->handle_irq = serial8250_default_handle_irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700501}
502
Alex Williamson40b36da2007-02-14 00:33:04 -0800503static void
504serial_out_sync(struct uart_8250_port *up, int offset, int value)
505{
David Daney7d6a07d2009-01-02 13:49:47 +0000506 struct uart_port *p = &up->port;
507 switch (p->iotype) {
Alex Williamson40b36da2007-02-14 00:33:04 -0800508 case UPIO_MEM:
509 case UPIO_MEM32:
Alex Williamson40b36da2007-02-14 00:33:04 -0800510 case UPIO_AU:
David Daney7d6a07d2009-01-02 13:49:47 +0000511 p->serial_out(p, offset, value);
512 p->serial_in(p, UART_LCR); /* safe, no side-effects */
Alex Williamson40b36da2007-02-14 00:33:04 -0800513 break;
514 default:
David Daney7d6a07d2009-01-02 13:49:47 +0000515 p->serial_out(p, offset, value);
Alex Williamson40b36da2007-02-14 00:33:04 -0800516 }
517}
518
David Daney7d6a07d2009-01-02 13:49:47 +0000519#define serial_in(up, offset) \
520 (up->port.serial_in(&(up)->port, (offset)))
521#define serial_out(up, offset, value) \
522 (up->port.serial_out(&(up)->port, (offset), (value)))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700523/*
524 * We used to support using pause I/O for certain machines. We
525 * haven't supported this for a while, but just in case it's badly
526 * needed for certain old 386 machines, I've left these #define's
527 * in....
528 */
529#define serial_inp(up, offset) serial_in(up, offset)
530#define serial_outp(up, offset, value) serial_out(up, offset, value)
531
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100532/* Uart divisor latch read */
533static inline int _serial_dl_read(struct uart_8250_port *up)
534{
535 return serial_inp(up, UART_DLL) | serial_inp(up, UART_DLM) << 8;
536}
537
538/* Uart divisor latch write */
539static inline void _serial_dl_write(struct uart_8250_port *up, int value)
540{
541 serial_outp(up, UART_DLL, value & 0xff);
542 serial_outp(up, UART_DLM, value >> 8 & 0xff);
543}
544
Manuel Lauss12bf3f22010-07-15 21:45:05 +0200545#if defined(CONFIG_MIPS_ALCHEMY)
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100546/* Au1x00 haven't got a standard divisor latch */
547static int serial_dl_read(struct uart_8250_port *up)
548{
549 if (up->port.iotype == UPIO_AU)
550 return __raw_readl(up->port.membase + 0x28);
551 else
552 return _serial_dl_read(up);
553}
554
555static void serial_dl_write(struct uart_8250_port *up, int value)
556{
557 if (up->port.iotype == UPIO_AU)
558 __raw_writel(value, up->port.membase + 0x28);
559 else
560 _serial_dl_write(up, value);
561}
Alan Cox6f803cd2008-02-08 04:18:52 -0800562#elif defined(CONFIG_SERIAL_8250_RM9K)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700563static int serial_dl_read(struct uart_8250_port *up)
564{
565 return (up->port.iotype == UPIO_RM9000) ?
566 (((__raw_readl(up->port.membase + 0x10) << 8) |
567 (__raw_readl(up->port.membase + 0x08) & 0xff)) & 0xffff) :
568 _serial_dl_read(up);
569}
570
571static void serial_dl_write(struct uart_8250_port *up, int value)
572{
573 if (up->port.iotype == UPIO_RM9000) {
574 __raw_writel(value, up->port.membase + 0x08);
575 __raw_writel(value >> 8, up->port.membase + 0x10);
576 } else {
577 _serial_dl_write(up, value);
578 }
579}
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100580#else
581#define serial_dl_read(up) _serial_dl_read(up)
582#define serial_dl_write(up, value) _serial_dl_write(up, value)
583#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700584
585/*
586 * For the 16C950
587 */
588static void serial_icr_write(struct uart_8250_port *up, int offset, int value)
589{
590 serial_out(up, UART_SCR, offset);
591 serial_out(up, UART_ICR, value);
592}
593
594static unsigned int serial_icr_read(struct uart_8250_port *up, int offset)
595{
596 unsigned int value;
597
598 serial_icr_write(up, UART_ACR, up->acr | UART_ACR_ICRRD);
599 serial_out(up, UART_SCR, offset);
600 value = serial_in(up, UART_ICR);
601 serial_icr_write(up, UART_ACR, up->acr);
602
603 return value;
604}
605
606/*
607 * FIFO support.
608 */
Will Newtonb5d674a2008-10-13 10:36:21 +0100609static void serial8250_clear_fifos(struct uart_8250_port *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700610{
611 if (p->capabilities & UART_CAP_FIFO) {
612 serial_outp(p, UART_FCR, UART_FCR_ENABLE_FIFO);
613 serial_outp(p, UART_FCR, UART_FCR_ENABLE_FIFO |
614 UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
615 serial_outp(p, UART_FCR, 0);
616 }
617}
618
619/*
620 * IER sleep support. UARTs which have EFRs need the "extended
621 * capability" bit enabled. Note that on XR16C850s, we need to
622 * reset LCR to write to IER.
623 */
Will Newtonb5d674a2008-10-13 10:36:21 +0100624static void serial8250_set_sleep(struct uart_8250_port *p, int sleep)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700625{
626 if (p->capabilities & UART_CAP_SLEEP) {
627 if (p->capabilities & UART_CAP_EFR) {
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -0800628 serial_outp(p, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700629 serial_outp(p, UART_EFR, UART_EFR_ECB);
630 serial_outp(p, UART_LCR, 0);
631 }
632 serial_outp(p, UART_IER, sleep ? UART_IERX_SLEEP : 0);
633 if (p->capabilities & UART_CAP_EFR) {
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -0800634 serial_outp(p, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700635 serial_outp(p, UART_EFR, 0);
636 serial_outp(p, UART_LCR, 0);
637 }
638 }
639}
640
641#ifdef CONFIG_SERIAL_8250_RSA
642/*
643 * Attempts to turn on the RSA FIFO. Returns zero on failure.
644 * We set the port uart clock rate if we succeed.
645 */
646static int __enable_rsa(struct uart_8250_port *up)
647{
648 unsigned char mode;
649 int result;
650
651 mode = serial_inp(up, UART_RSA_MSR);
652 result = mode & UART_RSA_MSR_FIFO;
653
654 if (!result) {
655 serial_outp(up, UART_RSA_MSR, mode | UART_RSA_MSR_FIFO);
656 mode = serial_inp(up, UART_RSA_MSR);
657 result = mode & UART_RSA_MSR_FIFO;
658 }
659
660 if (result)
661 up->port.uartclk = SERIAL_RSA_BAUD_BASE * 16;
662
663 return result;
664}
665
666static void enable_rsa(struct uart_8250_port *up)
667{
668 if (up->port.type == PORT_RSA) {
669 if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) {
670 spin_lock_irq(&up->port.lock);
671 __enable_rsa(up);
672 spin_unlock_irq(&up->port.lock);
673 }
674 if (up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16)
675 serial_outp(up, UART_RSA_FRR, 0);
676 }
677}
678
679/*
680 * Attempts to turn off the RSA FIFO. Returns zero on failure.
681 * It is unknown why interrupts were disabled in here. However,
682 * the caller is expected to preserve this behaviour by grabbing
683 * the spinlock before calling this function.
684 */
685static void disable_rsa(struct uart_8250_port *up)
686{
687 unsigned char mode;
688 int result;
689
690 if (up->port.type == PORT_RSA &&
691 up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) {
692 spin_lock_irq(&up->port.lock);
693
694 mode = serial_inp(up, UART_RSA_MSR);
695 result = !(mode & UART_RSA_MSR_FIFO);
696
697 if (!result) {
698 serial_outp(up, UART_RSA_MSR, mode & ~UART_RSA_MSR_FIFO);
699 mode = serial_inp(up, UART_RSA_MSR);
700 result = !(mode & UART_RSA_MSR_FIFO);
701 }
702
703 if (result)
704 up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16;
705 spin_unlock_irq(&up->port.lock);
706 }
707}
708#endif /* CONFIG_SERIAL_8250_RSA */
709
710/*
711 * This is a quickie test to see how big the FIFO is.
712 * It doesn't work at all the time, more's the pity.
713 */
714static int size_fifo(struct uart_8250_port *up)
715{
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100716 unsigned char old_fcr, old_mcr, old_lcr;
717 unsigned short old_dl;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700718 int count;
719
720 old_lcr = serial_inp(up, UART_LCR);
721 serial_outp(up, UART_LCR, 0);
722 old_fcr = serial_inp(up, UART_FCR);
723 old_mcr = serial_inp(up, UART_MCR);
724 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO |
725 UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
726 serial_outp(up, UART_MCR, UART_MCR_LOOP);
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -0800727 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_A);
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100728 old_dl = serial_dl_read(up);
729 serial_dl_write(up, 0x0001);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700730 serial_outp(up, UART_LCR, 0x03);
731 for (count = 0; count < 256; count++)
732 serial_outp(up, UART_TX, count);
733 mdelay(20);/* FIXME - schedule_timeout */
734 for (count = 0; (serial_inp(up, UART_LSR) & UART_LSR_DR) &&
735 (count < 256); count++)
736 serial_inp(up, UART_RX);
737 serial_outp(up, UART_FCR, old_fcr);
738 serial_outp(up, UART_MCR, old_mcr);
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -0800739 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_A);
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100740 serial_dl_write(up, old_dl);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700741 serial_outp(up, UART_LCR, old_lcr);
742
743 return count;
744}
745
746/*
747 * Read UART ID using the divisor method - set DLL and DLM to zero
748 * and the revision will be in DLL and device type in DLM. We
749 * preserve the device state across this.
750 */
751static unsigned int autoconfig_read_divisor_id(struct uart_8250_port *p)
752{
753 unsigned char old_dll, old_dlm, old_lcr;
754 unsigned int id;
755
756 old_lcr = serial_inp(p, UART_LCR);
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -0800757 serial_outp(p, UART_LCR, UART_LCR_CONF_MODE_A);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700758
759 old_dll = serial_inp(p, UART_DLL);
760 old_dlm = serial_inp(p, UART_DLM);
761
762 serial_outp(p, UART_DLL, 0);
763 serial_outp(p, UART_DLM, 0);
764
765 id = serial_inp(p, UART_DLL) | serial_inp(p, UART_DLM) << 8;
766
767 serial_outp(p, UART_DLL, old_dll);
768 serial_outp(p, UART_DLM, old_dlm);
769 serial_outp(p, UART_LCR, old_lcr);
770
771 return id;
772}
773
774/*
775 * This is a helper routine to autodetect StarTech/Exar/Oxsemi UART's.
776 * When this function is called we know it is at least a StarTech
777 * 16650 V2, but it might be one of several StarTech UARTs, or one of
778 * its clones. (We treat the broken original StarTech 16650 V1 as a
779 * 16550, and why not? Startech doesn't seem to even acknowledge its
780 * existence.)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700781 *
Linus Torvalds1da177e2005-04-16 15:20:36 -0700782 * What evil have men's minds wrought...
783 */
784static void autoconfig_has_efr(struct uart_8250_port *up)
785{
786 unsigned int id1, id2, id3, rev;
787
788 /*
789 * Everything with an EFR has SLEEP
790 */
791 up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP;
792
793 /*
794 * First we check to see if it's an Oxford Semiconductor UART.
795 *
796 * If we have to do this here because some non-National
797 * Semiconductor clone chips lock up if you try writing to the
798 * LSR register (which serial_icr_read does)
799 */
800
801 /*
802 * Check for Oxford Semiconductor 16C950.
803 *
804 * EFR [4] must be set else this test fails.
805 *
806 * This shouldn't be necessary, but Mike Hudson (Exoray@isys.ca)
807 * claims that it's needed for 952 dual UART's (which are not
808 * recommended for new designs).
809 */
810 up->acr = 0;
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -0800811 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700812 serial_out(up, UART_EFR, UART_EFR_ECB);
813 serial_out(up, UART_LCR, 0x00);
814 id1 = serial_icr_read(up, UART_ID1);
815 id2 = serial_icr_read(up, UART_ID2);
816 id3 = serial_icr_read(up, UART_ID3);
817 rev = serial_icr_read(up, UART_REV);
818
819 DEBUG_AUTOCONF("950id=%02x:%02x:%02x:%02x ", id1, id2, id3, rev);
820
821 if (id1 == 0x16 && id2 == 0xC9 &&
822 (id3 == 0x50 || id3 == 0x52 || id3 == 0x54)) {
823 up->port.type = PORT_16C950;
Russell King4ba5e352005-06-23 10:43:04 +0100824
825 /*
826 * Enable work around for the Oxford Semiconductor 952 rev B
827 * chip which causes it to seriously miscalculate baud rates
828 * when DLL is 0.
829 */
830 if (id3 == 0x52 && rev == 0x01)
831 up->bugs |= UART_BUG_QUOT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700832 return;
833 }
Thomas Koellerbd71c182007-05-06 14:48:47 -0700834
Linus Torvalds1da177e2005-04-16 15:20:36 -0700835 /*
836 * We check for a XR16C850 by setting DLL and DLM to 0, and then
837 * reading back DLL and DLM. The chip type depends on the DLM
838 * value read back:
839 * 0x10 - XR16C850 and the DLL contains the chip revision.
840 * 0x12 - XR16C2850.
841 * 0x14 - XR16C854.
842 */
843 id1 = autoconfig_read_divisor_id(up);
844 DEBUG_AUTOCONF("850id=%04x ", id1);
845
846 id2 = id1 >> 8;
847 if (id2 == 0x10 || id2 == 0x12 || id2 == 0x14) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700848 up->port.type = PORT_16850;
849 return;
850 }
851
852 /*
853 * It wasn't an XR16C850.
854 *
855 * We distinguish between the '654 and the '650 by counting
856 * how many bytes are in the FIFO. I'm using this for now,
857 * since that's the technique that was sent to me in the
858 * serial driver update, but I'm not convinced this works.
859 * I've had problems doing this in the past. -TYT
860 */
861 if (size_fifo(up) == 64)
862 up->port.type = PORT_16654;
863 else
864 up->port.type = PORT_16650V2;
865}
866
867/*
868 * We detected a chip without a FIFO. Only two fall into
869 * this category - the original 8250 and the 16450. The
870 * 16450 has a scratch register (accessible with LCR=0)
871 */
872static void autoconfig_8250(struct uart_8250_port *up)
873{
874 unsigned char scratch, status1, status2;
875
876 up->port.type = PORT_8250;
877
878 scratch = serial_in(up, UART_SCR);
879 serial_outp(up, UART_SCR, 0xa5);
880 status1 = serial_in(up, UART_SCR);
881 serial_outp(up, UART_SCR, 0x5a);
882 status2 = serial_in(up, UART_SCR);
883 serial_outp(up, UART_SCR, scratch);
884
885 if (status1 == 0xa5 && status2 == 0x5a)
886 up->port.type = PORT_16450;
887}
888
889static int broken_efr(struct uart_8250_port *up)
890{
891 /*
892 * Exar ST16C2550 "A2" devices incorrectly detect as
893 * having an EFR, and report an ID of 0x0201. See
Justin P. Mattock631dd1a2010-10-18 11:03:14 +0200894 * http://linux.derkeiler.com/Mailing-Lists/Kernel/2004-11/4812.html
Linus Torvalds1da177e2005-04-16 15:20:36 -0700895 */
896 if (autoconfig_read_divisor_id(up) == 0x0201 && size_fifo(up) == 16)
897 return 1;
898
899 return 0;
900}
901
Yin Kangkai0d0389e2011-02-09 11:35:18 +0800902static inline int ns16550a_goto_highspeed(struct uart_8250_port *up)
903{
904 unsigned char status;
905
906 status = serial_in(up, 0x04); /* EXCR2 */
907#define PRESL(x) ((x) & 0x30)
908 if (PRESL(status) == 0x10) {
909 /* already in high speed mode */
910 return 0;
911 } else {
912 status &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */
913 status |= 0x10; /* 1.625 divisor for baud_base --> 921600 */
914 serial_outp(up, 0x04, status);
915 }
916 return 1;
917}
918
Linus Torvalds1da177e2005-04-16 15:20:36 -0700919/*
920 * We know that the chip has FIFOs. Does it have an EFR? The
921 * EFR is located in the same register position as the IIR and
922 * we know the top two bits of the IIR are currently set. The
923 * EFR should contain zero. Try to read the EFR.
924 */
925static void autoconfig_16550a(struct uart_8250_port *up)
926{
927 unsigned char status1, status2;
928 unsigned int iersave;
929
930 up->port.type = PORT_16550A;
931 up->capabilities |= UART_CAP_FIFO;
932
933 /*
934 * Check for presence of the EFR when DLAB is set.
935 * Only ST16C650V1 UARTs pass this test.
936 */
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -0800937 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_A);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700938 if (serial_in(up, UART_EFR) == 0) {
939 serial_outp(up, UART_EFR, 0xA8);
940 if (serial_in(up, UART_EFR) != 0) {
941 DEBUG_AUTOCONF("EFRv1 ");
942 up->port.type = PORT_16650;
943 up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP;
944 } else {
945 DEBUG_AUTOCONF("Motorola 8xxx DUART ");
946 }
947 serial_outp(up, UART_EFR, 0);
948 return;
949 }
950
951 /*
952 * Maybe it requires 0xbf to be written to the LCR.
953 * (other ST16C650V2 UARTs, TI16C752A, etc)
954 */
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -0800955 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700956 if (serial_in(up, UART_EFR) == 0 && !broken_efr(up)) {
957 DEBUG_AUTOCONF("EFRv2 ");
958 autoconfig_has_efr(up);
959 return;
960 }
961
962 /*
963 * Check for a National Semiconductor SuperIO chip.
964 * Attempt to switch to bank 2, read the value of the LOOP bit
965 * from EXCR1. Switch back to bank 0, change it in MCR. Then
966 * switch back to bank 2, read it from EXCR1 again and check
967 * it's changed. If so, set baud_base in EXCR2 to 921600. -- dwmw2
Linus Torvalds1da177e2005-04-16 15:20:36 -0700968 */
969 serial_outp(up, UART_LCR, 0);
970 status1 = serial_in(up, UART_MCR);
971 serial_outp(up, UART_LCR, 0xE0);
972 status2 = serial_in(up, 0x02); /* EXCR1 */
973
974 if (!((status2 ^ status1) & UART_MCR_LOOP)) {
975 serial_outp(up, UART_LCR, 0);
976 serial_outp(up, UART_MCR, status1 ^ UART_MCR_LOOP);
977 serial_outp(up, UART_LCR, 0xE0);
978 status2 = serial_in(up, 0x02); /* EXCR1 */
979 serial_outp(up, UART_LCR, 0);
980 serial_outp(up, UART_MCR, status1);
981
982 if ((status2 ^ status1) & UART_MCR_LOOP) {
David Woodhouse857dde22005-05-21 15:52:23 +0100983 unsigned short quot;
984
Linus Torvalds1da177e2005-04-16 15:20:36 -0700985 serial_outp(up, UART_LCR, 0xE0);
David Woodhouse857dde22005-05-21 15:52:23 +0100986
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100987 quot = serial_dl_read(up);
David Woodhouse857dde22005-05-21 15:52:23 +0100988 quot <<= 3;
989
Yin Kangkai0d0389e2011-02-09 11:35:18 +0800990 if (ns16550a_goto_highspeed(up))
991 serial_dl_write(up, quot);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700992
David Woodhouse857dde22005-05-21 15:52:23 +0100993 serial_outp(up, UART_LCR, 0);
994
995 up->port.uartclk = 921600*16;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700996 up->port.type = PORT_NS16550A;
997 up->capabilities |= UART_NATSEMI;
998 return;
999 }
1000 }
1001
1002 /*
1003 * No EFR. Try to detect a TI16750, which only sets bit 5 of
1004 * the IIR when 64 byte FIFO mode is enabled when DLAB is set.
1005 * Try setting it with and without DLAB set. Cheap clones
1006 * set bit 5 without DLAB set.
1007 */
1008 serial_outp(up, UART_LCR, 0);
1009 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE);
1010 status1 = serial_in(up, UART_IIR) >> 5;
1011 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO);
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -08001012 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_A);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001013 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE);
1014 status2 = serial_in(up, UART_IIR) >> 5;
1015 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO);
1016 serial_outp(up, UART_LCR, 0);
1017
1018 DEBUG_AUTOCONF("iir1=%d iir2=%d ", status1, status2);
1019
1020 if (status1 == 6 && status2 == 7) {
1021 up->port.type = PORT_16750;
1022 up->capabilities |= UART_CAP_AFE | UART_CAP_SLEEP;
1023 return;
1024 }
1025
1026 /*
1027 * Try writing and reading the UART_IER_UUE bit (b6).
1028 * If it works, this is probably one of the Xscale platform's
1029 * internal UARTs.
1030 * We're going to explicitly set the UUE bit to 0 before
1031 * trying to write and read a 1 just to make sure it's not
1032 * already a 1 and maybe locked there before we even start start.
1033 */
1034 iersave = serial_in(up, UART_IER);
1035 serial_outp(up, UART_IER, iersave & ~UART_IER_UUE);
1036 if (!(serial_in(up, UART_IER) & UART_IER_UUE)) {
1037 /*
1038 * OK it's in a known zero state, try writing and reading
1039 * without disturbing the current state of the other bits.
1040 */
1041 serial_outp(up, UART_IER, iersave | UART_IER_UUE);
1042 if (serial_in(up, UART_IER) & UART_IER_UUE) {
1043 /*
1044 * It's an Xscale.
1045 * We'll leave the UART_IER_UUE bit set to 1 (enabled).
1046 */
1047 DEBUG_AUTOCONF("Xscale ");
1048 up->port.type = PORT_XSCALE;
Stephen Warren55681812011-06-17 09:45:07 -06001049 up->capabilities |= UART_CAP_UUE | UART_CAP_RTOIE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001050 return;
1051 }
1052 } else {
1053 /*
1054 * If we got here we couldn't force the IER_UUE bit to 0.
1055 * Log it and continue.
1056 */
1057 DEBUG_AUTOCONF("Couldn't force IER_UUE to 0 ");
1058 }
1059 serial_outp(up, UART_IER, iersave);
Philippe Langlais235dae52010-07-29 17:13:57 +02001060
1061 /*
Søren Holm06315342011-09-02 22:55:37 +02001062 * Exar uarts have EFR in a weird location
1063 */
1064 if (up->port.flags & UPF_EXAR_EFR) {
1065 up->port.type = PORT_XR17D15X;
1066 up->capabilities |= UART_CAP_AFE | UART_CAP_EFR;
1067 }
1068
1069 /*
Philippe Langlais235dae52010-07-29 17:13:57 +02001070 * We distinguish between 16550A and U6 16550A by counting
1071 * how many bytes are in the FIFO.
1072 */
1073 if (up->port.type == PORT_16550A && size_fifo(up) == 64) {
1074 up->port.type = PORT_U6_16550A;
1075 up->capabilities |= UART_CAP_AFE;
1076 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001077}
1078
1079/*
1080 * This routine is called by rs_init() to initialize a specific serial
1081 * port. It determines what type of UART chip this serial port is
1082 * using: 8250, 16450, 16550, 16550A. The important question is
1083 * whether or not this UART is a 16550A or not, since this will
1084 * determine whether or not we can use its FIFO features or not.
1085 */
1086static void autoconfig(struct uart_8250_port *up, unsigned int probeflags)
1087{
1088 unsigned char status1, scratch, scratch2, scratch3;
1089 unsigned char save_lcr, save_mcr;
1090 unsigned long flags;
1091
1092 if (!up->port.iobase && !up->port.mapbase && !up->port.membase)
1093 return;
1094
Lennert Buytenhek80647b92009-11-11 14:26:41 -08001095 DEBUG_AUTOCONF("ttyS%d: autoconf (0x%04lx, 0x%p): ",
David S. Miller84408382008-10-13 10:45:26 +01001096 serial_index(&up->port), up->port.iobase, up->port.membase);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001097
1098 /*
1099 * We really do need global IRQs disabled here - we're going to
1100 * be frobbing the chips IRQ enable register to see if it exists.
1101 */
1102 spin_lock_irqsave(&up->port.lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001103
1104 up->capabilities = 0;
Russell King4ba5e352005-06-23 10:43:04 +01001105 up->bugs = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001106
1107 if (!(up->port.flags & UPF_BUGGY_UART)) {
1108 /*
1109 * Do a simple existence test first; if we fail this,
1110 * there's no point trying anything else.
Thomas Koellerbd71c182007-05-06 14:48:47 -07001111 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001112 * 0x80 is used as a nonsense port to prevent against
1113 * false positives due to ISA bus float. The
1114 * assumption is that 0x80 is a non-existent port;
1115 * which should be safe since include/asm/io.h also
1116 * makes this assumption.
1117 *
1118 * Note: this is safe as long as MCR bit 4 is clear
1119 * and the device is in "PC" mode.
1120 */
1121 scratch = serial_inp(up, UART_IER);
1122 serial_outp(up, UART_IER, 0);
1123#ifdef __i386__
1124 outb(0xff, 0x080);
1125#endif
Thomas Hoehn48212002007-02-10 01:46:05 -08001126 /*
1127 * Mask out IER[7:4] bits for test as some UARTs (e.g. TL
1128 * 16C754B) allow only to modify them if an EFR bit is set.
1129 */
1130 scratch2 = serial_inp(up, UART_IER) & 0x0f;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001131 serial_outp(up, UART_IER, 0x0F);
1132#ifdef __i386__
1133 outb(0, 0x080);
1134#endif
Thomas Hoehn48212002007-02-10 01:46:05 -08001135 scratch3 = serial_inp(up, UART_IER) & 0x0f;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001136 serial_outp(up, UART_IER, scratch);
1137 if (scratch2 != 0 || scratch3 != 0x0F) {
1138 /*
1139 * We failed; there's nothing here
1140 */
1141 DEBUG_AUTOCONF("IER test failed (%02x, %02x) ",
1142 scratch2, scratch3);
1143 goto out;
1144 }
1145 }
1146
1147 save_mcr = serial_in(up, UART_MCR);
1148 save_lcr = serial_in(up, UART_LCR);
1149
Thomas Koellerbd71c182007-05-06 14:48:47 -07001150 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001151 * Check to see if a UART is really there. Certain broken
1152 * internal modems based on the Rockwell chipset fail this
1153 * test, because they apparently don't implement the loopback
1154 * test mode. So this test is skipped on the COM 1 through
1155 * COM 4 ports. This *should* be safe, since no board
1156 * manufacturer would be stupid enough to design a board
1157 * that conflicts with COM 1-4 --- we hope!
1158 */
1159 if (!(up->port.flags & UPF_SKIP_TEST)) {
1160 serial_outp(up, UART_MCR, UART_MCR_LOOP | 0x0A);
1161 status1 = serial_inp(up, UART_MSR) & 0xF0;
1162 serial_outp(up, UART_MCR, save_mcr);
1163 if (status1 != 0x90) {
1164 DEBUG_AUTOCONF("LOOP test failed (%02x) ",
1165 status1);
1166 goto out;
1167 }
1168 }
1169
1170 /*
1171 * We're pretty sure there's a port here. Lets find out what
1172 * type of port it is. The IIR top two bits allows us to find
Russell King6f0d6182005-09-09 16:17:58 +01001173 * out if it's 8250 or 16450, 16550, 16550A or later. This
Linus Torvalds1da177e2005-04-16 15:20:36 -07001174 * determines what we test for next.
1175 *
1176 * We also initialise the EFR (if any) to zero for later. The
1177 * EFR occupies the same register location as the FCR and IIR.
1178 */
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -08001179 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001180 serial_outp(up, UART_EFR, 0);
1181 serial_outp(up, UART_LCR, 0);
1182
1183 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO);
1184 scratch = serial_in(up, UART_IIR) >> 6;
1185
1186 DEBUG_AUTOCONF("iir=%d ", scratch);
1187
1188 switch (scratch) {
1189 case 0:
1190 autoconfig_8250(up);
1191 break;
1192 case 1:
1193 up->port.type = PORT_UNKNOWN;
1194 break;
1195 case 2:
1196 up->port.type = PORT_16550;
1197 break;
1198 case 3:
1199 autoconfig_16550a(up);
1200 break;
1201 }
1202
1203#ifdef CONFIG_SERIAL_8250_RSA
1204 /*
1205 * Only probe for RSA ports if we got the region.
1206 */
1207 if (up->port.type == PORT_16550A && probeflags & PROBE_RSA) {
1208 int i;
1209
1210 for (i = 0 ; i < probe_rsa_count; ++i) {
1211 if (probe_rsa[i] == up->port.iobase &&
1212 __enable_rsa(up)) {
1213 up->port.type = PORT_RSA;
1214 break;
1215 }
1216 }
1217 }
1218#endif
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00001219
Linus Torvalds1da177e2005-04-16 15:20:36 -07001220 serial_outp(up, UART_LCR, save_lcr);
1221
1222 if (up->capabilities != uart_config[up->port.type].flags) {
1223 printk(KERN_WARNING
1224 "ttyS%d: detected caps %08x should be %08x\n",
David S. Miller84408382008-10-13 10:45:26 +01001225 serial_index(&up->port), up->capabilities,
1226 uart_config[up->port.type].flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001227 }
1228
1229 up->port.fifosize = uart_config[up->port.type].fifo_size;
1230 up->capabilities = uart_config[up->port.type].flags;
1231 up->tx_loadsz = uart_config[up->port.type].tx_loadsz;
1232
1233 if (up->port.type == PORT_UNKNOWN)
1234 goto out;
1235
1236 /*
1237 * Reset the UART.
1238 */
1239#ifdef CONFIG_SERIAL_8250_RSA
1240 if (up->port.type == PORT_RSA)
1241 serial_outp(up, UART_RSA_FRR, 0);
1242#endif
1243 serial_outp(up, UART_MCR, save_mcr);
1244 serial8250_clear_fifos(up);
Alex Williamson40b36da2007-02-14 00:33:04 -08001245 serial_in(up, UART_RX);
Lennert Buytenhek5c8c7552005-11-12 21:58:05 +00001246 if (up->capabilities & UART_CAP_UUE)
1247 serial_outp(up, UART_IER, UART_IER_UUE);
1248 else
1249 serial_outp(up, UART_IER, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001250
Thomas Koellerbd71c182007-05-06 14:48:47 -07001251 out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001252 spin_unlock_irqrestore(&up->port.lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001253 DEBUG_AUTOCONF("type=%s\n", uart_config[up->port.type].name);
1254}
1255
1256static void autoconfig_irq(struct uart_8250_port *up)
1257{
1258 unsigned char save_mcr, save_ier;
1259 unsigned char save_ICP = 0;
1260 unsigned int ICP = 0;
1261 unsigned long irqs;
1262 int irq;
1263
1264 if (up->port.flags & UPF_FOURPORT) {
1265 ICP = (up->port.iobase & 0xfe0) | 0x1f;
1266 save_ICP = inb_p(ICP);
1267 outb_p(0x80, ICP);
1268 (void) inb_p(ICP);
1269 }
1270
1271 /* forget possible initially masked and pending IRQ */
1272 probe_irq_off(probe_irq_on());
1273 save_mcr = serial_inp(up, UART_MCR);
1274 save_ier = serial_inp(up, UART_IER);
1275 serial_outp(up, UART_MCR, UART_MCR_OUT1 | UART_MCR_OUT2);
Thomas Koellerbd71c182007-05-06 14:48:47 -07001276
Linus Torvalds1da177e2005-04-16 15:20:36 -07001277 irqs = probe_irq_on();
1278 serial_outp(up, UART_MCR, 0);
Alan Cox6f803cd2008-02-08 04:18:52 -08001279 udelay(10);
1280 if (up->port.flags & UPF_FOURPORT) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001281 serial_outp(up, UART_MCR,
1282 UART_MCR_DTR | UART_MCR_RTS);
1283 } else {
1284 serial_outp(up, UART_MCR,
1285 UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2);
1286 }
1287 serial_outp(up, UART_IER, 0x0f); /* enable all intrs */
1288 (void)serial_inp(up, UART_LSR);
1289 (void)serial_inp(up, UART_RX);
1290 (void)serial_inp(up, UART_IIR);
1291 (void)serial_inp(up, UART_MSR);
1292 serial_outp(up, UART_TX, 0xFF);
Alan Cox6f803cd2008-02-08 04:18:52 -08001293 udelay(20);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001294 irq = probe_irq_off(irqs);
1295
1296 serial_outp(up, UART_MCR, save_mcr);
1297 serial_outp(up, UART_IER, save_ier);
1298
1299 if (up->port.flags & UPF_FOURPORT)
1300 outb_p(save_ICP, ICP);
1301
1302 up->port.irq = (irq > 0) ? irq : 0;
1303}
1304
Russell Kinge763b902005-06-29 18:41:51 +01001305static inline void __stop_tx(struct uart_8250_port *p)
1306{
1307 if (p->ier & UART_IER_THRI) {
1308 p->ier &= ~UART_IER_THRI;
1309 serial_out(p, UART_IER, p->ier);
1310 }
1311}
1312
Russell Kingb129a8c2005-08-31 10:12:14 +01001313static void serial8250_stop_tx(struct uart_port *port)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001314{
Jamie Iles49d57412010-12-01 23:39:35 +00001315 struct uart_8250_port *up =
1316 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001317
Russell Kinge763b902005-06-29 18:41:51 +01001318 __stop_tx(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001319
1320 /*
Russell Kinge763b902005-06-29 18:41:51 +01001321 * We really want to stop the transmitter from sending.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001322 */
Russell Kinge763b902005-06-29 18:41:51 +01001323 if (up->port.type == PORT_16C950) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001324 up->acr |= UART_ACR_TXDIS;
1325 serial_icr_write(up, UART_ACR, up->acr);
1326 }
1327}
1328
Russell King55d3b282005-06-23 15:05:41 +01001329static void transmit_chars(struct uart_8250_port *up);
1330
Russell Kingb129a8c2005-08-31 10:12:14 +01001331static void serial8250_start_tx(struct uart_port *port)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001332{
Jamie Iles49d57412010-12-01 23:39:35 +00001333 struct uart_8250_port *up =
1334 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001335
1336 if (!(up->ier & UART_IER_THRI)) {
1337 up->ier |= UART_IER_THRI;
1338 serial_out(up, UART_IER, up->ier);
Russell King55d3b282005-06-23 15:05:41 +01001339
Russell King67f76542005-06-23 22:26:43 +01001340 if (up->bugs & UART_BUG_TXEN) {
Ian Jackson68cb4f82009-11-18 11:08:11 +01001341 unsigned char lsr;
Russell King55d3b282005-06-23 15:05:41 +01001342 lsr = serial_in(up, UART_LSR);
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001343 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
Thomas Koellerbd71c182007-05-06 14:48:47 -07001344 if ((up->port.type == PORT_RM9000) ?
Ian Jackson68cb4f82009-11-18 11:08:11 +01001345 (lsr & UART_LSR_THRE) :
1346 (lsr & UART_LSR_TEMT))
Russell King55d3b282005-06-23 15:05:41 +01001347 transmit_chars(up);
1348 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001349 }
Russell Kinge763b902005-06-29 18:41:51 +01001350
Linus Torvalds1da177e2005-04-16 15:20:36 -07001351 /*
Russell Kinge763b902005-06-29 18:41:51 +01001352 * Re-enable the transmitter if we disabled it.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001353 */
Russell Kinge763b902005-06-29 18:41:51 +01001354 if (up->port.type == PORT_16C950 && up->acr & UART_ACR_TXDIS) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001355 up->acr &= ~UART_ACR_TXDIS;
1356 serial_icr_write(up, UART_ACR, up->acr);
1357 }
1358}
1359
1360static void serial8250_stop_rx(struct uart_port *port)
1361{
Jamie Iles49d57412010-12-01 23:39:35 +00001362 struct uart_8250_port *up =
1363 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001364
1365 up->ier &= ~UART_IER_RLSI;
1366 up->port.read_status_mask &= ~UART_LSR_DR;
1367 serial_out(up, UART_IER, up->ier);
1368}
1369
1370static void serial8250_enable_ms(struct uart_port *port)
1371{
Jamie Iles49d57412010-12-01 23:39:35 +00001372 struct uart_8250_port *up =
1373 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001374
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00001375 /* no MSR capabilities */
1376 if (up->bugs & UART_BUG_NOMSR)
1377 return;
1378
Linus Torvalds1da177e2005-04-16 15:20:36 -07001379 up->ier |= UART_IER_MSI;
1380 serial_out(up, UART_IER, up->ier);
1381}
1382
Stephen Warren5f873ba2011-05-17 16:12:37 -06001383/*
1384 * Clear the Tegra rx fifo after a break
1385 *
1386 * FIXME: This needs to become a port specific callback once we have a
1387 * framework for this
1388 */
1389static void clear_rx_fifo(struct uart_8250_port *up)
1390{
1391 unsigned int status, tmout = 10000;
1392 do {
1393 status = serial_in(up, UART_LSR);
1394 if (status & (UART_LSR_FIFOE | UART_LSR_BRK_ERROR_BITS))
1395 status = serial_in(up, UART_RX);
1396 else
1397 break;
1398 if (--tmout == 0)
1399 break;
1400 udelay(1);
1401 } while (1);
1402}
1403
Russell Kingea8874d2006-01-04 19:43:24 +00001404static void
Thomas Koellercc79aa92007-02-20 13:58:05 -08001405receive_chars(struct uart_8250_port *up, unsigned int *status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001406{
Alan Coxebd2c8f2009-09-19 13:13:28 -07001407 struct tty_struct *tty = up->port.state->port.tty;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001408 unsigned char ch, lsr = *status;
1409 int max_count = 256;
1410 char flag;
1411
1412 do {
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001413 if (likely(lsr & UART_LSR_DR))
1414 ch = serial_inp(up, UART_RX);
1415 else
1416 /*
1417 * Intel 82571 has a Serial Over Lan device that will
1418 * set UART_LSR_BI without setting UART_LSR_DR when
1419 * it receives a break. To avoid reading from the
1420 * receive buffer without UART_LSR_DR bit set, we
1421 * just force the read character to be 0
1422 */
1423 ch = 0;
1424
Linus Torvalds1da177e2005-04-16 15:20:36 -07001425 flag = TTY_NORMAL;
1426 up->port.icount.rx++;
1427
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001428 lsr |= up->lsr_saved_flags;
1429 up->lsr_saved_flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001430
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001431 if (unlikely(lsr & UART_LSR_BRK_ERROR_BITS)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001432 /*
1433 * For statistics only
1434 */
1435 if (lsr & UART_LSR_BI) {
1436 lsr &= ~(UART_LSR_FE | UART_LSR_PE);
1437 up->port.icount.brk++;
1438 /*
Stephen Warren5f873ba2011-05-17 16:12:37 -06001439 * If tegra port then clear the rx fifo to
1440 * accept another break/character.
1441 */
1442 if (up->port.type == PORT_TEGRA)
1443 clear_rx_fifo(up);
1444
1445 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001446 * We do the SysRQ and SAK checking
1447 * here because otherwise the break
1448 * may get masked by ignore_status_mask
1449 * or read_status_mask.
1450 */
1451 if (uart_handle_break(&up->port))
1452 goto ignore_char;
1453 } else if (lsr & UART_LSR_PE)
1454 up->port.icount.parity++;
1455 else if (lsr & UART_LSR_FE)
1456 up->port.icount.frame++;
1457 if (lsr & UART_LSR_OE)
1458 up->port.icount.overrun++;
1459
1460 /*
Russell King23907eb2005-04-16 15:26:39 -07001461 * Mask off conditions which should be ignored.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001462 */
1463 lsr &= up->port.read_status_mask;
1464
1465 if (lsr & UART_LSR_BI) {
1466 DEBUG_INTR("handling break....");
1467 flag = TTY_BREAK;
1468 } else if (lsr & UART_LSR_PE)
1469 flag = TTY_PARITY;
1470 else if (lsr & UART_LSR_FE)
1471 flag = TTY_FRAME;
1472 }
David Howells7d12e782006-10-05 14:55:46 +01001473 if (uart_handle_sysrq_char(&up->port, ch))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001474 goto ignore_char;
Russell King05ab3012005-05-09 23:21:59 +01001475
1476 uart_insert_char(&up->port, lsr, UART_LSR_OE, ch, flag);
1477
Alan Cox6f803cd2008-02-08 04:18:52 -08001478ignore_char:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001479 lsr = serial_inp(up, UART_LSR);
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001480 } while ((lsr & (UART_LSR_DR | UART_LSR_BI)) && (max_count-- > 0));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001481 spin_unlock(&up->port.lock);
1482 tty_flip_buffer_push(tty);
1483 spin_lock(&up->port.lock);
1484 *status = lsr;
1485}
1486
Russell Kingea8874d2006-01-04 19:43:24 +00001487static void transmit_chars(struct uart_8250_port *up)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001488{
Alan Coxebd2c8f2009-09-19 13:13:28 -07001489 struct circ_buf *xmit = &up->port.state->xmit;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001490 int count;
1491
1492 if (up->port.x_char) {
1493 serial_outp(up, UART_TX, up->port.x_char);
1494 up->port.icount.tx++;
1495 up->port.x_char = 0;
1496 return;
1497 }
Russell Kingb129a8c2005-08-31 10:12:14 +01001498 if (uart_tx_stopped(&up->port)) {
1499 serial8250_stop_tx(&up->port);
1500 return;
1501 }
1502 if (uart_circ_empty(xmit)) {
Russell Kinge763b902005-06-29 18:41:51 +01001503 __stop_tx(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001504 return;
1505 }
1506
1507 count = up->tx_loadsz;
1508 do {
1509 serial_out(up, UART_TX, xmit->buf[xmit->tail]);
1510 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
1511 up->port.icount.tx++;
1512 if (uart_circ_empty(xmit))
1513 break;
1514 } while (--count > 0);
1515
1516 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
1517 uart_write_wakeup(&up->port);
1518
1519 DEBUG_INTR("THRE...");
1520
1521 if (uart_circ_empty(xmit))
Russell Kinge763b902005-06-29 18:41:51 +01001522 __stop_tx(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001523}
1524
Russell King2af7cd62006-01-04 16:55:09 +00001525static unsigned int check_modem_status(struct uart_8250_port *up)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001526{
Russell King2af7cd62006-01-04 16:55:09 +00001527 unsigned int status = serial_in(up, UART_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001528
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001529 status |= up->msr_saved_flags;
1530 up->msr_saved_flags = 0;
Taku Izumifdc30b32007-04-23 14:41:00 -07001531 if (status & UART_MSR_ANY_DELTA && up->ier & UART_IER_MSI &&
Alan Coxebd2c8f2009-09-19 13:13:28 -07001532 up->port.state != NULL) {
Russell King2af7cd62006-01-04 16:55:09 +00001533 if (status & UART_MSR_TERI)
1534 up->port.icount.rng++;
1535 if (status & UART_MSR_DDSR)
1536 up->port.icount.dsr++;
1537 if (status & UART_MSR_DDCD)
1538 uart_handle_dcd_change(&up->port, status & UART_MSR_DCD);
1539 if (status & UART_MSR_DCTS)
1540 uart_handle_cts_change(&up->port, status & UART_MSR_CTS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001541
Alan Coxbdc04e32009-09-19 13:13:31 -07001542 wake_up_interruptible(&up->port.state->port.delta_msr_wait);
Russell King2af7cd62006-01-04 16:55:09 +00001543 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001544
Russell King2af7cd62006-01-04 16:55:09 +00001545 return status;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001546}
1547
1548/*
1549 * This handles the interrupt from one port.
1550 */
Will Newtonb5d674a2008-10-13 10:36:21 +01001551static void serial8250_handle_port(struct uart_8250_port *up)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001552{
Russell King45e24602006-01-04 19:19:06 +00001553 unsigned int status;
Jiri Kosina4bf36312007-04-23 14:41:21 -07001554 unsigned long flags;
Russell King45e24602006-01-04 19:19:06 +00001555
Jiri Kosina4bf36312007-04-23 14:41:21 -07001556 spin_lock_irqsave(&up->port.lock, flags);
Russell King45e24602006-01-04 19:19:06 +00001557
1558 status = serial_inp(up, UART_LSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001559
1560 DEBUG_INTR("status = %x...", status);
1561
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001562 if (status & (UART_LSR_DR | UART_LSR_BI))
David Howells7d12e782006-10-05 14:55:46 +01001563 receive_chars(up, &status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001564 check_modem_status(up);
1565 if (status & UART_LSR_THRE)
1566 transmit_chars(up);
Russell King45e24602006-01-04 19:19:06 +00001567
Jiri Kosina4bf36312007-04-23 14:41:21 -07001568 spin_unlock_irqrestore(&up->port.lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001569}
1570
Jamie Iles583d28e2011-08-15 10:17:52 +01001571int serial8250_handle_irq(struct uart_port *port, unsigned int iir)
1572{
1573 struct uart_8250_port *up =
1574 container_of(port, struct uart_8250_port, port);
1575
1576 if (!(iir & UART_IIR_NO_INT)) {
1577 serial8250_handle_port(up);
1578 return 1;
1579 }
1580
1581 return 0;
1582}
Jamie Ilesc7a1bdc2011-08-26 19:04:49 +01001583EXPORT_SYMBOL_GPL(serial8250_handle_irq);
Jamie Iles583d28e2011-08-15 10:17:52 +01001584
1585static int serial8250_default_handle_irq(struct uart_port *port)
1586{
1587 struct uart_8250_port *up =
1588 container_of(port, struct uart_8250_port, port);
1589 unsigned int iir = serial_in(up, UART_IIR);
1590
1591 return serial8250_handle_irq(port, iir);
1592}
1593
Linus Torvalds1da177e2005-04-16 15:20:36 -07001594/*
1595 * This is the serial driver's interrupt routine.
1596 *
1597 * Arjan thinks the old way was overly complex, so it got simplified.
1598 * Alan disagrees, saying that need the complexity to handle the weird
1599 * nature of ISA shared interrupts. (This is a special exception.)
1600 *
1601 * In order to handle ISA shared interrupts properly, we need to check
1602 * that all ports have been serviced, and therefore the ISA interrupt
1603 * line has been de-asserted.
1604 *
1605 * This means we need to loop through all ports. checking that they
1606 * don't have an interrupt pending.
1607 */
David Howells7d12e782006-10-05 14:55:46 +01001608static irqreturn_t serial8250_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001609{
1610 struct irq_info *i = dev_id;
1611 struct list_head *l, *end = NULL;
1612 int pass_counter = 0, handled = 0;
1613
1614 DEBUG_INTR("serial8250_interrupt(%d)...", irq);
1615
1616 spin_lock(&i->lock);
1617
1618 l = i->head;
1619 do {
1620 struct uart_8250_port *up;
Jamie Iles583d28e2011-08-15 10:17:52 +01001621 struct uart_port *port;
Dan Williams448ac152011-11-22 13:41:24 -08001622 bool skip;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001623
1624 up = list_entry(l, struct uart_8250_port, list);
Jamie Iles583d28e2011-08-15 10:17:52 +01001625 port = &up->port;
Dan Williams448ac152011-11-22 13:41:24 -08001626 skip = pass_counter && up->port.flags & UPF_IIR_ONCE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001627
Dan Williams448ac152011-11-22 13:41:24 -08001628 if (!skip && port->handle_irq(port)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001629 handled = 1;
Marc St-Jeanbeab6972007-05-06 14:48:45 -07001630 end = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001631 } else if (end == NULL)
1632 end = l;
1633
1634 l = l->next;
1635
1636 if (l == i->head && pass_counter++ > PASS_LIMIT) {
1637 /* If we hit this, we're dead. */
Daniel Drakecd3ecad2010-10-20 16:00:48 -07001638 printk_ratelimited(KERN_ERR
1639 "serial8250: too much work for irq%d\n", irq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001640 break;
1641 }
1642 } while (l != end);
1643
1644 spin_unlock(&i->lock);
1645
1646 DEBUG_INTR("end.\n");
1647
1648 return IRQ_RETVAL(handled);
1649}
1650
1651/*
1652 * To support ISA shared interrupts, we need to have one interrupt
1653 * handler that ensures that the IRQ line has been deasserted
1654 * before returning. Failing to do this will result in the IRQ
1655 * line being stuck active, and, since ISA irqs are edge triggered,
1656 * no more IRQs will be seen.
1657 */
1658static void serial_do_unlink(struct irq_info *i, struct uart_8250_port *up)
1659{
1660 spin_lock_irq(&i->lock);
1661
1662 if (!list_empty(i->head)) {
1663 if (i->head == &up->list)
1664 i->head = i->head->next;
1665 list_del(&up->list);
1666 } else {
1667 BUG_ON(i->head != &up->list);
1668 i->head = NULL;
1669 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001670 spin_unlock_irq(&i->lock);
Alan Cox25db8ad2008-08-19 20:49:40 -07001671 /* List empty so throw away the hash node */
1672 if (i->head == NULL) {
1673 hlist_del(&i->node);
1674 kfree(i);
1675 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001676}
1677
1678static int serial_link_irq_chain(struct uart_8250_port *up)
1679{
Alan Cox25db8ad2008-08-19 20:49:40 -07001680 struct hlist_head *h;
1681 struct hlist_node *n;
1682 struct irq_info *i;
Thomas Gleixner40663cc2006-07-01 19:29:43 -07001683 int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? IRQF_SHARED : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001684
Alan Cox25db8ad2008-08-19 20:49:40 -07001685 mutex_lock(&hash_mutex);
1686
1687 h = &irq_lists[up->port.irq % NR_IRQ_HASH];
1688
1689 hlist_for_each(n, h) {
1690 i = hlist_entry(n, struct irq_info, node);
1691 if (i->irq == up->port.irq)
1692 break;
1693 }
1694
1695 if (n == NULL) {
1696 i = kzalloc(sizeof(struct irq_info), GFP_KERNEL);
1697 if (i == NULL) {
1698 mutex_unlock(&hash_mutex);
1699 return -ENOMEM;
1700 }
1701 spin_lock_init(&i->lock);
1702 i->irq = up->port.irq;
1703 hlist_add_head(&i->node, h);
1704 }
1705 mutex_unlock(&hash_mutex);
1706
Linus Torvalds1da177e2005-04-16 15:20:36 -07001707 spin_lock_irq(&i->lock);
1708
1709 if (i->head) {
1710 list_add(&up->list, i->head);
1711 spin_unlock_irq(&i->lock);
1712
1713 ret = 0;
1714 } else {
1715 INIT_LIST_HEAD(&up->list);
1716 i->head = &up->list;
1717 spin_unlock_irq(&i->lock);
Vikram Pandita1c2f0492009-09-19 13:13:19 -07001718 irq_flags |= up->port.irqflags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001719 ret = request_irq(up->port.irq, serial8250_interrupt,
1720 irq_flags, "serial", i);
1721 if (ret < 0)
1722 serial_do_unlink(i, up);
1723 }
1724
1725 return ret;
1726}
1727
1728static void serial_unlink_irq_chain(struct uart_8250_port *up)
1729{
Alan Cox25db8ad2008-08-19 20:49:40 -07001730 struct irq_info *i;
1731 struct hlist_node *n;
1732 struct hlist_head *h;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001733
Alan Cox25db8ad2008-08-19 20:49:40 -07001734 mutex_lock(&hash_mutex);
1735
1736 h = &irq_lists[up->port.irq % NR_IRQ_HASH];
1737
1738 hlist_for_each(n, h) {
1739 i = hlist_entry(n, struct irq_info, node);
1740 if (i->irq == up->port.irq)
1741 break;
1742 }
1743
1744 BUG_ON(n == NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001745 BUG_ON(i->head == NULL);
1746
1747 if (list_empty(i->head))
1748 free_irq(up->port.irq, i);
1749
1750 serial_do_unlink(i, up);
Alan Cox25db8ad2008-08-19 20:49:40 -07001751 mutex_unlock(&hash_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001752}
1753
1754/*
1755 * This function is used to handle ports that do not have an
1756 * interrupt. This doesn't work very well for 16450's, but gives
1757 * barely passable results for a 16550A. (Although at the expense
1758 * of much CPU overhead).
1759 */
1760static void serial8250_timeout(unsigned long data)
1761{
1762 struct uart_8250_port *up = (struct uart_8250_port *)data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001763 unsigned int iir;
1764
1765 iir = serial_in(up, UART_IIR);
Russell King45e24602006-01-04 19:19:06 +00001766 if (!(iir & UART_IIR_NO_INT))
David Howells7d12e782006-10-05 14:55:46 +01001767 serial8250_handle_port(up);
Anton Vorontsov54381062010-10-01 17:21:25 +04001768 mod_timer(&up->timer, jiffies + uart_poll_timeout(&up->port));
Alex Williamson40b36da2007-02-14 00:33:04 -08001769}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001770
Alex Williamson40b36da2007-02-14 00:33:04 -08001771static void serial8250_backup_timeout(unsigned long data)
1772{
1773 struct uart_8250_port *up = (struct uart_8250_port *)data;
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001774 unsigned int iir, ier = 0, lsr;
1775 unsigned long flags;
Alex Williamson40b36da2007-02-14 00:33:04 -08001776
Al Cooperdbb3b1c2011-07-25 16:19:52 -04001777 spin_lock_irqsave(&up->port.lock, flags);
1778
Alex Williamson40b36da2007-02-14 00:33:04 -08001779 /*
1780 * Must disable interrupts or else we risk racing with the interrupt
1781 * based handler.
1782 */
1783 if (is_real_interrupt(up->port.irq)) {
1784 ier = serial_in(up, UART_IER);
1785 serial_out(up, UART_IER, 0);
1786 }
1787
1788 iir = serial_in(up, UART_IIR);
1789
1790 /*
1791 * This should be a safe test for anyone who doesn't trust the
1792 * IIR bits on their UART, but it's specifically designed for
1793 * the "Diva" UART used on the management processor on many HP
1794 * ia64 and parisc boxes.
1795 */
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001796 lsr = serial_in(up, UART_LSR);
1797 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
Alex Williamson40b36da2007-02-14 00:33:04 -08001798 if ((iir & UART_IIR_NO_INT) && (up->ier & UART_IER_THRI) &&
Alan Coxebd2c8f2009-09-19 13:13:28 -07001799 (!uart_circ_empty(&up->port.state->xmit) || up->port.x_char) &&
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001800 (lsr & UART_LSR_THRE)) {
Alex Williamson40b36da2007-02-14 00:33:04 -08001801 iir &= ~(UART_IIR_ID | UART_IIR_NO_INT);
1802 iir |= UART_IIR_THRI;
1803 }
1804
1805 if (!(iir & UART_IIR_NO_INT))
Al Cooperdbb3b1c2011-07-25 16:19:52 -04001806 transmit_chars(up);
Alex Williamson40b36da2007-02-14 00:33:04 -08001807
1808 if (is_real_interrupt(up->port.irq))
1809 serial_out(up, UART_IER, ier);
1810
Al Cooperdbb3b1c2011-07-25 16:19:52 -04001811 spin_unlock_irqrestore(&up->port.lock, flags);
1812
Alex Williamson40b36da2007-02-14 00:33:04 -08001813 /* Standard timer interval plus 0.2s to keep the port running */
Alan Cox6f803cd2008-02-08 04:18:52 -08001814 mod_timer(&up->timer,
Anton Vorontsov54381062010-10-01 17:21:25 +04001815 jiffies + uart_poll_timeout(&up->port) + HZ / 5);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001816}
1817
1818static unsigned int serial8250_tx_empty(struct uart_port *port)
1819{
Jamie Iles49d57412010-12-01 23:39:35 +00001820 struct uart_8250_port *up =
1821 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001822 unsigned long flags;
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001823 unsigned int lsr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001824
1825 spin_lock_irqsave(&up->port.lock, flags);
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001826 lsr = serial_in(up, UART_LSR);
1827 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001828 spin_unlock_irqrestore(&up->port.lock, flags);
1829
Dick Hollenbeckbca47612009-12-09 12:31:34 -08001830 return (lsr & BOTH_EMPTY) == BOTH_EMPTY ? TIOCSER_TEMT : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001831}
1832
1833static unsigned int serial8250_get_mctrl(struct uart_port *port)
1834{
Jamie Iles49d57412010-12-01 23:39:35 +00001835 struct uart_8250_port *up =
1836 container_of(port, struct uart_8250_port, port);
Russell King2af7cd62006-01-04 16:55:09 +00001837 unsigned int status;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001838 unsigned int ret;
1839
Russell King2af7cd62006-01-04 16:55:09 +00001840 status = check_modem_status(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001841
1842 ret = 0;
1843 if (status & UART_MSR_DCD)
1844 ret |= TIOCM_CAR;
1845 if (status & UART_MSR_RI)
1846 ret |= TIOCM_RNG;
1847 if (status & UART_MSR_DSR)
1848 ret |= TIOCM_DSR;
1849 if (status & UART_MSR_CTS)
1850 ret |= TIOCM_CTS;
1851 return ret;
1852}
1853
1854static void serial8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
1855{
Jamie Iles49d57412010-12-01 23:39:35 +00001856 struct uart_8250_port *up =
1857 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001858 unsigned char mcr = 0;
1859
1860 if (mctrl & TIOCM_RTS)
1861 mcr |= UART_MCR_RTS;
1862 if (mctrl & TIOCM_DTR)
1863 mcr |= UART_MCR_DTR;
1864 if (mctrl & TIOCM_OUT1)
1865 mcr |= UART_MCR_OUT1;
1866 if (mctrl & TIOCM_OUT2)
1867 mcr |= UART_MCR_OUT2;
1868 if (mctrl & TIOCM_LOOP)
1869 mcr |= UART_MCR_LOOP;
1870
1871 mcr = (mcr & up->mcr_mask) | up->mcr_force | up->mcr;
1872
1873 serial_out(up, UART_MCR, mcr);
1874}
1875
1876static void serial8250_break_ctl(struct uart_port *port, int break_state)
1877{
Jamie Iles49d57412010-12-01 23:39:35 +00001878 struct uart_8250_port *up =
1879 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001880 unsigned long flags;
1881
1882 spin_lock_irqsave(&up->port.lock, flags);
1883 if (break_state == -1)
1884 up->lcr |= UART_LCR_SBC;
1885 else
1886 up->lcr &= ~UART_LCR_SBC;
1887 serial_out(up, UART_LCR, up->lcr);
1888 spin_unlock_irqrestore(&up->port.lock, flags);
1889}
1890
Alex Williamson40b36da2007-02-14 00:33:04 -08001891/*
1892 * Wait for transmitter & holding register to empty
1893 */
Will Newtonb5d674a2008-10-13 10:36:21 +01001894static void wait_for_xmitr(struct uart_8250_port *up, int bits)
Alex Williamson40b36da2007-02-14 00:33:04 -08001895{
1896 unsigned int status, tmout = 10000;
1897
1898 /* Wait up to 10ms for the character(s) to be sent. */
David Daney97d303b2010-10-05 11:40:07 -07001899 for (;;) {
Alex Williamson40b36da2007-02-14 00:33:04 -08001900 status = serial_in(up, UART_LSR);
1901
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001902 up->lsr_saved_flags |= status & LSR_SAVE_FLAGS;
Alex Williamson40b36da2007-02-14 00:33:04 -08001903
David Daney97d303b2010-10-05 11:40:07 -07001904 if ((status & bits) == bits)
1905 break;
Alex Williamson40b36da2007-02-14 00:33:04 -08001906 if (--tmout == 0)
1907 break;
1908 udelay(1);
David Daney97d303b2010-10-05 11:40:07 -07001909 }
Alex Williamson40b36da2007-02-14 00:33:04 -08001910
1911 /* Wait up to 1s for flow control if necessary */
1912 if (up->port.flags & UPF_CONS_FLOW) {
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001913 unsigned int tmout;
1914 for (tmout = 1000000; tmout; tmout--) {
1915 unsigned int msr = serial_in(up, UART_MSR);
1916 up->msr_saved_flags |= msr & MSR_SAVE_FLAGS;
1917 if (msr & UART_MSR_CTS)
1918 break;
Alex Williamson40b36da2007-02-14 00:33:04 -08001919 udelay(1);
1920 touch_nmi_watchdog();
1921 }
1922 }
1923}
1924
Jason Wesself2d937f2008-04-17 20:05:37 +02001925#ifdef CONFIG_CONSOLE_POLL
1926/*
1927 * Console polling routines for writing and reading from the uart while
1928 * in an interrupt or debug context.
1929 */
1930
1931static int serial8250_get_poll_char(struct uart_port *port)
1932{
Jamie Iles49d57412010-12-01 23:39:35 +00001933 struct uart_8250_port *up =
1934 container_of(port, struct uart_8250_port, port);
Jason Wesself2d937f2008-04-17 20:05:37 +02001935 unsigned char lsr = serial_inp(up, UART_LSR);
1936
Jason Wesself5316b42010-05-20 21:04:22 -05001937 if (!(lsr & UART_LSR_DR))
1938 return NO_POLL_CHAR;
Jason Wesself2d937f2008-04-17 20:05:37 +02001939
1940 return serial_inp(up, UART_RX);
1941}
1942
1943
1944static void serial8250_put_poll_char(struct uart_port *port,
1945 unsigned char c)
1946{
1947 unsigned int ier;
Jamie Iles49d57412010-12-01 23:39:35 +00001948 struct uart_8250_port *up =
1949 container_of(port, struct uart_8250_port, port);
Jason Wesself2d937f2008-04-17 20:05:37 +02001950
1951 /*
1952 * First save the IER then disable the interrupts
1953 */
1954 ier = serial_in(up, UART_IER);
1955 if (up->capabilities & UART_CAP_UUE)
1956 serial_out(up, UART_IER, UART_IER_UUE);
1957 else
1958 serial_out(up, UART_IER, 0);
1959
1960 wait_for_xmitr(up, BOTH_EMPTY);
1961 /*
1962 * Send the character out.
1963 * If a LF, also do CR...
1964 */
1965 serial_out(up, UART_TX, c);
1966 if (c == 10) {
1967 wait_for_xmitr(up, BOTH_EMPTY);
1968 serial_out(up, UART_TX, 13);
1969 }
1970
1971 /*
1972 * Finally, wait for transmitter to become empty
1973 * and restore the IER
1974 */
1975 wait_for_xmitr(up, BOTH_EMPTY);
1976 serial_out(up, UART_IER, ier);
1977}
1978
1979#endif /* CONFIG_CONSOLE_POLL */
1980
Linus Torvalds1da177e2005-04-16 15:20:36 -07001981static int serial8250_startup(struct uart_port *port)
1982{
Jamie Iles49d57412010-12-01 23:39:35 +00001983 struct uart_8250_port *up =
1984 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001985 unsigned long flags;
Russell King55d3b282005-06-23 15:05:41 +01001986 unsigned char lsr, iir;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001987 int retval;
1988
Ondrej Puzmane4f05af2010-12-04 21:17:38 +01001989 up->port.fifosize = uart_config[up->port.type].fifo_size;
1990 up->tx_loadsz = uart_config[up->port.type].tx_loadsz;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001991 up->capabilities = uart_config[up->port.type].flags;
1992 up->mcr = 0;
1993
Alan Coxb8e7e402009-05-28 14:01:35 +01001994 if (up->port.iotype != up->cur_iotype)
1995 set_io_from_upio(port);
1996
Linus Torvalds1da177e2005-04-16 15:20:36 -07001997 if (up->port.type == PORT_16C950) {
1998 /* Wake up and initialize UART */
1999 up->acr = 0;
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -08002000 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002001 serial_outp(up, UART_EFR, UART_EFR_ECB);
2002 serial_outp(up, UART_IER, 0);
2003 serial_outp(up, UART_LCR, 0);
2004 serial_icr_write(up, UART_CSR, 0); /* Reset the UART */
Wolfram Sang7d73aaf2011-12-09 18:07:13 +01002005 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002006 serial_outp(up, UART_EFR, UART_EFR_ECB);
2007 serial_outp(up, UART_LCR, 0);
2008 }
2009
2010#ifdef CONFIG_SERIAL_8250_RSA
2011 /*
2012 * If this is an RSA port, see if we can kick it up to the
2013 * higher speed clock.
2014 */
2015 enable_rsa(up);
2016#endif
2017
2018 /*
2019 * Clear the FIFO buffers and disable them.
Alexey Dobriyan7f927fc2006-03-28 01:56:53 -08002020 * (they will be reenabled in set_termios())
Linus Torvalds1da177e2005-04-16 15:20:36 -07002021 */
2022 serial8250_clear_fifos(up);
2023
2024 /*
2025 * Clear the interrupt registers.
2026 */
2027 (void) serial_inp(up, UART_LSR);
2028 (void) serial_inp(up, UART_RX);
2029 (void) serial_inp(up, UART_IIR);
2030 (void) serial_inp(up, UART_MSR);
2031
2032 /*
2033 * At this point, there's no way the LSR could still be 0xff;
2034 * if it is, then bail out, because there's likely no UART
2035 * here.
2036 */
2037 if (!(up->port.flags & UPF_BUGGY_UART) &&
2038 (serial_inp(up, UART_LSR) == 0xff)) {
Konrad Rzeszutek Wilk7808a4c2011-09-26 09:14:34 -04002039 printk_ratelimited(KERN_INFO "ttyS%d: LSR safety check engaged!\n",
2040 serial_index(&up->port));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002041 return -ENODEV;
2042 }
2043
2044 /*
2045 * For a XR16C850, we need to set the trigger levels
2046 */
2047 if (up->port.type == PORT_16850) {
2048 unsigned char fctr;
2049
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -08002050 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002051
2052 fctr = serial_inp(up, UART_FCTR) & ~(UART_FCTR_RX|UART_FCTR_TX);
2053 serial_outp(up, UART_FCTR, fctr | UART_FCTR_TRGD | UART_FCTR_RX);
2054 serial_outp(up, UART_TRG, UART_TRG_96);
2055 serial_outp(up, UART_FCTR, fctr | UART_FCTR_TRGD | UART_FCTR_TX);
2056 serial_outp(up, UART_TRG, UART_TRG_96);
2057
2058 serial_outp(up, UART_LCR, 0);
2059 }
2060
Alex Williamson40b36da2007-02-14 00:33:04 -08002061 if (is_real_interrupt(up->port.irq)) {
Alex Williamson01c194d2008-04-28 02:14:09 -07002062 unsigned char iir1;
Alex Williamson40b36da2007-02-14 00:33:04 -08002063 /*
2064 * Test for UARTs that do not reassert THRE when the
2065 * transmitter is idle and the interrupt has already
2066 * been cleared. Real 16550s should always reassert
2067 * this interrupt whenever the transmitter is idle and
2068 * the interrupt is enabled. Delays are necessary to
2069 * allow register changes to become visible.
2070 */
Borislav Petkovc389d272008-07-29 22:33:32 -07002071 spin_lock_irqsave(&up->port.lock, flags);
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002072 if (up->port.irqflags & IRQF_SHARED)
Anton Vorontsov768aec02008-07-22 11:21:07 +01002073 disable_irq_nosync(up->port.irq);
Alex Williamson40b36da2007-02-14 00:33:04 -08002074
2075 wait_for_xmitr(up, UART_LSR_THRE);
2076 serial_out_sync(up, UART_IER, UART_IER_THRI);
2077 udelay(1); /* allow THRE to set */
Alex Williamson01c194d2008-04-28 02:14:09 -07002078 iir1 = serial_in(up, UART_IIR);
Alex Williamson40b36da2007-02-14 00:33:04 -08002079 serial_out(up, UART_IER, 0);
2080 serial_out_sync(up, UART_IER, UART_IER_THRI);
2081 udelay(1); /* allow a working UART time to re-assert THRE */
2082 iir = serial_in(up, UART_IIR);
2083 serial_out(up, UART_IER, 0);
2084
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002085 if (up->port.irqflags & IRQF_SHARED)
Anton Vorontsov768aec02008-07-22 11:21:07 +01002086 enable_irq(up->port.irq);
Borislav Petkovc389d272008-07-29 22:33:32 -07002087 spin_unlock_irqrestore(&up->port.lock, flags);
Alex Williamson40b36da2007-02-14 00:33:04 -08002088
2089 /*
2090 * If the interrupt is not reasserted, setup a timer to
2091 * kick the UART on a regular basis.
2092 */
Alex Williamson01c194d2008-04-28 02:14:09 -07002093 if (!(iir1 & UART_IIR_NO_INT) && (iir & UART_IIR_NO_INT)) {
Will Newton363f66f2008-09-02 14:35:44 -07002094 up->bugs |= UART_BUG_THRE;
David S. Miller84408382008-10-13 10:45:26 +01002095 pr_debug("ttyS%d - using backup timer\n",
2096 serial_index(port));
Alex Williamson40b36da2007-02-14 00:33:04 -08002097 }
2098 }
2099
Linus Torvalds1da177e2005-04-16 15:20:36 -07002100 /*
Will Newton363f66f2008-09-02 14:35:44 -07002101 * The above check will only give an accurate result the first time
2102 * the port is opened so this value needs to be preserved.
2103 */
2104 if (up->bugs & UART_BUG_THRE) {
2105 up->timer.function = serial8250_backup_timeout;
2106 up->timer.data = (unsigned long)up;
2107 mod_timer(&up->timer, jiffies +
Anton Vorontsov54381062010-10-01 17:21:25 +04002108 uart_poll_timeout(port) + HZ / 5);
Will Newton363f66f2008-09-02 14:35:44 -07002109 }
2110
2111 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002112 * If the "interrupt" for this port doesn't correspond with any
2113 * hardware interrupt, we use a timer-based system. The original
2114 * driver used to do this with IRQ0.
2115 */
2116 if (!is_real_interrupt(up->port.irq)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002117 up->timer.data = (unsigned long)up;
Anton Vorontsov54381062010-10-01 17:21:25 +04002118 mod_timer(&up->timer, jiffies + uart_poll_timeout(port));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002119 } else {
2120 retval = serial_link_irq_chain(up);
2121 if (retval)
2122 return retval;
2123 }
2124
2125 /*
2126 * Now, initialize the UART
2127 */
2128 serial_outp(up, UART_LCR, UART_LCR_WLEN8);
2129
2130 spin_lock_irqsave(&up->port.lock, flags);
2131 if (up->port.flags & UPF_FOURPORT) {
2132 if (!is_real_interrupt(up->port.irq))
2133 up->port.mctrl |= TIOCM_OUT1;
2134 } else
2135 /*
2136 * Most PC uarts need OUT2 raised to enable interrupts.
2137 */
2138 if (is_real_interrupt(up->port.irq))
2139 up->port.mctrl |= TIOCM_OUT2;
2140
2141 serial8250_set_mctrl(&up->port, up->port.mctrl);
Russell King55d3b282005-06-23 15:05:41 +01002142
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002143 /* Serial over Lan (SoL) hack:
2144 Intel 8257x Gigabit ethernet chips have a
2145 16550 emulation, to be used for Serial Over Lan.
2146 Those chips take a longer time than a normal
2147 serial device to signalize that a transmission
2148 data was queued. Due to that, the above test generally
2149 fails. One solution would be to delay the reading of
2150 iir. However, this is not reliable, since the timeout
2151 is variable. So, let's just don't test if we receive
2152 TX irq. This way, we'll never enable UART_BUG_TXEN.
2153 */
Chuck Ebbertd41a4b52009-10-01 15:44:26 -07002154 if (skip_txen_test || up->port.flags & UPF_NO_TXEN_TEST)
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002155 goto dont_test_tx_en;
2156
Russell King55d3b282005-06-23 15:05:41 +01002157 /*
2158 * Do a quick test to see if we receive an
2159 * interrupt when we enable the TX irq.
2160 */
2161 serial_outp(up, UART_IER, UART_IER_THRI);
2162 lsr = serial_in(up, UART_LSR);
2163 iir = serial_in(up, UART_IIR);
2164 serial_outp(up, UART_IER, 0);
2165
2166 if (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT) {
Russell King67f76542005-06-23 22:26:43 +01002167 if (!(up->bugs & UART_BUG_TXEN)) {
2168 up->bugs |= UART_BUG_TXEN;
Russell King55d3b282005-06-23 15:05:41 +01002169 pr_debug("ttyS%d - enabling bad tx status workarounds\n",
David S. Miller84408382008-10-13 10:45:26 +01002170 serial_index(port));
Russell King55d3b282005-06-23 15:05:41 +01002171 }
2172 } else {
Russell King67f76542005-06-23 22:26:43 +01002173 up->bugs &= ~UART_BUG_TXEN;
Russell King55d3b282005-06-23 15:05:41 +01002174 }
2175
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002176dont_test_tx_en:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002177 spin_unlock_irqrestore(&up->port.lock, flags);
2178
2179 /*
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002180 * Clear the interrupt registers again for luck, and clear the
2181 * saved flags to avoid getting false values from polling
2182 * routines or the previous session.
2183 */
2184 serial_inp(up, UART_LSR);
2185 serial_inp(up, UART_RX);
2186 serial_inp(up, UART_IIR);
2187 serial_inp(up, UART_MSR);
2188 up->lsr_saved_flags = 0;
2189 up->msr_saved_flags = 0;
2190
2191 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002192 * Finally, enable interrupts. Note: Modem status interrupts
2193 * are set via set_termios(), which will be occurring imminently
2194 * anyway, so we don't enable them here.
2195 */
2196 up->ier = UART_IER_RLSI | UART_IER_RDI;
2197 serial_outp(up, UART_IER, up->ier);
2198
2199 if (up->port.flags & UPF_FOURPORT) {
2200 unsigned int icp;
2201 /*
2202 * Enable interrupts on the AST Fourport board
2203 */
2204 icp = (up->port.iobase & 0xfe0) | 0x01f;
2205 outb_p(0x80, icp);
2206 (void) inb_p(icp);
2207 }
2208
Linus Torvalds1da177e2005-04-16 15:20:36 -07002209 return 0;
2210}
2211
2212static void serial8250_shutdown(struct uart_port *port)
2213{
Jamie Iles49d57412010-12-01 23:39:35 +00002214 struct uart_8250_port *up =
2215 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002216 unsigned long flags;
2217
2218 /*
2219 * Disable interrupts from this port
2220 */
2221 up->ier = 0;
2222 serial_outp(up, UART_IER, 0);
2223
2224 spin_lock_irqsave(&up->port.lock, flags);
2225 if (up->port.flags & UPF_FOURPORT) {
2226 /* reset interrupts on the AST Fourport board */
2227 inb((up->port.iobase & 0xfe0) | 0x1f);
2228 up->port.mctrl |= TIOCM_OUT1;
2229 } else
2230 up->port.mctrl &= ~TIOCM_OUT2;
2231
2232 serial8250_set_mctrl(&up->port, up->port.mctrl);
2233 spin_unlock_irqrestore(&up->port.lock, flags);
2234
2235 /*
2236 * Disable break condition and FIFOs
2237 */
2238 serial_out(up, UART_LCR, serial_inp(up, UART_LCR) & ~UART_LCR_SBC);
2239 serial8250_clear_fifos(up);
2240
2241#ifdef CONFIG_SERIAL_8250_RSA
2242 /*
2243 * Reset the RSA board back to 115kbps compat mode.
2244 */
2245 disable_rsa(up);
2246#endif
2247
2248 /*
2249 * Read data port to reset things, and then unlink from
2250 * the IRQ chain.
2251 */
2252 (void) serial_in(up, UART_RX);
2253
Alex Williamson40b36da2007-02-14 00:33:04 -08002254 del_timer_sync(&up->timer);
2255 up->timer.function = serial8250_timeout;
2256 if (is_real_interrupt(up->port.irq))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002257 serial_unlink_irq_chain(up);
2258}
2259
2260static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud)
2261{
2262 unsigned int quot;
2263
2264 /*
2265 * Handle magic divisors for baud rates above baud_base on
2266 * SMSC SuperIO chips.
2267 */
2268 if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
2269 baud == (port->uartclk/4))
2270 quot = 0x8001;
2271 else if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
2272 baud == (port->uartclk/8))
2273 quot = 0x8002;
2274 else
2275 quot = uart_get_divisor(port, baud);
2276
2277 return quot;
2278}
2279
Philippe Langlais235dae52010-07-29 17:13:57 +02002280void
2281serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
2282 struct ktermios *old)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002283{
Jamie Iles49d57412010-12-01 23:39:35 +00002284 struct uart_8250_port *up =
2285 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002286 unsigned char cval, fcr = 0;
2287 unsigned long flags;
2288 unsigned int baud, quot;
2289
2290 switch (termios->c_cflag & CSIZE) {
2291 case CS5:
Russell King0a8b80c52005-06-24 19:48:22 +01002292 cval = UART_LCR_WLEN5;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002293 break;
2294 case CS6:
Russell King0a8b80c52005-06-24 19:48:22 +01002295 cval = UART_LCR_WLEN6;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002296 break;
2297 case CS7:
Russell King0a8b80c52005-06-24 19:48:22 +01002298 cval = UART_LCR_WLEN7;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002299 break;
2300 default:
2301 case CS8:
Russell King0a8b80c52005-06-24 19:48:22 +01002302 cval = UART_LCR_WLEN8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002303 break;
2304 }
2305
2306 if (termios->c_cflag & CSTOPB)
Russell King0a8b80c52005-06-24 19:48:22 +01002307 cval |= UART_LCR_STOP;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002308 if (termios->c_cflag & PARENB)
2309 cval |= UART_LCR_PARITY;
2310 if (!(termios->c_cflag & PARODD))
2311 cval |= UART_LCR_EPAR;
2312#ifdef CMSPAR
2313 if (termios->c_cflag & CMSPAR)
2314 cval |= UART_LCR_SPAR;
2315#endif
2316
2317 /*
2318 * Ask the core to calculate the divisor for us.
2319 */
Anton Vorontsov24d481e2009-09-19 13:13:20 -07002320 baud = uart_get_baud_rate(port, termios, old,
2321 port->uartclk / 16 / 0xffff,
2322 port->uartclk / 16);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002323 quot = serial8250_get_divisor(port, baud);
2324
2325 /*
Russell King4ba5e352005-06-23 10:43:04 +01002326 * Oxford Semi 952 rev B workaround
Linus Torvalds1da177e2005-04-16 15:20:36 -07002327 */
Russell King4ba5e352005-06-23 10:43:04 +01002328 if (up->bugs & UART_BUG_QUOT && (quot & 0xff) == 0)
Alan Cox3e8d4e22008-02-04 22:27:53 -08002329 quot++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002330
2331 if (up->capabilities & UART_CAP_FIFO && up->port.fifosize > 1) {
2332 if (baud < 2400)
2333 fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1;
2334 else
2335 fcr = uart_config[up->port.type].fcr;
2336 }
2337
2338 /*
2339 * MCR-based auto flow control. When AFE is enabled, RTS will be
2340 * deasserted when the receive FIFO contains more characters than
2341 * the trigger, or the MCR RTS bit is cleared. In the case where
2342 * the remote UART is not using CTS auto flow control, we must
2343 * have sufficient FIFO entries for the latency of the remote
2344 * UART to respond. IOW, at least 32 bytes of FIFO.
2345 */
2346 if (up->capabilities & UART_CAP_AFE && up->port.fifosize >= 32) {
2347 up->mcr &= ~UART_MCR_AFE;
2348 if (termios->c_cflag & CRTSCTS)
2349 up->mcr |= UART_MCR_AFE;
2350 }
2351
2352 /*
2353 * Ok, we're now changing the port state. Do it with
2354 * interrupts disabled.
2355 */
2356 spin_lock_irqsave(&up->port.lock, flags);
2357
2358 /*
2359 * Update the per-port timeout.
2360 */
2361 uart_update_timeout(port, termios->c_cflag, baud);
2362
2363 up->port.read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR;
2364 if (termios->c_iflag & INPCK)
2365 up->port.read_status_mask |= UART_LSR_FE | UART_LSR_PE;
2366 if (termios->c_iflag & (BRKINT | PARMRK))
2367 up->port.read_status_mask |= UART_LSR_BI;
2368
2369 /*
2370 * Characteres to ignore
2371 */
2372 up->port.ignore_status_mask = 0;
2373 if (termios->c_iflag & IGNPAR)
2374 up->port.ignore_status_mask |= UART_LSR_PE | UART_LSR_FE;
2375 if (termios->c_iflag & IGNBRK) {
2376 up->port.ignore_status_mask |= UART_LSR_BI;
2377 /*
2378 * If we're ignoring parity and break indicators,
2379 * ignore overruns too (for real raw support).
2380 */
2381 if (termios->c_iflag & IGNPAR)
2382 up->port.ignore_status_mask |= UART_LSR_OE;
2383 }
2384
2385 /*
2386 * ignore all characters if CREAD is not set
2387 */
2388 if ((termios->c_cflag & CREAD) == 0)
2389 up->port.ignore_status_mask |= UART_LSR_DR;
2390
2391 /*
2392 * CTS flow control flag and modem status interrupts
2393 */
Ingo Molnarf8b372a2010-11-13 16:21:58 +01002394 up->ier &= ~UART_IER_MSI;
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00002395 if (!(up->bugs & UART_BUG_NOMSR) &&
2396 UART_ENABLE_MS(&up->port, termios->c_cflag))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002397 up->ier |= UART_IER_MSI;
2398 if (up->capabilities & UART_CAP_UUE)
Stephen Warren4539c242011-05-17 16:12:36 -06002399 up->ier |= UART_IER_UUE;
2400 if (up->capabilities & UART_CAP_RTOIE)
2401 up->ier |= UART_IER_RTOIE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002402
2403 serial_out(up, UART_IER, up->ier);
2404
2405 if (up->capabilities & UART_CAP_EFR) {
2406 unsigned char efr = 0;
2407 /*
2408 * TI16C752/Startech hardware flow control. FIXME:
2409 * - TI16C752 requires control thresholds to be set.
2410 * - UART_MCR_RTS is ineffective if auto-RTS mode is enabled.
2411 */
2412 if (termios->c_cflag & CRTSCTS)
2413 efr |= UART_EFR_CTS;
2414
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -08002415 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B);
Søren Holm06315342011-09-02 22:55:37 +02002416 if (up->port.flags & UPF_EXAR_EFR)
2417 serial_outp(up, UART_XR_EFR, efr);
2418 else
2419 serial_outp(up, UART_EFR, efr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002420 }
2421
Russell Kingf2eda272008-09-01 21:47:59 +01002422#ifdef CONFIG_ARCH_OMAP
Jonathan McDowell255341c2006-08-14 23:05:32 -07002423 /* Workaround to enable 115200 baud on OMAP1510 internal ports */
Russell King56685452008-09-01 21:25:33 +01002424 if (cpu_is_omap1510() && is_omap_port(up)) {
Jonathan McDowell255341c2006-08-14 23:05:32 -07002425 if (baud == 115200) {
2426 quot = 1;
2427 serial_out(up, UART_OMAP_OSC_12M_SEL, 1);
2428 } else
2429 serial_out(up, UART_OMAP_OSC_12M_SEL, 0);
2430 }
2431#endif
2432
Linus Torvalds1da177e2005-04-16 15:20:36 -07002433 if (up->capabilities & UART_NATSEMI) {
2434 /* Switch to bank 2 not bank 1, to avoid resetting EXCR2 */
2435 serial_outp(up, UART_LCR, 0xe0);
2436 } else {
2437 serial_outp(up, UART_LCR, cval | UART_LCR_DLAB);/* set DLAB */
2438 }
2439
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +01002440 serial_dl_write(up, quot);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002441
2442 /*
2443 * LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR
2444 * is written without DLAB set, this mode will be disabled.
2445 */
2446 if (up->port.type == PORT_16750)
2447 serial_outp(up, UART_FCR, fcr);
2448
2449 serial_outp(up, UART_LCR, cval); /* reset DLAB */
2450 up->lcr = cval; /* Save LCR */
2451 if (up->port.type != PORT_16750) {
2452 if (fcr & UART_FCR_ENABLE_FIFO) {
2453 /* emulated UARTs (Lucent Venus 167x) need two steps */
2454 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO);
2455 }
2456 serial_outp(up, UART_FCR, fcr); /* set fcr */
2457 }
2458 serial8250_set_mctrl(&up->port, up->port.mctrl);
2459 spin_unlock_irqrestore(&up->port.lock, flags);
Alan Coxe991a2b2008-04-28 02:14:06 -07002460 /* Don't rewrite B0 */
2461 if (tty_termios_baud_rate(termios))
2462 tty_termios_encode_baud_rate(termios, baud, baud);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002463}
Philippe Langlais235dae52010-07-29 17:13:57 +02002464EXPORT_SYMBOL(serial8250_do_set_termios);
2465
2466static void
2467serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
2468 struct ktermios *old)
2469{
2470 if (port->set_termios)
2471 port->set_termios(port, termios, old);
2472 else
2473 serial8250_do_set_termios(port, termios, old);
2474}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002475
2476static void
Arnd Bergmanna0821df2010-06-01 22:53:11 +02002477serial8250_set_ldisc(struct uart_port *port, int new)
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002478{
Arnd Bergmanna0821df2010-06-01 22:53:11 +02002479 if (new == N_PPS) {
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002480 port->flags |= UPF_HARDPPS_CD;
2481 serial8250_enable_ms(port);
2482 } else
2483 port->flags &= ~UPF_HARDPPS_CD;
2484}
2485
Manuel Laussc161afe2010-09-25 15:13:45 +02002486
2487void serial8250_do_pm(struct uart_port *port, unsigned int state,
2488 unsigned int oldstate)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002489{
Jamie Iles49d57412010-12-01 23:39:35 +00002490 struct uart_8250_port *p =
2491 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002492
2493 serial8250_set_sleep(p, state != 0);
Manuel Laussc161afe2010-09-25 15:13:45 +02002494}
2495EXPORT_SYMBOL(serial8250_do_pm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002496
Manuel Laussc161afe2010-09-25 15:13:45 +02002497static void
2498serial8250_pm(struct uart_port *port, unsigned int state,
2499 unsigned int oldstate)
2500{
2501 if (port->pm)
2502 port->pm(port, state, oldstate);
2503 else
2504 serial8250_do_pm(port, state, oldstate);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002505}
2506
Russell Kingf2eda272008-09-01 21:47:59 +01002507static unsigned int serial8250_port_size(struct uart_8250_port *pt)
2508{
2509 if (pt->port.iotype == UPIO_AU)
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002510 return 0x1000;
Russell Kingf2eda272008-09-01 21:47:59 +01002511#ifdef CONFIG_ARCH_OMAP
2512 if (is_omap_port(pt))
2513 return 0x16 << pt->port.regshift;
2514#endif
2515 return 8 << pt->port.regshift;
2516}
2517
Linus Torvalds1da177e2005-04-16 15:20:36 -07002518/*
2519 * Resource handling.
2520 */
2521static int serial8250_request_std_resource(struct uart_8250_port *up)
2522{
Russell Kingf2eda272008-09-01 21:47:59 +01002523 unsigned int size = serial8250_port_size(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002524 int ret = 0;
2525
2526 switch (up->port.iotype) {
Sergei Shtylyov85835f42006-04-30 11:15:58 +01002527 case UPIO_AU:
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002528 case UPIO_TSI:
2529 case UPIO_MEM32:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002530 case UPIO_MEM:
2531 if (!up->port.mapbase)
2532 break;
2533
2534 if (!request_mem_region(up->port.mapbase, size, "serial")) {
2535 ret = -EBUSY;
2536 break;
2537 }
2538
2539 if (up->port.flags & UPF_IOREMAP) {
Alan Cox6f441fe2008-05-01 04:34:59 -07002540 up->port.membase = ioremap_nocache(up->port.mapbase,
2541 size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002542 if (!up->port.membase) {
2543 release_mem_region(up->port.mapbase, size);
2544 ret = -ENOMEM;
2545 }
2546 }
2547 break;
2548
2549 case UPIO_HUB6:
2550 case UPIO_PORT:
2551 if (!request_region(up->port.iobase, size, "serial"))
2552 ret = -EBUSY;
2553 break;
2554 }
2555 return ret;
2556}
2557
2558static void serial8250_release_std_resource(struct uart_8250_port *up)
2559{
Russell Kingf2eda272008-09-01 21:47:59 +01002560 unsigned int size = serial8250_port_size(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002561
2562 switch (up->port.iotype) {
Sergei Shtylyov85835f42006-04-30 11:15:58 +01002563 case UPIO_AU:
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002564 case UPIO_TSI:
2565 case UPIO_MEM32:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002566 case UPIO_MEM:
2567 if (!up->port.mapbase)
2568 break;
2569
2570 if (up->port.flags & UPF_IOREMAP) {
2571 iounmap(up->port.membase);
2572 up->port.membase = NULL;
2573 }
2574
2575 release_mem_region(up->port.mapbase, size);
2576 break;
2577
2578 case UPIO_HUB6:
2579 case UPIO_PORT:
2580 release_region(up->port.iobase, size);
2581 break;
2582 }
2583}
2584
2585static int serial8250_request_rsa_resource(struct uart_8250_port *up)
2586{
2587 unsigned long start = UART_RSA_BASE << up->port.regshift;
2588 unsigned int size = 8 << up->port.regshift;
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002589 int ret = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002590
2591 switch (up->port.iotype) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002592 case UPIO_HUB6:
2593 case UPIO_PORT:
2594 start += up->port.iobase;
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002595 if (request_region(start, size, "serial-rsa"))
2596 ret = 0;
2597 else
Linus Torvalds1da177e2005-04-16 15:20:36 -07002598 ret = -EBUSY;
2599 break;
2600 }
2601
2602 return ret;
2603}
2604
2605static void serial8250_release_rsa_resource(struct uart_8250_port *up)
2606{
2607 unsigned long offset = UART_RSA_BASE << up->port.regshift;
2608 unsigned int size = 8 << up->port.regshift;
2609
2610 switch (up->port.iotype) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002611 case UPIO_HUB6:
2612 case UPIO_PORT:
2613 release_region(up->port.iobase + offset, size);
2614 break;
2615 }
2616}
2617
2618static void serial8250_release_port(struct uart_port *port)
2619{
Jamie Iles49d57412010-12-01 23:39:35 +00002620 struct uart_8250_port *up =
2621 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002622
2623 serial8250_release_std_resource(up);
2624 if (up->port.type == PORT_RSA)
2625 serial8250_release_rsa_resource(up);
2626}
2627
2628static int serial8250_request_port(struct uart_port *port)
2629{
Jamie Iles49d57412010-12-01 23:39:35 +00002630 struct uart_8250_port *up =
2631 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002632 int ret = 0;
2633
2634 ret = serial8250_request_std_resource(up);
2635 if (ret == 0 && up->port.type == PORT_RSA) {
2636 ret = serial8250_request_rsa_resource(up);
2637 if (ret < 0)
2638 serial8250_release_std_resource(up);
2639 }
2640
2641 return ret;
2642}
2643
2644static void serial8250_config_port(struct uart_port *port, int flags)
2645{
Jamie Iles49d57412010-12-01 23:39:35 +00002646 struct uart_8250_port *up =
2647 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002648 int probeflags = PROBE_ANY;
2649 int ret;
2650
2651 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002652 * Find the region that we can probe for. This in turn
2653 * tells us whether we can probe for the type of port.
2654 */
2655 ret = serial8250_request_std_resource(up);
2656 if (ret < 0)
2657 return;
2658
2659 ret = serial8250_request_rsa_resource(up);
2660 if (ret < 0)
2661 probeflags &= ~PROBE_RSA;
2662
Alan Coxb8e7e402009-05-28 14:01:35 +01002663 if (up->port.iotype != up->cur_iotype)
2664 set_io_from_upio(port);
2665
Linus Torvalds1da177e2005-04-16 15:20:36 -07002666 if (flags & UART_CONFIG_TYPE)
2667 autoconfig(up, probeflags);
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002668
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002669 /* if access method is AU, it is a 16550 with a quirk */
2670 if (up->port.type == PORT_16550A && up->port.iotype == UPIO_AU)
2671 up->bugs |= UART_BUG_NOMSR;
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002672
Linus Torvalds1da177e2005-04-16 15:20:36 -07002673 if (up->port.type != PORT_UNKNOWN && flags & UART_CONFIG_IRQ)
2674 autoconfig_irq(up);
2675
2676 if (up->port.type != PORT_RSA && probeflags & PROBE_RSA)
2677 serial8250_release_rsa_resource(up);
2678 if (up->port.type == PORT_UNKNOWN)
2679 serial8250_release_std_resource(up);
2680}
2681
2682static int
2683serial8250_verify_port(struct uart_port *port, struct serial_struct *ser)
2684{
Yinghai Lua62c4132008-08-19 20:49:55 -07002685 if (ser->irq >= nr_irqs || ser->irq < 0 ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07002686 ser->baud_base < 9600 || ser->type < PORT_UNKNOWN ||
2687 ser->type >= ARRAY_SIZE(uart_config) || ser->type == PORT_CIRRUS ||
2688 ser->type == PORT_STARTECH)
2689 return -EINVAL;
2690 return 0;
2691}
2692
2693static const char *
2694serial8250_type(struct uart_port *port)
2695{
2696 int type = port->type;
2697
2698 if (type >= ARRAY_SIZE(uart_config))
2699 type = 0;
2700 return uart_config[type].name;
2701}
2702
2703static struct uart_ops serial8250_pops = {
2704 .tx_empty = serial8250_tx_empty,
2705 .set_mctrl = serial8250_set_mctrl,
2706 .get_mctrl = serial8250_get_mctrl,
2707 .stop_tx = serial8250_stop_tx,
2708 .start_tx = serial8250_start_tx,
2709 .stop_rx = serial8250_stop_rx,
2710 .enable_ms = serial8250_enable_ms,
2711 .break_ctl = serial8250_break_ctl,
2712 .startup = serial8250_startup,
2713 .shutdown = serial8250_shutdown,
2714 .set_termios = serial8250_set_termios,
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002715 .set_ldisc = serial8250_set_ldisc,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002716 .pm = serial8250_pm,
2717 .type = serial8250_type,
2718 .release_port = serial8250_release_port,
2719 .request_port = serial8250_request_port,
2720 .config_port = serial8250_config_port,
2721 .verify_port = serial8250_verify_port,
Jason Wesself2d937f2008-04-17 20:05:37 +02002722#ifdef CONFIG_CONSOLE_POLL
2723 .poll_get_char = serial8250_get_poll_char,
2724 .poll_put_char = serial8250_put_poll_char,
2725#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07002726};
2727
2728static struct uart_8250_port serial8250_ports[UART_NR];
2729
Alan Coxaf7f3742010-10-18 11:38:02 -07002730static void (*serial8250_isa_config)(int port, struct uart_port *up,
2731 unsigned short *capabilities);
2732
2733void serial8250_set_isa_configurator(
2734 void (*v)(int port, struct uart_port *up, unsigned short *capabilities))
2735{
2736 serial8250_isa_config = v;
2737}
2738EXPORT_SYMBOL(serial8250_set_isa_configurator);
2739
Linus Torvalds1da177e2005-04-16 15:20:36 -07002740static void __init serial8250_isa_init_ports(void)
2741{
2742 struct uart_8250_port *up;
2743 static int first = 1;
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02002744 int i, irqflag = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002745
2746 if (!first)
2747 return;
2748 first = 0;
2749
Dave Jonesa61c2d72006-01-07 23:18:19 +00002750 for (i = 0; i < nr_uarts; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002751 struct uart_8250_port *up = &serial8250_ports[i];
2752
2753 up->port.line = i;
2754 spin_lock_init(&up->port.lock);
2755
2756 init_timer(&up->timer);
2757 up->timer.function = serial8250_timeout;
2758
2759 /*
2760 * ALPHA_KLUDGE_MCR needs to be killed.
2761 */
2762 up->mcr_mask = ~ALPHA_KLUDGE_MCR;
2763 up->mcr_force = ALPHA_KLUDGE_MCR;
2764
2765 up->port.ops = &serial8250_pops;
2766 }
2767
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02002768 if (share_irqs)
2769 irqflag = IRQF_SHARED;
2770
Russell King44454bc2005-06-30 22:41:22 +01002771 for (i = 0, up = serial8250_ports;
Dave Jonesa61c2d72006-01-07 23:18:19 +00002772 i < ARRAY_SIZE(old_serial_port) && i < nr_uarts;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002773 i++, up++) {
2774 up->port.iobase = old_serial_port[i].port;
2775 up->port.irq = irq_canonicalize(old_serial_port[i].irq);
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002776 up->port.irqflags = old_serial_port[i].irqflags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002777 up->port.uartclk = old_serial_port[i].baud_base * 16;
2778 up->port.flags = old_serial_port[i].flags;
2779 up->port.hub6 = old_serial_port[i].hub6;
2780 up->port.membase = old_serial_port[i].iomem_base;
2781 up->port.iotype = old_serial_port[i].io_type;
2782 up->port.regshift = old_serial_port[i].iomem_reg_shift;
David Daney7d6a07d2009-01-02 13:49:47 +00002783 set_io_from_upio(&up->port);
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02002784 up->port.irqflags |= irqflag;
Alan Coxaf7f3742010-10-18 11:38:02 -07002785 if (serial8250_isa_config != NULL)
2786 serial8250_isa_config(i, &up->port, &up->capabilities);
2787
Linus Torvalds1da177e2005-04-16 15:20:36 -07002788 }
2789}
2790
Shmulik Ladkanib5d228c2009-12-09 12:31:29 -08002791static void
2792serial8250_init_fixed_type_port(struct uart_8250_port *up, unsigned int type)
2793{
2794 up->port.type = type;
2795 up->port.fifosize = uart_config[type].fifo_size;
2796 up->capabilities = uart_config[type].flags;
2797 up->tx_loadsz = uart_config[type].tx_loadsz;
2798}
2799
Linus Torvalds1da177e2005-04-16 15:20:36 -07002800static void __init
2801serial8250_register_ports(struct uart_driver *drv, struct device *dev)
2802{
2803 int i;
2804
Alan Coxb8e7e402009-05-28 14:01:35 +01002805 for (i = 0; i < nr_uarts; i++) {
2806 struct uart_8250_port *up = &serial8250_ports[i];
2807 up->cur_iotype = 0xFF;
2808 }
2809
Linus Torvalds1da177e2005-04-16 15:20:36 -07002810 serial8250_isa_init_ports();
2811
Dave Jonesa61c2d72006-01-07 23:18:19 +00002812 for (i = 0; i < nr_uarts; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002813 struct uart_8250_port *up = &serial8250_ports[i];
2814
2815 up->port.dev = dev;
Shmulik Ladkanib5d228c2009-12-09 12:31:29 -08002816
2817 if (up->port.flags & UPF_FIXED_TYPE)
2818 serial8250_init_fixed_type_port(up, up->port.type);
2819
Linus Torvalds1da177e2005-04-16 15:20:36 -07002820 uart_add_one_port(drv, &up->port);
2821 }
2822}
2823
2824#ifdef CONFIG_SERIAL_8250_CONSOLE
2825
Russell Kingd3587882006-03-20 20:00:09 +00002826static void serial8250_console_putchar(struct uart_port *port, int ch)
2827{
Jamie Iles49d57412010-12-01 23:39:35 +00002828 struct uart_8250_port *up =
2829 container_of(port, struct uart_8250_port, port);
Russell Kingd3587882006-03-20 20:00:09 +00002830
2831 wait_for_xmitr(up, UART_LSR_THRE);
2832 serial_out(up, UART_TX, ch);
2833}
2834
Linus Torvalds1da177e2005-04-16 15:20:36 -07002835/*
2836 * Print a string to the serial port trying not to disturb
2837 * any possible real use of the port...
2838 *
2839 * The console_lock must be held when we get here.
2840 */
2841static void
2842serial8250_console_write(struct console *co, const char *s, unsigned int count)
2843{
2844 struct uart_8250_port *up = &serial8250_ports[co->index];
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002845 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002846 unsigned int ier;
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002847 int locked = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002848
Andrew Morton78512ec2005-11-07 00:59:13 -08002849 touch_nmi_watchdog();
2850
Andrew Morton68aa2c02006-06-30 02:29:59 -07002851 local_irq_save(flags);
2852 if (up->port.sysrq) {
2853 /* serial8250_handle_port() already took the lock */
2854 locked = 0;
2855 } else if (oops_in_progress) {
2856 locked = spin_trylock(&up->port.lock);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002857 } else
Andrew Morton68aa2c02006-06-30 02:29:59 -07002858 spin_lock(&up->port.lock);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002859
Linus Torvalds1da177e2005-04-16 15:20:36 -07002860 /*
Ralf Baechledc7bf132006-02-15 09:59:47 +00002861 * First save the IER then disable the interrupts
Linus Torvalds1da177e2005-04-16 15:20:36 -07002862 */
2863 ier = serial_in(up, UART_IER);
2864
2865 if (up->capabilities & UART_CAP_UUE)
2866 serial_out(up, UART_IER, UART_IER_UUE);
2867 else
2868 serial_out(up, UART_IER, 0);
2869
Russell Kingd3587882006-03-20 20:00:09 +00002870 uart_console_write(&up->port, s, count, serial8250_console_putchar);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002871
2872 /*
2873 * Finally, wait for transmitter to become empty
2874 * and restore the IER
2875 */
Alan Coxf91a3712006-01-21 14:59:12 +00002876 wait_for_xmitr(up, BOTH_EMPTY);
Russell Kinga88d75b2006-04-30 11:30:15 +01002877 serial_out(up, UART_IER, ier);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002878
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002879 /*
2880 * The receive handling will happen properly because the
2881 * receive ready bit will still be set; it is not cleared
2882 * on read. However, modem control will not, we must
2883 * call it if we have saved something in the saved flags
2884 * while processing with interrupts off.
2885 */
2886 if (up->msr_saved_flags)
2887 check_modem_status(up);
2888
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002889 if (locked)
Andrew Morton68aa2c02006-06-30 02:29:59 -07002890 spin_unlock(&up->port.lock);
2891 local_irq_restore(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002892}
2893
Vivek Goyal118c0ac2007-01-11 01:52:44 +01002894static int __init serial8250_console_setup(struct console *co, char *options)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002895{
2896 struct uart_port *port;
2897 int baud = 9600;
2898 int bits = 8;
2899 int parity = 'n';
2900 int flow = 'n';
2901
2902 /*
2903 * Check whether an invalid uart number has been specified, and
2904 * if so, search for the first available port that does have
2905 * console support.
2906 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00002907 if (co->index >= nr_uarts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002908 co->index = 0;
2909 port = &serial8250_ports[co->index].port;
2910 if (!port->iobase && !port->membase)
2911 return -ENODEV;
2912
2913 if (options)
2914 uart_parse_options(options, &baud, &parity, &bits, &flow);
2915
2916 return uart_set_options(port, co, baud, parity, bits, flow);
2917}
2918
Daniel Ritzb6b1d872007-08-03 16:07:43 +02002919static int serial8250_console_early_setup(void)
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002920{
2921 return serial8250_find_port_for_earlycon();
2922}
2923
Linus Torvalds1da177e2005-04-16 15:20:36 -07002924static struct console serial8250_console = {
2925 .name = "ttyS",
2926 .write = serial8250_console_write,
2927 .device = uart_console_device,
2928 .setup = serial8250_console_setup,
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002929 .early_setup = serial8250_console_early_setup,
Peter Zijlstraa80c49d2010-11-15 21:11:12 +01002930 .flags = CON_PRINTBUFFER | CON_ANYTIME,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002931 .index = -1,
2932 .data = &serial8250_reg,
2933};
2934
2935static int __init serial8250_console_init(void)
2936{
Eric W. Biederman05d81d22008-07-12 13:47:53 -07002937 if (nr_uarts > UART_NR)
2938 nr_uarts = UART_NR;
2939
Linus Torvalds1da177e2005-04-16 15:20:36 -07002940 serial8250_isa_init_ports();
2941 register_console(&serial8250_console);
2942 return 0;
2943}
2944console_initcall(serial8250_console_init);
2945
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002946int serial8250_find_port(struct uart_port *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002947{
2948 int line;
2949 struct uart_port *port;
2950
Dave Jonesa61c2d72006-01-07 23:18:19 +00002951 for (line = 0; line < nr_uarts; line++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002952 port = &serial8250_ports[line].port;
Russell King50aec3b52006-01-04 18:13:03 +00002953 if (uart_match_port(p, port))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002954 return line;
2955 }
2956 return -ENODEV;
2957}
2958
Linus Torvalds1da177e2005-04-16 15:20:36 -07002959#define SERIAL8250_CONSOLE &serial8250_console
2960#else
2961#define SERIAL8250_CONSOLE NULL
2962#endif
2963
2964static struct uart_driver serial8250_reg = {
2965 .owner = THIS_MODULE,
2966 .driver_name = "serial",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002967 .dev_name = "ttyS",
2968 .major = TTY_MAJOR,
2969 .minor = 64,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002970 .cons = SERIAL8250_CONSOLE,
2971};
2972
Russell Kingd856c662006-02-23 10:22:13 +00002973/*
2974 * early_serial_setup - early registration for 8250 ports
2975 *
2976 * Setup an 8250 port structure prior to console initialisation. Use
2977 * after console initialisation will cause undefined behaviour.
2978 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002979int __init early_serial_setup(struct uart_port *port)
2980{
David Daneyb4304282009-01-02 13:49:41 +00002981 struct uart_port *p;
2982
Linus Torvalds1da177e2005-04-16 15:20:36 -07002983 if (port->line >= ARRAY_SIZE(serial8250_ports))
2984 return -ENODEV;
2985
2986 serial8250_isa_init_ports();
David Daneyb4304282009-01-02 13:49:41 +00002987 p = &serial8250_ports[port->line].port;
2988 p->iobase = port->iobase;
2989 p->membase = port->membase;
2990 p->irq = port->irq;
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002991 p->irqflags = port->irqflags;
David Daneyb4304282009-01-02 13:49:41 +00002992 p->uartclk = port->uartclk;
2993 p->fifosize = port->fifosize;
2994 p->regshift = port->regshift;
2995 p->iotype = port->iotype;
2996 p->flags = port->flags;
2997 p->mapbase = port->mapbase;
2998 p->private_data = port->private_data;
Helge Deller125c97d2009-01-13 22:51:07 +01002999 p->type = port->type;
3000 p->line = port->line;
David Daney7d6a07d2009-01-02 13:49:47 +00003001
3002 set_io_from_upio(p);
3003 if (port->serial_in)
3004 p->serial_in = port->serial_in;
3005 if (port->serial_out)
3006 p->serial_out = port->serial_out;
Jamie Iles583d28e2011-08-15 10:17:52 +01003007 if (port->handle_irq)
3008 p->handle_irq = port->handle_irq;
3009 else
3010 p->handle_irq = serial8250_default_handle_irq;
David Daney7d6a07d2009-01-02 13:49:47 +00003011
Linus Torvalds1da177e2005-04-16 15:20:36 -07003012 return 0;
3013}
3014
3015/**
3016 * serial8250_suspend_port - suspend one serial port
3017 * @line: serial line number
Linus Torvalds1da177e2005-04-16 15:20:36 -07003018 *
3019 * Suspend one serial port.
3020 */
3021void serial8250_suspend_port(int line)
3022{
3023 uart_suspend_port(&serial8250_reg, &serial8250_ports[line].port);
3024}
3025
3026/**
3027 * serial8250_resume_port - resume one serial port
3028 * @line: serial line number
Linus Torvalds1da177e2005-04-16 15:20:36 -07003029 *
3030 * Resume one serial port.
3031 */
3032void serial8250_resume_port(int line)
3033{
David Woodhouseb5b82df2007-05-17 14:27:39 +08003034 struct uart_8250_port *up = &serial8250_ports[line];
3035
3036 if (up->capabilities & UART_NATSEMI) {
David Woodhouseb5b82df2007-05-17 14:27:39 +08003037 /* Ensure it's still in high speed mode */
3038 serial_outp(up, UART_LCR, 0xE0);
3039
Yin Kangkai0d0389e2011-02-09 11:35:18 +08003040 ns16550a_goto_highspeed(up);
David Woodhouseb5b82df2007-05-17 14:27:39 +08003041
3042 serial_outp(up, UART_LCR, 0);
Yin Kangkai95926d22011-02-09 11:34:20 +08003043 up->port.uartclk = 921600*16;
David Woodhouseb5b82df2007-05-17 14:27:39 +08003044 }
3045 uart_resume_port(&serial8250_reg, &up->port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003046}
3047
3048/*
3049 * Register a set of serial devices attached to a platform device. The
3050 * list is terminated with a zero flags entry, which means we expect
3051 * all entries to have at least UPF_BOOT_AUTOCONF set.
3052 */
Russell King3ae5eae2005-11-09 22:32:44 +00003053static int __devinit serial8250_probe(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003054{
Russell King3ae5eae2005-11-09 22:32:44 +00003055 struct plat_serial8250_port *p = dev->dev.platform_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003056 struct uart_port port;
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02003057 int ret, i, irqflag = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003058
3059 memset(&port, 0, sizeof(struct uart_port));
3060
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02003061 if (share_irqs)
3062 irqflag = IRQF_SHARED;
3063
Russell Kingec9f47c2005-06-27 11:12:54 +01003064 for (i = 0; p && p->flags != 0; p++, i++) {
Will Newton74a197412008-02-04 22:27:50 -08003065 port.iobase = p->iobase;
3066 port.membase = p->membase;
3067 port.irq = p->irq;
Vikram Pandita1c2f0492009-09-19 13:13:19 -07003068 port.irqflags = p->irqflags;
Will Newton74a197412008-02-04 22:27:50 -08003069 port.uartclk = p->uartclk;
3070 port.regshift = p->regshift;
3071 port.iotype = p->iotype;
3072 port.flags = p->flags;
3073 port.mapbase = p->mapbase;
3074 port.hub6 = p->hub6;
3075 port.private_data = p->private_data;
David Daney8e23fcc2009-01-02 13:49:54 +00003076 port.type = p->type;
David Daney7d6a07d2009-01-02 13:49:47 +00003077 port.serial_in = p->serial_in;
3078 port.serial_out = p->serial_out;
Jamie Iles583d28e2011-08-15 10:17:52 +01003079 port.handle_irq = p->handle_irq;
Philippe Langlais235dae52010-07-29 17:13:57 +02003080 port.set_termios = p->set_termios;
Manuel Laussc161afe2010-09-25 15:13:45 +02003081 port.pm = p->pm;
Will Newton74a197412008-02-04 22:27:50 -08003082 port.dev = &dev->dev;
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02003083 port.irqflags |= irqflag;
Russell Kingec9f47c2005-06-27 11:12:54 +01003084 ret = serial8250_register_port(&port);
3085 if (ret < 0) {
Russell King3ae5eae2005-11-09 22:32:44 +00003086 dev_err(&dev->dev, "unable to register port at index %d "
Josh Boyer4f640ef2007-07-23 18:43:44 -07003087 "(IO%lx MEM%llx IRQ%d): %d\n", i,
3088 p->iobase, (unsigned long long)p->mapbase,
3089 p->irq, ret);
Russell Kingec9f47c2005-06-27 11:12:54 +01003090 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003091 }
3092 return 0;
3093}
3094
3095/*
3096 * Remove serial ports registered against a platform device.
3097 */
Russell King3ae5eae2005-11-09 22:32:44 +00003098static int __devexit serial8250_remove(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003099{
3100 int i;
3101
Dave Jonesa61c2d72006-01-07 23:18:19 +00003102 for (i = 0; i < nr_uarts; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003103 struct uart_8250_port *up = &serial8250_ports[i];
3104
Russell King3ae5eae2005-11-09 22:32:44 +00003105 if (up->port.dev == &dev->dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003106 serial8250_unregister_port(i);
3107 }
3108 return 0;
3109}
3110
Russell King3ae5eae2005-11-09 22:32:44 +00003111static int serial8250_suspend(struct platform_device *dev, pm_message_t state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003112{
3113 int i;
3114
Linus Torvalds1da177e2005-04-16 15:20:36 -07003115 for (i = 0; i < UART_NR; i++) {
3116 struct uart_8250_port *up = &serial8250_ports[i];
3117
Russell King3ae5eae2005-11-09 22:32:44 +00003118 if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003119 uart_suspend_port(&serial8250_reg, &up->port);
3120 }
3121
3122 return 0;
3123}
3124
Russell King3ae5eae2005-11-09 22:32:44 +00003125static int serial8250_resume(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003126{
3127 int i;
3128
Linus Torvalds1da177e2005-04-16 15:20:36 -07003129 for (i = 0; i < UART_NR; i++) {
3130 struct uart_8250_port *up = &serial8250_ports[i];
3131
Russell King3ae5eae2005-11-09 22:32:44 +00003132 if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
David Woodhouseb5b82df2007-05-17 14:27:39 +08003133 serial8250_resume_port(i);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003134 }
3135
3136 return 0;
3137}
3138
Russell King3ae5eae2005-11-09 22:32:44 +00003139static struct platform_driver serial8250_isa_driver = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003140 .probe = serial8250_probe,
3141 .remove = __devexit_p(serial8250_remove),
3142 .suspend = serial8250_suspend,
3143 .resume = serial8250_resume,
Russell King3ae5eae2005-11-09 22:32:44 +00003144 .driver = {
3145 .name = "serial8250",
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003146 .owner = THIS_MODULE,
Russell King3ae5eae2005-11-09 22:32:44 +00003147 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07003148};
3149
3150/*
3151 * This "device" covers _all_ ISA 8250-compatible serial devices listed
3152 * in the table in include/asm/serial.h
3153 */
3154static struct platform_device *serial8250_isa_devs;
3155
3156/*
3157 * serial8250_register_port and serial8250_unregister_port allows for
3158 * 16x50 serial ports to be configured at run-time, to support PCMCIA
3159 * modems and PCI multiport cards.
3160 */
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003161static DEFINE_MUTEX(serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003162
3163static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *port)
3164{
3165 int i;
3166
3167 /*
3168 * First, find a port entry which matches.
3169 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003170 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003171 if (uart_match_port(&serial8250_ports[i].port, port))
3172 return &serial8250_ports[i];
3173
3174 /*
3175 * We didn't find a matching entry, so look for the first
3176 * free entry. We look for one which hasn't been previously
3177 * used (indicated by zero iobase).
3178 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003179 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003180 if (serial8250_ports[i].port.type == PORT_UNKNOWN &&
3181 serial8250_ports[i].port.iobase == 0)
3182 return &serial8250_ports[i];
3183
3184 /*
3185 * That also failed. Last resort is to find any entry which
3186 * doesn't have a real port associated with it.
3187 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003188 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003189 if (serial8250_ports[i].port.type == PORT_UNKNOWN)
3190 return &serial8250_ports[i];
3191
3192 return NULL;
3193}
3194
3195/**
3196 * serial8250_register_port - register a serial port
3197 * @port: serial port template
3198 *
3199 * Configure the serial port specified by the request. If the
3200 * port exists and is in use, it is hung up and unregistered
3201 * first.
3202 *
3203 * The port is then probed and if necessary the IRQ is autodetected
3204 * If this fails an error is returned.
3205 *
3206 * On success the port is ready to use and the line number is returned.
3207 */
3208int serial8250_register_port(struct uart_port *port)
3209{
3210 struct uart_8250_port *uart;
3211 int ret = -ENOSPC;
3212
3213 if (port->uartclk == 0)
3214 return -EINVAL;
3215
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003216 mutex_lock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003217
3218 uart = serial8250_find_match_or_unused(port);
3219 if (uart) {
3220 uart_remove_one_port(&serial8250_reg, &uart->port);
3221
Will Newton74a197412008-02-04 22:27:50 -08003222 uart->port.iobase = port->iobase;
3223 uart->port.membase = port->membase;
3224 uart->port.irq = port->irq;
Vikram Pandita1c2f0492009-09-19 13:13:19 -07003225 uart->port.irqflags = port->irqflags;
Will Newton74a197412008-02-04 22:27:50 -08003226 uart->port.uartclk = port->uartclk;
3227 uart->port.fifosize = port->fifosize;
3228 uart->port.regshift = port->regshift;
3229 uart->port.iotype = port->iotype;
3230 uart->port.flags = port->flags | UPF_BOOT_AUTOCONF;
3231 uart->port.mapbase = port->mapbase;
3232 uart->port.private_data = port->private_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003233 if (port->dev)
3234 uart->port.dev = port->dev;
David Daney8e23fcc2009-01-02 13:49:54 +00003235
Shmulik Ladkanib5d228c2009-12-09 12:31:29 -08003236 if (port->flags & UPF_FIXED_TYPE)
3237 serial8250_init_fixed_type_port(uart, port->type);
David Daney8e23fcc2009-01-02 13:49:54 +00003238
David Daney7d6a07d2009-01-02 13:49:47 +00003239 set_io_from_upio(&uart->port);
3240 /* Possibly override default I/O functions. */
3241 if (port->serial_in)
3242 uart->port.serial_in = port->serial_in;
3243 if (port->serial_out)
3244 uart->port.serial_out = port->serial_out;
Jamie Iles583d28e2011-08-15 10:17:52 +01003245 if (port->handle_irq)
3246 uart->port.handle_irq = port->handle_irq;
Philippe Langlais235dae52010-07-29 17:13:57 +02003247 /* Possibly override set_termios call */
3248 if (port->set_termios)
3249 uart->port.set_termios = port->set_termios;
Manuel Laussc161afe2010-09-25 15:13:45 +02003250 if (port->pm)
3251 uart->port.pm = port->pm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003252
Alan Coxaf7f3742010-10-18 11:38:02 -07003253 if (serial8250_isa_config != NULL)
3254 serial8250_isa_config(0, &uart->port,
3255 &uart->capabilities);
3256
Linus Torvalds1da177e2005-04-16 15:20:36 -07003257 ret = uart_add_one_port(&serial8250_reg, &uart->port);
3258 if (ret == 0)
3259 ret = uart->port.line;
3260 }
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003261 mutex_unlock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003262
3263 return ret;
3264}
3265EXPORT_SYMBOL(serial8250_register_port);
3266
3267/**
3268 * serial8250_unregister_port - remove a 16x50 serial port at runtime
3269 * @line: serial line number
3270 *
3271 * Remove one serial port. This may not be called from interrupt
3272 * context. We hand the port back to the our control.
3273 */
3274void serial8250_unregister_port(int line)
3275{
3276 struct uart_8250_port *uart = &serial8250_ports[line];
3277
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003278 mutex_lock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003279 uart_remove_one_port(&serial8250_reg, &uart->port);
3280 if (serial8250_isa_devs) {
3281 uart->port.flags &= ~UPF_BOOT_AUTOCONF;
3282 uart->port.type = PORT_UNKNOWN;
3283 uart->port.dev = &serial8250_isa_devs->dev;
leitao@linux.vnet.ibm.comcb01ece2011-05-26 11:18:39 -03003284 uart->capabilities = uart_config[uart->port.type].flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003285 uart_add_one_port(&serial8250_reg, &uart->port);
3286 } else {
3287 uart->port.dev = NULL;
3288 }
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003289 mutex_unlock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003290}
3291EXPORT_SYMBOL(serial8250_unregister_port);
3292
3293static int __init serial8250_init(void)
3294{
Alan Cox25db8ad2008-08-19 20:49:40 -07003295 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003296
Dave Jonesa61c2d72006-01-07 23:18:19 +00003297 if (nr_uarts > UART_NR)
3298 nr_uarts = UART_NR;
3299
Paul Bollef1fb9bb2008-12-30 14:06:43 +01003300 printk(KERN_INFO "Serial: 8250/16550 driver, "
Dave Jonesa61c2d72006-01-07 23:18:19 +00003301 "%d ports, IRQ sharing %sabled\n", nr_uarts,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003302 share_irqs ? "en" : "dis");
3303
David Millerb70ac772008-10-13 10:36:31 +01003304#ifdef CONFIG_SPARC
3305 ret = sunserial_register_minors(&serial8250_reg, UART_NR);
3306#else
3307 serial8250_reg.nr = UART_NR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003308 ret = uart_register_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003309#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003310 if (ret)
3311 goto out;
3312
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003313 serial8250_isa_devs = platform_device_alloc("serial8250",
3314 PLAT8250_DEV_LEGACY);
3315 if (!serial8250_isa_devs) {
3316 ret = -ENOMEM;
Russell Kingbc965a72006-01-18 09:54:29 +00003317 goto unreg_uart_drv;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003318 }
3319
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003320 ret = platform_device_add(serial8250_isa_devs);
3321 if (ret)
3322 goto put_dev;
3323
Linus Torvalds1da177e2005-04-16 15:20:36 -07003324 serial8250_register_ports(&serial8250_reg, &serial8250_isa_devs->dev);
3325
Russell Kingbc965a72006-01-18 09:54:29 +00003326 ret = platform_driver_register(&serial8250_isa_driver);
3327 if (ret == 0)
3328 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003329
Russell Kingbc965a72006-01-18 09:54:29 +00003330 platform_device_del(serial8250_isa_devs);
Alan Cox25db8ad2008-08-19 20:49:40 -07003331put_dev:
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003332 platform_device_put(serial8250_isa_devs);
Alan Cox25db8ad2008-08-19 20:49:40 -07003333unreg_uart_drv:
David Millerb70ac772008-10-13 10:36:31 +01003334#ifdef CONFIG_SPARC
3335 sunserial_unregister_minors(&serial8250_reg, UART_NR);
3336#else
Linus Torvalds1da177e2005-04-16 15:20:36 -07003337 uart_unregister_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003338#endif
Alan Cox25db8ad2008-08-19 20:49:40 -07003339out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07003340 return ret;
3341}
3342
3343static void __exit serial8250_exit(void)
3344{
3345 struct platform_device *isa_dev = serial8250_isa_devs;
3346
3347 /*
3348 * This tells serial8250_unregister_port() not to re-register
3349 * the ports (thereby making serial8250_isa_driver permanently
3350 * in use.)
3351 */
3352 serial8250_isa_devs = NULL;
3353
Russell King3ae5eae2005-11-09 22:32:44 +00003354 platform_driver_unregister(&serial8250_isa_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003355 platform_device_unregister(isa_dev);
3356
David Millerb70ac772008-10-13 10:36:31 +01003357#ifdef CONFIG_SPARC
3358 sunserial_unregister_minors(&serial8250_reg, UART_NR);
3359#else
Linus Torvalds1da177e2005-04-16 15:20:36 -07003360 uart_unregister_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003361#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003362}
3363
3364module_init(serial8250_init);
3365module_exit(serial8250_exit);
3366
3367EXPORT_SYMBOL(serial8250_suspend_port);
3368EXPORT_SYMBOL(serial8250_resume_port);
3369
3370MODULE_LICENSE("GPL");
Adrian Bunkd87a6d92008-07-16 21:53:31 +01003371MODULE_DESCRIPTION("Generic 8250/16x50 serial driver");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003372
3373module_param(share_irqs, uint, 0644);
3374MODULE_PARM_DESC(share_irqs, "Share IRQs with other non-8250/16x50 devices"
3375 " (unsafe)");
3376
Dave Jonesa61c2d72006-01-07 23:18:19 +00003377module_param(nr_uarts, uint, 0644);
3378MODULE_PARM_DESC(nr_uarts, "Maximum number of UARTs supported. (1-" __MODULE_STRING(CONFIG_SERIAL_8250_NR_UARTS) ")");
3379
Chuck Ebbertd41a4b52009-10-01 15:44:26 -07003380module_param(skip_txen_test, uint, 0644);
3381MODULE_PARM_DESC(skip_txen_test, "Skip checking for the TXEN bug at init time");
3382
Linus Torvalds1da177e2005-04-16 15:20:36 -07003383#ifdef CONFIG_SERIAL_8250_RSA
3384module_param_array(probe_rsa, ulong, &probe_rsa_count, 0444);
3385MODULE_PARM_DESC(probe_rsa, "Probe I/O ports for RSA");
3386#endif
3387MODULE_ALIAS_CHARDEV_MAJOR(TTY_MAJOR);