blob: eeadf1b8e093202234b30c688490da2de10a3c04 [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;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001622
1623 up = list_entry(l, struct uart_8250_port, list);
Jamie Iles583d28e2011-08-15 10:17:52 +01001624 port = &up->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001625
Jamie Iles583d28e2011-08-15 10:17:52 +01001626 if (port->handle_irq(port)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001627 handled = 1;
Marc St-Jeanbeab6972007-05-06 14:48:45 -07001628 end = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001629 } else if (end == NULL)
1630 end = l;
1631
1632 l = l->next;
1633
1634 if (l == i->head && pass_counter++ > PASS_LIMIT) {
1635 /* If we hit this, we're dead. */
Daniel Drakecd3ecad2010-10-20 16:00:48 -07001636 printk_ratelimited(KERN_ERR
1637 "serial8250: too much work for irq%d\n", irq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001638 break;
1639 }
1640 } while (l != end);
1641
1642 spin_unlock(&i->lock);
1643
1644 DEBUG_INTR("end.\n");
1645
1646 return IRQ_RETVAL(handled);
1647}
1648
1649/*
1650 * To support ISA shared interrupts, we need to have one interrupt
1651 * handler that ensures that the IRQ line has been deasserted
1652 * before returning. Failing to do this will result in the IRQ
1653 * line being stuck active, and, since ISA irqs are edge triggered,
1654 * no more IRQs will be seen.
1655 */
1656static void serial_do_unlink(struct irq_info *i, struct uart_8250_port *up)
1657{
1658 spin_lock_irq(&i->lock);
1659
1660 if (!list_empty(i->head)) {
1661 if (i->head == &up->list)
1662 i->head = i->head->next;
1663 list_del(&up->list);
1664 } else {
1665 BUG_ON(i->head != &up->list);
1666 i->head = NULL;
1667 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001668 spin_unlock_irq(&i->lock);
Alan Cox25db8ad2008-08-19 20:49:40 -07001669 /* List empty so throw away the hash node */
1670 if (i->head == NULL) {
1671 hlist_del(&i->node);
1672 kfree(i);
1673 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001674}
1675
1676static int serial_link_irq_chain(struct uart_8250_port *up)
1677{
Alan Cox25db8ad2008-08-19 20:49:40 -07001678 struct hlist_head *h;
1679 struct hlist_node *n;
1680 struct irq_info *i;
Thomas Gleixner40663cc2006-07-01 19:29:43 -07001681 int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? IRQF_SHARED : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001682
Alan Cox25db8ad2008-08-19 20:49:40 -07001683 mutex_lock(&hash_mutex);
1684
1685 h = &irq_lists[up->port.irq % NR_IRQ_HASH];
1686
1687 hlist_for_each(n, h) {
1688 i = hlist_entry(n, struct irq_info, node);
1689 if (i->irq == up->port.irq)
1690 break;
1691 }
1692
1693 if (n == NULL) {
1694 i = kzalloc(sizeof(struct irq_info), GFP_KERNEL);
1695 if (i == NULL) {
1696 mutex_unlock(&hash_mutex);
1697 return -ENOMEM;
1698 }
1699 spin_lock_init(&i->lock);
1700 i->irq = up->port.irq;
1701 hlist_add_head(&i->node, h);
1702 }
1703 mutex_unlock(&hash_mutex);
1704
Linus Torvalds1da177e2005-04-16 15:20:36 -07001705 spin_lock_irq(&i->lock);
1706
1707 if (i->head) {
1708 list_add(&up->list, i->head);
1709 spin_unlock_irq(&i->lock);
1710
1711 ret = 0;
1712 } else {
1713 INIT_LIST_HEAD(&up->list);
1714 i->head = &up->list;
1715 spin_unlock_irq(&i->lock);
Vikram Pandita1c2f0492009-09-19 13:13:19 -07001716 irq_flags |= up->port.irqflags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001717 ret = request_irq(up->port.irq, serial8250_interrupt,
1718 irq_flags, "serial", i);
1719 if (ret < 0)
1720 serial_do_unlink(i, up);
1721 }
1722
1723 return ret;
1724}
1725
1726static void serial_unlink_irq_chain(struct uart_8250_port *up)
1727{
Alan Cox25db8ad2008-08-19 20:49:40 -07001728 struct irq_info *i;
1729 struct hlist_node *n;
1730 struct hlist_head *h;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001731
Alan Cox25db8ad2008-08-19 20:49:40 -07001732 mutex_lock(&hash_mutex);
1733
1734 h = &irq_lists[up->port.irq % NR_IRQ_HASH];
1735
1736 hlist_for_each(n, h) {
1737 i = hlist_entry(n, struct irq_info, node);
1738 if (i->irq == up->port.irq)
1739 break;
1740 }
1741
1742 BUG_ON(n == NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001743 BUG_ON(i->head == NULL);
1744
1745 if (list_empty(i->head))
1746 free_irq(up->port.irq, i);
1747
1748 serial_do_unlink(i, up);
Alan Cox25db8ad2008-08-19 20:49:40 -07001749 mutex_unlock(&hash_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001750}
1751
1752/*
1753 * This function is used to handle ports that do not have an
1754 * interrupt. This doesn't work very well for 16450's, but gives
1755 * barely passable results for a 16550A. (Although at the expense
1756 * of much CPU overhead).
1757 */
1758static void serial8250_timeout(unsigned long data)
1759{
1760 struct uart_8250_port *up = (struct uart_8250_port *)data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001761 unsigned int iir;
1762
1763 iir = serial_in(up, UART_IIR);
Russell King45e24602006-01-04 19:19:06 +00001764 if (!(iir & UART_IIR_NO_INT))
David Howells7d12e782006-10-05 14:55:46 +01001765 serial8250_handle_port(up);
Anton Vorontsov54381062010-10-01 17:21:25 +04001766 mod_timer(&up->timer, jiffies + uart_poll_timeout(&up->port));
Alex Williamson40b36da2007-02-14 00:33:04 -08001767}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001768
Alex Williamson40b36da2007-02-14 00:33:04 -08001769static void serial8250_backup_timeout(unsigned long data)
1770{
1771 struct uart_8250_port *up = (struct uart_8250_port *)data;
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001772 unsigned int iir, ier = 0, lsr;
1773 unsigned long flags;
Alex Williamson40b36da2007-02-14 00:33:04 -08001774
Al Cooperdbb3b1c2011-07-25 16:19:52 -04001775 spin_lock_irqsave(&up->port.lock, flags);
1776
Alex Williamson40b36da2007-02-14 00:33:04 -08001777 /*
1778 * Must disable interrupts or else we risk racing with the interrupt
1779 * based handler.
1780 */
1781 if (is_real_interrupt(up->port.irq)) {
1782 ier = serial_in(up, UART_IER);
1783 serial_out(up, UART_IER, 0);
1784 }
1785
1786 iir = serial_in(up, UART_IIR);
1787
1788 /*
1789 * This should be a safe test for anyone who doesn't trust the
1790 * IIR bits on their UART, but it's specifically designed for
1791 * the "Diva" UART used on the management processor on many HP
1792 * ia64 and parisc boxes.
1793 */
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001794 lsr = serial_in(up, UART_LSR);
1795 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
Alex Williamson40b36da2007-02-14 00:33:04 -08001796 if ((iir & UART_IIR_NO_INT) && (up->ier & UART_IER_THRI) &&
Alan Coxebd2c8f2009-09-19 13:13:28 -07001797 (!uart_circ_empty(&up->port.state->xmit) || up->port.x_char) &&
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001798 (lsr & UART_LSR_THRE)) {
Alex Williamson40b36da2007-02-14 00:33:04 -08001799 iir &= ~(UART_IIR_ID | UART_IIR_NO_INT);
1800 iir |= UART_IIR_THRI;
1801 }
1802
1803 if (!(iir & UART_IIR_NO_INT))
Al Cooperdbb3b1c2011-07-25 16:19:52 -04001804 transmit_chars(up);
Alex Williamson40b36da2007-02-14 00:33:04 -08001805
1806 if (is_real_interrupt(up->port.irq))
1807 serial_out(up, UART_IER, ier);
1808
Al Cooperdbb3b1c2011-07-25 16:19:52 -04001809 spin_unlock_irqrestore(&up->port.lock, flags);
1810
Alex Williamson40b36da2007-02-14 00:33:04 -08001811 /* Standard timer interval plus 0.2s to keep the port running */
Alan Cox6f803cd2008-02-08 04:18:52 -08001812 mod_timer(&up->timer,
Anton Vorontsov54381062010-10-01 17:21:25 +04001813 jiffies + uart_poll_timeout(&up->port) + HZ / 5);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001814}
1815
1816static unsigned int serial8250_tx_empty(struct uart_port *port)
1817{
Jamie Iles49d57412010-12-01 23:39:35 +00001818 struct uart_8250_port *up =
1819 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001820 unsigned long flags;
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001821 unsigned int lsr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001822
1823 spin_lock_irqsave(&up->port.lock, flags);
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001824 lsr = serial_in(up, UART_LSR);
1825 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001826 spin_unlock_irqrestore(&up->port.lock, flags);
1827
Dick Hollenbeckbca47612009-12-09 12:31:34 -08001828 return (lsr & BOTH_EMPTY) == BOTH_EMPTY ? TIOCSER_TEMT : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001829}
1830
1831static unsigned int serial8250_get_mctrl(struct uart_port *port)
1832{
Jamie Iles49d57412010-12-01 23:39:35 +00001833 struct uart_8250_port *up =
1834 container_of(port, struct uart_8250_port, port);
Russell King2af7cd62006-01-04 16:55:09 +00001835 unsigned int status;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001836 unsigned int ret;
1837
Russell King2af7cd62006-01-04 16:55:09 +00001838 status = check_modem_status(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001839
1840 ret = 0;
1841 if (status & UART_MSR_DCD)
1842 ret |= TIOCM_CAR;
1843 if (status & UART_MSR_RI)
1844 ret |= TIOCM_RNG;
1845 if (status & UART_MSR_DSR)
1846 ret |= TIOCM_DSR;
1847 if (status & UART_MSR_CTS)
1848 ret |= TIOCM_CTS;
1849 return ret;
1850}
1851
1852static void serial8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
1853{
Jamie Iles49d57412010-12-01 23:39:35 +00001854 struct uart_8250_port *up =
1855 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001856 unsigned char mcr = 0;
1857
1858 if (mctrl & TIOCM_RTS)
1859 mcr |= UART_MCR_RTS;
1860 if (mctrl & TIOCM_DTR)
1861 mcr |= UART_MCR_DTR;
1862 if (mctrl & TIOCM_OUT1)
1863 mcr |= UART_MCR_OUT1;
1864 if (mctrl & TIOCM_OUT2)
1865 mcr |= UART_MCR_OUT2;
1866 if (mctrl & TIOCM_LOOP)
1867 mcr |= UART_MCR_LOOP;
1868
1869 mcr = (mcr & up->mcr_mask) | up->mcr_force | up->mcr;
1870
1871 serial_out(up, UART_MCR, mcr);
1872}
1873
1874static void serial8250_break_ctl(struct uart_port *port, int break_state)
1875{
Jamie Iles49d57412010-12-01 23:39:35 +00001876 struct uart_8250_port *up =
1877 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001878 unsigned long flags;
1879
1880 spin_lock_irqsave(&up->port.lock, flags);
1881 if (break_state == -1)
1882 up->lcr |= UART_LCR_SBC;
1883 else
1884 up->lcr &= ~UART_LCR_SBC;
1885 serial_out(up, UART_LCR, up->lcr);
1886 spin_unlock_irqrestore(&up->port.lock, flags);
1887}
1888
Alex Williamson40b36da2007-02-14 00:33:04 -08001889/*
1890 * Wait for transmitter & holding register to empty
1891 */
Will Newtonb5d674a2008-10-13 10:36:21 +01001892static void wait_for_xmitr(struct uart_8250_port *up, int bits)
Alex Williamson40b36da2007-02-14 00:33:04 -08001893{
1894 unsigned int status, tmout = 10000;
1895
1896 /* Wait up to 10ms for the character(s) to be sent. */
David Daney97d303b2010-10-05 11:40:07 -07001897 for (;;) {
Alex Williamson40b36da2007-02-14 00:33:04 -08001898 status = serial_in(up, UART_LSR);
1899
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001900 up->lsr_saved_flags |= status & LSR_SAVE_FLAGS;
Alex Williamson40b36da2007-02-14 00:33:04 -08001901
David Daney97d303b2010-10-05 11:40:07 -07001902 if ((status & bits) == bits)
1903 break;
Alex Williamson40b36da2007-02-14 00:33:04 -08001904 if (--tmout == 0)
1905 break;
1906 udelay(1);
David Daney97d303b2010-10-05 11:40:07 -07001907 }
Alex Williamson40b36da2007-02-14 00:33:04 -08001908
1909 /* Wait up to 1s for flow control if necessary */
1910 if (up->port.flags & UPF_CONS_FLOW) {
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001911 unsigned int tmout;
1912 for (tmout = 1000000; tmout; tmout--) {
1913 unsigned int msr = serial_in(up, UART_MSR);
1914 up->msr_saved_flags |= msr & MSR_SAVE_FLAGS;
1915 if (msr & UART_MSR_CTS)
1916 break;
Alex Williamson40b36da2007-02-14 00:33:04 -08001917 udelay(1);
1918 touch_nmi_watchdog();
1919 }
1920 }
1921}
1922
Jason Wesself2d937f2008-04-17 20:05:37 +02001923#ifdef CONFIG_CONSOLE_POLL
1924/*
1925 * Console polling routines for writing and reading from the uart while
1926 * in an interrupt or debug context.
1927 */
1928
1929static int serial8250_get_poll_char(struct uart_port *port)
1930{
Jamie Iles49d57412010-12-01 23:39:35 +00001931 struct uart_8250_port *up =
1932 container_of(port, struct uart_8250_port, port);
Jason Wesself2d937f2008-04-17 20:05:37 +02001933 unsigned char lsr = serial_inp(up, UART_LSR);
1934
Jason Wesself5316b42010-05-20 21:04:22 -05001935 if (!(lsr & UART_LSR_DR))
1936 return NO_POLL_CHAR;
Jason Wesself2d937f2008-04-17 20:05:37 +02001937
1938 return serial_inp(up, UART_RX);
1939}
1940
1941
1942static void serial8250_put_poll_char(struct uart_port *port,
1943 unsigned char c)
1944{
1945 unsigned int ier;
Jamie Iles49d57412010-12-01 23:39:35 +00001946 struct uart_8250_port *up =
1947 container_of(port, struct uart_8250_port, port);
Jason Wesself2d937f2008-04-17 20:05:37 +02001948
1949 /*
1950 * First save the IER then disable the interrupts
1951 */
1952 ier = serial_in(up, UART_IER);
1953 if (up->capabilities & UART_CAP_UUE)
1954 serial_out(up, UART_IER, UART_IER_UUE);
1955 else
1956 serial_out(up, UART_IER, 0);
1957
1958 wait_for_xmitr(up, BOTH_EMPTY);
1959 /*
1960 * Send the character out.
1961 * If a LF, also do CR...
1962 */
1963 serial_out(up, UART_TX, c);
1964 if (c == 10) {
1965 wait_for_xmitr(up, BOTH_EMPTY);
1966 serial_out(up, UART_TX, 13);
1967 }
1968
1969 /*
1970 * Finally, wait for transmitter to become empty
1971 * and restore the IER
1972 */
1973 wait_for_xmitr(up, BOTH_EMPTY);
1974 serial_out(up, UART_IER, ier);
1975}
1976
1977#endif /* CONFIG_CONSOLE_POLL */
1978
Linus Torvalds1da177e2005-04-16 15:20:36 -07001979static int serial8250_startup(struct uart_port *port)
1980{
Jamie Iles49d57412010-12-01 23:39:35 +00001981 struct uart_8250_port *up =
1982 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001983 unsigned long flags;
Russell King55d3b282005-06-23 15:05:41 +01001984 unsigned char lsr, iir;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001985 int retval;
1986
Ondrej Puzmane4f05af2010-12-04 21:17:38 +01001987 up->port.fifosize = uart_config[up->port.type].fifo_size;
1988 up->tx_loadsz = uart_config[up->port.type].tx_loadsz;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001989 up->capabilities = uart_config[up->port.type].flags;
1990 up->mcr = 0;
1991
Alan Coxb8e7e402009-05-28 14:01:35 +01001992 if (up->port.iotype != up->cur_iotype)
1993 set_io_from_upio(port);
1994
Linus Torvalds1da177e2005-04-16 15:20:36 -07001995 if (up->port.type == PORT_16C950) {
1996 /* Wake up and initialize UART */
1997 up->acr = 0;
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -08001998 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001999 serial_outp(up, UART_EFR, UART_EFR_ECB);
2000 serial_outp(up, UART_IER, 0);
2001 serial_outp(up, UART_LCR, 0);
2002 serial_icr_write(up, UART_CSR, 0); /* Reset the UART */
2003 serial_outp(up, UART_LCR, 0xBF);
2004 serial_outp(up, UART_EFR, UART_EFR_ECB);
2005 serial_outp(up, UART_LCR, 0);
2006 }
2007
2008#ifdef CONFIG_SERIAL_8250_RSA
2009 /*
2010 * If this is an RSA port, see if we can kick it up to the
2011 * higher speed clock.
2012 */
2013 enable_rsa(up);
2014#endif
2015
2016 /*
2017 * Clear the FIFO buffers and disable them.
Alexey Dobriyan7f927fc2006-03-28 01:56:53 -08002018 * (they will be reenabled in set_termios())
Linus Torvalds1da177e2005-04-16 15:20:36 -07002019 */
2020 serial8250_clear_fifos(up);
2021
2022 /*
2023 * Clear the interrupt registers.
2024 */
2025 (void) serial_inp(up, UART_LSR);
2026 (void) serial_inp(up, UART_RX);
2027 (void) serial_inp(up, UART_IIR);
2028 (void) serial_inp(up, UART_MSR);
2029
2030 /*
2031 * At this point, there's no way the LSR could still be 0xff;
2032 * if it is, then bail out, because there's likely no UART
2033 * here.
2034 */
2035 if (!(up->port.flags & UPF_BUGGY_UART) &&
2036 (serial_inp(up, UART_LSR) == 0xff)) {
Konrad Rzeszutek Wilk7808a4c2011-09-26 09:14:34 -04002037 printk_ratelimited(KERN_INFO "ttyS%d: LSR safety check engaged!\n",
2038 serial_index(&up->port));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002039 return -ENODEV;
2040 }
2041
2042 /*
2043 * For a XR16C850, we need to set the trigger levels
2044 */
2045 if (up->port.type == PORT_16850) {
2046 unsigned char fctr;
2047
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -08002048 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002049
2050 fctr = serial_inp(up, UART_FCTR) & ~(UART_FCTR_RX|UART_FCTR_TX);
2051 serial_outp(up, UART_FCTR, fctr | UART_FCTR_TRGD | UART_FCTR_RX);
2052 serial_outp(up, UART_TRG, UART_TRG_96);
2053 serial_outp(up, UART_FCTR, fctr | UART_FCTR_TRGD | UART_FCTR_TX);
2054 serial_outp(up, UART_TRG, UART_TRG_96);
2055
2056 serial_outp(up, UART_LCR, 0);
2057 }
2058
Alex Williamson40b36da2007-02-14 00:33:04 -08002059 if (is_real_interrupt(up->port.irq)) {
Alex Williamson01c194d2008-04-28 02:14:09 -07002060 unsigned char iir1;
Alex Williamson40b36da2007-02-14 00:33:04 -08002061 /*
2062 * Test for UARTs that do not reassert THRE when the
2063 * transmitter is idle and the interrupt has already
2064 * been cleared. Real 16550s should always reassert
2065 * this interrupt whenever the transmitter is idle and
2066 * the interrupt is enabled. Delays are necessary to
2067 * allow register changes to become visible.
2068 */
Borislav Petkovc389d272008-07-29 22:33:32 -07002069 spin_lock_irqsave(&up->port.lock, flags);
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002070 if (up->port.irqflags & IRQF_SHARED)
Anton Vorontsov768aec02008-07-22 11:21:07 +01002071 disable_irq_nosync(up->port.irq);
Alex Williamson40b36da2007-02-14 00:33:04 -08002072
2073 wait_for_xmitr(up, UART_LSR_THRE);
2074 serial_out_sync(up, UART_IER, UART_IER_THRI);
2075 udelay(1); /* allow THRE to set */
Alex Williamson01c194d2008-04-28 02:14:09 -07002076 iir1 = serial_in(up, UART_IIR);
Alex Williamson40b36da2007-02-14 00:33:04 -08002077 serial_out(up, UART_IER, 0);
2078 serial_out_sync(up, UART_IER, UART_IER_THRI);
2079 udelay(1); /* allow a working UART time to re-assert THRE */
2080 iir = serial_in(up, UART_IIR);
2081 serial_out(up, UART_IER, 0);
2082
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002083 if (up->port.irqflags & IRQF_SHARED)
Anton Vorontsov768aec02008-07-22 11:21:07 +01002084 enable_irq(up->port.irq);
Borislav Petkovc389d272008-07-29 22:33:32 -07002085 spin_unlock_irqrestore(&up->port.lock, flags);
Alex Williamson40b36da2007-02-14 00:33:04 -08002086
2087 /*
2088 * If the interrupt is not reasserted, setup a timer to
2089 * kick the UART on a regular basis.
2090 */
Alex Williamson01c194d2008-04-28 02:14:09 -07002091 if (!(iir1 & UART_IIR_NO_INT) && (iir & UART_IIR_NO_INT)) {
Will Newton363f66f2008-09-02 14:35:44 -07002092 up->bugs |= UART_BUG_THRE;
David S. Miller84408382008-10-13 10:45:26 +01002093 pr_debug("ttyS%d - using backup timer\n",
2094 serial_index(port));
Alex Williamson40b36da2007-02-14 00:33:04 -08002095 }
2096 }
2097
Linus Torvalds1da177e2005-04-16 15:20:36 -07002098 /*
Will Newton363f66f2008-09-02 14:35:44 -07002099 * The above check will only give an accurate result the first time
2100 * the port is opened so this value needs to be preserved.
2101 */
2102 if (up->bugs & UART_BUG_THRE) {
2103 up->timer.function = serial8250_backup_timeout;
2104 up->timer.data = (unsigned long)up;
2105 mod_timer(&up->timer, jiffies +
Anton Vorontsov54381062010-10-01 17:21:25 +04002106 uart_poll_timeout(port) + HZ / 5);
Will Newton363f66f2008-09-02 14:35:44 -07002107 }
2108
2109 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002110 * If the "interrupt" for this port doesn't correspond with any
2111 * hardware interrupt, we use a timer-based system. The original
2112 * driver used to do this with IRQ0.
2113 */
2114 if (!is_real_interrupt(up->port.irq)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002115 up->timer.data = (unsigned long)up;
Anton Vorontsov54381062010-10-01 17:21:25 +04002116 mod_timer(&up->timer, jiffies + uart_poll_timeout(port));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002117 } else {
2118 retval = serial_link_irq_chain(up);
2119 if (retval)
2120 return retval;
2121 }
2122
2123 /*
2124 * Now, initialize the UART
2125 */
2126 serial_outp(up, UART_LCR, UART_LCR_WLEN8);
2127
2128 spin_lock_irqsave(&up->port.lock, flags);
2129 if (up->port.flags & UPF_FOURPORT) {
2130 if (!is_real_interrupt(up->port.irq))
2131 up->port.mctrl |= TIOCM_OUT1;
2132 } else
2133 /*
2134 * Most PC uarts need OUT2 raised to enable interrupts.
2135 */
2136 if (is_real_interrupt(up->port.irq))
2137 up->port.mctrl |= TIOCM_OUT2;
2138
2139 serial8250_set_mctrl(&up->port, up->port.mctrl);
Russell King55d3b282005-06-23 15:05:41 +01002140
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002141 /* Serial over Lan (SoL) hack:
2142 Intel 8257x Gigabit ethernet chips have a
2143 16550 emulation, to be used for Serial Over Lan.
2144 Those chips take a longer time than a normal
2145 serial device to signalize that a transmission
2146 data was queued. Due to that, the above test generally
2147 fails. One solution would be to delay the reading of
2148 iir. However, this is not reliable, since the timeout
2149 is variable. So, let's just don't test if we receive
2150 TX irq. This way, we'll never enable UART_BUG_TXEN.
2151 */
Chuck Ebbertd41a4b52009-10-01 15:44:26 -07002152 if (skip_txen_test || up->port.flags & UPF_NO_TXEN_TEST)
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002153 goto dont_test_tx_en;
2154
Russell King55d3b282005-06-23 15:05:41 +01002155 /*
2156 * Do a quick test to see if we receive an
2157 * interrupt when we enable the TX irq.
2158 */
2159 serial_outp(up, UART_IER, UART_IER_THRI);
2160 lsr = serial_in(up, UART_LSR);
2161 iir = serial_in(up, UART_IIR);
2162 serial_outp(up, UART_IER, 0);
2163
2164 if (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT) {
Russell King67f76542005-06-23 22:26:43 +01002165 if (!(up->bugs & UART_BUG_TXEN)) {
2166 up->bugs |= UART_BUG_TXEN;
Russell King55d3b282005-06-23 15:05:41 +01002167 pr_debug("ttyS%d - enabling bad tx status workarounds\n",
David S. Miller84408382008-10-13 10:45:26 +01002168 serial_index(port));
Russell King55d3b282005-06-23 15:05:41 +01002169 }
2170 } else {
Russell King67f76542005-06-23 22:26:43 +01002171 up->bugs &= ~UART_BUG_TXEN;
Russell King55d3b282005-06-23 15:05:41 +01002172 }
2173
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002174dont_test_tx_en:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002175 spin_unlock_irqrestore(&up->port.lock, flags);
2176
2177 /*
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002178 * Clear the interrupt registers again for luck, and clear the
2179 * saved flags to avoid getting false values from polling
2180 * routines or the previous session.
2181 */
2182 serial_inp(up, UART_LSR);
2183 serial_inp(up, UART_RX);
2184 serial_inp(up, UART_IIR);
2185 serial_inp(up, UART_MSR);
2186 up->lsr_saved_flags = 0;
2187 up->msr_saved_flags = 0;
2188
2189 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002190 * Finally, enable interrupts. Note: Modem status interrupts
2191 * are set via set_termios(), which will be occurring imminently
2192 * anyway, so we don't enable them here.
2193 */
2194 up->ier = UART_IER_RLSI | UART_IER_RDI;
2195 serial_outp(up, UART_IER, up->ier);
2196
2197 if (up->port.flags & UPF_FOURPORT) {
2198 unsigned int icp;
2199 /*
2200 * Enable interrupts on the AST Fourport board
2201 */
2202 icp = (up->port.iobase & 0xfe0) | 0x01f;
2203 outb_p(0x80, icp);
2204 (void) inb_p(icp);
2205 }
2206
Linus Torvalds1da177e2005-04-16 15:20:36 -07002207 return 0;
2208}
2209
2210static void serial8250_shutdown(struct uart_port *port)
2211{
Jamie Iles49d57412010-12-01 23:39:35 +00002212 struct uart_8250_port *up =
2213 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002214 unsigned long flags;
2215
2216 /*
2217 * Disable interrupts from this port
2218 */
2219 up->ier = 0;
2220 serial_outp(up, UART_IER, 0);
2221
2222 spin_lock_irqsave(&up->port.lock, flags);
2223 if (up->port.flags & UPF_FOURPORT) {
2224 /* reset interrupts on the AST Fourport board */
2225 inb((up->port.iobase & 0xfe0) | 0x1f);
2226 up->port.mctrl |= TIOCM_OUT1;
2227 } else
2228 up->port.mctrl &= ~TIOCM_OUT2;
2229
2230 serial8250_set_mctrl(&up->port, up->port.mctrl);
2231 spin_unlock_irqrestore(&up->port.lock, flags);
2232
2233 /*
2234 * Disable break condition and FIFOs
2235 */
2236 serial_out(up, UART_LCR, serial_inp(up, UART_LCR) & ~UART_LCR_SBC);
2237 serial8250_clear_fifos(up);
2238
2239#ifdef CONFIG_SERIAL_8250_RSA
2240 /*
2241 * Reset the RSA board back to 115kbps compat mode.
2242 */
2243 disable_rsa(up);
2244#endif
2245
2246 /*
2247 * Read data port to reset things, and then unlink from
2248 * the IRQ chain.
2249 */
2250 (void) serial_in(up, UART_RX);
2251
Alex Williamson40b36da2007-02-14 00:33:04 -08002252 del_timer_sync(&up->timer);
2253 up->timer.function = serial8250_timeout;
2254 if (is_real_interrupt(up->port.irq))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002255 serial_unlink_irq_chain(up);
2256}
2257
2258static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud)
2259{
2260 unsigned int quot;
2261
2262 /*
2263 * Handle magic divisors for baud rates above baud_base on
2264 * SMSC SuperIO chips.
2265 */
2266 if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
2267 baud == (port->uartclk/4))
2268 quot = 0x8001;
2269 else if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
2270 baud == (port->uartclk/8))
2271 quot = 0x8002;
2272 else
2273 quot = uart_get_divisor(port, baud);
2274
2275 return quot;
2276}
2277
Philippe Langlais235dae52010-07-29 17:13:57 +02002278void
2279serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
2280 struct ktermios *old)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002281{
Jamie Iles49d57412010-12-01 23:39:35 +00002282 struct uart_8250_port *up =
2283 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002284 unsigned char cval, fcr = 0;
2285 unsigned long flags;
2286 unsigned int baud, quot;
2287
2288 switch (termios->c_cflag & CSIZE) {
2289 case CS5:
Russell King0a8b80c52005-06-24 19:48:22 +01002290 cval = UART_LCR_WLEN5;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002291 break;
2292 case CS6:
Russell King0a8b80c52005-06-24 19:48:22 +01002293 cval = UART_LCR_WLEN6;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002294 break;
2295 case CS7:
Russell King0a8b80c52005-06-24 19:48:22 +01002296 cval = UART_LCR_WLEN7;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002297 break;
2298 default:
2299 case CS8:
Russell King0a8b80c52005-06-24 19:48:22 +01002300 cval = UART_LCR_WLEN8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002301 break;
2302 }
2303
2304 if (termios->c_cflag & CSTOPB)
Russell King0a8b80c52005-06-24 19:48:22 +01002305 cval |= UART_LCR_STOP;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002306 if (termios->c_cflag & PARENB)
2307 cval |= UART_LCR_PARITY;
2308 if (!(termios->c_cflag & PARODD))
2309 cval |= UART_LCR_EPAR;
2310#ifdef CMSPAR
2311 if (termios->c_cflag & CMSPAR)
2312 cval |= UART_LCR_SPAR;
2313#endif
2314
2315 /*
2316 * Ask the core to calculate the divisor for us.
2317 */
Anton Vorontsov24d481e2009-09-19 13:13:20 -07002318 baud = uart_get_baud_rate(port, termios, old,
2319 port->uartclk / 16 / 0xffff,
2320 port->uartclk / 16);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002321 quot = serial8250_get_divisor(port, baud);
2322
2323 /*
Russell King4ba5e352005-06-23 10:43:04 +01002324 * Oxford Semi 952 rev B workaround
Linus Torvalds1da177e2005-04-16 15:20:36 -07002325 */
Russell King4ba5e352005-06-23 10:43:04 +01002326 if (up->bugs & UART_BUG_QUOT && (quot & 0xff) == 0)
Alan Cox3e8d4e22008-02-04 22:27:53 -08002327 quot++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002328
2329 if (up->capabilities & UART_CAP_FIFO && up->port.fifosize > 1) {
2330 if (baud < 2400)
2331 fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1;
2332 else
2333 fcr = uart_config[up->port.type].fcr;
2334 }
2335
2336 /*
2337 * MCR-based auto flow control. When AFE is enabled, RTS will be
2338 * deasserted when the receive FIFO contains more characters than
2339 * the trigger, or the MCR RTS bit is cleared. In the case where
2340 * the remote UART is not using CTS auto flow control, we must
2341 * have sufficient FIFO entries for the latency of the remote
2342 * UART to respond. IOW, at least 32 bytes of FIFO.
2343 */
2344 if (up->capabilities & UART_CAP_AFE && up->port.fifosize >= 32) {
2345 up->mcr &= ~UART_MCR_AFE;
2346 if (termios->c_cflag & CRTSCTS)
2347 up->mcr |= UART_MCR_AFE;
2348 }
2349
2350 /*
2351 * Ok, we're now changing the port state. Do it with
2352 * interrupts disabled.
2353 */
2354 spin_lock_irqsave(&up->port.lock, flags);
2355
2356 /*
2357 * Update the per-port timeout.
2358 */
2359 uart_update_timeout(port, termios->c_cflag, baud);
2360
2361 up->port.read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR;
2362 if (termios->c_iflag & INPCK)
2363 up->port.read_status_mask |= UART_LSR_FE | UART_LSR_PE;
2364 if (termios->c_iflag & (BRKINT | PARMRK))
2365 up->port.read_status_mask |= UART_LSR_BI;
2366
2367 /*
2368 * Characteres to ignore
2369 */
2370 up->port.ignore_status_mask = 0;
2371 if (termios->c_iflag & IGNPAR)
2372 up->port.ignore_status_mask |= UART_LSR_PE | UART_LSR_FE;
2373 if (termios->c_iflag & IGNBRK) {
2374 up->port.ignore_status_mask |= UART_LSR_BI;
2375 /*
2376 * If we're ignoring parity and break indicators,
2377 * ignore overruns too (for real raw support).
2378 */
2379 if (termios->c_iflag & IGNPAR)
2380 up->port.ignore_status_mask |= UART_LSR_OE;
2381 }
2382
2383 /*
2384 * ignore all characters if CREAD is not set
2385 */
2386 if ((termios->c_cflag & CREAD) == 0)
2387 up->port.ignore_status_mask |= UART_LSR_DR;
2388
2389 /*
2390 * CTS flow control flag and modem status interrupts
2391 */
Ingo Molnarf8b372a2010-11-13 16:21:58 +01002392 up->ier &= ~UART_IER_MSI;
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00002393 if (!(up->bugs & UART_BUG_NOMSR) &&
2394 UART_ENABLE_MS(&up->port, termios->c_cflag))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002395 up->ier |= UART_IER_MSI;
2396 if (up->capabilities & UART_CAP_UUE)
Stephen Warren4539c242011-05-17 16:12:36 -06002397 up->ier |= UART_IER_UUE;
2398 if (up->capabilities & UART_CAP_RTOIE)
2399 up->ier |= UART_IER_RTOIE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002400
2401 serial_out(up, UART_IER, up->ier);
2402
2403 if (up->capabilities & UART_CAP_EFR) {
2404 unsigned char efr = 0;
2405 /*
2406 * TI16C752/Startech hardware flow control. FIXME:
2407 * - TI16C752 requires control thresholds to be set.
2408 * - UART_MCR_RTS is ineffective if auto-RTS mode is enabled.
2409 */
2410 if (termios->c_cflag & CRTSCTS)
2411 efr |= UART_EFR_CTS;
2412
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -08002413 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B);
Søren Holm06315342011-09-02 22:55:37 +02002414 if (up->port.flags & UPF_EXAR_EFR)
2415 serial_outp(up, UART_XR_EFR, efr);
2416 else
2417 serial_outp(up, UART_EFR, efr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002418 }
2419
Russell Kingf2eda272008-09-01 21:47:59 +01002420#ifdef CONFIG_ARCH_OMAP
Jonathan McDowell255341c2006-08-14 23:05:32 -07002421 /* Workaround to enable 115200 baud on OMAP1510 internal ports */
Russell King56685452008-09-01 21:25:33 +01002422 if (cpu_is_omap1510() && is_omap_port(up)) {
Jonathan McDowell255341c2006-08-14 23:05:32 -07002423 if (baud == 115200) {
2424 quot = 1;
2425 serial_out(up, UART_OMAP_OSC_12M_SEL, 1);
2426 } else
2427 serial_out(up, UART_OMAP_OSC_12M_SEL, 0);
2428 }
2429#endif
2430
Linus Torvalds1da177e2005-04-16 15:20:36 -07002431 if (up->capabilities & UART_NATSEMI) {
2432 /* Switch to bank 2 not bank 1, to avoid resetting EXCR2 */
2433 serial_outp(up, UART_LCR, 0xe0);
2434 } else {
2435 serial_outp(up, UART_LCR, cval | UART_LCR_DLAB);/* set DLAB */
2436 }
2437
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +01002438 serial_dl_write(up, quot);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002439
2440 /*
2441 * LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR
2442 * is written without DLAB set, this mode will be disabled.
2443 */
2444 if (up->port.type == PORT_16750)
2445 serial_outp(up, UART_FCR, fcr);
2446
2447 serial_outp(up, UART_LCR, cval); /* reset DLAB */
2448 up->lcr = cval; /* Save LCR */
2449 if (up->port.type != PORT_16750) {
2450 if (fcr & UART_FCR_ENABLE_FIFO) {
2451 /* emulated UARTs (Lucent Venus 167x) need two steps */
2452 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO);
2453 }
2454 serial_outp(up, UART_FCR, fcr); /* set fcr */
2455 }
2456 serial8250_set_mctrl(&up->port, up->port.mctrl);
2457 spin_unlock_irqrestore(&up->port.lock, flags);
Alan Coxe991a2b2008-04-28 02:14:06 -07002458 /* Don't rewrite B0 */
2459 if (tty_termios_baud_rate(termios))
2460 tty_termios_encode_baud_rate(termios, baud, baud);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002461}
Philippe Langlais235dae52010-07-29 17:13:57 +02002462EXPORT_SYMBOL(serial8250_do_set_termios);
2463
2464static void
2465serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
2466 struct ktermios *old)
2467{
2468 if (port->set_termios)
2469 port->set_termios(port, termios, old);
2470 else
2471 serial8250_do_set_termios(port, termios, old);
2472}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002473
2474static void
Arnd Bergmanna0821df2010-06-01 22:53:11 +02002475serial8250_set_ldisc(struct uart_port *port, int new)
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002476{
Arnd Bergmanna0821df2010-06-01 22:53:11 +02002477 if (new == N_PPS) {
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002478 port->flags |= UPF_HARDPPS_CD;
2479 serial8250_enable_ms(port);
2480 } else
2481 port->flags &= ~UPF_HARDPPS_CD;
2482}
2483
Manuel Laussc161afe2010-09-25 15:13:45 +02002484
2485void serial8250_do_pm(struct uart_port *port, unsigned int state,
2486 unsigned int oldstate)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002487{
Jamie Iles49d57412010-12-01 23:39:35 +00002488 struct uart_8250_port *p =
2489 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002490
2491 serial8250_set_sleep(p, state != 0);
Manuel Laussc161afe2010-09-25 15:13:45 +02002492}
2493EXPORT_SYMBOL(serial8250_do_pm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002494
Manuel Laussc161afe2010-09-25 15:13:45 +02002495static void
2496serial8250_pm(struct uart_port *port, unsigned int state,
2497 unsigned int oldstate)
2498{
2499 if (port->pm)
2500 port->pm(port, state, oldstate);
2501 else
2502 serial8250_do_pm(port, state, oldstate);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002503}
2504
Russell Kingf2eda272008-09-01 21:47:59 +01002505static unsigned int serial8250_port_size(struct uart_8250_port *pt)
2506{
2507 if (pt->port.iotype == UPIO_AU)
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002508 return 0x1000;
Russell Kingf2eda272008-09-01 21:47:59 +01002509#ifdef CONFIG_ARCH_OMAP
2510 if (is_omap_port(pt))
2511 return 0x16 << pt->port.regshift;
2512#endif
2513 return 8 << pt->port.regshift;
2514}
2515
Linus Torvalds1da177e2005-04-16 15:20:36 -07002516/*
2517 * Resource handling.
2518 */
2519static int serial8250_request_std_resource(struct uart_8250_port *up)
2520{
Russell Kingf2eda272008-09-01 21:47:59 +01002521 unsigned int size = serial8250_port_size(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002522 int ret = 0;
2523
2524 switch (up->port.iotype) {
Sergei Shtylyov85835f42006-04-30 11:15:58 +01002525 case UPIO_AU:
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002526 case UPIO_TSI:
2527 case UPIO_MEM32:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002528 case UPIO_MEM:
2529 if (!up->port.mapbase)
2530 break;
2531
2532 if (!request_mem_region(up->port.mapbase, size, "serial")) {
2533 ret = -EBUSY;
2534 break;
2535 }
2536
2537 if (up->port.flags & UPF_IOREMAP) {
Alan Cox6f441fe2008-05-01 04:34:59 -07002538 up->port.membase = ioremap_nocache(up->port.mapbase,
2539 size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002540 if (!up->port.membase) {
2541 release_mem_region(up->port.mapbase, size);
2542 ret = -ENOMEM;
2543 }
2544 }
2545 break;
2546
2547 case UPIO_HUB6:
2548 case UPIO_PORT:
2549 if (!request_region(up->port.iobase, size, "serial"))
2550 ret = -EBUSY;
2551 break;
2552 }
2553 return ret;
2554}
2555
2556static void serial8250_release_std_resource(struct uart_8250_port *up)
2557{
Russell Kingf2eda272008-09-01 21:47:59 +01002558 unsigned int size = serial8250_port_size(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002559
2560 switch (up->port.iotype) {
Sergei Shtylyov85835f42006-04-30 11:15:58 +01002561 case UPIO_AU:
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002562 case UPIO_TSI:
2563 case UPIO_MEM32:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002564 case UPIO_MEM:
2565 if (!up->port.mapbase)
2566 break;
2567
2568 if (up->port.flags & UPF_IOREMAP) {
2569 iounmap(up->port.membase);
2570 up->port.membase = NULL;
2571 }
2572
2573 release_mem_region(up->port.mapbase, size);
2574 break;
2575
2576 case UPIO_HUB6:
2577 case UPIO_PORT:
2578 release_region(up->port.iobase, size);
2579 break;
2580 }
2581}
2582
2583static int serial8250_request_rsa_resource(struct uart_8250_port *up)
2584{
2585 unsigned long start = UART_RSA_BASE << up->port.regshift;
2586 unsigned int size = 8 << up->port.regshift;
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002587 int ret = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002588
2589 switch (up->port.iotype) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002590 case UPIO_HUB6:
2591 case UPIO_PORT:
2592 start += up->port.iobase;
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002593 if (request_region(start, size, "serial-rsa"))
2594 ret = 0;
2595 else
Linus Torvalds1da177e2005-04-16 15:20:36 -07002596 ret = -EBUSY;
2597 break;
2598 }
2599
2600 return ret;
2601}
2602
2603static void serial8250_release_rsa_resource(struct uart_8250_port *up)
2604{
2605 unsigned long offset = UART_RSA_BASE << up->port.regshift;
2606 unsigned int size = 8 << up->port.regshift;
2607
2608 switch (up->port.iotype) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002609 case UPIO_HUB6:
2610 case UPIO_PORT:
2611 release_region(up->port.iobase + offset, size);
2612 break;
2613 }
2614}
2615
2616static void serial8250_release_port(struct uart_port *port)
2617{
Jamie Iles49d57412010-12-01 23:39:35 +00002618 struct uart_8250_port *up =
2619 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002620
2621 serial8250_release_std_resource(up);
2622 if (up->port.type == PORT_RSA)
2623 serial8250_release_rsa_resource(up);
2624}
2625
2626static int serial8250_request_port(struct uart_port *port)
2627{
Jamie Iles49d57412010-12-01 23:39:35 +00002628 struct uart_8250_port *up =
2629 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002630 int ret = 0;
2631
2632 ret = serial8250_request_std_resource(up);
2633 if (ret == 0 && up->port.type == PORT_RSA) {
2634 ret = serial8250_request_rsa_resource(up);
2635 if (ret < 0)
2636 serial8250_release_std_resource(up);
2637 }
2638
2639 return ret;
2640}
2641
2642static void serial8250_config_port(struct uart_port *port, int flags)
2643{
Jamie Iles49d57412010-12-01 23:39:35 +00002644 struct uart_8250_port *up =
2645 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002646 int probeflags = PROBE_ANY;
2647 int ret;
2648
2649 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002650 * Find the region that we can probe for. This in turn
2651 * tells us whether we can probe for the type of port.
2652 */
2653 ret = serial8250_request_std_resource(up);
2654 if (ret < 0)
2655 return;
2656
2657 ret = serial8250_request_rsa_resource(up);
2658 if (ret < 0)
2659 probeflags &= ~PROBE_RSA;
2660
Alan Coxb8e7e402009-05-28 14:01:35 +01002661 if (up->port.iotype != up->cur_iotype)
2662 set_io_from_upio(port);
2663
Linus Torvalds1da177e2005-04-16 15:20:36 -07002664 if (flags & UART_CONFIG_TYPE)
2665 autoconfig(up, probeflags);
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002666
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002667 /* if access method is AU, it is a 16550 with a quirk */
2668 if (up->port.type == PORT_16550A && up->port.iotype == UPIO_AU)
2669 up->bugs |= UART_BUG_NOMSR;
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002670
Linus Torvalds1da177e2005-04-16 15:20:36 -07002671 if (up->port.type != PORT_UNKNOWN && flags & UART_CONFIG_IRQ)
2672 autoconfig_irq(up);
2673
2674 if (up->port.type != PORT_RSA && probeflags & PROBE_RSA)
2675 serial8250_release_rsa_resource(up);
2676 if (up->port.type == PORT_UNKNOWN)
2677 serial8250_release_std_resource(up);
2678}
2679
2680static int
2681serial8250_verify_port(struct uart_port *port, struct serial_struct *ser)
2682{
Yinghai Lua62c4132008-08-19 20:49:55 -07002683 if (ser->irq >= nr_irqs || ser->irq < 0 ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07002684 ser->baud_base < 9600 || ser->type < PORT_UNKNOWN ||
2685 ser->type >= ARRAY_SIZE(uart_config) || ser->type == PORT_CIRRUS ||
2686 ser->type == PORT_STARTECH)
2687 return -EINVAL;
2688 return 0;
2689}
2690
2691static const char *
2692serial8250_type(struct uart_port *port)
2693{
2694 int type = port->type;
2695
2696 if (type >= ARRAY_SIZE(uart_config))
2697 type = 0;
2698 return uart_config[type].name;
2699}
2700
2701static struct uart_ops serial8250_pops = {
2702 .tx_empty = serial8250_tx_empty,
2703 .set_mctrl = serial8250_set_mctrl,
2704 .get_mctrl = serial8250_get_mctrl,
2705 .stop_tx = serial8250_stop_tx,
2706 .start_tx = serial8250_start_tx,
2707 .stop_rx = serial8250_stop_rx,
2708 .enable_ms = serial8250_enable_ms,
2709 .break_ctl = serial8250_break_ctl,
2710 .startup = serial8250_startup,
2711 .shutdown = serial8250_shutdown,
2712 .set_termios = serial8250_set_termios,
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002713 .set_ldisc = serial8250_set_ldisc,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002714 .pm = serial8250_pm,
2715 .type = serial8250_type,
2716 .release_port = serial8250_release_port,
2717 .request_port = serial8250_request_port,
2718 .config_port = serial8250_config_port,
2719 .verify_port = serial8250_verify_port,
Jason Wesself2d937f2008-04-17 20:05:37 +02002720#ifdef CONFIG_CONSOLE_POLL
2721 .poll_get_char = serial8250_get_poll_char,
2722 .poll_put_char = serial8250_put_poll_char,
2723#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07002724};
2725
2726static struct uart_8250_port serial8250_ports[UART_NR];
2727
Alan Coxaf7f3742010-10-18 11:38:02 -07002728static void (*serial8250_isa_config)(int port, struct uart_port *up,
2729 unsigned short *capabilities);
2730
2731void serial8250_set_isa_configurator(
2732 void (*v)(int port, struct uart_port *up, unsigned short *capabilities))
2733{
2734 serial8250_isa_config = v;
2735}
2736EXPORT_SYMBOL(serial8250_set_isa_configurator);
2737
Linus Torvalds1da177e2005-04-16 15:20:36 -07002738static void __init serial8250_isa_init_ports(void)
2739{
2740 struct uart_8250_port *up;
2741 static int first = 1;
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02002742 int i, irqflag = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002743
2744 if (!first)
2745 return;
2746 first = 0;
2747
Dave Jonesa61c2d72006-01-07 23:18:19 +00002748 for (i = 0; i < nr_uarts; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002749 struct uart_8250_port *up = &serial8250_ports[i];
2750
2751 up->port.line = i;
2752 spin_lock_init(&up->port.lock);
2753
2754 init_timer(&up->timer);
2755 up->timer.function = serial8250_timeout;
2756
2757 /*
2758 * ALPHA_KLUDGE_MCR needs to be killed.
2759 */
2760 up->mcr_mask = ~ALPHA_KLUDGE_MCR;
2761 up->mcr_force = ALPHA_KLUDGE_MCR;
2762
2763 up->port.ops = &serial8250_pops;
2764 }
2765
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02002766 if (share_irqs)
2767 irqflag = IRQF_SHARED;
2768
Russell King44454bc2005-06-30 22:41:22 +01002769 for (i = 0, up = serial8250_ports;
Dave Jonesa61c2d72006-01-07 23:18:19 +00002770 i < ARRAY_SIZE(old_serial_port) && i < nr_uarts;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002771 i++, up++) {
2772 up->port.iobase = old_serial_port[i].port;
2773 up->port.irq = irq_canonicalize(old_serial_port[i].irq);
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002774 up->port.irqflags = old_serial_port[i].irqflags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002775 up->port.uartclk = old_serial_port[i].baud_base * 16;
2776 up->port.flags = old_serial_port[i].flags;
2777 up->port.hub6 = old_serial_port[i].hub6;
2778 up->port.membase = old_serial_port[i].iomem_base;
2779 up->port.iotype = old_serial_port[i].io_type;
2780 up->port.regshift = old_serial_port[i].iomem_reg_shift;
David Daney7d6a07d2009-01-02 13:49:47 +00002781 set_io_from_upio(&up->port);
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02002782 up->port.irqflags |= irqflag;
Alan Coxaf7f3742010-10-18 11:38:02 -07002783 if (serial8250_isa_config != NULL)
2784 serial8250_isa_config(i, &up->port, &up->capabilities);
2785
Linus Torvalds1da177e2005-04-16 15:20:36 -07002786 }
2787}
2788
Shmulik Ladkanib5d228c2009-12-09 12:31:29 -08002789static void
2790serial8250_init_fixed_type_port(struct uart_8250_port *up, unsigned int type)
2791{
2792 up->port.type = type;
2793 up->port.fifosize = uart_config[type].fifo_size;
2794 up->capabilities = uart_config[type].flags;
2795 up->tx_loadsz = uart_config[type].tx_loadsz;
2796}
2797
Linus Torvalds1da177e2005-04-16 15:20:36 -07002798static void __init
2799serial8250_register_ports(struct uart_driver *drv, struct device *dev)
2800{
2801 int i;
2802
Alan Coxb8e7e402009-05-28 14:01:35 +01002803 for (i = 0; i < nr_uarts; i++) {
2804 struct uart_8250_port *up = &serial8250_ports[i];
2805 up->cur_iotype = 0xFF;
2806 }
2807
Linus Torvalds1da177e2005-04-16 15:20:36 -07002808 serial8250_isa_init_ports();
2809
Dave Jonesa61c2d72006-01-07 23:18:19 +00002810 for (i = 0; i < nr_uarts; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002811 struct uart_8250_port *up = &serial8250_ports[i];
2812
2813 up->port.dev = dev;
Shmulik Ladkanib5d228c2009-12-09 12:31:29 -08002814
2815 if (up->port.flags & UPF_FIXED_TYPE)
2816 serial8250_init_fixed_type_port(up, up->port.type);
2817
Linus Torvalds1da177e2005-04-16 15:20:36 -07002818 uart_add_one_port(drv, &up->port);
2819 }
2820}
2821
2822#ifdef CONFIG_SERIAL_8250_CONSOLE
2823
Russell Kingd3587882006-03-20 20:00:09 +00002824static void serial8250_console_putchar(struct uart_port *port, int ch)
2825{
Jamie Iles49d57412010-12-01 23:39:35 +00002826 struct uart_8250_port *up =
2827 container_of(port, struct uart_8250_port, port);
Russell Kingd3587882006-03-20 20:00:09 +00002828
2829 wait_for_xmitr(up, UART_LSR_THRE);
2830 serial_out(up, UART_TX, ch);
2831}
2832
Linus Torvalds1da177e2005-04-16 15:20:36 -07002833/*
2834 * Print a string to the serial port trying not to disturb
2835 * any possible real use of the port...
2836 *
2837 * The console_lock must be held when we get here.
2838 */
2839static void
2840serial8250_console_write(struct console *co, const char *s, unsigned int count)
2841{
2842 struct uart_8250_port *up = &serial8250_ports[co->index];
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002843 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002844 unsigned int ier;
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002845 int locked = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002846
Andrew Morton78512ec2005-11-07 00:59:13 -08002847 touch_nmi_watchdog();
2848
Andrew Morton68aa2c02006-06-30 02:29:59 -07002849 local_irq_save(flags);
2850 if (up->port.sysrq) {
2851 /* serial8250_handle_port() already took the lock */
2852 locked = 0;
2853 } else if (oops_in_progress) {
2854 locked = spin_trylock(&up->port.lock);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002855 } else
Andrew Morton68aa2c02006-06-30 02:29:59 -07002856 spin_lock(&up->port.lock);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002857
Linus Torvalds1da177e2005-04-16 15:20:36 -07002858 /*
Ralf Baechledc7bf132006-02-15 09:59:47 +00002859 * First save the IER then disable the interrupts
Linus Torvalds1da177e2005-04-16 15:20:36 -07002860 */
2861 ier = serial_in(up, UART_IER);
2862
2863 if (up->capabilities & UART_CAP_UUE)
2864 serial_out(up, UART_IER, UART_IER_UUE);
2865 else
2866 serial_out(up, UART_IER, 0);
2867
Russell Kingd3587882006-03-20 20:00:09 +00002868 uart_console_write(&up->port, s, count, serial8250_console_putchar);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002869
2870 /*
2871 * Finally, wait for transmitter to become empty
2872 * and restore the IER
2873 */
Alan Coxf91a3712006-01-21 14:59:12 +00002874 wait_for_xmitr(up, BOTH_EMPTY);
Russell Kinga88d75b2006-04-30 11:30:15 +01002875 serial_out(up, UART_IER, ier);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002876
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002877 /*
2878 * The receive handling will happen properly because the
2879 * receive ready bit will still be set; it is not cleared
2880 * on read. However, modem control will not, we must
2881 * call it if we have saved something in the saved flags
2882 * while processing with interrupts off.
2883 */
2884 if (up->msr_saved_flags)
2885 check_modem_status(up);
2886
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002887 if (locked)
Andrew Morton68aa2c02006-06-30 02:29:59 -07002888 spin_unlock(&up->port.lock);
2889 local_irq_restore(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002890}
2891
Vivek Goyal118c0ac2007-01-11 01:52:44 +01002892static int __init serial8250_console_setup(struct console *co, char *options)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002893{
2894 struct uart_port *port;
2895 int baud = 9600;
2896 int bits = 8;
2897 int parity = 'n';
2898 int flow = 'n';
2899
2900 /*
2901 * Check whether an invalid uart number has been specified, and
2902 * if so, search for the first available port that does have
2903 * console support.
2904 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00002905 if (co->index >= nr_uarts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002906 co->index = 0;
2907 port = &serial8250_ports[co->index].port;
2908 if (!port->iobase && !port->membase)
2909 return -ENODEV;
2910
2911 if (options)
2912 uart_parse_options(options, &baud, &parity, &bits, &flow);
2913
2914 return uart_set_options(port, co, baud, parity, bits, flow);
2915}
2916
Daniel Ritzb6b1d872007-08-03 16:07:43 +02002917static int serial8250_console_early_setup(void)
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002918{
2919 return serial8250_find_port_for_earlycon();
2920}
2921
Linus Torvalds1da177e2005-04-16 15:20:36 -07002922static struct console serial8250_console = {
2923 .name = "ttyS",
2924 .write = serial8250_console_write,
2925 .device = uart_console_device,
2926 .setup = serial8250_console_setup,
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002927 .early_setup = serial8250_console_early_setup,
Peter Zijlstraa80c49d2010-11-15 21:11:12 +01002928 .flags = CON_PRINTBUFFER | CON_ANYTIME,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002929 .index = -1,
2930 .data = &serial8250_reg,
2931};
2932
2933static int __init serial8250_console_init(void)
2934{
Eric W. Biederman05d81d22008-07-12 13:47:53 -07002935 if (nr_uarts > UART_NR)
2936 nr_uarts = UART_NR;
2937
Linus Torvalds1da177e2005-04-16 15:20:36 -07002938 serial8250_isa_init_ports();
2939 register_console(&serial8250_console);
2940 return 0;
2941}
2942console_initcall(serial8250_console_init);
2943
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002944int serial8250_find_port(struct uart_port *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002945{
2946 int line;
2947 struct uart_port *port;
2948
Dave Jonesa61c2d72006-01-07 23:18:19 +00002949 for (line = 0; line < nr_uarts; line++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002950 port = &serial8250_ports[line].port;
Russell King50aec3b52006-01-04 18:13:03 +00002951 if (uart_match_port(p, port))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002952 return line;
2953 }
2954 return -ENODEV;
2955}
2956
Linus Torvalds1da177e2005-04-16 15:20:36 -07002957#define SERIAL8250_CONSOLE &serial8250_console
2958#else
2959#define SERIAL8250_CONSOLE NULL
2960#endif
2961
2962static struct uart_driver serial8250_reg = {
2963 .owner = THIS_MODULE,
2964 .driver_name = "serial",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002965 .dev_name = "ttyS",
2966 .major = TTY_MAJOR,
2967 .minor = 64,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002968 .cons = SERIAL8250_CONSOLE,
2969};
2970
Russell Kingd856c662006-02-23 10:22:13 +00002971/*
2972 * early_serial_setup - early registration for 8250 ports
2973 *
2974 * Setup an 8250 port structure prior to console initialisation. Use
2975 * after console initialisation will cause undefined behaviour.
2976 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002977int __init early_serial_setup(struct uart_port *port)
2978{
David Daneyb4304282009-01-02 13:49:41 +00002979 struct uart_port *p;
2980
Linus Torvalds1da177e2005-04-16 15:20:36 -07002981 if (port->line >= ARRAY_SIZE(serial8250_ports))
2982 return -ENODEV;
2983
2984 serial8250_isa_init_ports();
David Daneyb4304282009-01-02 13:49:41 +00002985 p = &serial8250_ports[port->line].port;
2986 p->iobase = port->iobase;
2987 p->membase = port->membase;
2988 p->irq = port->irq;
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002989 p->irqflags = port->irqflags;
David Daneyb4304282009-01-02 13:49:41 +00002990 p->uartclk = port->uartclk;
2991 p->fifosize = port->fifosize;
2992 p->regshift = port->regshift;
2993 p->iotype = port->iotype;
2994 p->flags = port->flags;
2995 p->mapbase = port->mapbase;
2996 p->private_data = port->private_data;
Helge Deller125c97d2009-01-13 22:51:07 +01002997 p->type = port->type;
2998 p->line = port->line;
David Daney7d6a07d2009-01-02 13:49:47 +00002999
3000 set_io_from_upio(p);
3001 if (port->serial_in)
3002 p->serial_in = port->serial_in;
3003 if (port->serial_out)
3004 p->serial_out = port->serial_out;
Jamie Iles583d28e2011-08-15 10:17:52 +01003005 if (port->handle_irq)
3006 p->handle_irq = port->handle_irq;
3007 else
3008 p->handle_irq = serial8250_default_handle_irq;
David Daney7d6a07d2009-01-02 13:49:47 +00003009
Linus Torvalds1da177e2005-04-16 15:20:36 -07003010 return 0;
3011}
3012
3013/**
3014 * serial8250_suspend_port - suspend one serial port
3015 * @line: serial line number
Linus Torvalds1da177e2005-04-16 15:20:36 -07003016 *
3017 * Suspend one serial port.
3018 */
3019void serial8250_suspend_port(int line)
3020{
3021 uart_suspend_port(&serial8250_reg, &serial8250_ports[line].port);
3022}
3023
3024/**
3025 * serial8250_resume_port - resume one serial port
3026 * @line: serial line number
Linus Torvalds1da177e2005-04-16 15:20:36 -07003027 *
3028 * Resume one serial port.
3029 */
3030void serial8250_resume_port(int line)
3031{
David Woodhouseb5b82df2007-05-17 14:27:39 +08003032 struct uart_8250_port *up = &serial8250_ports[line];
3033
3034 if (up->capabilities & UART_NATSEMI) {
David Woodhouseb5b82df2007-05-17 14:27:39 +08003035 /* Ensure it's still in high speed mode */
3036 serial_outp(up, UART_LCR, 0xE0);
3037
Yin Kangkai0d0389e2011-02-09 11:35:18 +08003038 ns16550a_goto_highspeed(up);
David Woodhouseb5b82df2007-05-17 14:27:39 +08003039
3040 serial_outp(up, UART_LCR, 0);
Yin Kangkai95926d22011-02-09 11:34:20 +08003041 up->port.uartclk = 921600*16;
David Woodhouseb5b82df2007-05-17 14:27:39 +08003042 }
3043 uart_resume_port(&serial8250_reg, &up->port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003044}
3045
3046/*
3047 * Register a set of serial devices attached to a platform device. The
3048 * list is terminated with a zero flags entry, which means we expect
3049 * all entries to have at least UPF_BOOT_AUTOCONF set.
3050 */
Russell King3ae5eae2005-11-09 22:32:44 +00003051static int __devinit serial8250_probe(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003052{
Russell King3ae5eae2005-11-09 22:32:44 +00003053 struct plat_serial8250_port *p = dev->dev.platform_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003054 struct uart_port port;
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02003055 int ret, i, irqflag = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003056
3057 memset(&port, 0, sizeof(struct uart_port));
3058
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02003059 if (share_irqs)
3060 irqflag = IRQF_SHARED;
3061
Russell Kingec9f47c2005-06-27 11:12:54 +01003062 for (i = 0; p && p->flags != 0; p++, i++) {
Will Newton74a197412008-02-04 22:27:50 -08003063 port.iobase = p->iobase;
3064 port.membase = p->membase;
3065 port.irq = p->irq;
Vikram Pandita1c2f0492009-09-19 13:13:19 -07003066 port.irqflags = p->irqflags;
Will Newton74a197412008-02-04 22:27:50 -08003067 port.uartclk = p->uartclk;
3068 port.regshift = p->regshift;
3069 port.iotype = p->iotype;
3070 port.flags = p->flags;
3071 port.mapbase = p->mapbase;
3072 port.hub6 = p->hub6;
3073 port.private_data = p->private_data;
David Daney8e23fcc2009-01-02 13:49:54 +00003074 port.type = p->type;
David Daney7d6a07d2009-01-02 13:49:47 +00003075 port.serial_in = p->serial_in;
3076 port.serial_out = p->serial_out;
Jamie Iles583d28e2011-08-15 10:17:52 +01003077 port.handle_irq = p->handle_irq;
Philippe Langlais235dae52010-07-29 17:13:57 +02003078 port.set_termios = p->set_termios;
Manuel Laussc161afe2010-09-25 15:13:45 +02003079 port.pm = p->pm;
Will Newton74a197412008-02-04 22:27:50 -08003080 port.dev = &dev->dev;
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02003081 port.irqflags |= irqflag;
Russell Kingec9f47c2005-06-27 11:12:54 +01003082 ret = serial8250_register_port(&port);
3083 if (ret < 0) {
Russell King3ae5eae2005-11-09 22:32:44 +00003084 dev_err(&dev->dev, "unable to register port at index %d "
Josh Boyer4f640ef2007-07-23 18:43:44 -07003085 "(IO%lx MEM%llx IRQ%d): %d\n", i,
3086 p->iobase, (unsigned long long)p->mapbase,
3087 p->irq, ret);
Russell Kingec9f47c2005-06-27 11:12:54 +01003088 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003089 }
3090 return 0;
3091}
3092
3093/*
3094 * Remove serial ports registered against a platform device.
3095 */
Russell King3ae5eae2005-11-09 22:32:44 +00003096static int __devexit serial8250_remove(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003097{
3098 int i;
3099
Dave Jonesa61c2d72006-01-07 23:18:19 +00003100 for (i = 0; i < nr_uarts; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003101 struct uart_8250_port *up = &serial8250_ports[i];
3102
Russell King3ae5eae2005-11-09 22:32:44 +00003103 if (up->port.dev == &dev->dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003104 serial8250_unregister_port(i);
3105 }
3106 return 0;
3107}
3108
Russell King3ae5eae2005-11-09 22:32:44 +00003109static int serial8250_suspend(struct platform_device *dev, pm_message_t state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003110{
3111 int i;
3112
Linus Torvalds1da177e2005-04-16 15:20:36 -07003113 for (i = 0; i < UART_NR; i++) {
3114 struct uart_8250_port *up = &serial8250_ports[i];
3115
Russell King3ae5eae2005-11-09 22:32:44 +00003116 if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003117 uart_suspend_port(&serial8250_reg, &up->port);
3118 }
3119
3120 return 0;
3121}
3122
Russell King3ae5eae2005-11-09 22:32:44 +00003123static int serial8250_resume(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003124{
3125 int i;
3126
Linus Torvalds1da177e2005-04-16 15:20:36 -07003127 for (i = 0; i < UART_NR; i++) {
3128 struct uart_8250_port *up = &serial8250_ports[i];
3129
Russell King3ae5eae2005-11-09 22:32:44 +00003130 if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
David Woodhouseb5b82df2007-05-17 14:27:39 +08003131 serial8250_resume_port(i);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003132 }
3133
3134 return 0;
3135}
3136
Russell King3ae5eae2005-11-09 22:32:44 +00003137static struct platform_driver serial8250_isa_driver = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003138 .probe = serial8250_probe,
3139 .remove = __devexit_p(serial8250_remove),
3140 .suspend = serial8250_suspend,
3141 .resume = serial8250_resume,
Russell King3ae5eae2005-11-09 22:32:44 +00003142 .driver = {
3143 .name = "serial8250",
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003144 .owner = THIS_MODULE,
Russell King3ae5eae2005-11-09 22:32:44 +00003145 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07003146};
3147
3148/*
3149 * This "device" covers _all_ ISA 8250-compatible serial devices listed
3150 * in the table in include/asm/serial.h
3151 */
3152static struct platform_device *serial8250_isa_devs;
3153
3154/*
3155 * serial8250_register_port and serial8250_unregister_port allows for
3156 * 16x50 serial ports to be configured at run-time, to support PCMCIA
3157 * modems and PCI multiport cards.
3158 */
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003159static DEFINE_MUTEX(serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003160
3161static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *port)
3162{
3163 int i;
3164
3165 /*
3166 * First, find a port entry which matches.
3167 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003168 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003169 if (uart_match_port(&serial8250_ports[i].port, port))
3170 return &serial8250_ports[i];
3171
3172 /*
3173 * We didn't find a matching entry, so look for the first
3174 * free entry. We look for one which hasn't been previously
3175 * used (indicated by zero iobase).
3176 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003177 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003178 if (serial8250_ports[i].port.type == PORT_UNKNOWN &&
3179 serial8250_ports[i].port.iobase == 0)
3180 return &serial8250_ports[i];
3181
3182 /*
3183 * That also failed. Last resort is to find any entry which
3184 * doesn't have a real port associated with it.
3185 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003186 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003187 if (serial8250_ports[i].port.type == PORT_UNKNOWN)
3188 return &serial8250_ports[i];
3189
3190 return NULL;
3191}
3192
3193/**
3194 * serial8250_register_port - register a serial port
3195 * @port: serial port template
3196 *
3197 * Configure the serial port specified by the request. If the
3198 * port exists and is in use, it is hung up and unregistered
3199 * first.
3200 *
3201 * The port is then probed and if necessary the IRQ is autodetected
3202 * If this fails an error is returned.
3203 *
3204 * On success the port is ready to use and the line number is returned.
3205 */
3206int serial8250_register_port(struct uart_port *port)
3207{
3208 struct uart_8250_port *uart;
3209 int ret = -ENOSPC;
3210
3211 if (port->uartclk == 0)
3212 return -EINVAL;
3213
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003214 mutex_lock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003215
3216 uart = serial8250_find_match_or_unused(port);
3217 if (uart) {
3218 uart_remove_one_port(&serial8250_reg, &uart->port);
3219
Will Newton74a197412008-02-04 22:27:50 -08003220 uart->port.iobase = port->iobase;
3221 uart->port.membase = port->membase;
3222 uart->port.irq = port->irq;
Vikram Pandita1c2f0492009-09-19 13:13:19 -07003223 uart->port.irqflags = port->irqflags;
Will Newton74a197412008-02-04 22:27:50 -08003224 uart->port.uartclk = port->uartclk;
3225 uart->port.fifosize = port->fifosize;
3226 uart->port.regshift = port->regshift;
3227 uart->port.iotype = port->iotype;
3228 uart->port.flags = port->flags | UPF_BOOT_AUTOCONF;
3229 uart->port.mapbase = port->mapbase;
3230 uart->port.private_data = port->private_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003231 if (port->dev)
3232 uart->port.dev = port->dev;
David Daney8e23fcc2009-01-02 13:49:54 +00003233
Shmulik Ladkanib5d228c2009-12-09 12:31:29 -08003234 if (port->flags & UPF_FIXED_TYPE)
3235 serial8250_init_fixed_type_port(uart, port->type);
David Daney8e23fcc2009-01-02 13:49:54 +00003236
David Daney7d6a07d2009-01-02 13:49:47 +00003237 set_io_from_upio(&uart->port);
3238 /* Possibly override default I/O functions. */
3239 if (port->serial_in)
3240 uart->port.serial_in = port->serial_in;
3241 if (port->serial_out)
3242 uart->port.serial_out = port->serial_out;
Jamie Iles583d28e2011-08-15 10:17:52 +01003243 if (port->handle_irq)
3244 uart->port.handle_irq = port->handle_irq;
Philippe Langlais235dae52010-07-29 17:13:57 +02003245 /* Possibly override set_termios call */
3246 if (port->set_termios)
3247 uart->port.set_termios = port->set_termios;
Manuel Laussc161afe2010-09-25 15:13:45 +02003248 if (port->pm)
3249 uart->port.pm = port->pm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003250
Alan Coxaf7f3742010-10-18 11:38:02 -07003251 if (serial8250_isa_config != NULL)
3252 serial8250_isa_config(0, &uart->port,
3253 &uart->capabilities);
3254
Linus Torvalds1da177e2005-04-16 15:20:36 -07003255 ret = uart_add_one_port(&serial8250_reg, &uart->port);
3256 if (ret == 0)
3257 ret = uart->port.line;
3258 }
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003259 mutex_unlock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003260
3261 return ret;
3262}
3263EXPORT_SYMBOL(serial8250_register_port);
3264
3265/**
3266 * serial8250_unregister_port - remove a 16x50 serial port at runtime
3267 * @line: serial line number
3268 *
3269 * Remove one serial port. This may not be called from interrupt
3270 * context. We hand the port back to the our control.
3271 */
3272void serial8250_unregister_port(int line)
3273{
3274 struct uart_8250_port *uart = &serial8250_ports[line];
3275
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003276 mutex_lock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003277 uart_remove_one_port(&serial8250_reg, &uart->port);
3278 if (serial8250_isa_devs) {
3279 uart->port.flags &= ~UPF_BOOT_AUTOCONF;
3280 uart->port.type = PORT_UNKNOWN;
3281 uart->port.dev = &serial8250_isa_devs->dev;
leitao@linux.vnet.ibm.comcb01ece2011-05-26 11:18:39 -03003282 uart->capabilities = uart_config[uart->port.type].flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003283 uart_add_one_port(&serial8250_reg, &uart->port);
3284 } else {
3285 uart->port.dev = NULL;
3286 }
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003287 mutex_unlock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003288}
3289EXPORT_SYMBOL(serial8250_unregister_port);
3290
3291static int __init serial8250_init(void)
3292{
Alan Cox25db8ad2008-08-19 20:49:40 -07003293 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003294
Dave Jonesa61c2d72006-01-07 23:18:19 +00003295 if (nr_uarts > UART_NR)
3296 nr_uarts = UART_NR;
3297
Paul Bollef1fb9bb2008-12-30 14:06:43 +01003298 printk(KERN_INFO "Serial: 8250/16550 driver, "
Dave Jonesa61c2d72006-01-07 23:18:19 +00003299 "%d ports, IRQ sharing %sabled\n", nr_uarts,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003300 share_irqs ? "en" : "dis");
3301
David Millerb70ac772008-10-13 10:36:31 +01003302#ifdef CONFIG_SPARC
3303 ret = sunserial_register_minors(&serial8250_reg, UART_NR);
3304#else
3305 serial8250_reg.nr = UART_NR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003306 ret = uart_register_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003307#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003308 if (ret)
3309 goto out;
3310
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003311 serial8250_isa_devs = platform_device_alloc("serial8250",
3312 PLAT8250_DEV_LEGACY);
3313 if (!serial8250_isa_devs) {
3314 ret = -ENOMEM;
Russell Kingbc965a72006-01-18 09:54:29 +00003315 goto unreg_uart_drv;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003316 }
3317
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003318 ret = platform_device_add(serial8250_isa_devs);
3319 if (ret)
3320 goto put_dev;
3321
Linus Torvalds1da177e2005-04-16 15:20:36 -07003322 serial8250_register_ports(&serial8250_reg, &serial8250_isa_devs->dev);
3323
Russell Kingbc965a72006-01-18 09:54:29 +00003324 ret = platform_driver_register(&serial8250_isa_driver);
3325 if (ret == 0)
3326 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003327
Russell Kingbc965a72006-01-18 09:54:29 +00003328 platform_device_del(serial8250_isa_devs);
Alan Cox25db8ad2008-08-19 20:49:40 -07003329put_dev:
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003330 platform_device_put(serial8250_isa_devs);
Alan Cox25db8ad2008-08-19 20:49:40 -07003331unreg_uart_drv:
David Millerb70ac772008-10-13 10:36:31 +01003332#ifdef CONFIG_SPARC
3333 sunserial_unregister_minors(&serial8250_reg, UART_NR);
3334#else
Linus Torvalds1da177e2005-04-16 15:20:36 -07003335 uart_unregister_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003336#endif
Alan Cox25db8ad2008-08-19 20:49:40 -07003337out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07003338 return ret;
3339}
3340
3341static void __exit serial8250_exit(void)
3342{
3343 struct platform_device *isa_dev = serial8250_isa_devs;
3344
3345 /*
3346 * This tells serial8250_unregister_port() not to re-register
3347 * the ports (thereby making serial8250_isa_driver permanently
3348 * in use.)
3349 */
3350 serial8250_isa_devs = NULL;
3351
Russell King3ae5eae2005-11-09 22:32:44 +00003352 platform_driver_unregister(&serial8250_isa_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003353 platform_device_unregister(isa_dev);
3354
David Millerb70ac772008-10-13 10:36:31 +01003355#ifdef CONFIG_SPARC
3356 sunserial_unregister_minors(&serial8250_reg, UART_NR);
3357#else
Linus Torvalds1da177e2005-04-16 15:20:36 -07003358 uart_unregister_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003359#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003360}
3361
3362module_init(serial8250_init);
3363module_exit(serial8250_exit);
3364
3365EXPORT_SYMBOL(serial8250_suspend_port);
3366EXPORT_SYMBOL(serial8250_resume_port);
3367
3368MODULE_LICENSE("GPL");
Adrian Bunkd87a6d92008-07-16 21:53:31 +01003369MODULE_DESCRIPTION("Generic 8250/16x50 serial driver");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003370
3371module_param(share_irqs, uint, 0644);
3372MODULE_PARM_DESC(share_irqs, "Share IRQs with other non-8250/16x50 devices"
3373 " (unsafe)");
3374
Dave Jonesa61c2d72006-01-07 23:18:19 +00003375module_param(nr_uarts, uint, 0644);
3376MODULE_PARM_DESC(nr_uarts, "Maximum number of UARTs supported. (1-" __MODULE_STRING(CONFIG_SERIAL_8250_NR_UARTS) ")");
3377
Chuck Ebbertd41a4b52009-10-01 15:44:26 -07003378module_param(skip_txen_test, uint, 0644);
3379MODULE_PARM_DESC(skip_txen_test, "Skip checking for the TXEN bug at init time");
3380
Linus Torvalds1da177e2005-04-16 15:20:36 -07003381#ifdef CONFIG_SERIAL_8250_RSA
3382module_param_array(probe_rsa, ulong, &probe_rsa_count, 0444);
3383MODULE_PARM_DESC(probe_rsa, "Probe I/O ports for RSA");
3384#endif
3385MODULE_ALIAS_CHARDEV_MAJOR(TTY_MAJOR);