blob: 6e1958a325bd8b5512675dd52d399b32bf04803e [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 * Driver for 8250/16550-type serial ports
3 *
4 * Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
5 *
6 * Copyright (C) 2001 Russell King.
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070013 * A note about mapbase / membase
14 *
15 * mapbase is the physical address of the IO port.
16 * membase is an 'ioremapped' cookie.
17 */
Linus Torvalds1da177e2005-04-16 15:20:36 -070018
19#if defined(CONFIG_SERIAL_8250_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
20#define SUPPORT_SYSRQ
21#endif
22
23#include <linux/module.h>
24#include <linux/moduleparam.h>
25#include <linux/ioport.h>
26#include <linux/init.h>
27#include <linux/console.h>
28#include <linux/sysrq.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070029#include <linux/delay.h>
Russell Kingd052d1b2005-10-29 19:07:23 +010030#include <linux/platform_device.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include <linux/tty.h>
Daniel Drakecd3ecad2010-10-20 16:00:48 -070032#include <linux/ratelimit.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070033#include <linux/tty_flip.h>
34#include <linux/serial_reg.h>
35#include <linux/serial_core.h>
36#include <linux/serial.h>
37#include <linux/serial_8250.h>
Andrew Morton78512ec2005-11-07 00:59:13 -080038#include <linux/nmi.h>
Arjan van de Venf392ecf2006-01-12 18:44:32 +000039#include <linux/mutex.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090040#include <linux/slab.h>
Paul Gortmaker68163832012-02-09 18:48:19 -050041#ifdef CONFIG_SPARC
42#include <linux/sunserialcore.h>
43#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070044
45#include <asm/io.h>
46#include <asm/irq.h>
47
48#include "8250.h"
49
50/*
51 * Configuration:
Thomas Gleixner40663cc2006-07-01 19:29:43 -070052 * share_irqs - whether we pass IRQF_SHARED to request_irq(). This option
Linus Torvalds1da177e2005-04-16 15:20:36 -070053 * is unsafe when used on edge-triggered interrupts.
54 */
Adrian Bunk408b6642005-05-01 08:59:29 -070055static unsigned int share_irqs = SERIAL8250_SHARE_IRQS;
Linus Torvalds1da177e2005-04-16 15:20:36 -070056
Dave Jonesa61c2d72006-01-07 23:18:19 +000057static unsigned int nr_uarts = CONFIG_SERIAL_8250_RUNTIME_UARTS;
58
David S. Miller84408382008-10-13 10:45:26 +010059static struct uart_driver serial8250_reg;
60
61static int serial_index(struct uart_port *port)
62{
63 return (serial8250_reg.minor - 64) + port->line;
64}
65
Chuck Ebbertd41a4b52009-10-01 15:44:26 -070066static unsigned int skip_txen_test; /* force skip of txen test at init time */
67
Linus Torvalds1da177e2005-04-16 15:20:36 -070068/*
69 * Debugging.
70 */
71#if 0
72#define DEBUG_AUTOCONF(fmt...) printk(fmt)
73#else
74#define DEBUG_AUTOCONF(fmt...) do { } while (0)
75#endif
76
77#if 0
78#define DEBUG_INTR(fmt...) printk(fmt)
79#else
80#define DEBUG_INTR(fmt...) do { } while (0)
81#endif
82
Jiri Slabye7328ae2011-06-05 22:51:49 +020083#define PASS_LIMIT 512
Linus Torvalds1da177e2005-04-16 15:20:36 -070084
Dick Hollenbeckbca47612009-12-09 12:31:34 -080085#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
86
87
Linus Torvalds1da177e2005-04-16 15:20:36 -070088#ifdef CONFIG_SERIAL_8250_DETECT_IRQ
89#define CONFIG_SERIAL_DETECT_IRQ 1
90#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070091#ifdef CONFIG_SERIAL_8250_MANY_PORTS
92#define CONFIG_SERIAL_MANY_PORTS 1
93#endif
94
95/*
96 * HUB6 is always on. This will be removed once the header
97 * files have been cleaned.
98 */
99#define CONFIG_HUB6 1
100
Bryan Wua4ed1e42008-05-31 16:10:04 +0800101#include <asm/serial.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102/*
103 * SERIAL_PORT_DFNS tells us about built-in ports that have no
104 * standard enumeration mechanism. Platforms that can find all
105 * serial ports via mechanisms like ACPI or PCI need not supply it.
106 */
107#ifndef SERIAL_PORT_DFNS
108#define SERIAL_PORT_DFNS
109#endif
110
Arjan van de Vencb3592b2005-11-28 21:04:11 +0000111static const struct old_serial_port old_serial_port[] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112 SERIAL_PORT_DFNS /* defined in asm/serial.h */
113};
114
Russell King026d02a2005-06-29 18:45:19 +0100115#define UART_NR CONFIG_SERIAL_8250_NR_UARTS
Linus Torvalds1da177e2005-04-16 15:20:36 -0700116
117#ifdef CONFIG_SERIAL_8250_RSA
118
119#define PORT_RSA_MAX 4
120static unsigned long probe_rsa[PORT_RSA_MAX];
121static unsigned int probe_rsa_count;
122#endif /* CONFIG_SERIAL_8250_RSA */
123
Linus Torvalds1da177e2005-04-16 15:20:36 -0700124struct irq_info {
Alan Cox25db8ad2008-08-19 20:49:40 -0700125 struct hlist_node node;
126 int irq;
127 spinlock_t lock; /* Protects list not the hash */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700128 struct list_head *head;
129};
130
Alan Cox25db8ad2008-08-19 20:49:40 -0700131#define NR_IRQ_HASH 32 /* Can be adjusted later */
132static struct hlist_head irq_lists[NR_IRQ_HASH];
133static DEFINE_MUTEX(hash_mutex); /* Used to walk the hash */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700134
135/*
136 * Here we define the default xmit fifo size used for each type of UART.
137 */
138static const struct serial8250_config uart_config[] = {
139 [PORT_UNKNOWN] = {
140 .name = "unknown",
141 .fifo_size = 1,
142 .tx_loadsz = 1,
143 },
144 [PORT_8250] = {
145 .name = "8250",
146 .fifo_size = 1,
147 .tx_loadsz = 1,
148 },
149 [PORT_16450] = {
150 .name = "16450",
151 .fifo_size = 1,
152 .tx_loadsz = 1,
153 },
154 [PORT_16550] = {
155 .name = "16550",
156 .fifo_size = 1,
157 .tx_loadsz = 1,
158 },
159 [PORT_16550A] = {
160 .name = "16550A",
161 .fifo_size = 16,
162 .tx_loadsz = 16,
163 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
164 .flags = UART_CAP_FIFO,
165 },
166 [PORT_CIRRUS] = {
167 .name = "Cirrus",
168 .fifo_size = 1,
169 .tx_loadsz = 1,
170 },
171 [PORT_16650] = {
172 .name = "ST16650",
173 .fifo_size = 1,
174 .tx_loadsz = 1,
175 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
176 },
177 [PORT_16650V2] = {
178 .name = "ST16650V2",
179 .fifo_size = 32,
180 .tx_loadsz = 16,
181 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
182 UART_FCR_T_TRIG_00,
183 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
184 },
185 [PORT_16750] = {
186 .name = "TI16750",
187 .fifo_size = 64,
188 .tx_loadsz = 64,
189 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 |
190 UART_FCR7_64BYTE,
191 .flags = UART_CAP_FIFO | UART_CAP_SLEEP | UART_CAP_AFE,
192 },
193 [PORT_STARTECH] = {
194 .name = "Startech",
195 .fifo_size = 1,
196 .tx_loadsz = 1,
197 },
198 [PORT_16C950] = {
199 .name = "16C950/954",
200 .fifo_size = 128,
201 .tx_loadsz = 128,
202 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
Pavel Machekd0694e22011-01-09 08:38:48 +0100203 /* UART_CAP_EFR breaks billionon CF bluetooth card. */
204 .flags = UART_CAP_FIFO | UART_CAP_SLEEP,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700205 },
206 [PORT_16654] = {
207 .name = "ST16654",
208 .fifo_size = 64,
209 .tx_loadsz = 32,
210 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
211 UART_FCR_T_TRIG_10,
212 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
213 },
214 [PORT_16850] = {
215 .name = "XR16850",
216 .fifo_size = 128,
217 .tx_loadsz = 128,
218 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
219 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
220 },
221 [PORT_RSA] = {
222 .name = "RSA",
223 .fifo_size = 2048,
224 .tx_loadsz = 2048,
225 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_11,
226 .flags = UART_CAP_FIFO,
227 },
228 [PORT_NS16550A] = {
229 .name = "NS16550A",
230 .fifo_size = 16,
231 .tx_loadsz = 16,
232 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
233 .flags = UART_CAP_FIFO | UART_NATSEMI,
234 },
235 [PORT_XSCALE] = {
236 .name = "XScale",
237 .fifo_size = 32,
238 .tx_loadsz = 32,
239 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
Stephen Warren4539c242011-05-17 16:12:36 -0600240 .flags = UART_CAP_FIFO | UART_CAP_UUE | UART_CAP_RTOIE,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700241 },
Thomas Koellerbd71c182007-05-06 14:48:47 -0700242 [PORT_RM9000] = {
243 .name = "RM9000",
244 .fifo_size = 16,
245 .tx_loadsz = 16,
246 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
247 .flags = UART_CAP_FIFO,
248 },
David Daney6b06f192009-01-02 13:50:00 +0000249 [PORT_OCTEON] = {
250 .name = "OCTEON",
251 .fifo_size = 64,
252 .tx_loadsz = 64,
253 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
254 .flags = UART_CAP_FIFO,
255 },
Florian Fainelli08e09922009-06-11 13:21:24 +0100256 [PORT_AR7] = {
257 .name = "AR7",
258 .fifo_size = 16,
259 .tx_loadsz = 16,
260 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_00,
261 .flags = UART_CAP_FIFO | UART_CAP_AFE,
262 },
Philippe Langlais235dae52010-07-29 17:13:57 +0200263 [PORT_U6_16550A] = {
264 .name = "U6_16550A",
265 .fifo_size = 64,
266 .tx_loadsz = 64,
267 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
268 .flags = UART_CAP_FIFO | UART_CAP_AFE,
269 },
Stephen Warren4539c242011-05-17 16:12:36 -0600270 [PORT_TEGRA] = {
271 .name = "Tegra",
272 .fifo_size = 32,
273 .tx_loadsz = 8,
274 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
275 UART_FCR_T_TRIG_01,
276 .flags = UART_CAP_FIFO | UART_CAP_RTOIE,
277 },
Søren Holm06315342011-09-02 22:55:37 +0200278 [PORT_XR17D15X] = {
279 .name = "XR17D15X",
280 .fifo_size = 64,
281 .tx_loadsz = 64,
282 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
283 .flags = UART_CAP_FIFO | UART_CAP_AFE | UART_CAP_EFR,
284 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700285};
286
Magnus Dammcc419fa02012-05-02 21:46:51 +0900287/* Uart divisor latch read */
Magnus Damme8155622012-05-02 21:47:18 +0900288static int default_serial_dl_read(struct uart_8250_port *up)
Magnus Dammcc419fa02012-05-02 21:46:51 +0900289{
290 return serial_in(up, UART_DLL) | serial_in(up, UART_DLM) << 8;
291}
292
293/* Uart divisor latch write */
Magnus Damme8155622012-05-02 21:47:18 +0900294static void default_serial_dl_write(struct uart_8250_port *up, int value)
Magnus Dammcc419fa02012-05-02 21:46:51 +0900295{
296 serial_out(up, UART_DLL, value & 0xff);
297 serial_out(up, UART_DLM, value >> 8 & 0xff);
298}
299
Magnus Damm6b416032012-05-02 21:47:00 +0900300#ifdef CONFIG_MIPS_ALCHEMY
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000301
302/* Au1x00 UART hardware has a weird register layout */
303static const u8 au_io_in_map[] = {
304 [UART_RX] = 0,
305 [UART_IER] = 2,
306 [UART_IIR] = 3,
307 [UART_LCR] = 5,
308 [UART_MCR] = 6,
309 [UART_LSR] = 7,
310 [UART_MSR] = 8,
311};
312
313static const u8 au_io_out_map[] = {
314 [UART_TX] = 1,
315 [UART_IER] = 2,
316 [UART_FCR] = 4,
317 [UART_LCR] = 5,
318 [UART_MCR] = 6,
319};
320
Magnus Damm6b416032012-05-02 21:47:00 +0900321static unsigned int au_serial_in(struct uart_port *p, int offset)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000322{
Magnus Damm6b416032012-05-02 21:47:00 +0900323 offset = au_io_in_map[offset] << p->regshift;
324 return __raw_readl(p->membase + offset);
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000325}
326
Magnus Damm6b416032012-05-02 21:47:00 +0900327static void au_serial_out(struct uart_port *p, int offset, int value)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000328{
Magnus Damm6b416032012-05-02 21:47:00 +0900329 offset = au_io_out_map[offset] << p->regshift;
330 __raw_writel(value, p->membase + offset);
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000331}
332
Magnus Damm6b416032012-05-02 21:47:00 +0900333/* Au1x00 haven't got a standard divisor latch */
334static int au_serial_dl_read(struct uart_8250_port *up)
335{
336 return __raw_readl(up->port.membase + 0x28);
337}
338
339static void au_serial_dl_write(struct uart_8250_port *up, int value)
340{
341 __raw_writel(value, up->port.membase + 0x28);
342}
343
344#endif
345
Magnus Damm28bf4cf2012-05-02 21:47:09 +0900346#ifdef CONFIG_SERIAL_8250_RM9K
Thomas Koellerbd71c182007-05-06 14:48:47 -0700347
348static const u8
349 regmap_in[8] = {
350 [UART_RX] = 0x00,
351 [UART_IER] = 0x0c,
352 [UART_IIR] = 0x14,
353 [UART_LCR] = 0x1c,
354 [UART_MCR] = 0x20,
355 [UART_LSR] = 0x24,
356 [UART_MSR] = 0x28,
357 [UART_SCR] = 0x2c
358 },
359 regmap_out[8] = {
360 [UART_TX] = 0x04,
361 [UART_IER] = 0x0c,
362 [UART_FCR] = 0x18,
363 [UART_LCR] = 0x1c,
364 [UART_MCR] = 0x20,
365 [UART_LSR] = 0x24,
366 [UART_MSR] = 0x28,
367 [UART_SCR] = 0x2c
368 };
369
Magnus Damm28bf4cf2012-05-02 21:47:09 +0900370static unsigned int rm9k_serial_in(struct uart_port *p, int offset)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700371{
Magnus Damm28bf4cf2012-05-02 21:47:09 +0900372 offset = regmap_in[offset] << p->regshift;
373 return readl(p->membase + offset);
Thomas Koellerbd71c182007-05-06 14:48:47 -0700374}
375
Magnus Damm28bf4cf2012-05-02 21:47:09 +0900376static void rm9k_serial_out(struct uart_port *p, int offset, int value)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700377{
Magnus Damm28bf4cf2012-05-02 21:47:09 +0900378 offset = regmap_out[offset] << p->regshift;
379 writel(value, p->membase + offset);
Thomas Koellerbd71c182007-05-06 14:48:47 -0700380}
381
Magnus Damm28bf4cf2012-05-02 21:47:09 +0900382static int rm9k_serial_dl_read(struct uart_8250_port *up)
383{
384 return ((__raw_readl(up->port.membase + 0x10) << 8) |
385 (__raw_readl(up->port.membase + 0x08) & 0xff)) & 0xffff;
386}
387
388static void rm9k_serial_dl_write(struct uart_8250_port *up, int value)
389{
390 __raw_writel(value, up->port.membase + 0x08);
391 __raw_writel(value >> 8, up->port.membase + 0x10);
392}
393
394#endif
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000395
David Daney7d6a07d2009-01-02 13:49:47 +0000396static unsigned int hub6_serial_in(struct uart_port *p, int offset)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700397{
Magnus Damme8155622012-05-02 21:47:18 +0900398 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000399 outb(p->hub6 - 1 + offset, p->iobase);
400 return inb(p->iobase + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700401}
402
David Daney7d6a07d2009-01-02 13:49:47 +0000403static void hub6_serial_out(struct uart_port *p, int offset, int value)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700404{
Magnus Damme8155622012-05-02 21:47:18 +0900405 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000406 outb(p->hub6 - 1 + offset, p->iobase);
407 outb(value, p->iobase + 1);
408}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700409
David Daney7d6a07d2009-01-02 13:49:47 +0000410static unsigned int mem_serial_in(struct uart_port *p, int offset)
411{
Magnus Damme8155622012-05-02 21:47:18 +0900412 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000413 return readb(p->membase + offset);
414}
415
416static void mem_serial_out(struct uart_port *p, int offset, int value)
417{
Magnus Damme8155622012-05-02 21:47:18 +0900418 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000419 writeb(value, p->membase + offset);
420}
421
422static void mem32_serial_out(struct uart_port *p, int offset, int value)
423{
Magnus Damme8155622012-05-02 21:47:18 +0900424 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000425 writel(value, p->membase + offset);
426}
427
428static unsigned int mem32_serial_in(struct uart_port *p, int offset)
429{
Magnus Damme8155622012-05-02 21:47:18 +0900430 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000431 return readl(p->membase + offset);
432}
433
David Daney7d6a07d2009-01-02 13:49:47 +0000434static unsigned int io_serial_in(struct uart_port *p, int offset)
435{
Magnus Damme8155622012-05-02 21:47:18 +0900436 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000437 return inb(p->iobase + offset);
438}
439
440static void io_serial_out(struct uart_port *p, int offset, int value)
441{
Magnus Damme8155622012-05-02 21:47:18 +0900442 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000443 outb(value, p->iobase + offset);
444}
445
Jamie Iles583d28e2011-08-15 10:17:52 +0100446static int serial8250_default_handle_irq(struct uart_port *port);
447
David Daney7d6a07d2009-01-02 13:49:47 +0000448static void set_io_from_upio(struct uart_port *p)
449{
Jamie Iles49d57412010-12-01 23:39:35 +0000450 struct uart_8250_port *up =
451 container_of(p, struct uart_8250_port, port);
Magnus Dammcc419fa02012-05-02 21:46:51 +0900452
Magnus Damme8155622012-05-02 21:47:18 +0900453 up->dl_read = default_serial_dl_read;
454 up->dl_write = default_serial_dl_write;
Magnus Dammcc419fa02012-05-02 21:46:51 +0900455
David Daney7d6a07d2009-01-02 13:49:47 +0000456 switch (p->iotype) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700457 case UPIO_HUB6:
David Daney7d6a07d2009-01-02 13:49:47 +0000458 p->serial_in = hub6_serial_in;
459 p->serial_out = hub6_serial_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700460 break;
461
462 case UPIO_MEM:
David Daney7d6a07d2009-01-02 13:49:47 +0000463 p->serial_in = mem_serial_in;
464 p->serial_out = mem_serial_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700465 break;
466
467 case UPIO_MEM32:
David Daney7d6a07d2009-01-02 13:49:47 +0000468 p->serial_in = mem32_serial_in;
469 p->serial_out = mem32_serial_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700470 break;
471
Magnus Damm28bf4cf2012-05-02 21:47:09 +0900472#ifdef CONFIG_SERIAL_8250_RM9K
473 case UPIO_RM9000:
474 p->serial_in = rm9k_serial_in;
475 p->serial_out = rm9k_serial_out;
476 up->dl_read = rm9k_serial_dl_read;
477 up->dl_write = rm9k_serial_dl_write;
478 break;
479#endif
480
Magnus Damm6b416032012-05-02 21:47:00 +0900481#ifdef CONFIG_MIPS_ALCHEMY
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000482 case UPIO_AU:
David Daney7d6a07d2009-01-02 13:49:47 +0000483 p->serial_in = au_serial_in;
484 p->serial_out = au_serial_out;
Magnus Damm6b416032012-05-02 21:47:00 +0900485 up->dl_read = au_serial_dl_read;
486 up->dl_write = au_serial_dl_write;
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000487 break;
Magnus Damm6b416032012-05-02 21:47:00 +0900488#endif
Manuel Lauss12bf3f22010-07-15 21:45:05 +0200489
Linus Torvalds1da177e2005-04-16 15:20:36 -0700490 default:
David Daney7d6a07d2009-01-02 13:49:47 +0000491 p->serial_in = io_serial_in;
492 p->serial_out = io_serial_out;
493 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700494 }
Alan Coxb8e7e402009-05-28 14:01:35 +0100495 /* Remember loaded iotype */
496 up->cur_iotype = p->iotype;
Jamie Iles583d28e2011-08-15 10:17:52 +0100497 p->handle_irq = serial8250_default_handle_irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700498}
499
Alex Williamson40b36da2007-02-14 00:33:04 -0800500static void
Paul Gortmaker55e40162012-03-08 19:12:14 -0500501serial_port_out_sync(struct uart_port *p, int offset, int value)
Alex Williamson40b36da2007-02-14 00:33:04 -0800502{
David Daney7d6a07d2009-01-02 13:49:47 +0000503 switch (p->iotype) {
Alex Williamson40b36da2007-02-14 00:33:04 -0800504 case UPIO_MEM:
505 case UPIO_MEM32:
Alex Williamson40b36da2007-02-14 00:33:04 -0800506 case UPIO_AU:
David Daney7d6a07d2009-01-02 13:49:47 +0000507 p->serial_out(p, offset, value);
508 p->serial_in(p, UART_LCR); /* safe, no side-effects */
Alex Williamson40b36da2007-02-14 00:33:04 -0800509 break;
510 default:
David Daney7d6a07d2009-01-02 13:49:47 +0000511 p->serial_out(p, offset, value);
Alex Williamson40b36da2007-02-14 00:33:04 -0800512 }
513}
514
Linus Torvalds1da177e2005-04-16 15:20:36 -0700515/*
516 * For the 16C950
517 */
518static void serial_icr_write(struct uart_8250_port *up, int offset, int value)
519{
520 serial_out(up, UART_SCR, offset);
521 serial_out(up, UART_ICR, value);
522}
523
524static unsigned int serial_icr_read(struct uart_8250_port *up, int offset)
525{
526 unsigned int value;
527
528 serial_icr_write(up, UART_ACR, up->acr | UART_ACR_ICRRD);
529 serial_out(up, UART_SCR, offset);
530 value = serial_in(up, UART_ICR);
531 serial_icr_write(up, UART_ACR, up->acr);
532
533 return value;
534}
535
536/*
537 * FIFO support.
538 */
Will Newtonb5d674a2008-10-13 10:36:21 +0100539static void serial8250_clear_fifos(struct uart_8250_port *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700540{
541 if (p->capabilities & UART_CAP_FIFO) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500542 serial_out(p, UART_FCR, UART_FCR_ENABLE_FIFO);
543 serial_out(p, UART_FCR, UART_FCR_ENABLE_FIFO |
Linus Torvalds1da177e2005-04-16 15:20:36 -0700544 UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500545 serial_out(p, UART_FCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700546 }
547}
548
Sudhakar Mamillapalli0ad372b2012-04-10 14:10:58 -0700549void serial8250_clear_and_reinit_fifos(struct uart_8250_port *p)
550{
551 unsigned char fcr;
552
553 serial8250_clear_fifos(p);
554 fcr = uart_config[p->port.type].fcr;
555 serial_out(p, UART_FCR, fcr);
556}
557EXPORT_SYMBOL_GPL(serial8250_clear_and_reinit_fifos);
558
Linus Torvalds1da177e2005-04-16 15:20:36 -0700559/*
560 * IER sleep support. UARTs which have EFRs need the "extended
561 * capability" bit enabled. Note that on XR16C850s, we need to
562 * reset LCR to write to IER.
563 */
Will Newtonb5d674a2008-10-13 10:36:21 +0100564static void serial8250_set_sleep(struct uart_8250_port *p, int sleep)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700565{
566 if (p->capabilities & UART_CAP_SLEEP) {
567 if (p->capabilities & UART_CAP_EFR) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500568 serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B);
569 serial_out(p, UART_EFR, UART_EFR_ECB);
570 serial_out(p, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700571 }
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500572 serial_out(p, UART_IER, sleep ? UART_IERX_SLEEP : 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700573 if (p->capabilities & UART_CAP_EFR) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500574 serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B);
575 serial_out(p, UART_EFR, 0);
576 serial_out(p, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700577 }
578 }
579}
580
581#ifdef CONFIG_SERIAL_8250_RSA
582/*
583 * Attempts to turn on the RSA FIFO. Returns zero on failure.
584 * We set the port uart clock rate if we succeed.
585 */
586static int __enable_rsa(struct uart_8250_port *up)
587{
588 unsigned char mode;
589 int result;
590
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500591 mode = serial_in(up, UART_RSA_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700592 result = mode & UART_RSA_MSR_FIFO;
593
594 if (!result) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500595 serial_out(up, UART_RSA_MSR, mode | UART_RSA_MSR_FIFO);
596 mode = serial_in(up, UART_RSA_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700597 result = mode & UART_RSA_MSR_FIFO;
598 }
599
600 if (result)
601 up->port.uartclk = SERIAL_RSA_BAUD_BASE * 16;
602
603 return result;
604}
605
606static void enable_rsa(struct uart_8250_port *up)
607{
608 if (up->port.type == PORT_RSA) {
609 if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) {
610 spin_lock_irq(&up->port.lock);
611 __enable_rsa(up);
612 spin_unlock_irq(&up->port.lock);
613 }
614 if (up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16)
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500615 serial_out(up, UART_RSA_FRR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700616 }
617}
618
619/*
620 * Attempts to turn off the RSA FIFO. Returns zero on failure.
621 * It is unknown why interrupts were disabled in here. However,
622 * the caller is expected to preserve this behaviour by grabbing
623 * the spinlock before calling this function.
624 */
625static void disable_rsa(struct uart_8250_port *up)
626{
627 unsigned char mode;
628 int result;
629
630 if (up->port.type == PORT_RSA &&
631 up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) {
632 spin_lock_irq(&up->port.lock);
633
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500634 mode = serial_in(up, UART_RSA_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700635 result = !(mode & UART_RSA_MSR_FIFO);
636
637 if (!result) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500638 serial_out(up, UART_RSA_MSR, mode & ~UART_RSA_MSR_FIFO);
639 mode = serial_in(up, UART_RSA_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700640 result = !(mode & UART_RSA_MSR_FIFO);
641 }
642
643 if (result)
644 up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16;
645 spin_unlock_irq(&up->port.lock);
646 }
647}
648#endif /* CONFIG_SERIAL_8250_RSA */
649
650/*
651 * This is a quickie test to see how big the FIFO is.
652 * It doesn't work at all the time, more's the pity.
653 */
654static int size_fifo(struct uart_8250_port *up)
655{
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100656 unsigned char old_fcr, old_mcr, old_lcr;
657 unsigned short old_dl;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700658 int count;
659
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500660 old_lcr = serial_in(up, UART_LCR);
661 serial_out(up, UART_LCR, 0);
662 old_fcr = serial_in(up, UART_FCR);
663 old_mcr = serial_in(up, UART_MCR);
664 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO |
Linus Torvalds1da177e2005-04-16 15:20:36 -0700665 UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500666 serial_out(up, UART_MCR, UART_MCR_LOOP);
667 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100668 old_dl = serial_dl_read(up);
669 serial_dl_write(up, 0x0001);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500670 serial_out(up, UART_LCR, 0x03);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700671 for (count = 0; count < 256; count++)
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500672 serial_out(up, UART_TX, count);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700673 mdelay(20);/* FIXME - schedule_timeout */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500674 for (count = 0; (serial_in(up, UART_LSR) & UART_LSR_DR) &&
Linus Torvalds1da177e2005-04-16 15:20:36 -0700675 (count < 256); count++)
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500676 serial_in(up, UART_RX);
677 serial_out(up, UART_FCR, old_fcr);
678 serial_out(up, UART_MCR, old_mcr);
679 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100680 serial_dl_write(up, old_dl);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500681 serial_out(up, UART_LCR, old_lcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700682
683 return count;
684}
685
686/*
687 * Read UART ID using the divisor method - set DLL and DLM to zero
688 * and the revision will be in DLL and device type in DLM. We
689 * preserve the device state across this.
690 */
691static unsigned int autoconfig_read_divisor_id(struct uart_8250_port *p)
692{
693 unsigned char old_dll, old_dlm, old_lcr;
694 unsigned int id;
695
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500696 old_lcr = serial_in(p, UART_LCR);
697 serial_out(p, UART_LCR, UART_LCR_CONF_MODE_A);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700698
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500699 old_dll = serial_in(p, UART_DLL);
700 old_dlm = serial_in(p, UART_DLM);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700701
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500702 serial_out(p, UART_DLL, 0);
703 serial_out(p, UART_DLM, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700704
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500705 id = serial_in(p, UART_DLL) | serial_in(p, UART_DLM) << 8;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700706
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500707 serial_out(p, UART_DLL, old_dll);
708 serial_out(p, UART_DLM, old_dlm);
709 serial_out(p, UART_LCR, old_lcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700710
711 return id;
712}
713
714/*
715 * This is a helper routine to autodetect StarTech/Exar/Oxsemi UART's.
716 * When this function is called we know it is at least a StarTech
717 * 16650 V2, but it might be one of several StarTech UARTs, or one of
718 * its clones. (We treat the broken original StarTech 16650 V1 as a
719 * 16550, and why not? Startech doesn't seem to even acknowledge its
720 * existence.)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700721 *
Linus Torvalds1da177e2005-04-16 15:20:36 -0700722 * What evil have men's minds wrought...
723 */
724static void autoconfig_has_efr(struct uart_8250_port *up)
725{
726 unsigned int id1, id2, id3, rev;
727
728 /*
729 * Everything with an EFR has SLEEP
730 */
731 up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP;
732
733 /*
734 * First we check to see if it's an Oxford Semiconductor UART.
735 *
736 * If we have to do this here because some non-National
737 * Semiconductor clone chips lock up if you try writing to the
738 * LSR register (which serial_icr_read does)
739 */
740
741 /*
742 * Check for Oxford Semiconductor 16C950.
743 *
744 * EFR [4] must be set else this test fails.
745 *
746 * This shouldn't be necessary, but Mike Hudson (Exoray@isys.ca)
747 * claims that it's needed for 952 dual UART's (which are not
748 * recommended for new designs).
749 */
750 up->acr = 0;
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -0800751 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700752 serial_out(up, UART_EFR, UART_EFR_ECB);
753 serial_out(up, UART_LCR, 0x00);
754 id1 = serial_icr_read(up, UART_ID1);
755 id2 = serial_icr_read(up, UART_ID2);
756 id3 = serial_icr_read(up, UART_ID3);
757 rev = serial_icr_read(up, UART_REV);
758
759 DEBUG_AUTOCONF("950id=%02x:%02x:%02x:%02x ", id1, id2, id3, rev);
760
761 if (id1 == 0x16 && id2 == 0xC9 &&
762 (id3 == 0x50 || id3 == 0x52 || id3 == 0x54)) {
763 up->port.type = PORT_16C950;
Russell King4ba5e352005-06-23 10:43:04 +0100764
765 /*
766 * Enable work around for the Oxford Semiconductor 952 rev B
767 * chip which causes it to seriously miscalculate baud rates
768 * when DLL is 0.
769 */
770 if (id3 == 0x52 && rev == 0x01)
771 up->bugs |= UART_BUG_QUOT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700772 return;
773 }
Thomas Koellerbd71c182007-05-06 14:48:47 -0700774
Linus Torvalds1da177e2005-04-16 15:20:36 -0700775 /*
776 * We check for a XR16C850 by setting DLL and DLM to 0, and then
777 * reading back DLL and DLM. The chip type depends on the DLM
778 * value read back:
779 * 0x10 - XR16C850 and the DLL contains the chip revision.
780 * 0x12 - XR16C2850.
781 * 0x14 - XR16C854.
782 */
783 id1 = autoconfig_read_divisor_id(up);
784 DEBUG_AUTOCONF("850id=%04x ", id1);
785
786 id2 = id1 >> 8;
787 if (id2 == 0x10 || id2 == 0x12 || id2 == 0x14) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700788 up->port.type = PORT_16850;
789 return;
790 }
791
792 /*
793 * It wasn't an XR16C850.
794 *
795 * We distinguish between the '654 and the '650 by counting
796 * how many bytes are in the FIFO. I'm using this for now,
797 * since that's the technique that was sent to me in the
798 * serial driver update, but I'm not convinced this works.
799 * I've had problems doing this in the past. -TYT
800 */
801 if (size_fifo(up) == 64)
802 up->port.type = PORT_16654;
803 else
804 up->port.type = PORT_16650V2;
805}
806
807/*
808 * We detected a chip without a FIFO. Only two fall into
809 * this category - the original 8250 and the 16450. The
810 * 16450 has a scratch register (accessible with LCR=0)
811 */
812static void autoconfig_8250(struct uart_8250_port *up)
813{
814 unsigned char scratch, status1, status2;
815
816 up->port.type = PORT_8250;
817
818 scratch = serial_in(up, UART_SCR);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500819 serial_out(up, UART_SCR, 0xa5);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700820 status1 = serial_in(up, UART_SCR);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500821 serial_out(up, UART_SCR, 0x5a);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700822 status2 = serial_in(up, UART_SCR);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500823 serial_out(up, UART_SCR, scratch);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700824
825 if (status1 == 0xa5 && status2 == 0x5a)
826 up->port.type = PORT_16450;
827}
828
829static int broken_efr(struct uart_8250_port *up)
830{
831 /*
832 * Exar ST16C2550 "A2" devices incorrectly detect as
833 * having an EFR, and report an ID of 0x0201. See
Justin P. Mattock631dd1a2010-10-18 11:03:14 +0200834 * http://linux.derkeiler.com/Mailing-Lists/Kernel/2004-11/4812.html
Linus Torvalds1da177e2005-04-16 15:20:36 -0700835 */
836 if (autoconfig_read_divisor_id(up) == 0x0201 && size_fifo(up) == 16)
837 return 1;
838
839 return 0;
840}
841
Yin Kangkai0d0389e2011-02-09 11:35:18 +0800842static inline int ns16550a_goto_highspeed(struct uart_8250_port *up)
843{
844 unsigned char status;
845
846 status = serial_in(up, 0x04); /* EXCR2 */
847#define PRESL(x) ((x) & 0x30)
848 if (PRESL(status) == 0x10) {
849 /* already in high speed mode */
850 return 0;
851 } else {
852 status &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */
853 status |= 0x10; /* 1.625 divisor for baud_base --> 921600 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500854 serial_out(up, 0x04, status);
Yin Kangkai0d0389e2011-02-09 11:35:18 +0800855 }
856 return 1;
857}
858
Linus Torvalds1da177e2005-04-16 15:20:36 -0700859/*
860 * We know that the chip has FIFOs. Does it have an EFR? The
861 * EFR is located in the same register position as the IIR and
862 * we know the top two bits of the IIR are currently set. The
863 * EFR should contain zero. Try to read the EFR.
864 */
865static void autoconfig_16550a(struct uart_8250_port *up)
866{
867 unsigned char status1, status2;
868 unsigned int iersave;
869
870 up->port.type = PORT_16550A;
871 up->capabilities |= UART_CAP_FIFO;
872
873 /*
874 * Check for presence of the EFR when DLAB is set.
875 * Only ST16C650V1 UARTs pass this test.
876 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500877 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700878 if (serial_in(up, UART_EFR) == 0) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500879 serial_out(up, UART_EFR, 0xA8);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700880 if (serial_in(up, UART_EFR) != 0) {
881 DEBUG_AUTOCONF("EFRv1 ");
882 up->port.type = PORT_16650;
883 up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP;
884 } else {
885 DEBUG_AUTOCONF("Motorola 8xxx DUART ");
886 }
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500887 serial_out(up, UART_EFR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700888 return;
889 }
890
891 /*
892 * Maybe it requires 0xbf to be written to the LCR.
893 * (other ST16C650V2 UARTs, TI16C752A, etc)
894 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500895 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700896 if (serial_in(up, UART_EFR) == 0 && !broken_efr(up)) {
897 DEBUG_AUTOCONF("EFRv2 ");
898 autoconfig_has_efr(up);
899 return;
900 }
901
902 /*
903 * Check for a National Semiconductor SuperIO chip.
904 * Attempt to switch to bank 2, read the value of the LOOP bit
905 * from EXCR1. Switch back to bank 0, change it in MCR. Then
906 * switch back to bank 2, read it from EXCR1 again and check
907 * it's changed. If so, set baud_base in EXCR2 to 921600. -- dwmw2
Linus Torvalds1da177e2005-04-16 15:20:36 -0700908 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500909 serial_out(up, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700910 status1 = serial_in(up, UART_MCR);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500911 serial_out(up, UART_LCR, 0xE0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700912 status2 = serial_in(up, 0x02); /* EXCR1 */
913
914 if (!((status2 ^ status1) & UART_MCR_LOOP)) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500915 serial_out(up, UART_LCR, 0);
916 serial_out(up, UART_MCR, status1 ^ UART_MCR_LOOP);
917 serial_out(up, UART_LCR, 0xE0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700918 status2 = serial_in(up, 0x02); /* EXCR1 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500919 serial_out(up, UART_LCR, 0);
920 serial_out(up, UART_MCR, status1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700921
922 if ((status2 ^ status1) & UART_MCR_LOOP) {
David Woodhouse857dde22005-05-21 15:52:23 +0100923 unsigned short quot;
924
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500925 serial_out(up, UART_LCR, 0xE0);
David Woodhouse857dde22005-05-21 15:52:23 +0100926
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100927 quot = serial_dl_read(up);
David Woodhouse857dde22005-05-21 15:52:23 +0100928 quot <<= 3;
929
Yin Kangkai0d0389e2011-02-09 11:35:18 +0800930 if (ns16550a_goto_highspeed(up))
931 serial_dl_write(up, quot);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700932
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500933 serial_out(up, UART_LCR, 0);
David Woodhouse857dde22005-05-21 15:52:23 +0100934
935 up->port.uartclk = 921600*16;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700936 up->port.type = PORT_NS16550A;
937 up->capabilities |= UART_NATSEMI;
938 return;
939 }
940 }
941
942 /*
943 * No EFR. Try to detect a TI16750, which only sets bit 5 of
944 * the IIR when 64 byte FIFO mode is enabled when DLAB is set.
945 * Try setting it with and without DLAB set. Cheap clones
946 * set bit 5 without DLAB set.
947 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500948 serial_out(up, UART_LCR, 0);
949 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700950 status1 = serial_in(up, UART_IIR) >> 5;
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500951 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
952 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
953 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700954 status2 = serial_in(up, UART_IIR) >> 5;
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500955 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
956 serial_out(up, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700957
958 DEBUG_AUTOCONF("iir1=%d iir2=%d ", status1, status2);
959
960 if (status1 == 6 && status2 == 7) {
961 up->port.type = PORT_16750;
962 up->capabilities |= UART_CAP_AFE | UART_CAP_SLEEP;
963 return;
964 }
965
966 /*
967 * Try writing and reading the UART_IER_UUE bit (b6).
968 * If it works, this is probably one of the Xscale platform's
969 * internal UARTs.
970 * We're going to explicitly set the UUE bit to 0 before
971 * trying to write and read a 1 just to make sure it's not
972 * already a 1 and maybe locked there before we even start start.
973 */
974 iersave = serial_in(up, UART_IER);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500975 serial_out(up, UART_IER, iersave & ~UART_IER_UUE);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700976 if (!(serial_in(up, UART_IER) & UART_IER_UUE)) {
977 /*
978 * OK it's in a known zero state, try writing and reading
979 * without disturbing the current state of the other bits.
980 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500981 serial_out(up, UART_IER, iersave | UART_IER_UUE);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700982 if (serial_in(up, UART_IER) & UART_IER_UUE) {
983 /*
984 * It's an Xscale.
985 * We'll leave the UART_IER_UUE bit set to 1 (enabled).
986 */
987 DEBUG_AUTOCONF("Xscale ");
988 up->port.type = PORT_XSCALE;
Stephen Warren55681812011-06-17 09:45:07 -0600989 up->capabilities |= UART_CAP_UUE | UART_CAP_RTOIE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700990 return;
991 }
992 } else {
993 /*
994 * If we got here we couldn't force the IER_UUE bit to 0.
995 * Log it and continue.
996 */
997 DEBUG_AUTOCONF("Couldn't force IER_UUE to 0 ");
998 }
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500999 serial_out(up, UART_IER, iersave);
Philippe Langlais235dae52010-07-29 17:13:57 +02001000
1001 /*
Søren Holm06315342011-09-02 22:55:37 +02001002 * Exar uarts have EFR in a weird location
1003 */
1004 if (up->port.flags & UPF_EXAR_EFR) {
1005 up->port.type = PORT_XR17D15X;
1006 up->capabilities |= UART_CAP_AFE | UART_CAP_EFR;
1007 }
1008
1009 /*
Philippe Langlais235dae52010-07-29 17:13:57 +02001010 * We distinguish between 16550A and U6 16550A by counting
1011 * how many bytes are in the FIFO.
1012 */
1013 if (up->port.type == PORT_16550A && size_fifo(up) == 64) {
1014 up->port.type = PORT_U6_16550A;
1015 up->capabilities |= UART_CAP_AFE;
1016 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001017}
1018
1019/*
1020 * This routine is called by rs_init() to initialize a specific serial
1021 * port. It determines what type of UART chip this serial port is
1022 * using: 8250, 16450, 16550, 16550A. The important question is
1023 * whether or not this UART is a 16550A or not, since this will
1024 * determine whether or not we can use its FIFO features or not.
1025 */
1026static void autoconfig(struct uart_8250_port *up, unsigned int probeflags)
1027{
1028 unsigned char status1, scratch, scratch2, scratch3;
1029 unsigned char save_lcr, save_mcr;
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001030 struct uart_port *port = &up->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001031 unsigned long flags;
1032
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001033 if (!port->iobase && !port->mapbase && !port->membase)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001034 return;
1035
Lennert Buytenhek80647b92009-11-11 14:26:41 -08001036 DEBUG_AUTOCONF("ttyS%d: autoconf (0x%04lx, 0x%p): ",
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001037 serial_index(port), port->iobase, port->membase);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001038
1039 /*
1040 * We really do need global IRQs disabled here - we're going to
1041 * be frobbing the chips IRQ enable register to see if it exists.
1042 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001043 spin_lock_irqsave(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001044
1045 up->capabilities = 0;
Russell King4ba5e352005-06-23 10:43:04 +01001046 up->bugs = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001047
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001048 if (!(port->flags & UPF_BUGGY_UART)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001049 /*
1050 * Do a simple existence test first; if we fail this,
1051 * there's no point trying anything else.
Thomas Koellerbd71c182007-05-06 14:48:47 -07001052 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001053 * 0x80 is used as a nonsense port to prevent against
1054 * false positives due to ISA bus float. The
1055 * assumption is that 0x80 is a non-existent port;
1056 * which should be safe since include/asm/io.h also
1057 * makes this assumption.
1058 *
1059 * Note: this is safe as long as MCR bit 4 is clear
1060 * and the device is in "PC" mode.
1061 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001062 scratch = serial_in(up, UART_IER);
1063 serial_out(up, UART_IER, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001064#ifdef __i386__
1065 outb(0xff, 0x080);
1066#endif
Thomas Hoehn48212002007-02-10 01:46:05 -08001067 /*
1068 * Mask out IER[7:4] bits for test as some UARTs (e.g. TL
1069 * 16C754B) allow only to modify them if an EFR bit is set.
1070 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001071 scratch2 = serial_in(up, UART_IER) & 0x0f;
1072 serial_out(up, UART_IER, 0x0F);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001073#ifdef __i386__
1074 outb(0, 0x080);
1075#endif
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001076 scratch3 = serial_in(up, UART_IER) & 0x0f;
1077 serial_out(up, UART_IER, scratch);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001078 if (scratch2 != 0 || scratch3 != 0x0F) {
1079 /*
1080 * We failed; there's nothing here
1081 */
1082 DEBUG_AUTOCONF("IER test failed (%02x, %02x) ",
1083 scratch2, scratch3);
1084 goto out;
1085 }
1086 }
1087
1088 save_mcr = serial_in(up, UART_MCR);
1089 save_lcr = serial_in(up, UART_LCR);
1090
Thomas Koellerbd71c182007-05-06 14:48:47 -07001091 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001092 * Check to see if a UART is really there. Certain broken
1093 * internal modems based on the Rockwell chipset fail this
1094 * test, because they apparently don't implement the loopback
1095 * test mode. So this test is skipped on the COM 1 through
1096 * COM 4 ports. This *should* be safe, since no board
1097 * manufacturer would be stupid enough to design a board
1098 * that conflicts with COM 1-4 --- we hope!
1099 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001100 if (!(port->flags & UPF_SKIP_TEST)) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001101 serial_out(up, UART_MCR, UART_MCR_LOOP | 0x0A);
1102 status1 = serial_in(up, UART_MSR) & 0xF0;
1103 serial_out(up, UART_MCR, save_mcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001104 if (status1 != 0x90) {
1105 DEBUG_AUTOCONF("LOOP test failed (%02x) ",
1106 status1);
1107 goto out;
1108 }
1109 }
1110
1111 /*
1112 * We're pretty sure there's a port here. Lets find out what
1113 * type of port it is. The IIR top two bits allows us to find
Russell King6f0d6182005-09-09 16:17:58 +01001114 * out if it's 8250 or 16450, 16550, 16550A or later. This
Linus Torvalds1da177e2005-04-16 15:20:36 -07001115 * determines what we test for next.
1116 *
1117 * We also initialise the EFR (if any) to zero for later. The
1118 * EFR occupies the same register location as the FCR and IIR.
1119 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001120 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
1121 serial_out(up, UART_EFR, 0);
1122 serial_out(up, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001123
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001124 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001125 scratch = serial_in(up, UART_IIR) >> 6;
1126
1127 DEBUG_AUTOCONF("iir=%d ", scratch);
1128
1129 switch (scratch) {
1130 case 0:
1131 autoconfig_8250(up);
1132 break;
1133 case 1:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001134 port->type = PORT_UNKNOWN;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001135 break;
1136 case 2:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001137 port->type = PORT_16550;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001138 break;
1139 case 3:
1140 autoconfig_16550a(up);
1141 break;
1142 }
1143
1144#ifdef CONFIG_SERIAL_8250_RSA
1145 /*
1146 * Only probe for RSA ports if we got the region.
1147 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001148 if (port->type == PORT_16550A && probeflags & PROBE_RSA) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001149 int i;
1150
1151 for (i = 0 ; i < probe_rsa_count; ++i) {
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001152 if (probe_rsa[i] == port->iobase && __enable_rsa(up)) {
1153 port->type = PORT_RSA;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001154 break;
1155 }
1156 }
1157 }
1158#endif
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00001159
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001160 serial_out(up, UART_LCR, save_lcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001161
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001162 if (up->capabilities != uart_config[port->type].flags) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163 printk(KERN_WARNING
1164 "ttyS%d: detected caps %08x should be %08x\n",
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001165 serial_index(port), up->capabilities,
1166 uart_config[port->type].flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001167 }
1168
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001169 port->fifosize = uart_config[up->port.type].fifo_size;
1170 up->capabilities = uart_config[port->type].flags;
1171 up->tx_loadsz = uart_config[port->type].tx_loadsz;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001172
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001173 if (port->type == PORT_UNKNOWN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001174 goto out;
1175
1176 /*
1177 * Reset the UART.
1178 */
1179#ifdef CONFIG_SERIAL_8250_RSA
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001180 if (port->type == PORT_RSA)
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001181 serial_out(up, UART_RSA_FRR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001182#endif
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001183 serial_out(up, UART_MCR, save_mcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001184 serial8250_clear_fifos(up);
Alex Williamson40b36da2007-02-14 00:33:04 -08001185 serial_in(up, UART_RX);
Lennert Buytenhek5c8c7552005-11-12 21:58:05 +00001186 if (up->capabilities & UART_CAP_UUE)
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001187 serial_out(up, UART_IER, UART_IER_UUE);
Lennert Buytenhek5c8c7552005-11-12 21:58:05 +00001188 else
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001189 serial_out(up, UART_IER, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001190
Thomas Koellerbd71c182007-05-06 14:48:47 -07001191 out:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001192 spin_unlock_irqrestore(&port->lock, flags);
1193 DEBUG_AUTOCONF("type=%s\n", uart_config[port->type].name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001194}
1195
1196static void autoconfig_irq(struct uart_8250_port *up)
1197{
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001198 struct uart_port *port = &up->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001199 unsigned char save_mcr, save_ier;
1200 unsigned char save_ICP = 0;
1201 unsigned int ICP = 0;
1202 unsigned long irqs;
1203 int irq;
1204
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001205 if (port->flags & UPF_FOURPORT) {
1206 ICP = (port->iobase & 0xfe0) | 0x1f;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001207 save_ICP = inb_p(ICP);
1208 outb_p(0x80, ICP);
Paul Gortmaker0d263a22012-03-08 19:12:10 -05001209 inb_p(ICP);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001210 }
1211
1212 /* forget possible initially masked and pending IRQ */
1213 probe_irq_off(probe_irq_on());
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001214 save_mcr = serial_in(up, UART_MCR);
1215 save_ier = serial_in(up, UART_IER);
1216 serial_out(up, UART_MCR, UART_MCR_OUT1 | UART_MCR_OUT2);
Thomas Koellerbd71c182007-05-06 14:48:47 -07001217
Linus Torvalds1da177e2005-04-16 15:20:36 -07001218 irqs = probe_irq_on();
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001219 serial_out(up, UART_MCR, 0);
Alan Cox6f803cd2008-02-08 04:18:52 -08001220 udelay(10);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001221 if (port->flags & UPF_FOURPORT) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001222 serial_out(up, UART_MCR,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001223 UART_MCR_DTR | UART_MCR_RTS);
1224 } else {
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001225 serial_out(up, UART_MCR,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001226 UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2);
1227 }
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001228 serial_out(up, UART_IER, 0x0f); /* enable all intrs */
Paul Gortmaker0d263a22012-03-08 19:12:10 -05001229 serial_in(up, UART_LSR);
1230 serial_in(up, UART_RX);
1231 serial_in(up, UART_IIR);
1232 serial_in(up, UART_MSR);
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001233 serial_out(up, UART_TX, 0xFF);
Alan Cox6f803cd2008-02-08 04:18:52 -08001234 udelay(20);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001235 irq = probe_irq_off(irqs);
1236
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001237 serial_out(up, UART_MCR, save_mcr);
1238 serial_out(up, UART_IER, save_ier);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001239
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001240 if (port->flags & UPF_FOURPORT)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001241 outb_p(save_ICP, ICP);
1242
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001243 port->irq = (irq > 0) ? irq : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001244}
1245
Russell Kinge763b902005-06-29 18:41:51 +01001246static inline void __stop_tx(struct uart_8250_port *p)
1247{
1248 if (p->ier & UART_IER_THRI) {
1249 p->ier &= ~UART_IER_THRI;
1250 serial_out(p, UART_IER, p->ier);
1251 }
1252}
1253
Russell Kingb129a8c2005-08-31 10:12:14 +01001254static void serial8250_stop_tx(struct uart_port *port)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001255{
Jamie Iles49d57412010-12-01 23:39:35 +00001256 struct uart_8250_port *up =
1257 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001258
Russell Kinge763b902005-06-29 18:41:51 +01001259 __stop_tx(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001260
1261 /*
Russell Kinge763b902005-06-29 18:41:51 +01001262 * We really want to stop the transmitter from sending.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001263 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001264 if (port->type == PORT_16C950) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001265 up->acr |= UART_ACR_TXDIS;
1266 serial_icr_write(up, UART_ACR, up->acr);
1267 }
1268}
1269
Russell Kingb129a8c2005-08-31 10:12:14 +01001270static void serial8250_start_tx(struct uart_port *port)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001271{
Jamie Iles49d57412010-12-01 23:39:35 +00001272 struct uart_8250_port *up =
1273 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001274
1275 if (!(up->ier & UART_IER_THRI)) {
1276 up->ier |= UART_IER_THRI;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001277 serial_port_out(port, UART_IER, up->ier);
Russell King55d3b282005-06-23 15:05:41 +01001278
Russell King67f76542005-06-23 22:26:43 +01001279 if (up->bugs & UART_BUG_TXEN) {
Ian Jackson68cb4f82009-11-18 11:08:11 +01001280 unsigned char lsr;
Russell King55d3b282005-06-23 15:05:41 +01001281 lsr = serial_in(up, UART_LSR);
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001282 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001283 if ((port->type == PORT_RM9000) ?
Ian Jackson68cb4f82009-11-18 11:08:11 +01001284 (lsr & UART_LSR_THRE) :
1285 (lsr & UART_LSR_TEMT))
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001286 serial8250_tx_chars(up);
Russell King55d3b282005-06-23 15:05:41 +01001287 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001288 }
Russell Kinge763b902005-06-29 18:41:51 +01001289
Linus Torvalds1da177e2005-04-16 15:20:36 -07001290 /*
Russell Kinge763b902005-06-29 18:41:51 +01001291 * Re-enable the transmitter if we disabled it.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001292 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001293 if (port->type == PORT_16C950 && up->acr & UART_ACR_TXDIS) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001294 up->acr &= ~UART_ACR_TXDIS;
1295 serial_icr_write(up, UART_ACR, up->acr);
1296 }
1297}
1298
1299static void serial8250_stop_rx(struct uart_port *port)
1300{
Jamie Iles49d57412010-12-01 23:39:35 +00001301 struct uart_8250_port *up =
1302 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001303
1304 up->ier &= ~UART_IER_RLSI;
1305 up->port.read_status_mask &= ~UART_LSR_DR;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001306 serial_port_out(port, UART_IER, up->ier);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001307}
1308
1309static void serial8250_enable_ms(struct uart_port *port)
1310{
Jamie Iles49d57412010-12-01 23:39:35 +00001311 struct uart_8250_port *up =
1312 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001313
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00001314 /* no MSR capabilities */
1315 if (up->bugs & UART_BUG_NOMSR)
1316 return;
1317
Linus Torvalds1da177e2005-04-16 15:20:36 -07001318 up->ier |= UART_IER_MSI;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001319 serial_port_out(port, UART_IER, up->ier);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001320}
1321
Stephen Warren5f873ba2011-05-17 16:12:37 -06001322/*
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001323 * serial8250_rx_chars: processes according to the passed in LSR
Paul Gortmaker0690f412011-12-04 18:42:19 -05001324 * value, and returns the remaining LSR bits not handled
1325 * by this Rx routine.
1326 */
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001327unsigned char
1328serial8250_rx_chars(struct uart_8250_port *up, unsigned char lsr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001329{
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001330 struct uart_port *port = &up->port;
1331 struct tty_struct *tty = port->state->port.tty;
Paul Gortmaker0690f412011-12-04 18:42:19 -05001332 unsigned char ch;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001333 int max_count = 256;
1334 char flag;
1335
1336 do {
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001337 if (likely(lsr & UART_LSR_DR))
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001338 ch = serial_in(up, UART_RX);
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001339 else
1340 /*
1341 * Intel 82571 has a Serial Over Lan device that will
1342 * set UART_LSR_BI without setting UART_LSR_DR when
1343 * it receives a break. To avoid reading from the
1344 * receive buffer without UART_LSR_DR bit set, we
1345 * just force the read character to be 0
1346 */
1347 ch = 0;
1348
Linus Torvalds1da177e2005-04-16 15:20:36 -07001349 flag = TTY_NORMAL;
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001350 port->icount.rx++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001351
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001352 lsr |= up->lsr_saved_flags;
1353 up->lsr_saved_flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001354
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001355 if (unlikely(lsr & UART_LSR_BRK_ERROR_BITS)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001356 if (lsr & UART_LSR_BI) {
1357 lsr &= ~(UART_LSR_FE | UART_LSR_PE);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001358 port->icount.brk++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001359 /*
1360 * We do the SysRQ and SAK checking
1361 * here because otherwise the break
1362 * may get masked by ignore_status_mask
1363 * or read_status_mask.
1364 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001365 if (uart_handle_break(port))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001366 goto ignore_char;
1367 } else if (lsr & UART_LSR_PE)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001368 port->icount.parity++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001369 else if (lsr & UART_LSR_FE)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001370 port->icount.frame++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001371 if (lsr & UART_LSR_OE)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001372 port->icount.overrun++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001373
1374 /*
Russell King23907eb2005-04-16 15:26:39 -07001375 * Mask off conditions which should be ignored.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001376 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001377 lsr &= port->read_status_mask;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001378
1379 if (lsr & UART_LSR_BI) {
1380 DEBUG_INTR("handling break....");
1381 flag = TTY_BREAK;
1382 } else if (lsr & UART_LSR_PE)
1383 flag = TTY_PARITY;
1384 else if (lsr & UART_LSR_FE)
1385 flag = TTY_FRAME;
1386 }
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001387 if (uart_handle_sysrq_char(port, ch))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001388 goto ignore_char;
Russell King05ab3012005-05-09 23:21:59 +01001389
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001390 uart_insert_char(port, lsr, UART_LSR_OE, ch, flag);
Russell King05ab3012005-05-09 23:21:59 +01001391
Alan Cox6f803cd2008-02-08 04:18:52 -08001392ignore_char:
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001393 lsr = serial_in(up, UART_LSR);
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001394 } while ((lsr & (UART_LSR_DR | UART_LSR_BI)) && (max_count-- > 0));
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001395 spin_unlock(&port->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001396 tty_flip_buffer_push(tty);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001397 spin_lock(&port->lock);
Paul Gortmaker0690f412011-12-04 18:42:19 -05001398 return lsr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001399}
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001400EXPORT_SYMBOL_GPL(serial8250_rx_chars);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001401
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001402void serial8250_tx_chars(struct uart_8250_port *up)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001403{
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001404 struct uart_port *port = &up->port;
1405 struct circ_buf *xmit = &port->state->xmit;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001406 int count;
1407
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001408 if (port->x_char) {
1409 serial_out(up, UART_TX, port->x_char);
1410 port->icount.tx++;
1411 port->x_char = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001412 return;
1413 }
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001414 if (uart_tx_stopped(port)) {
1415 serial8250_stop_tx(port);
Russell Kingb129a8c2005-08-31 10:12:14 +01001416 return;
1417 }
1418 if (uart_circ_empty(xmit)) {
Russell Kinge763b902005-06-29 18:41:51 +01001419 __stop_tx(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001420 return;
1421 }
1422
1423 count = up->tx_loadsz;
1424 do {
1425 serial_out(up, UART_TX, xmit->buf[xmit->tail]);
1426 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001427 port->icount.tx++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001428 if (uart_circ_empty(xmit))
1429 break;
1430 } while (--count > 0);
1431
1432 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001433 uart_write_wakeup(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001434
1435 DEBUG_INTR("THRE...");
1436
1437 if (uart_circ_empty(xmit))
Russell Kinge763b902005-06-29 18:41:51 +01001438 __stop_tx(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001439}
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001440EXPORT_SYMBOL_GPL(serial8250_tx_chars);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001441
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001442unsigned int serial8250_modem_status(struct uart_8250_port *up)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001443{
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001444 struct uart_port *port = &up->port;
Russell King2af7cd62006-01-04 16:55:09 +00001445 unsigned int status = serial_in(up, UART_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001446
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001447 status |= up->msr_saved_flags;
1448 up->msr_saved_flags = 0;
Taku Izumifdc30b32007-04-23 14:41:00 -07001449 if (status & UART_MSR_ANY_DELTA && up->ier & UART_IER_MSI &&
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001450 port->state != NULL) {
Russell King2af7cd62006-01-04 16:55:09 +00001451 if (status & UART_MSR_TERI)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001452 port->icount.rng++;
Russell King2af7cd62006-01-04 16:55:09 +00001453 if (status & UART_MSR_DDSR)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001454 port->icount.dsr++;
Russell King2af7cd62006-01-04 16:55:09 +00001455 if (status & UART_MSR_DDCD)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001456 uart_handle_dcd_change(port, status & UART_MSR_DCD);
Russell King2af7cd62006-01-04 16:55:09 +00001457 if (status & UART_MSR_DCTS)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001458 uart_handle_cts_change(port, status & UART_MSR_CTS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001459
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001460 wake_up_interruptible(&port->state->port.delta_msr_wait);
Russell King2af7cd62006-01-04 16:55:09 +00001461 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001462
Russell King2af7cd62006-01-04 16:55:09 +00001463 return status;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001464}
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001465EXPORT_SYMBOL_GPL(serial8250_modem_status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001466
1467/*
1468 * This handles the interrupt from one port.
1469 */
Paul Gortmaker86b21192011-12-04 18:42:22 -05001470int serial8250_handle_irq(struct uart_port *port, unsigned int iir)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001471{
Paul Gortmaker0690f412011-12-04 18:42:19 -05001472 unsigned char status;
Jiri Kosina4bf36312007-04-23 14:41:21 -07001473 unsigned long flags;
Paul Gortmaker86b21192011-12-04 18:42:22 -05001474 struct uart_8250_port *up =
1475 container_of(port, struct uart_8250_port, port);
1476
1477 if (iir & UART_IIR_NO_INT)
1478 return 0;
Russell King45e24602006-01-04 19:19:06 +00001479
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001480 spin_lock_irqsave(&port->lock, flags);
Russell King45e24602006-01-04 19:19:06 +00001481
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001482 status = serial_port_in(port, UART_LSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001483
1484 DEBUG_INTR("status = %x...", status);
1485
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001486 if (status & (UART_LSR_DR | UART_LSR_BI))
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001487 status = serial8250_rx_chars(up, status);
1488 serial8250_modem_status(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001489 if (status & UART_LSR_THRE)
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001490 serial8250_tx_chars(up);
Russell King45e24602006-01-04 19:19:06 +00001491
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001492 spin_unlock_irqrestore(&port->lock, flags);
Paul Gortmaker86b21192011-12-04 18:42:22 -05001493 return 1;
Jamie Iles583d28e2011-08-15 10:17:52 +01001494}
Jamie Ilesc7a1bdc2011-08-26 19:04:49 +01001495EXPORT_SYMBOL_GPL(serial8250_handle_irq);
Jamie Iles583d28e2011-08-15 10:17:52 +01001496
1497static int serial8250_default_handle_irq(struct uart_port *port)
1498{
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001499 unsigned int iir = serial_port_in(port, UART_IIR);
Jamie Iles583d28e2011-08-15 10:17:52 +01001500
1501 return serial8250_handle_irq(port, iir);
1502}
1503
Linus Torvalds1da177e2005-04-16 15:20:36 -07001504/*
1505 * This is the serial driver's interrupt routine.
1506 *
1507 * Arjan thinks the old way was overly complex, so it got simplified.
1508 * Alan disagrees, saying that need the complexity to handle the weird
1509 * nature of ISA shared interrupts. (This is a special exception.)
1510 *
1511 * In order to handle ISA shared interrupts properly, we need to check
1512 * that all ports have been serviced, and therefore the ISA interrupt
1513 * line has been de-asserted.
1514 *
1515 * This means we need to loop through all ports. checking that they
1516 * don't have an interrupt pending.
1517 */
David Howells7d12e782006-10-05 14:55:46 +01001518static irqreturn_t serial8250_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001519{
1520 struct irq_info *i = dev_id;
1521 struct list_head *l, *end = NULL;
1522 int pass_counter = 0, handled = 0;
1523
1524 DEBUG_INTR("serial8250_interrupt(%d)...", irq);
1525
1526 spin_lock(&i->lock);
1527
1528 l = i->head;
1529 do {
1530 struct uart_8250_port *up;
Jamie Iles583d28e2011-08-15 10:17:52 +01001531 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001532
1533 up = list_entry(l, struct uart_8250_port, list);
Jamie Iles583d28e2011-08-15 10:17:52 +01001534 port = &up->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001535
Dan Williams49b532f2012-04-06 11:49:44 -07001536 if (port->handle_irq(port)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001537 handled = 1;
Marc St-Jeanbeab6972007-05-06 14:48:45 -07001538 end = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001539 } else if (end == NULL)
1540 end = l;
1541
1542 l = l->next;
1543
1544 if (l == i->head && pass_counter++ > PASS_LIMIT) {
1545 /* If we hit this, we're dead. */
Daniel Drakecd3ecad2010-10-20 16:00:48 -07001546 printk_ratelimited(KERN_ERR
1547 "serial8250: too much work for irq%d\n", irq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001548 break;
1549 }
1550 } while (l != end);
1551
1552 spin_unlock(&i->lock);
1553
1554 DEBUG_INTR("end.\n");
1555
1556 return IRQ_RETVAL(handled);
1557}
1558
1559/*
1560 * To support ISA shared interrupts, we need to have one interrupt
1561 * handler that ensures that the IRQ line has been deasserted
1562 * before returning. Failing to do this will result in the IRQ
1563 * line being stuck active, and, since ISA irqs are edge triggered,
1564 * no more IRQs will be seen.
1565 */
1566static void serial_do_unlink(struct irq_info *i, struct uart_8250_port *up)
1567{
1568 spin_lock_irq(&i->lock);
1569
1570 if (!list_empty(i->head)) {
1571 if (i->head == &up->list)
1572 i->head = i->head->next;
1573 list_del(&up->list);
1574 } else {
1575 BUG_ON(i->head != &up->list);
1576 i->head = NULL;
1577 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001578 spin_unlock_irq(&i->lock);
Alan Cox25db8ad2008-08-19 20:49:40 -07001579 /* List empty so throw away the hash node */
1580 if (i->head == NULL) {
1581 hlist_del(&i->node);
1582 kfree(i);
1583 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001584}
1585
1586static int serial_link_irq_chain(struct uart_8250_port *up)
1587{
Alan Cox25db8ad2008-08-19 20:49:40 -07001588 struct hlist_head *h;
1589 struct hlist_node *n;
1590 struct irq_info *i;
Thomas Gleixner40663cc2006-07-01 19:29:43 -07001591 int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? IRQF_SHARED : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001592
Alan Cox25db8ad2008-08-19 20:49:40 -07001593 mutex_lock(&hash_mutex);
1594
1595 h = &irq_lists[up->port.irq % NR_IRQ_HASH];
1596
1597 hlist_for_each(n, h) {
1598 i = hlist_entry(n, struct irq_info, node);
1599 if (i->irq == up->port.irq)
1600 break;
1601 }
1602
1603 if (n == NULL) {
1604 i = kzalloc(sizeof(struct irq_info), GFP_KERNEL);
1605 if (i == NULL) {
1606 mutex_unlock(&hash_mutex);
1607 return -ENOMEM;
1608 }
1609 spin_lock_init(&i->lock);
1610 i->irq = up->port.irq;
1611 hlist_add_head(&i->node, h);
1612 }
1613 mutex_unlock(&hash_mutex);
1614
Linus Torvalds1da177e2005-04-16 15:20:36 -07001615 spin_lock_irq(&i->lock);
1616
1617 if (i->head) {
1618 list_add(&up->list, i->head);
1619 spin_unlock_irq(&i->lock);
1620
1621 ret = 0;
1622 } else {
1623 INIT_LIST_HEAD(&up->list);
1624 i->head = &up->list;
1625 spin_unlock_irq(&i->lock);
Vikram Pandita1c2f0492009-09-19 13:13:19 -07001626 irq_flags |= up->port.irqflags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001627 ret = request_irq(up->port.irq, serial8250_interrupt,
1628 irq_flags, "serial", i);
1629 if (ret < 0)
1630 serial_do_unlink(i, up);
1631 }
1632
1633 return ret;
1634}
1635
1636static void serial_unlink_irq_chain(struct uart_8250_port *up)
1637{
Alan Cox25db8ad2008-08-19 20:49:40 -07001638 struct irq_info *i;
1639 struct hlist_node *n;
1640 struct hlist_head *h;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001641
Alan Cox25db8ad2008-08-19 20:49:40 -07001642 mutex_lock(&hash_mutex);
1643
1644 h = &irq_lists[up->port.irq % NR_IRQ_HASH];
1645
1646 hlist_for_each(n, h) {
1647 i = hlist_entry(n, struct irq_info, node);
1648 if (i->irq == up->port.irq)
1649 break;
1650 }
1651
1652 BUG_ON(n == NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001653 BUG_ON(i->head == NULL);
1654
1655 if (list_empty(i->head))
1656 free_irq(up->port.irq, i);
1657
1658 serial_do_unlink(i, up);
Alan Cox25db8ad2008-08-19 20:49:40 -07001659 mutex_unlock(&hash_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001660}
1661
1662/*
1663 * This function is used to handle ports that do not have an
1664 * interrupt. This doesn't work very well for 16450's, but gives
1665 * barely passable results for a 16550A. (Although at the expense
1666 * of much CPU overhead).
1667 */
1668static void serial8250_timeout(unsigned long data)
1669{
1670 struct uart_8250_port *up = (struct uart_8250_port *)data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001671
Paul Gortmakera0431472011-12-04 18:42:21 -05001672 up->port.handle_irq(&up->port);
Anton Vorontsov54381062010-10-01 17:21:25 +04001673 mod_timer(&up->timer, jiffies + uart_poll_timeout(&up->port));
Alex Williamson40b36da2007-02-14 00:33:04 -08001674}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001675
Alex Williamson40b36da2007-02-14 00:33:04 -08001676static void serial8250_backup_timeout(unsigned long data)
1677{
1678 struct uart_8250_port *up = (struct uart_8250_port *)data;
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001679 unsigned int iir, ier = 0, lsr;
1680 unsigned long flags;
Alex Williamson40b36da2007-02-14 00:33:04 -08001681
Al Cooperdbb3b1c2011-07-25 16:19:52 -04001682 spin_lock_irqsave(&up->port.lock, flags);
1683
Alex Williamson40b36da2007-02-14 00:33:04 -08001684 /*
1685 * Must disable interrupts or else we risk racing with the interrupt
1686 * based handler.
1687 */
Alan Coxd4e33fa2012-01-26 17:44:09 +00001688 if (up->port.irq) {
Alex Williamson40b36da2007-02-14 00:33:04 -08001689 ier = serial_in(up, UART_IER);
1690 serial_out(up, UART_IER, 0);
1691 }
1692
1693 iir = serial_in(up, UART_IIR);
1694
1695 /*
1696 * This should be a safe test for anyone who doesn't trust the
1697 * IIR bits on their UART, but it's specifically designed for
1698 * the "Diva" UART used on the management processor on many HP
1699 * ia64 and parisc boxes.
1700 */
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001701 lsr = serial_in(up, UART_LSR);
1702 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
Alex Williamson40b36da2007-02-14 00:33:04 -08001703 if ((iir & UART_IIR_NO_INT) && (up->ier & UART_IER_THRI) &&
Alan Coxebd2c8f2009-09-19 13:13:28 -07001704 (!uart_circ_empty(&up->port.state->xmit) || up->port.x_char) &&
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001705 (lsr & UART_LSR_THRE)) {
Alex Williamson40b36da2007-02-14 00:33:04 -08001706 iir &= ~(UART_IIR_ID | UART_IIR_NO_INT);
1707 iir |= UART_IIR_THRI;
1708 }
1709
1710 if (!(iir & UART_IIR_NO_INT))
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001711 serial8250_tx_chars(up);
Alex Williamson40b36da2007-02-14 00:33:04 -08001712
Alan Coxd4e33fa2012-01-26 17:44:09 +00001713 if (up->port.irq)
Alex Williamson40b36da2007-02-14 00:33:04 -08001714 serial_out(up, UART_IER, ier);
1715
Al Cooperdbb3b1c2011-07-25 16:19:52 -04001716 spin_unlock_irqrestore(&up->port.lock, flags);
1717
Alex Williamson40b36da2007-02-14 00:33:04 -08001718 /* Standard timer interval plus 0.2s to keep the port running */
Alan Cox6f803cd2008-02-08 04:18:52 -08001719 mod_timer(&up->timer,
Anton Vorontsov54381062010-10-01 17:21:25 +04001720 jiffies + uart_poll_timeout(&up->port) + HZ / 5);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001721}
1722
1723static unsigned int serial8250_tx_empty(struct uart_port *port)
1724{
Jamie Iles49d57412010-12-01 23:39:35 +00001725 struct uart_8250_port *up =
1726 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001727 unsigned long flags;
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001728 unsigned int lsr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001729
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001730 spin_lock_irqsave(&port->lock, flags);
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001731 lsr = serial_port_in(port, UART_LSR);
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001732 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001733 spin_unlock_irqrestore(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001734
Dick Hollenbeckbca47612009-12-09 12:31:34 -08001735 return (lsr & BOTH_EMPTY) == BOTH_EMPTY ? TIOCSER_TEMT : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001736}
1737
1738static unsigned int serial8250_get_mctrl(struct uart_port *port)
1739{
Jamie Iles49d57412010-12-01 23:39:35 +00001740 struct uart_8250_port *up =
1741 container_of(port, struct uart_8250_port, port);
Russell King2af7cd62006-01-04 16:55:09 +00001742 unsigned int status;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001743 unsigned int ret;
1744
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001745 status = serial8250_modem_status(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001746
1747 ret = 0;
1748 if (status & UART_MSR_DCD)
1749 ret |= TIOCM_CAR;
1750 if (status & UART_MSR_RI)
1751 ret |= TIOCM_RNG;
1752 if (status & UART_MSR_DSR)
1753 ret |= TIOCM_DSR;
1754 if (status & UART_MSR_CTS)
1755 ret |= TIOCM_CTS;
1756 return ret;
1757}
1758
1759static void serial8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
1760{
Jamie Iles49d57412010-12-01 23:39:35 +00001761 struct uart_8250_port *up =
1762 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001763 unsigned char mcr = 0;
1764
1765 if (mctrl & TIOCM_RTS)
1766 mcr |= UART_MCR_RTS;
1767 if (mctrl & TIOCM_DTR)
1768 mcr |= UART_MCR_DTR;
1769 if (mctrl & TIOCM_OUT1)
1770 mcr |= UART_MCR_OUT1;
1771 if (mctrl & TIOCM_OUT2)
1772 mcr |= UART_MCR_OUT2;
1773 if (mctrl & TIOCM_LOOP)
1774 mcr |= UART_MCR_LOOP;
1775
1776 mcr = (mcr & up->mcr_mask) | up->mcr_force | up->mcr;
1777
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001778 serial_port_out(port, UART_MCR, mcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001779}
1780
1781static void serial8250_break_ctl(struct uart_port *port, int break_state)
1782{
Jamie Iles49d57412010-12-01 23:39:35 +00001783 struct uart_8250_port *up =
1784 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001785 unsigned long flags;
1786
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001787 spin_lock_irqsave(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001788 if (break_state == -1)
1789 up->lcr |= UART_LCR_SBC;
1790 else
1791 up->lcr &= ~UART_LCR_SBC;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001792 serial_port_out(port, UART_LCR, up->lcr);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001793 spin_unlock_irqrestore(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001794}
1795
Alex Williamson40b36da2007-02-14 00:33:04 -08001796/*
1797 * Wait for transmitter & holding register to empty
1798 */
Will Newtonb5d674a2008-10-13 10:36:21 +01001799static void wait_for_xmitr(struct uart_8250_port *up, int bits)
Alex Williamson40b36da2007-02-14 00:33:04 -08001800{
1801 unsigned int status, tmout = 10000;
1802
1803 /* Wait up to 10ms for the character(s) to be sent. */
David Daney97d303b2010-10-05 11:40:07 -07001804 for (;;) {
Alex Williamson40b36da2007-02-14 00:33:04 -08001805 status = serial_in(up, UART_LSR);
1806
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001807 up->lsr_saved_flags |= status & LSR_SAVE_FLAGS;
Alex Williamson40b36da2007-02-14 00:33:04 -08001808
David Daney97d303b2010-10-05 11:40:07 -07001809 if ((status & bits) == bits)
1810 break;
Alex Williamson40b36da2007-02-14 00:33:04 -08001811 if (--tmout == 0)
1812 break;
1813 udelay(1);
David Daney97d303b2010-10-05 11:40:07 -07001814 }
Alex Williamson40b36da2007-02-14 00:33:04 -08001815
1816 /* Wait up to 1s for flow control if necessary */
1817 if (up->port.flags & UPF_CONS_FLOW) {
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001818 unsigned int tmout;
1819 for (tmout = 1000000; tmout; tmout--) {
1820 unsigned int msr = serial_in(up, UART_MSR);
1821 up->msr_saved_flags |= msr & MSR_SAVE_FLAGS;
1822 if (msr & UART_MSR_CTS)
1823 break;
Alex Williamson40b36da2007-02-14 00:33:04 -08001824 udelay(1);
1825 touch_nmi_watchdog();
1826 }
1827 }
1828}
1829
Jason Wesself2d937f2008-04-17 20:05:37 +02001830#ifdef CONFIG_CONSOLE_POLL
1831/*
1832 * Console polling routines for writing and reading from the uart while
1833 * in an interrupt or debug context.
1834 */
1835
1836static int serial8250_get_poll_char(struct uart_port *port)
1837{
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001838 unsigned char lsr = serial_port_in(port, UART_LSR);
Jason Wesself2d937f2008-04-17 20:05:37 +02001839
Jason Wesself5316b42010-05-20 21:04:22 -05001840 if (!(lsr & UART_LSR_DR))
1841 return NO_POLL_CHAR;
Jason Wesself2d937f2008-04-17 20:05:37 +02001842
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001843 return serial_port_in(port, UART_RX);
Jason Wesself2d937f2008-04-17 20:05:37 +02001844}
1845
1846
1847static void serial8250_put_poll_char(struct uart_port *port,
1848 unsigned char c)
1849{
1850 unsigned int ier;
Jamie Iles49d57412010-12-01 23:39:35 +00001851 struct uart_8250_port *up =
1852 container_of(port, struct uart_8250_port, port);
Jason Wesself2d937f2008-04-17 20:05:37 +02001853
1854 /*
1855 * First save the IER then disable the interrupts
1856 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001857 ier = serial_port_in(port, UART_IER);
Jason Wesself2d937f2008-04-17 20:05:37 +02001858 if (up->capabilities & UART_CAP_UUE)
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001859 serial_port_out(port, UART_IER, UART_IER_UUE);
Jason Wesself2d937f2008-04-17 20:05:37 +02001860 else
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001861 serial_port_out(port, UART_IER, 0);
Jason Wesself2d937f2008-04-17 20:05:37 +02001862
1863 wait_for_xmitr(up, BOTH_EMPTY);
1864 /*
1865 * Send the character out.
1866 * If a LF, also do CR...
1867 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001868 serial_port_out(port, UART_TX, c);
Jason Wesself2d937f2008-04-17 20:05:37 +02001869 if (c == 10) {
1870 wait_for_xmitr(up, BOTH_EMPTY);
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001871 serial_port_out(port, UART_TX, 13);
Jason Wesself2d937f2008-04-17 20:05:37 +02001872 }
1873
1874 /*
1875 * Finally, wait for transmitter to become empty
1876 * and restore the IER
1877 */
1878 wait_for_xmitr(up, BOTH_EMPTY);
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001879 serial_port_out(port, UART_IER, ier);
Jason Wesself2d937f2008-04-17 20:05:37 +02001880}
1881
1882#endif /* CONFIG_CONSOLE_POLL */
1883
Linus Torvalds1da177e2005-04-16 15:20:36 -07001884static int serial8250_startup(struct uart_port *port)
1885{
Jamie Iles49d57412010-12-01 23:39:35 +00001886 struct uart_8250_port *up =
1887 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001888 unsigned long flags;
Russell King55d3b282005-06-23 15:05:41 +01001889 unsigned char lsr, iir;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001890 int retval;
1891
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001892 port->fifosize = uart_config[up->port.type].fifo_size;
Ondrej Puzmane4f05af2010-12-04 21:17:38 +01001893 up->tx_loadsz = uart_config[up->port.type].tx_loadsz;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001894 up->capabilities = uart_config[up->port.type].flags;
1895 up->mcr = 0;
1896
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001897 if (port->iotype != up->cur_iotype)
Alan Coxb8e7e402009-05-28 14:01:35 +01001898 set_io_from_upio(port);
1899
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001900 if (port->type == PORT_16C950) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001901 /* Wake up and initialize UART */
1902 up->acr = 0;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001903 serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B);
1904 serial_port_out(port, UART_EFR, UART_EFR_ECB);
1905 serial_port_out(port, UART_IER, 0);
1906 serial_port_out(port, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001907 serial_icr_write(up, UART_CSR, 0); /* Reset the UART */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001908 serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B);
1909 serial_port_out(port, UART_EFR, UART_EFR_ECB);
1910 serial_port_out(port, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001911 }
1912
1913#ifdef CONFIG_SERIAL_8250_RSA
1914 /*
1915 * If this is an RSA port, see if we can kick it up to the
1916 * higher speed clock.
1917 */
1918 enable_rsa(up);
1919#endif
1920
1921 /*
1922 * Clear the FIFO buffers and disable them.
Alexey Dobriyan7f927fc2006-03-28 01:56:53 -08001923 * (they will be reenabled in set_termios())
Linus Torvalds1da177e2005-04-16 15:20:36 -07001924 */
1925 serial8250_clear_fifos(up);
1926
1927 /*
1928 * Clear the interrupt registers.
1929 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001930 serial_port_in(port, UART_LSR);
1931 serial_port_in(port, UART_RX);
1932 serial_port_in(port, UART_IIR);
1933 serial_port_in(port, UART_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001934
1935 /*
1936 * At this point, there's no way the LSR could still be 0xff;
1937 * if it is, then bail out, because there's likely no UART
1938 * here.
1939 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001940 if (!(port->flags & UPF_BUGGY_UART) &&
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001941 (serial_port_in(port, UART_LSR) == 0xff)) {
Konrad Rzeszutek Wilk7808a4c2011-09-26 09:14:34 -04001942 printk_ratelimited(KERN_INFO "ttyS%d: LSR safety check engaged!\n",
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001943 serial_index(port));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001944 return -ENODEV;
1945 }
1946
1947 /*
1948 * For a XR16C850, we need to set the trigger levels
1949 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001950 if (port->type == PORT_16850) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001951 unsigned char fctr;
1952
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001953 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001954
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001955 fctr = serial_in(up, UART_FCTR) & ~(UART_FCTR_RX|UART_FCTR_TX);
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001956 serial_port_out(port, UART_FCTR,
1957 fctr | UART_FCTR_TRGD | UART_FCTR_RX);
1958 serial_port_out(port, UART_TRG, UART_TRG_96);
1959 serial_port_out(port, UART_FCTR,
1960 fctr | UART_FCTR_TRGD | UART_FCTR_TX);
1961 serial_port_out(port, UART_TRG, UART_TRG_96);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001962
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001963 serial_port_out(port, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001964 }
1965
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001966 if (port->irq) {
Alex Williamson01c194d2008-04-28 02:14:09 -07001967 unsigned char iir1;
Alex Williamson40b36da2007-02-14 00:33:04 -08001968 /*
1969 * Test for UARTs that do not reassert THRE when the
1970 * transmitter is idle and the interrupt has already
1971 * been cleared. Real 16550s should always reassert
1972 * this interrupt whenever the transmitter is idle and
1973 * the interrupt is enabled. Delays are necessary to
1974 * allow register changes to become visible.
1975 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001976 spin_lock_irqsave(&port->lock, flags);
Vikram Pandita1c2f0492009-09-19 13:13:19 -07001977 if (up->port.irqflags & IRQF_SHARED)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001978 disable_irq_nosync(port->irq);
Alex Williamson40b36da2007-02-14 00:33:04 -08001979
1980 wait_for_xmitr(up, UART_LSR_THRE);
Paul Gortmaker55e40162012-03-08 19:12:14 -05001981 serial_port_out_sync(port, UART_IER, UART_IER_THRI);
Alex Williamson40b36da2007-02-14 00:33:04 -08001982 udelay(1); /* allow THRE to set */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001983 iir1 = serial_port_in(port, UART_IIR);
1984 serial_port_out(port, UART_IER, 0);
Paul Gortmaker55e40162012-03-08 19:12:14 -05001985 serial_port_out_sync(port, UART_IER, UART_IER_THRI);
Alex Williamson40b36da2007-02-14 00:33:04 -08001986 udelay(1); /* allow a working UART time to re-assert THRE */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001987 iir = serial_port_in(port, UART_IIR);
1988 serial_port_out(port, UART_IER, 0);
Alex Williamson40b36da2007-02-14 00:33:04 -08001989
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001990 if (port->irqflags & IRQF_SHARED)
1991 enable_irq(port->irq);
1992 spin_unlock_irqrestore(&port->lock, flags);
Alex Williamson40b36da2007-02-14 00:33:04 -08001993
1994 /*
Dan Williamsbc02d152012-04-06 11:49:50 -07001995 * If the interrupt is not reasserted, or we otherwise
1996 * don't trust the iir, setup a timer to kick the UART
1997 * on a regular basis.
Alex Williamson40b36da2007-02-14 00:33:04 -08001998 */
Dan Williamsbc02d152012-04-06 11:49:50 -07001999 if ((!(iir1 & UART_IIR_NO_INT) && (iir & UART_IIR_NO_INT)) ||
2000 up->port.flags & UPF_BUG_THRE) {
Will Newton363f66f2008-09-02 14:35:44 -07002001 up->bugs |= UART_BUG_THRE;
David S. Miller84408382008-10-13 10:45:26 +01002002 pr_debug("ttyS%d - using backup timer\n",
2003 serial_index(port));
Alex Williamson40b36da2007-02-14 00:33:04 -08002004 }
2005 }
2006
Linus Torvalds1da177e2005-04-16 15:20:36 -07002007 /*
Will Newton363f66f2008-09-02 14:35:44 -07002008 * The above check will only give an accurate result the first time
2009 * the port is opened so this value needs to be preserved.
2010 */
2011 if (up->bugs & UART_BUG_THRE) {
2012 up->timer.function = serial8250_backup_timeout;
2013 up->timer.data = (unsigned long)up;
2014 mod_timer(&up->timer, jiffies +
Anton Vorontsov54381062010-10-01 17:21:25 +04002015 uart_poll_timeout(port) + HZ / 5);
Will Newton363f66f2008-09-02 14:35:44 -07002016 }
2017
2018 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002019 * If the "interrupt" for this port doesn't correspond with any
2020 * hardware interrupt, we use a timer-based system. The original
2021 * driver used to do this with IRQ0.
2022 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002023 if (!port->irq) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002024 up->timer.data = (unsigned long)up;
Anton Vorontsov54381062010-10-01 17:21:25 +04002025 mod_timer(&up->timer, jiffies + uart_poll_timeout(port));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002026 } else {
2027 retval = serial_link_irq_chain(up);
2028 if (retval)
2029 return retval;
2030 }
2031
2032 /*
2033 * Now, initialize the UART
2034 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002035 serial_port_out(port, UART_LCR, UART_LCR_WLEN8);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002036
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002037 spin_lock_irqsave(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002038 if (up->port.flags & UPF_FOURPORT) {
Alan Coxd4e33fa2012-01-26 17:44:09 +00002039 if (!up->port.irq)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002040 up->port.mctrl |= TIOCM_OUT1;
2041 } else
2042 /*
2043 * Most PC uarts need OUT2 raised to enable interrupts.
2044 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002045 if (port->irq)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002046 up->port.mctrl |= TIOCM_OUT2;
2047
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002048 serial8250_set_mctrl(port, port->mctrl);
Russell King55d3b282005-06-23 15:05:41 +01002049
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002050 /* Serial over Lan (SoL) hack:
2051 Intel 8257x Gigabit ethernet chips have a
2052 16550 emulation, to be used for Serial Over Lan.
2053 Those chips take a longer time than a normal
2054 serial device to signalize that a transmission
2055 data was queued. Due to that, the above test generally
2056 fails. One solution would be to delay the reading of
2057 iir. However, this is not reliable, since the timeout
2058 is variable. So, let's just don't test if we receive
2059 TX irq. This way, we'll never enable UART_BUG_TXEN.
2060 */
Chuck Ebbertd41a4b52009-10-01 15:44:26 -07002061 if (skip_txen_test || up->port.flags & UPF_NO_TXEN_TEST)
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002062 goto dont_test_tx_en;
2063
Russell King55d3b282005-06-23 15:05:41 +01002064 /*
2065 * Do a quick test to see if we receive an
2066 * interrupt when we enable the TX irq.
2067 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002068 serial_port_out(port, UART_IER, UART_IER_THRI);
2069 lsr = serial_port_in(port, UART_LSR);
2070 iir = serial_port_in(port, UART_IIR);
2071 serial_port_out(port, UART_IER, 0);
Russell King55d3b282005-06-23 15:05:41 +01002072
2073 if (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT) {
Russell King67f76542005-06-23 22:26:43 +01002074 if (!(up->bugs & UART_BUG_TXEN)) {
2075 up->bugs |= UART_BUG_TXEN;
Russell King55d3b282005-06-23 15:05:41 +01002076 pr_debug("ttyS%d - enabling bad tx status workarounds\n",
David S. Miller84408382008-10-13 10:45:26 +01002077 serial_index(port));
Russell King55d3b282005-06-23 15:05:41 +01002078 }
2079 } else {
Russell King67f76542005-06-23 22:26:43 +01002080 up->bugs &= ~UART_BUG_TXEN;
Russell King55d3b282005-06-23 15:05:41 +01002081 }
2082
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002083dont_test_tx_en:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002084 spin_unlock_irqrestore(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002085
2086 /*
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002087 * Clear the interrupt registers again for luck, and clear the
2088 * saved flags to avoid getting false values from polling
2089 * routines or the previous session.
2090 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002091 serial_port_in(port, UART_LSR);
2092 serial_port_in(port, UART_RX);
2093 serial_port_in(port, UART_IIR);
2094 serial_port_in(port, UART_MSR);
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002095 up->lsr_saved_flags = 0;
2096 up->msr_saved_flags = 0;
2097
2098 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002099 * Finally, enable interrupts. Note: Modem status interrupts
2100 * are set via set_termios(), which will be occurring imminently
2101 * anyway, so we don't enable them here.
2102 */
2103 up->ier = UART_IER_RLSI | UART_IER_RDI;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002104 serial_port_out(port, UART_IER, up->ier);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002105
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002106 if (port->flags & UPF_FOURPORT) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002107 unsigned int icp;
2108 /*
2109 * Enable interrupts on the AST Fourport board
2110 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002111 icp = (port->iobase & 0xfe0) | 0x01f;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002112 outb_p(0x80, icp);
Paul Gortmaker0d263a22012-03-08 19:12:10 -05002113 inb_p(icp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002114 }
2115
Linus Torvalds1da177e2005-04-16 15:20:36 -07002116 return 0;
2117}
2118
2119static void serial8250_shutdown(struct uart_port *port)
2120{
Jamie Iles49d57412010-12-01 23:39:35 +00002121 struct uart_8250_port *up =
2122 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002123 unsigned long flags;
2124
2125 /*
2126 * Disable interrupts from this port
2127 */
2128 up->ier = 0;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002129 serial_port_out(port, UART_IER, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002130
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002131 spin_lock_irqsave(&port->lock, flags);
2132 if (port->flags & UPF_FOURPORT) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002133 /* reset interrupts on the AST Fourport board */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002134 inb((port->iobase & 0xfe0) | 0x1f);
2135 port->mctrl |= TIOCM_OUT1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002136 } else
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002137 port->mctrl &= ~TIOCM_OUT2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002138
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002139 serial8250_set_mctrl(port, port->mctrl);
2140 spin_unlock_irqrestore(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002141
2142 /*
2143 * Disable break condition and FIFOs
2144 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002145 serial_port_out(port, UART_LCR,
2146 serial_port_in(port, UART_LCR) & ~UART_LCR_SBC);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002147 serial8250_clear_fifos(up);
2148
2149#ifdef CONFIG_SERIAL_8250_RSA
2150 /*
2151 * Reset the RSA board back to 115kbps compat mode.
2152 */
2153 disable_rsa(up);
2154#endif
2155
2156 /*
2157 * Read data port to reset things, and then unlink from
2158 * the IRQ chain.
2159 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002160 serial_port_in(port, UART_RX);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002161
Alex Williamson40b36da2007-02-14 00:33:04 -08002162 del_timer_sync(&up->timer);
2163 up->timer.function = serial8250_timeout;
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002164 if (port->irq)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002165 serial_unlink_irq_chain(up);
2166}
2167
2168static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud)
2169{
2170 unsigned int quot;
2171
2172 /*
2173 * Handle magic divisors for baud rates above baud_base on
2174 * SMSC SuperIO chips.
2175 */
2176 if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
2177 baud == (port->uartclk/4))
2178 quot = 0x8001;
2179 else if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
2180 baud == (port->uartclk/8))
2181 quot = 0x8002;
2182 else
2183 quot = uart_get_divisor(port, baud);
2184
2185 return quot;
2186}
2187
Philippe Langlais235dae52010-07-29 17:13:57 +02002188void
2189serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
2190 struct ktermios *old)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002191{
Jamie Iles49d57412010-12-01 23:39:35 +00002192 struct uart_8250_port *up =
2193 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002194 unsigned char cval, fcr = 0;
2195 unsigned long flags;
2196 unsigned int baud, quot;
2197
2198 switch (termios->c_cflag & CSIZE) {
2199 case CS5:
Russell King0a8b80c52005-06-24 19:48:22 +01002200 cval = UART_LCR_WLEN5;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002201 break;
2202 case CS6:
Russell King0a8b80c52005-06-24 19:48:22 +01002203 cval = UART_LCR_WLEN6;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002204 break;
2205 case CS7:
Russell King0a8b80c52005-06-24 19:48:22 +01002206 cval = UART_LCR_WLEN7;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002207 break;
2208 default:
2209 case CS8:
Russell King0a8b80c52005-06-24 19:48:22 +01002210 cval = UART_LCR_WLEN8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002211 break;
2212 }
2213
2214 if (termios->c_cflag & CSTOPB)
Russell King0a8b80c52005-06-24 19:48:22 +01002215 cval |= UART_LCR_STOP;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002216 if (termios->c_cflag & PARENB)
2217 cval |= UART_LCR_PARITY;
2218 if (!(termios->c_cflag & PARODD))
2219 cval |= UART_LCR_EPAR;
2220#ifdef CMSPAR
2221 if (termios->c_cflag & CMSPAR)
2222 cval |= UART_LCR_SPAR;
2223#endif
2224
2225 /*
2226 * Ask the core to calculate the divisor for us.
2227 */
Anton Vorontsov24d481e2009-09-19 13:13:20 -07002228 baud = uart_get_baud_rate(port, termios, old,
2229 port->uartclk / 16 / 0xffff,
2230 port->uartclk / 16);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002231 quot = serial8250_get_divisor(port, baud);
2232
2233 /*
Russell King4ba5e352005-06-23 10:43:04 +01002234 * Oxford Semi 952 rev B workaround
Linus Torvalds1da177e2005-04-16 15:20:36 -07002235 */
Russell King4ba5e352005-06-23 10:43:04 +01002236 if (up->bugs & UART_BUG_QUOT && (quot & 0xff) == 0)
Alan Cox3e8d4e22008-02-04 22:27:53 -08002237 quot++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002238
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002239 if (up->capabilities & UART_CAP_FIFO && port->fifosize > 1) {
Christian Melkif9a91112012-04-30 11:21:26 +02002240 fcr = uart_config[port->type].fcr;
2241 if (baud < 2400) {
2242 fcr &= ~UART_FCR_TRIGGER_MASK;
2243 fcr |= UART_FCR_TRIGGER_1;
2244 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002245 }
2246
2247 /*
2248 * MCR-based auto flow control. When AFE is enabled, RTS will be
2249 * deasserted when the receive FIFO contains more characters than
2250 * the trigger, or the MCR RTS bit is cleared. In the case where
2251 * the remote UART is not using CTS auto flow control, we must
2252 * have sufficient FIFO entries for the latency of the remote
2253 * UART to respond. IOW, at least 32 bytes of FIFO.
2254 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002255 if (up->capabilities & UART_CAP_AFE && port->fifosize >= 32) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002256 up->mcr &= ~UART_MCR_AFE;
2257 if (termios->c_cflag & CRTSCTS)
2258 up->mcr |= UART_MCR_AFE;
2259 }
2260
2261 /*
2262 * Ok, we're now changing the port state. Do it with
2263 * interrupts disabled.
2264 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002265 spin_lock_irqsave(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002266
2267 /*
2268 * Update the per-port timeout.
2269 */
2270 uart_update_timeout(port, termios->c_cflag, baud);
2271
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002272 port->read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002273 if (termios->c_iflag & INPCK)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002274 port->read_status_mask |= UART_LSR_FE | UART_LSR_PE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002275 if (termios->c_iflag & (BRKINT | PARMRK))
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002276 port->read_status_mask |= UART_LSR_BI;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002277
2278 /*
2279 * Characteres to ignore
2280 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002281 port->ignore_status_mask = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002282 if (termios->c_iflag & IGNPAR)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002283 port->ignore_status_mask |= UART_LSR_PE | UART_LSR_FE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002284 if (termios->c_iflag & IGNBRK) {
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002285 port->ignore_status_mask |= UART_LSR_BI;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002286 /*
2287 * If we're ignoring parity and break indicators,
2288 * ignore overruns too (for real raw support).
2289 */
2290 if (termios->c_iflag & IGNPAR)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002291 port->ignore_status_mask |= UART_LSR_OE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002292 }
2293
2294 /*
2295 * ignore all characters if CREAD is not set
2296 */
2297 if ((termios->c_cflag & CREAD) == 0)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002298 port->ignore_status_mask |= UART_LSR_DR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002299
2300 /*
2301 * CTS flow control flag and modem status interrupts
2302 */
Ingo Molnarf8b372a2010-11-13 16:21:58 +01002303 up->ier &= ~UART_IER_MSI;
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00002304 if (!(up->bugs & UART_BUG_NOMSR) &&
2305 UART_ENABLE_MS(&up->port, termios->c_cflag))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002306 up->ier |= UART_IER_MSI;
2307 if (up->capabilities & UART_CAP_UUE)
Stephen Warren4539c242011-05-17 16:12:36 -06002308 up->ier |= UART_IER_UUE;
2309 if (up->capabilities & UART_CAP_RTOIE)
2310 up->ier |= UART_IER_RTOIE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002311
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002312 serial_port_out(port, UART_IER, up->ier);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002313
2314 if (up->capabilities & UART_CAP_EFR) {
2315 unsigned char efr = 0;
2316 /*
2317 * TI16C752/Startech hardware flow control. FIXME:
2318 * - TI16C752 requires control thresholds to be set.
2319 * - UART_MCR_RTS is ineffective if auto-RTS mode is enabled.
2320 */
2321 if (termios->c_cflag & CRTSCTS)
2322 efr |= UART_EFR_CTS;
2323
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002324 serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002325 if (port->flags & UPF_EXAR_EFR)
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002326 serial_port_out(port, UART_XR_EFR, efr);
Søren Holm06315342011-09-02 22:55:37 +02002327 else
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002328 serial_port_out(port, UART_EFR, efr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002329 }
2330
Russell Kingf2eda272008-09-01 21:47:59 +01002331#ifdef CONFIG_ARCH_OMAP
Jonathan McDowell255341c2006-08-14 23:05:32 -07002332 /* Workaround to enable 115200 baud on OMAP1510 internal ports */
Russell King56685452008-09-01 21:25:33 +01002333 if (cpu_is_omap1510() && is_omap_port(up)) {
Jonathan McDowell255341c2006-08-14 23:05:32 -07002334 if (baud == 115200) {
2335 quot = 1;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002336 serial_port_out(port, UART_OMAP_OSC_12M_SEL, 1);
Jonathan McDowell255341c2006-08-14 23:05:32 -07002337 } else
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002338 serial_port_out(port, UART_OMAP_OSC_12M_SEL, 0);
Jonathan McDowell255341c2006-08-14 23:05:32 -07002339 }
2340#endif
2341
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002342 /*
2343 * For NatSemi, switch to bank 2 not bank 1, to avoid resetting EXCR2,
2344 * otherwise just set DLAB
2345 */
2346 if (up->capabilities & UART_NATSEMI)
2347 serial_port_out(port, UART_LCR, 0xe0);
2348 else
2349 serial_port_out(port, UART_LCR, cval | UART_LCR_DLAB);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002350
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +01002351 serial_dl_write(up, quot);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002352
2353 /*
2354 * LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR
2355 * is written without DLAB set, this mode will be disabled.
2356 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002357 if (port->type == PORT_16750)
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002358 serial_port_out(port, UART_FCR, fcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002359
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002360 serial_port_out(port, UART_LCR, cval); /* reset DLAB */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002361 up->lcr = cval; /* Save LCR */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002362 if (port->type != PORT_16750) {
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002363 /* emulated UARTs (Lucent Venus 167x) need two steps */
2364 if (fcr & UART_FCR_ENABLE_FIFO)
2365 serial_port_out(port, UART_FCR, UART_FCR_ENABLE_FIFO);
2366 serial_port_out(port, UART_FCR, fcr); /* set fcr */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002367 }
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002368 serial8250_set_mctrl(port, port->mctrl);
2369 spin_unlock_irqrestore(&port->lock, flags);
Alan Coxe991a2b2008-04-28 02:14:06 -07002370 /* Don't rewrite B0 */
2371 if (tty_termios_baud_rate(termios))
2372 tty_termios_encode_baud_rate(termios, baud, baud);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002373}
Philippe Langlais235dae52010-07-29 17:13:57 +02002374EXPORT_SYMBOL(serial8250_do_set_termios);
2375
2376static void
2377serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
2378 struct ktermios *old)
2379{
2380 if (port->set_termios)
2381 port->set_termios(port, termios, old);
2382 else
2383 serial8250_do_set_termios(port, termios, old);
2384}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002385
2386static void
Arnd Bergmanna0821df2010-06-01 22:53:11 +02002387serial8250_set_ldisc(struct uart_port *port, int new)
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002388{
Arnd Bergmanna0821df2010-06-01 22:53:11 +02002389 if (new == N_PPS) {
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002390 port->flags |= UPF_HARDPPS_CD;
2391 serial8250_enable_ms(port);
2392 } else
2393 port->flags &= ~UPF_HARDPPS_CD;
2394}
2395
Manuel Laussc161afe2010-09-25 15:13:45 +02002396
2397void serial8250_do_pm(struct uart_port *port, unsigned int state,
2398 unsigned int oldstate)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002399{
Jamie Iles49d57412010-12-01 23:39:35 +00002400 struct uart_8250_port *p =
2401 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002402
2403 serial8250_set_sleep(p, state != 0);
Manuel Laussc161afe2010-09-25 15:13:45 +02002404}
2405EXPORT_SYMBOL(serial8250_do_pm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002406
Manuel Laussc161afe2010-09-25 15:13:45 +02002407static void
2408serial8250_pm(struct uart_port *port, unsigned int state,
2409 unsigned int oldstate)
2410{
2411 if (port->pm)
2412 port->pm(port, state, oldstate);
2413 else
2414 serial8250_do_pm(port, state, oldstate);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002415}
2416
Russell Kingf2eda272008-09-01 21:47:59 +01002417static unsigned int serial8250_port_size(struct uart_8250_port *pt)
2418{
2419 if (pt->port.iotype == UPIO_AU)
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002420 return 0x1000;
Russell Kingf2eda272008-09-01 21:47:59 +01002421#ifdef CONFIG_ARCH_OMAP
2422 if (is_omap_port(pt))
2423 return 0x16 << pt->port.regshift;
2424#endif
2425 return 8 << pt->port.regshift;
2426}
2427
Linus Torvalds1da177e2005-04-16 15:20:36 -07002428/*
2429 * Resource handling.
2430 */
2431static int serial8250_request_std_resource(struct uart_8250_port *up)
2432{
Russell Kingf2eda272008-09-01 21:47:59 +01002433 unsigned int size = serial8250_port_size(up);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002434 struct uart_port *port = &up->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002435 int ret = 0;
2436
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002437 switch (port->iotype) {
Sergei Shtylyov85835f42006-04-30 11:15:58 +01002438 case UPIO_AU:
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002439 case UPIO_TSI:
2440 case UPIO_MEM32:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002441 case UPIO_MEM:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002442 if (!port->mapbase)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002443 break;
2444
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002445 if (!request_mem_region(port->mapbase, size, "serial")) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002446 ret = -EBUSY;
2447 break;
2448 }
2449
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002450 if (port->flags & UPF_IOREMAP) {
2451 port->membase = ioremap_nocache(port->mapbase, size);
2452 if (!port->membase) {
2453 release_mem_region(port->mapbase, size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002454 ret = -ENOMEM;
2455 }
2456 }
2457 break;
2458
2459 case UPIO_HUB6:
2460 case UPIO_PORT:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002461 if (!request_region(port->iobase, size, "serial"))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002462 ret = -EBUSY;
2463 break;
2464 }
2465 return ret;
2466}
2467
2468static void serial8250_release_std_resource(struct uart_8250_port *up)
2469{
Russell Kingf2eda272008-09-01 21:47:59 +01002470 unsigned int size = serial8250_port_size(up);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002471 struct uart_port *port = &up->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002472
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002473 switch (port->iotype) {
Sergei Shtylyov85835f42006-04-30 11:15:58 +01002474 case UPIO_AU:
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002475 case UPIO_TSI:
2476 case UPIO_MEM32:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002477 case UPIO_MEM:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002478 if (!port->mapbase)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002479 break;
2480
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002481 if (port->flags & UPF_IOREMAP) {
2482 iounmap(port->membase);
2483 port->membase = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002484 }
2485
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002486 release_mem_region(port->mapbase, size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002487 break;
2488
2489 case UPIO_HUB6:
2490 case UPIO_PORT:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002491 release_region(port->iobase, size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002492 break;
2493 }
2494}
2495
2496static int serial8250_request_rsa_resource(struct uart_8250_port *up)
2497{
2498 unsigned long start = UART_RSA_BASE << up->port.regshift;
2499 unsigned int size = 8 << up->port.regshift;
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002500 struct uart_port *port = &up->port;
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002501 int ret = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002502
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002503 switch (port->iotype) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002504 case UPIO_HUB6:
2505 case UPIO_PORT:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002506 start += port->iobase;
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002507 if (request_region(start, size, "serial-rsa"))
2508 ret = 0;
2509 else
Linus Torvalds1da177e2005-04-16 15:20:36 -07002510 ret = -EBUSY;
2511 break;
2512 }
2513
2514 return ret;
2515}
2516
2517static void serial8250_release_rsa_resource(struct uart_8250_port *up)
2518{
2519 unsigned long offset = UART_RSA_BASE << up->port.regshift;
2520 unsigned int size = 8 << up->port.regshift;
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002521 struct uart_port *port = &up->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002522
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002523 switch (port->iotype) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002524 case UPIO_HUB6:
2525 case UPIO_PORT:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002526 release_region(port->iobase + offset, size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002527 break;
2528 }
2529}
2530
2531static void serial8250_release_port(struct uart_port *port)
2532{
Jamie Iles49d57412010-12-01 23:39:35 +00002533 struct uart_8250_port *up =
2534 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002535
2536 serial8250_release_std_resource(up);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002537 if (port->type == PORT_RSA)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002538 serial8250_release_rsa_resource(up);
2539}
2540
2541static int serial8250_request_port(struct uart_port *port)
2542{
Jamie Iles49d57412010-12-01 23:39:35 +00002543 struct uart_8250_port *up =
2544 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002545 int ret = 0;
2546
2547 ret = serial8250_request_std_resource(up);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002548 if (ret == 0 && port->type == PORT_RSA) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002549 ret = serial8250_request_rsa_resource(up);
2550 if (ret < 0)
2551 serial8250_release_std_resource(up);
2552 }
2553
2554 return ret;
2555}
2556
2557static void serial8250_config_port(struct uart_port *port, int flags)
2558{
Jamie Iles49d57412010-12-01 23:39:35 +00002559 struct uart_8250_port *up =
2560 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002561 int probeflags = PROBE_ANY;
2562 int ret;
2563
2564 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002565 * Find the region that we can probe for. This in turn
2566 * tells us whether we can probe for the type of port.
2567 */
2568 ret = serial8250_request_std_resource(up);
2569 if (ret < 0)
2570 return;
2571
2572 ret = serial8250_request_rsa_resource(up);
2573 if (ret < 0)
2574 probeflags &= ~PROBE_RSA;
2575
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002576 if (port->iotype != up->cur_iotype)
Alan Coxb8e7e402009-05-28 14:01:35 +01002577 set_io_from_upio(port);
2578
Linus Torvalds1da177e2005-04-16 15:20:36 -07002579 if (flags & UART_CONFIG_TYPE)
2580 autoconfig(up, probeflags);
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002581
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002582 /* if access method is AU, it is a 16550 with a quirk */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002583 if (port->type == PORT_16550A && port->iotype == UPIO_AU)
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002584 up->bugs |= UART_BUG_NOMSR;
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002585
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002586 if (port->type != PORT_UNKNOWN && flags & UART_CONFIG_IRQ)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002587 autoconfig_irq(up);
2588
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002589 if (port->type != PORT_RSA && probeflags & PROBE_RSA)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002590 serial8250_release_rsa_resource(up);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002591 if (port->type == PORT_UNKNOWN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002592 serial8250_release_std_resource(up);
2593}
2594
2595static int
2596serial8250_verify_port(struct uart_port *port, struct serial_struct *ser)
2597{
Yinghai Lua62c4132008-08-19 20:49:55 -07002598 if (ser->irq >= nr_irqs || ser->irq < 0 ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07002599 ser->baud_base < 9600 || ser->type < PORT_UNKNOWN ||
2600 ser->type >= ARRAY_SIZE(uart_config) || ser->type == PORT_CIRRUS ||
2601 ser->type == PORT_STARTECH)
2602 return -EINVAL;
2603 return 0;
2604}
2605
2606static const char *
2607serial8250_type(struct uart_port *port)
2608{
2609 int type = port->type;
2610
2611 if (type >= ARRAY_SIZE(uart_config))
2612 type = 0;
2613 return uart_config[type].name;
2614}
2615
2616static struct uart_ops serial8250_pops = {
2617 .tx_empty = serial8250_tx_empty,
2618 .set_mctrl = serial8250_set_mctrl,
2619 .get_mctrl = serial8250_get_mctrl,
2620 .stop_tx = serial8250_stop_tx,
2621 .start_tx = serial8250_start_tx,
2622 .stop_rx = serial8250_stop_rx,
2623 .enable_ms = serial8250_enable_ms,
2624 .break_ctl = serial8250_break_ctl,
2625 .startup = serial8250_startup,
2626 .shutdown = serial8250_shutdown,
2627 .set_termios = serial8250_set_termios,
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002628 .set_ldisc = serial8250_set_ldisc,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002629 .pm = serial8250_pm,
2630 .type = serial8250_type,
2631 .release_port = serial8250_release_port,
2632 .request_port = serial8250_request_port,
2633 .config_port = serial8250_config_port,
2634 .verify_port = serial8250_verify_port,
Jason Wesself2d937f2008-04-17 20:05:37 +02002635#ifdef CONFIG_CONSOLE_POLL
2636 .poll_get_char = serial8250_get_poll_char,
2637 .poll_put_char = serial8250_put_poll_char,
2638#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07002639};
2640
2641static struct uart_8250_port serial8250_ports[UART_NR];
2642
Alan Coxaf7f3742010-10-18 11:38:02 -07002643static void (*serial8250_isa_config)(int port, struct uart_port *up,
2644 unsigned short *capabilities);
2645
2646void serial8250_set_isa_configurator(
2647 void (*v)(int port, struct uart_port *up, unsigned short *capabilities))
2648{
2649 serial8250_isa_config = v;
2650}
2651EXPORT_SYMBOL(serial8250_set_isa_configurator);
2652
Linus Torvalds1da177e2005-04-16 15:20:36 -07002653static void __init serial8250_isa_init_ports(void)
2654{
2655 struct uart_8250_port *up;
2656 static int first = 1;
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02002657 int i, irqflag = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002658
2659 if (!first)
2660 return;
2661 first = 0;
2662
Dave Jonesa61c2d72006-01-07 23:18:19 +00002663 for (i = 0; i < nr_uarts; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002664 struct uart_8250_port *up = &serial8250_ports[i];
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002665 struct uart_port *port = &up->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002666
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002667 port->line = i;
2668 spin_lock_init(&port->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002669
2670 init_timer(&up->timer);
2671 up->timer.function = serial8250_timeout;
2672
2673 /*
2674 * ALPHA_KLUDGE_MCR needs to be killed.
2675 */
2676 up->mcr_mask = ~ALPHA_KLUDGE_MCR;
2677 up->mcr_force = ALPHA_KLUDGE_MCR;
2678
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002679 port->ops = &serial8250_pops;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002680 }
2681
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02002682 if (share_irqs)
2683 irqflag = IRQF_SHARED;
2684
Russell King44454bc2005-06-30 22:41:22 +01002685 for (i = 0, up = serial8250_ports;
Dave Jonesa61c2d72006-01-07 23:18:19 +00002686 i < ARRAY_SIZE(old_serial_port) && i < nr_uarts;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002687 i++, up++) {
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002688 struct uart_port *port = &up->port;
2689
2690 port->iobase = old_serial_port[i].port;
2691 port->irq = irq_canonicalize(old_serial_port[i].irq);
2692 port->irqflags = old_serial_port[i].irqflags;
2693 port->uartclk = old_serial_port[i].baud_base * 16;
2694 port->flags = old_serial_port[i].flags;
2695 port->hub6 = old_serial_port[i].hub6;
2696 port->membase = old_serial_port[i].iomem_base;
2697 port->iotype = old_serial_port[i].io_type;
2698 port->regshift = old_serial_port[i].iomem_reg_shift;
2699 set_io_from_upio(port);
2700 port->irqflags |= irqflag;
Alan Coxaf7f3742010-10-18 11:38:02 -07002701 if (serial8250_isa_config != NULL)
2702 serial8250_isa_config(i, &up->port, &up->capabilities);
2703
Linus Torvalds1da177e2005-04-16 15:20:36 -07002704 }
2705}
2706
Shmulik Ladkanib5d228c2009-12-09 12:31:29 -08002707static void
2708serial8250_init_fixed_type_port(struct uart_8250_port *up, unsigned int type)
2709{
2710 up->port.type = type;
2711 up->port.fifosize = uart_config[type].fifo_size;
2712 up->capabilities = uart_config[type].flags;
2713 up->tx_loadsz = uart_config[type].tx_loadsz;
2714}
2715
Linus Torvalds1da177e2005-04-16 15:20:36 -07002716static void __init
2717serial8250_register_ports(struct uart_driver *drv, struct device *dev)
2718{
2719 int i;
2720
Alan Coxb8e7e402009-05-28 14:01:35 +01002721 for (i = 0; i < nr_uarts; i++) {
2722 struct uart_8250_port *up = &serial8250_ports[i];
2723 up->cur_iotype = 0xFF;
2724 }
2725
Linus Torvalds1da177e2005-04-16 15:20:36 -07002726 serial8250_isa_init_ports();
2727
Dave Jonesa61c2d72006-01-07 23:18:19 +00002728 for (i = 0; i < nr_uarts; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002729 struct uart_8250_port *up = &serial8250_ports[i];
2730
2731 up->port.dev = dev;
Shmulik Ladkanib5d228c2009-12-09 12:31:29 -08002732
2733 if (up->port.flags & UPF_FIXED_TYPE)
2734 serial8250_init_fixed_type_port(up, up->port.type);
2735
Linus Torvalds1da177e2005-04-16 15:20:36 -07002736 uart_add_one_port(drv, &up->port);
2737 }
2738}
2739
2740#ifdef CONFIG_SERIAL_8250_CONSOLE
2741
Russell Kingd3587882006-03-20 20:00:09 +00002742static void serial8250_console_putchar(struct uart_port *port, int ch)
2743{
Jamie Iles49d57412010-12-01 23:39:35 +00002744 struct uart_8250_port *up =
2745 container_of(port, struct uart_8250_port, port);
Russell Kingd3587882006-03-20 20:00:09 +00002746
2747 wait_for_xmitr(up, UART_LSR_THRE);
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002748 serial_port_out(port, UART_TX, ch);
Russell Kingd3587882006-03-20 20:00:09 +00002749}
2750
Linus Torvalds1da177e2005-04-16 15:20:36 -07002751/*
2752 * Print a string to the serial port trying not to disturb
2753 * any possible real use of the port...
2754 *
2755 * The console_lock must be held when we get here.
2756 */
2757static void
2758serial8250_console_write(struct console *co, const char *s, unsigned int count)
2759{
2760 struct uart_8250_port *up = &serial8250_ports[co->index];
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002761 struct uart_port *port = &up->port;
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002762 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002763 unsigned int ier;
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002764 int locked = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002765
Andrew Morton78512ec2005-11-07 00:59:13 -08002766 touch_nmi_watchdog();
2767
Andrew Morton68aa2c02006-06-30 02:29:59 -07002768 local_irq_save(flags);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002769 if (port->sysrq) {
Paul Gortmaker86b21192011-12-04 18:42:22 -05002770 /* serial8250_handle_irq() already took the lock */
Andrew Morton68aa2c02006-06-30 02:29:59 -07002771 locked = 0;
2772 } else if (oops_in_progress) {
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002773 locked = spin_trylock(&port->lock);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002774 } else
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002775 spin_lock(&port->lock);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002776
Linus Torvalds1da177e2005-04-16 15:20:36 -07002777 /*
Ralf Baechledc7bf132006-02-15 09:59:47 +00002778 * First save the IER then disable the interrupts
Linus Torvalds1da177e2005-04-16 15:20:36 -07002779 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002780 ier = serial_port_in(port, UART_IER);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002781
2782 if (up->capabilities & UART_CAP_UUE)
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002783 serial_port_out(port, UART_IER, UART_IER_UUE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002784 else
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002785 serial_port_out(port, UART_IER, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002786
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002787 uart_console_write(port, s, count, serial8250_console_putchar);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002788
2789 /*
2790 * Finally, wait for transmitter to become empty
2791 * and restore the IER
2792 */
Alan Coxf91a3712006-01-21 14:59:12 +00002793 wait_for_xmitr(up, BOTH_EMPTY);
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002794 serial_port_out(port, UART_IER, ier);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002795
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002796 /*
2797 * The receive handling will happen properly because the
2798 * receive ready bit will still be set; it is not cleared
2799 * on read. However, modem control will not, we must
2800 * call it if we have saved something in the saved flags
2801 * while processing with interrupts off.
2802 */
2803 if (up->msr_saved_flags)
Paul Gortmaker3986fb22011-12-04 18:42:20 -05002804 serial8250_modem_status(up);
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002805
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002806 if (locked)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002807 spin_unlock(&port->lock);
Andrew Morton68aa2c02006-06-30 02:29:59 -07002808 local_irq_restore(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002809}
2810
Vivek Goyal118c0ac2007-01-11 01:52:44 +01002811static int __init serial8250_console_setup(struct console *co, char *options)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002812{
2813 struct uart_port *port;
2814 int baud = 9600;
2815 int bits = 8;
2816 int parity = 'n';
2817 int flow = 'n';
2818
2819 /*
2820 * Check whether an invalid uart number has been specified, and
2821 * if so, search for the first available port that does have
2822 * console support.
2823 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00002824 if (co->index >= nr_uarts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002825 co->index = 0;
2826 port = &serial8250_ports[co->index].port;
2827 if (!port->iobase && !port->membase)
2828 return -ENODEV;
2829
2830 if (options)
2831 uart_parse_options(options, &baud, &parity, &bits, &flow);
2832
2833 return uart_set_options(port, co, baud, parity, bits, flow);
2834}
2835
Daniel Ritzb6b1d872007-08-03 16:07:43 +02002836static int serial8250_console_early_setup(void)
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002837{
2838 return serial8250_find_port_for_earlycon();
2839}
2840
Linus Torvalds1da177e2005-04-16 15:20:36 -07002841static struct console serial8250_console = {
2842 .name = "ttyS",
2843 .write = serial8250_console_write,
2844 .device = uart_console_device,
2845 .setup = serial8250_console_setup,
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002846 .early_setup = serial8250_console_early_setup,
Peter Zijlstraa80c49d2010-11-15 21:11:12 +01002847 .flags = CON_PRINTBUFFER | CON_ANYTIME,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002848 .index = -1,
2849 .data = &serial8250_reg,
2850};
2851
2852static int __init serial8250_console_init(void)
2853{
Eric W. Biederman05d81d22008-07-12 13:47:53 -07002854 if (nr_uarts > UART_NR)
2855 nr_uarts = UART_NR;
2856
Linus Torvalds1da177e2005-04-16 15:20:36 -07002857 serial8250_isa_init_ports();
2858 register_console(&serial8250_console);
2859 return 0;
2860}
2861console_initcall(serial8250_console_init);
2862
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002863int serial8250_find_port(struct uart_port *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002864{
2865 int line;
2866 struct uart_port *port;
2867
Dave Jonesa61c2d72006-01-07 23:18:19 +00002868 for (line = 0; line < nr_uarts; line++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002869 port = &serial8250_ports[line].port;
Russell King50aec3b52006-01-04 18:13:03 +00002870 if (uart_match_port(p, port))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002871 return line;
2872 }
2873 return -ENODEV;
2874}
2875
Linus Torvalds1da177e2005-04-16 15:20:36 -07002876#define SERIAL8250_CONSOLE &serial8250_console
2877#else
2878#define SERIAL8250_CONSOLE NULL
2879#endif
2880
2881static struct uart_driver serial8250_reg = {
2882 .owner = THIS_MODULE,
2883 .driver_name = "serial",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002884 .dev_name = "ttyS",
2885 .major = TTY_MAJOR,
2886 .minor = 64,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002887 .cons = SERIAL8250_CONSOLE,
2888};
2889
Russell Kingd856c662006-02-23 10:22:13 +00002890/*
2891 * early_serial_setup - early registration for 8250 ports
2892 *
2893 * Setup an 8250 port structure prior to console initialisation. Use
2894 * after console initialisation will cause undefined behaviour.
2895 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002896int __init early_serial_setup(struct uart_port *port)
2897{
David Daneyb4304282009-01-02 13:49:41 +00002898 struct uart_port *p;
2899
Linus Torvalds1da177e2005-04-16 15:20:36 -07002900 if (port->line >= ARRAY_SIZE(serial8250_ports))
2901 return -ENODEV;
2902
2903 serial8250_isa_init_ports();
David Daneyb4304282009-01-02 13:49:41 +00002904 p = &serial8250_ports[port->line].port;
2905 p->iobase = port->iobase;
2906 p->membase = port->membase;
2907 p->irq = port->irq;
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002908 p->irqflags = port->irqflags;
David Daneyb4304282009-01-02 13:49:41 +00002909 p->uartclk = port->uartclk;
2910 p->fifosize = port->fifosize;
2911 p->regshift = port->regshift;
2912 p->iotype = port->iotype;
2913 p->flags = port->flags;
2914 p->mapbase = port->mapbase;
2915 p->private_data = port->private_data;
Helge Deller125c97d2009-01-13 22:51:07 +01002916 p->type = port->type;
2917 p->line = port->line;
David Daney7d6a07d2009-01-02 13:49:47 +00002918
2919 set_io_from_upio(p);
2920 if (port->serial_in)
2921 p->serial_in = port->serial_in;
2922 if (port->serial_out)
2923 p->serial_out = port->serial_out;
Jamie Iles583d28e2011-08-15 10:17:52 +01002924 if (port->handle_irq)
2925 p->handle_irq = port->handle_irq;
2926 else
2927 p->handle_irq = serial8250_default_handle_irq;
David Daney7d6a07d2009-01-02 13:49:47 +00002928
Linus Torvalds1da177e2005-04-16 15:20:36 -07002929 return 0;
2930}
2931
2932/**
2933 * serial8250_suspend_port - suspend one serial port
2934 * @line: serial line number
Linus Torvalds1da177e2005-04-16 15:20:36 -07002935 *
2936 * Suspend one serial port.
2937 */
2938void serial8250_suspend_port(int line)
2939{
2940 uart_suspend_port(&serial8250_reg, &serial8250_ports[line].port);
2941}
2942
2943/**
2944 * serial8250_resume_port - resume one serial port
2945 * @line: serial line number
Linus Torvalds1da177e2005-04-16 15:20:36 -07002946 *
2947 * Resume one serial port.
2948 */
2949void serial8250_resume_port(int line)
2950{
David Woodhouseb5b82df2007-05-17 14:27:39 +08002951 struct uart_8250_port *up = &serial8250_ports[line];
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002952 struct uart_port *port = &up->port;
David Woodhouseb5b82df2007-05-17 14:27:39 +08002953
2954 if (up->capabilities & UART_NATSEMI) {
David Woodhouseb5b82df2007-05-17 14:27:39 +08002955 /* Ensure it's still in high speed mode */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002956 serial_port_out(port, UART_LCR, 0xE0);
David Woodhouseb5b82df2007-05-17 14:27:39 +08002957
Yin Kangkai0d0389e2011-02-09 11:35:18 +08002958 ns16550a_goto_highspeed(up);
David Woodhouseb5b82df2007-05-17 14:27:39 +08002959
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002960 serial_port_out(port, UART_LCR, 0);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002961 port->uartclk = 921600*16;
David Woodhouseb5b82df2007-05-17 14:27:39 +08002962 }
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002963 uart_resume_port(&serial8250_reg, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002964}
2965
2966/*
2967 * Register a set of serial devices attached to a platform device. The
2968 * list is terminated with a zero flags entry, which means we expect
2969 * all entries to have at least UPF_BOOT_AUTOCONF set.
2970 */
Russell King3ae5eae2005-11-09 22:32:44 +00002971static int __devinit serial8250_probe(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002972{
Russell King3ae5eae2005-11-09 22:32:44 +00002973 struct plat_serial8250_port *p = dev->dev.platform_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002974 struct uart_port port;
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02002975 int ret, i, irqflag = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002976
2977 memset(&port, 0, sizeof(struct uart_port));
2978
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02002979 if (share_irqs)
2980 irqflag = IRQF_SHARED;
2981
Russell Kingec9f47c2005-06-27 11:12:54 +01002982 for (i = 0; p && p->flags != 0; p++, i++) {
Will Newton74a197412008-02-04 22:27:50 -08002983 port.iobase = p->iobase;
2984 port.membase = p->membase;
2985 port.irq = p->irq;
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002986 port.irqflags = p->irqflags;
Will Newton74a197412008-02-04 22:27:50 -08002987 port.uartclk = p->uartclk;
2988 port.regshift = p->regshift;
2989 port.iotype = p->iotype;
2990 port.flags = p->flags;
2991 port.mapbase = p->mapbase;
2992 port.hub6 = p->hub6;
2993 port.private_data = p->private_data;
David Daney8e23fcc2009-01-02 13:49:54 +00002994 port.type = p->type;
David Daney7d6a07d2009-01-02 13:49:47 +00002995 port.serial_in = p->serial_in;
2996 port.serial_out = p->serial_out;
Jamie Iles583d28e2011-08-15 10:17:52 +01002997 port.handle_irq = p->handle_irq;
Dan Williamsbf03f652012-04-10 14:10:53 -07002998 port.handle_break = p->handle_break;
Philippe Langlais235dae52010-07-29 17:13:57 +02002999 port.set_termios = p->set_termios;
Manuel Laussc161afe2010-09-25 15:13:45 +02003000 port.pm = p->pm;
Will Newton74a197412008-02-04 22:27:50 -08003001 port.dev = &dev->dev;
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02003002 port.irqflags |= irqflag;
Russell Kingec9f47c2005-06-27 11:12:54 +01003003 ret = serial8250_register_port(&port);
3004 if (ret < 0) {
Russell King3ae5eae2005-11-09 22:32:44 +00003005 dev_err(&dev->dev, "unable to register port at index %d "
Josh Boyer4f640ef2007-07-23 18:43:44 -07003006 "(IO%lx MEM%llx IRQ%d): %d\n", i,
3007 p->iobase, (unsigned long long)p->mapbase,
3008 p->irq, ret);
Russell Kingec9f47c2005-06-27 11:12:54 +01003009 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003010 }
3011 return 0;
3012}
3013
3014/*
3015 * Remove serial ports registered against a platform device.
3016 */
Russell King3ae5eae2005-11-09 22:32:44 +00003017static int __devexit serial8250_remove(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003018{
3019 int i;
3020
Dave Jonesa61c2d72006-01-07 23:18:19 +00003021 for (i = 0; i < nr_uarts; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003022 struct uart_8250_port *up = &serial8250_ports[i];
3023
Russell King3ae5eae2005-11-09 22:32:44 +00003024 if (up->port.dev == &dev->dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003025 serial8250_unregister_port(i);
3026 }
3027 return 0;
3028}
3029
Russell King3ae5eae2005-11-09 22:32:44 +00003030static int serial8250_suspend(struct platform_device *dev, pm_message_t state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003031{
3032 int i;
3033
Linus Torvalds1da177e2005-04-16 15:20:36 -07003034 for (i = 0; i < UART_NR; i++) {
3035 struct uart_8250_port *up = &serial8250_ports[i];
3036
Russell King3ae5eae2005-11-09 22:32:44 +00003037 if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003038 uart_suspend_port(&serial8250_reg, &up->port);
3039 }
3040
3041 return 0;
3042}
3043
Russell King3ae5eae2005-11-09 22:32:44 +00003044static int serial8250_resume(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003045{
3046 int i;
3047
Linus Torvalds1da177e2005-04-16 15:20:36 -07003048 for (i = 0; i < UART_NR; i++) {
3049 struct uart_8250_port *up = &serial8250_ports[i];
3050
Russell King3ae5eae2005-11-09 22:32:44 +00003051 if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
David Woodhouseb5b82df2007-05-17 14:27:39 +08003052 serial8250_resume_port(i);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003053 }
3054
3055 return 0;
3056}
3057
Russell King3ae5eae2005-11-09 22:32:44 +00003058static struct platform_driver serial8250_isa_driver = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003059 .probe = serial8250_probe,
3060 .remove = __devexit_p(serial8250_remove),
3061 .suspend = serial8250_suspend,
3062 .resume = serial8250_resume,
Russell King3ae5eae2005-11-09 22:32:44 +00003063 .driver = {
3064 .name = "serial8250",
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003065 .owner = THIS_MODULE,
Russell King3ae5eae2005-11-09 22:32:44 +00003066 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07003067};
3068
3069/*
3070 * This "device" covers _all_ ISA 8250-compatible serial devices listed
3071 * in the table in include/asm/serial.h
3072 */
3073static struct platform_device *serial8250_isa_devs;
3074
3075/*
3076 * serial8250_register_port and serial8250_unregister_port allows for
3077 * 16x50 serial ports to be configured at run-time, to support PCMCIA
3078 * modems and PCI multiport cards.
3079 */
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003080static DEFINE_MUTEX(serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003081
3082static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *port)
3083{
3084 int i;
3085
3086 /*
3087 * First, find a port entry which matches.
3088 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003089 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003090 if (uart_match_port(&serial8250_ports[i].port, port))
3091 return &serial8250_ports[i];
3092
3093 /*
3094 * We didn't find a matching entry, so look for the first
3095 * free entry. We look for one which hasn't been previously
3096 * used (indicated by zero iobase).
3097 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003098 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003099 if (serial8250_ports[i].port.type == PORT_UNKNOWN &&
3100 serial8250_ports[i].port.iobase == 0)
3101 return &serial8250_ports[i];
3102
3103 /*
3104 * That also failed. Last resort is to find any entry which
3105 * doesn't have a real port associated with it.
3106 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003107 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003108 if (serial8250_ports[i].port.type == PORT_UNKNOWN)
3109 return &serial8250_ports[i];
3110
3111 return NULL;
3112}
3113
3114/**
Magnus Dammf73fa052012-05-02 21:47:27 +09003115 * serial8250_register_8250_port - register a serial port
Randy Dunlap58bcd332012-06-08 18:51:23 -07003116 * @up: serial port template
Magnus Dammf73fa052012-05-02 21:47:27 +09003117 *
3118 * Configure the serial port specified by the request. If the
3119 * port exists and is in use, it is hung up and unregistered
3120 * first.
3121 *
3122 * The port is then probed and if necessary the IRQ is autodetected
3123 * If this fails an error is returned.
3124 *
3125 * On success the port is ready to use and the line number is returned.
3126 */
3127int serial8250_register_8250_port(struct uart_8250_port *up)
3128{
3129 struct uart_8250_port *uart;
3130 int ret = -ENOSPC;
3131
3132 if (up->port.uartclk == 0)
3133 return -EINVAL;
3134
3135 mutex_lock(&serial_mutex);
3136
3137 uart = serial8250_find_match_or_unused(&up->port);
3138 if (uart) {
3139 uart_remove_one_port(&serial8250_reg, &uart->port);
3140
3141 uart->port.iobase = up->port.iobase;
3142 uart->port.membase = up->port.membase;
3143 uart->port.irq = up->port.irq;
3144 uart->port.irqflags = up->port.irqflags;
3145 uart->port.uartclk = up->port.uartclk;
3146 uart->port.fifosize = up->port.fifosize;
3147 uart->port.regshift = up->port.regshift;
3148 uart->port.iotype = up->port.iotype;
3149 uart->port.flags = up->port.flags | UPF_BOOT_AUTOCONF;
3150 uart->port.mapbase = up->port.mapbase;
3151 uart->port.private_data = up->port.private_data;
3152 if (up->port.dev)
3153 uart->port.dev = up->port.dev;
3154
3155 if (up->port.flags & UPF_FIXED_TYPE)
3156 serial8250_init_fixed_type_port(uart, up->port.type);
3157
3158 set_io_from_upio(&uart->port);
3159 /* Possibly override default I/O functions. */
3160 if (up->port.serial_in)
3161 uart->port.serial_in = up->port.serial_in;
3162 if (up->port.serial_out)
3163 uart->port.serial_out = up->port.serial_out;
3164 if (up->port.handle_irq)
3165 uart->port.handle_irq = up->port.handle_irq;
3166 /* Possibly override set_termios call */
3167 if (up->port.set_termios)
3168 uart->port.set_termios = up->port.set_termios;
3169 if (up->port.pm)
3170 uart->port.pm = up->port.pm;
3171 if (up->port.handle_break)
3172 uart->port.handle_break = up->port.handle_break;
3173 if (up->dl_read)
3174 uart->dl_read = up->dl_read;
3175 if (up->dl_write)
3176 uart->dl_write = up->dl_write;
3177
3178 if (serial8250_isa_config != NULL)
3179 serial8250_isa_config(0, &uart->port,
3180 &uart->capabilities);
3181
3182 ret = uart_add_one_port(&serial8250_reg, &uart->port);
3183 if (ret == 0)
3184 ret = uart->port.line;
3185 }
3186 mutex_unlock(&serial_mutex);
3187
3188 return ret;
3189}
3190EXPORT_SYMBOL(serial8250_register_8250_port);
3191
3192/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07003193 * serial8250_register_port - register a serial port
3194 * @port: serial port template
3195 *
3196 * Configure the serial port specified by the request. If the
3197 * port exists and is in use, it is hung up and unregistered
3198 * first.
3199 *
3200 * The port is then probed and if necessary the IRQ is autodetected
3201 * If this fails an error is returned.
3202 *
3203 * On success the port is ready to use and the line number is returned.
3204 */
3205int serial8250_register_port(struct uart_port *port)
3206{
Magnus Dammf73fa052012-05-02 21:47:27 +09003207 struct uart_8250_port up;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003208
Magnus Dammf73fa052012-05-02 21:47:27 +09003209 memset(&up, 0, sizeof(up));
3210 memcpy(&up.port, port, sizeof(*port));
3211 return serial8250_register_8250_port(&up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003212}
3213EXPORT_SYMBOL(serial8250_register_port);
3214
3215/**
3216 * serial8250_unregister_port - remove a 16x50 serial port at runtime
3217 * @line: serial line number
3218 *
3219 * Remove one serial port. This may not be called from interrupt
3220 * context. We hand the port back to the our control.
3221 */
3222void serial8250_unregister_port(int line)
3223{
3224 struct uart_8250_port *uart = &serial8250_ports[line];
3225
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003226 mutex_lock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003227 uart_remove_one_port(&serial8250_reg, &uart->port);
3228 if (serial8250_isa_devs) {
3229 uart->port.flags &= ~UPF_BOOT_AUTOCONF;
3230 uart->port.type = PORT_UNKNOWN;
3231 uart->port.dev = &serial8250_isa_devs->dev;
leitao@linux.vnet.ibm.comcb01ece2011-05-26 11:18:39 -03003232 uart->capabilities = uart_config[uart->port.type].flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003233 uart_add_one_port(&serial8250_reg, &uart->port);
3234 } else {
3235 uart->port.dev = NULL;
3236 }
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003237 mutex_unlock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003238}
3239EXPORT_SYMBOL(serial8250_unregister_port);
3240
3241static int __init serial8250_init(void)
3242{
Alan Cox25db8ad2008-08-19 20:49:40 -07003243 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003244
Dave Jonesa61c2d72006-01-07 23:18:19 +00003245 if (nr_uarts > UART_NR)
3246 nr_uarts = UART_NR;
3247
Paul Bollef1fb9bb2008-12-30 14:06:43 +01003248 printk(KERN_INFO "Serial: 8250/16550 driver, "
Dave Jonesa61c2d72006-01-07 23:18:19 +00003249 "%d ports, IRQ sharing %sabled\n", nr_uarts,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003250 share_irqs ? "en" : "dis");
3251
David Millerb70ac772008-10-13 10:36:31 +01003252#ifdef CONFIG_SPARC
3253 ret = sunserial_register_minors(&serial8250_reg, UART_NR);
3254#else
3255 serial8250_reg.nr = UART_NR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003256 ret = uart_register_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003257#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003258 if (ret)
3259 goto out;
3260
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003261 serial8250_isa_devs = platform_device_alloc("serial8250",
3262 PLAT8250_DEV_LEGACY);
3263 if (!serial8250_isa_devs) {
3264 ret = -ENOMEM;
Russell Kingbc965a72006-01-18 09:54:29 +00003265 goto unreg_uart_drv;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003266 }
3267
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003268 ret = platform_device_add(serial8250_isa_devs);
3269 if (ret)
3270 goto put_dev;
3271
Linus Torvalds1da177e2005-04-16 15:20:36 -07003272 serial8250_register_ports(&serial8250_reg, &serial8250_isa_devs->dev);
3273
Russell Kingbc965a72006-01-18 09:54:29 +00003274 ret = platform_driver_register(&serial8250_isa_driver);
3275 if (ret == 0)
3276 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003277
Russell Kingbc965a72006-01-18 09:54:29 +00003278 platform_device_del(serial8250_isa_devs);
Alan Cox25db8ad2008-08-19 20:49:40 -07003279put_dev:
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003280 platform_device_put(serial8250_isa_devs);
Alan Cox25db8ad2008-08-19 20:49:40 -07003281unreg_uart_drv:
David Millerb70ac772008-10-13 10:36:31 +01003282#ifdef CONFIG_SPARC
3283 sunserial_unregister_minors(&serial8250_reg, UART_NR);
3284#else
Linus Torvalds1da177e2005-04-16 15:20:36 -07003285 uart_unregister_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003286#endif
Alan Cox25db8ad2008-08-19 20:49:40 -07003287out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07003288 return ret;
3289}
3290
3291static void __exit serial8250_exit(void)
3292{
3293 struct platform_device *isa_dev = serial8250_isa_devs;
3294
3295 /*
3296 * This tells serial8250_unregister_port() not to re-register
3297 * the ports (thereby making serial8250_isa_driver permanently
3298 * in use.)
3299 */
3300 serial8250_isa_devs = NULL;
3301
Russell King3ae5eae2005-11-09 22:32:44 +00003302 platform_driver_unregister(&serial8250_isa_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003303 platform_device_unregister(isa_dev);
3304
David Millerb70ac772008-10-13 10:36:31 +01003305#ifdef CONFIG_SPARC
3306 sunserial_unregister_minors(&serial8250_reg, UART_NR);
3307#else
Linus Torvalds1da177e2005-04-16 15:20:36 -07003308 uart_unregister_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003309#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003310}
3311
3312module_init(serial8250_init);
3313module_exit(serial8250_exit);
3314
3315EXPORT_SYMBOL(serial8250_suspend_port);
3316EXPORT_SYMBOL(serial8250_resume_port);
3317
3318MODULE_LICENSE("GPL");
Adrian Bunkd87a6d92008-07-16 21:53:31 +01003319MODULE_DESCRIPTION("Generic 8250/16x50 serial driver");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003320
3321module_param(share_irqs, uint, 0644);
3322MODULE_PARM_DESC(share_irqs, "Share IRQs with other non-8250/16x50 devices"
3323 " (unsafe)");
3324
Dave Jonesa61c2d72006-01-07 23:18:19 +00003325module_param(nr_uarts, uint, 0644);
3326MODULE_PARM_DESC(nr_uarts, "Maximum number of UARTs supported. (1-" __MODULE_STRING(CONFIG_SERIAL_8250_NR_UARTS) ")");
3327
Chuck Ebbertd41a4b52009-10-01 15:44:26 -07003328module_param(skip_txen_test, uint, 0644);
3329MODULE_PARM_DESC(skip_txen_test, "Skip checking for the TXEN bug at init time");
3330
Linus Torvalds1da177e2005-04-16 15:20:36 -07003331#ifdef CONFIG_SERIAL_8250_RSA
3332module_param_array(probe_rsa, ulong, &probe_rsa_count, 0444);
3333MODULE_PARM_DESC(probe_rsa, "Probe I/O ports for RSA");
3334#endif
3335MODULE_ALIAS_CHARDEV_MAJOR(TTY_MAJOR);