blob: 435ce14e676c69a938121c2f9608001c71aa39d5 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 * Driver for 8250/16550-type serial ports
3 *
4 * Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
5 *
6 * Copyright (C) 2001 Russell King.
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070013 * A note about mapbase / membase
14 *
15 * mapbase is the physical address of the IO port.
16 * membase is an 'ioremapped' cookie.
17 */
Linus Torvalds1da177e2005-04-16 15:20:36 -070018
19#if defined(CONFIG_SERIAL_8250_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
20#define SUPPORT_SYSRQ
21#endif
22
23#include <linux/module.h>
24#include <linux/moduleparam.h>
25#include <linux/ioport.h>
26#include <linux/init.h>
27#include <linux/console.h>
28#include <linux/sysrq.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070029#include <linux/delay.h>
Russell Kingd052d1b2005-10-29 19:07:23 +010030#include <linux/platform_device.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include <linux/tty.h>
Daniel Drakecd3ecad2010-10-20 16:00:48 -070032#include <linux/ratelimit.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070033#include <linux/tty_flip.h>
34#include <linux/serial_reg.h>
35#include <linux/serial_core.h>
36#include <linux/serial.h>
37#include <linux/serial_8250.h>
Andrew Morton78512ec2005-11-07 00:59:13 -080038#include <linux/nmi.h>
Arjan van de Venf392ecf2006-01-12 18:44:32 +000039#include <linux/mutex.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090040#include <linux/slab.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070041
42#include <asm/io.h>
43#include <asm/irq.h>
44
45#include "8250.h"
46
David Millerb70ac772008-10-13 10:36:31 +010047#ifdef CONFIG_SPARC
48#include "suncore.h"
49#endif
50
Linus Torvalds1da177e2005-04-16 15:20:36 -070051/*
52 * Configuration:
Thomas Gleixner40663cc2006-07-01 19:29:43 -070053 * share_irqs - whether we pass IRQF_SHARED to request_irq(). This option
Linus Torvalds1da177e2005-04-16 15:20:36 -070054 * is unsafe when used on edge-triggered interrupts.
55 */
Adrian Bunk408b6642005-05-01 08:59:29 -070056static unsigned int share_irqs = SERIAL8250_SHARE_IRQS;
Linus Torvalds1da177e2005-04-16 15:20:36 -070057
Dave Jonesa61c2d72006-01-07 23:18:19 +000058static unsigned int nr_uarts = CONFIG_SERIAL_8250_RUNTIME_UARTS;
59
David S. Miller84408382008-10-13 10:45:26 +010060static struct uart_driver serial8250_reg;
61
62static int serial_index(struct uart_port *port)
63{
64 return (serial8250_reg.minor - 64) + port->line;
65}
66
Chuck Ebbertd41a4b52009-10-01 15:44:26 -070067static unsigned int skip_txen_test; /* force skip of txen test at init time */
68
Linus Torvalds1da177e2005-04-16 15:20:36 -070069/*
70 * Debugging.
71 */
72#if 0
73#define DEBUG_AUTOCONF(fmt...) printk(fmt)
74#else
75#define DEBUG_AUTOCONF(fmt...) do { } while (0)
76#endif
77
78#if 0
79#define DEBUG_INTR(fmt...) printk(fmt)
80#else
81#define DEBUG_INTR(fmt...) do { } while (0)
82#endif
83
Jiri Slabye7328ae2011-06-05 22:51:49 +020084#define PASS_LIMIT 512
Linus Torvalds1da177e2005-04-16 15:20:36 -070085
Dick Hollenbeckbca47612009-12-09 12:31:34 -080086#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
87
88
Linus Torvalds1da177e2005-04-16 15:20:36 -070089/*
90 * We default to IRQ0 for the "no irq" hack. Some
91 * machine types want others as well - they're free
92 * to redefine this in their header file.
93 */
94#define is_real_interrupt(irq) ((irq) != 0)
95
Linus Torvalds1da177e2005-04-16 15:20:36 -070096#ifdef CONFIG_SERIAL_8250_DETECT_IRQ
97#define CONFIG_SERIAL_DETECT_IRQ 1
98#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070099#ifdef CONFIG_SERIAL_8250_MANY_PORTS
100#define CONFIG_SERIAL_MANY_PORTS 1
101#endif
102
103/*
104 * HUB6 is always on. This will be removed once the header
105 * files have been cleaned.
106 */
107#define CONFIG_HUB6 1
108
Bryan Wua4ed1e42008-05-31 16:10:04 +0800109#include <asm/serial.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700110/*
111 * SERIAL_PORT_DFNS tells us about built-in ports that have no
112 * standard enumeration mechanism. Platforms that can find all
113 * serial ports via mechanisms like ACPI or PCI need not supply it.
114 */
115#ifndef SERIAL_PORT_DFNS
116#define SERIAL_PORT_DFNS
117#endif
118
Arjan van de Vencb3592b2005-11-28 21:04:11 +0000119static const struct old_serial_port old_serial_port[] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700120 SERIAL_PORT_DFNS /* defined in asm/serial.h */
121};
122
Russell King026d02a2005-06-29 18:45:19 +0100123#define UART_NR CONFIG_SERIAL_8250_NR_UARTS
Linus Torvalds1da177e2005-04-16 15:20:36 -0700124
125#ifdef CONFIG_SERIAL_8250_RSA
126
127#define PORT_RSA_MAX 4
128static unsigned long probe_rsa[PORT_RSA_MAX];
129static unsigned int probe_rsa_count;
130#endif /* CONFIG_SERIAL_8250_RSA */
131
132struct uart_8250_port {
133 struct uart_port port;
134 struct timer_list timer; /* "no irq" timer */
135 struct list_head list; /* ports on this IRQ */
Russell King4ba5e352005-06-23 10:43:04 +0100136 unsigned short capabilities; /* port capabilities */
137 unsigned short bugs; /* port bugs */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700138 unsigned int tx_loadsz; /* transmit fifo load size */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700139 unsigned char acr;
140 unsigned char ier;
141 unsigned char lcr;
142 unsigned char mcr;
143 unsigned char mcr_mask; /* mask of user bits */
144 unsigned char mcr_force; /* mask of forced bits */
Alan Coxb8e7e402009-05-28 14:01:35 +0100145 unsigned char cur_iotype; /* Running I/O type */
Corey Minyardad4c2aa2007-08-22 14:01:18 -0700146
147 /*
148 * Some bits in registers are cleared on a read, so they must
149 * be saved whenever the register is read but the bits will not
150 * be immediately processed.
151 */
152#define LSR_SAVE_FLAGS UART_LSR_BRK_ERROR_BITS
153 unsigned char lsr_saved_flags;
154#define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA
155 unsigned char msr_saved_flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700156};
157
158struct irq_info {
Alan Cox25db8ad2008-08-19 20:49:40 -0700159 struct hlist_node node;
160 int irq;
161 spinlock_t lock; /* Protects list not the hash */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700162 struct list_head *head;
163};
164
Alan Cox25db8ad2008-08-19 20:49:40 -0700165#define NR_IRQ_HASH 32 /* Can be adjusted later */
166static struct hlist_head irq_lists[NR_IRQ_HASH];
167static DEFINE_MUTEX(hash_mutex); /* Used to walk the hash */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700168
169/*
170 * Here we define the default xmit fifo size used for each type of UART.
171 */
172static const struct serial8250_config uart_config[] = {
173 [PORT_UNKNOWN] = {
174 .name = "unknown",
175 .fifo_size = 1,
176 .tx_loadsz = 1,
177 },
178 [PORT_8250] = {
179 .name = "8250",
180 .fifo_size = 1,
181 .tx_loadsz = 1,
182 },
183 [PORT_16450] = {
184 .name = "16450",
185 .fifo_size = 1,
186 .tx_loadsz = 1,
187 },
188 [PORT_16550] = {
189 .name = "16550",
190 .fifo_size = 1,
191 .tx_loadsz = 1,
192 },
193 [PORT_16550A] = {
194 .name = "16550A",
195 .fifo_size = 16,
196 .tx_loadsz = 16,
197 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
198 .flags = UART_CAP_FIFO,
199 },
200 [PORT_CIRRUS] = {
201 .name = "Cirrus",
202 .fifo_size = 1,
203 .tx_loadsz = 1,
204 },
205 [PORT_16650] = {
206 .name = "ST16650",
207 .fifo_size = 1,
208 .tx_loadsz = 1,
209 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
210 },
211 [PORT_16650V2] = {
212 .name = "ST16650V2",
213 .fifo_size = 32,
214 .tx_loadsz = 16,
215 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
216 UART_FCR_T_TRIG_00,
217 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
218 },
219 [PORT_16750] = {
220 .name = "TI16750",
221 .fifo_size = 64,
222 .tx_loadsz = 64,
223 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 |
224 UART_FCR7_64BYTE,
225 .flags = UART_CAP_FIFO | UART_CAP_SLEEP | UART_CAP_AFE,
226 },
227 [PORT_STARTECH] = {
228 .name = "Startech",
229 .fifo_size = 1,
230 .tx_loadsz = 1,
231 },
232 [PORT_16C950] = {
233 .name = "16C950/954",
234 .fifo_size = 128,
235 .tx_loadsz = 128,
236 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
Pavel Machekd0694e22011-01-09 08:38:48 +0100237 /* UART_CAP_EFR breaks billionon CF bluetooth card. */
238 .flags = UART_CAP_FIFO | UART_CAP_SLEEP,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700239 },
240 [PORT_16654] = {
241 .name = "ST16654",
242 .fifo_size = 64,
243 .tx_loadsz = 32,
244 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
245 UART_FCR_T_TRIG_10,
246 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
247 },
248 [PORT_16850] = {
249 .name = "XR16850",
250 .fifo_size = 128,
251 .tx_loadsz = 128,
252 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
253 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
254 },
255 [PORT_RSA] = {
256 .name = "RSA",
257 .fifo_size = 2048,
258 .tx_loadsz = 2048,
259 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_11,
260 .flags = UART_CAP_FIFO,
261 },
262 [PORT_NS16550A] = {
263 .name = "NS16550A",
264 .fifo_size = 16,
265 .tx_loadsz = 16,
266 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
267 .flags = UART_CAP_FIFO | UART_NATSEMI,
268 },
269 [PORT_XSCALE] = {
270 .name = "XScale",
271 .fifo_size = 32,
272 .tx_loadsz = 32,
273 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
Stephen Warren4539c242011-05-17 16:12:36 -0600274 .flags = UART_CAP_FIFO | UART_CAP_UUE | UART_CAP_RTOIE,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700275 },
Thomas Koellerbd71c182007-05-06 14:48:47 -0700276 [PORT_RM9000] = {
277 .name = "RM9000",
278 .fifo_size = 16,
279 .tx_loadsz = 16,
280 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
281 .flags = UART_CAP_FIFO,
282 },
David Daney6b06f192009-01-02 13:50:00 +0000283 [PORT_OCTEON] = {
284 .name = "OCTEON",
285 .fifo_size = 64,
286 .tx_loadsz = 64,
287 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
288 .flags = UART_CAP_FIFO,
289 },
Florian Fainelli08e09922009-06-11 13:21:24 +0100290 [PORT_AR7] = {
291 .name = "AR7",
292 .fifo_size = 16,
293 .tx_loadsz = 16,
294 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_00,
295 .flags = UART_CAP_FIFO | UART_CAP_AFE,
296 },
Philippe Langlais235dae52010-07-29 17:13:57 +0200297 [PORT_U6_16550A] = {
298 .name = "U6_16550A",
299 .fifo_size = 64,
300 .tx_loadsz = 64,
301 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
302 .flags = UART_CAP_FIFO | UART_CAP_AFE,
303 },
Stephen Warren4539c242011-05-17 16:12:36 -0600304 [PORT_TEGRA] = {
305 .name = "Tegra",
306 .fifo_size = 32,
307 .tx_loadsz = 8,
308 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
309 UART_FCR_T_TRIG_01,
310 .flags = UART_CAP_FIFO | UART_CAP_RTOIE,
311 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700312};
313
Manuel Lauss12bf3f22010-07-15 21:45:05 +0200314#if defined(CONFIG_MIPS_ALCHEMY)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000315
316/* Au1x00 UART hardware has a weird register layout */
317static const u8 au_io_in_map[] = {
318 [UART_RX] = 0,
319 [UART_IER] = 2,
320 [UART_IIR] = 3,
321 [UART_LCR] = 5,
322 [UART_MCR] = 6,
323 [UART_LSR] = 7,
324 [UART_MSR] = 8,
325};
326
327static const u8 au_io_out_map[] = {
328 [UART_TX] = 1,
329 [UART_IER] = 2,
330 [UART_FCR] = 4,
331 [UART_LCR] = 5,
332 [UART_MCR] = 6,
333};
334
335/* sane hardware needs no mapping */
David Daney7d6a07d2009-01-02 13:49:47 +0000336static inline int map_8250_in_reg(struct uart_port *p, int offset)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000337{
David Daney7d6a07d2009-01-02 13:49:47 +0000338 if (p->iotype != UPIO_AU)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000339 return offset;
340 return au_io_in_map[offset];
341}
342
David Daney7d6a07d2009-01-02 13:49:47 +0000343static inline int map_8250_out_reg(struct uart_port *p, int offset)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000344{
David Daney7d6a07d2009-01-02 13:49:47 +0000345 if (p->iotype != UPIO_AU)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000346 return offset;
347 return au_io_out_map[offset];
348}
349
Alan Cox6f803cd2008-02-08 04:18:52 -0800350#elif defined(CONFIG_SERIAL_8250_RM9K)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700351
352static const u8
353 regmap_in[8] = {
354 [UART_RX] = 0x00,
355 [UART_IER] = 0x0c,
356 [UART_IIR] = 0x14,
357 [UART_LCR] = 0x1c,
358 [UART_MCR] = 0x20,
359 [UART_LSR] = 0x24,
360 [UART_MSR] = 0x28,
361 [UART_SCR] = 0x2c
362 },
363 regmap_out[8] = {
364 [UART_TX] = 0x04,
365 [UART_IER] = 0x0c,
366 [UART_FCR] = 0x18,
367 [UART_LCR] = 0x1c,
368 [UART_MCR] = 0x20,
369 [UART_LSR] = 0x24,
370 [UART_MSR] = 0x28,
371 [UART_SCR] = 0x2c
372 };
373
David Daney7d6a07d2009-01-02 13:49:47 +0000374static inline int map_8250_in_reg(struct uart_port *p, int offset)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700375{
David Daney7d6a07d2009-01-02 13:49:47 +0000376 if (p->iotype != UPIO_RM9000)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700377 return offset;
378 return regmap_in[offset];
379}
380
David Daney7d6a07d2009-01-02 13:49:47 +0000381static inline int map_8250_out_reg(struct uart_port *p, int offset)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700382{
David Daney7d6a07d2009-01-02 13:49:47 +0000383 if (p->iotype != UPIO_RM9000)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700384 return offset;
385 return regmap_out[offset];
386}
387
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000388#else
389
390/* sane hardware needs no mapping */
391#define map_8250_in_reg(up, offset) (offset)
392#define map_8250_out_reg(up, offset) (offset)
393
394#endif
395
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{
David Daney7d6a07d2009-01-02 13:49:47 +0000398 offset = map_8250_in_reg(p, offset) << p->regshift;
399 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{
David Daney7d6a07d2009-01-02 13:49:47 +0000405 offset = map_8250_out_reg(p, offset) << p->regshift;
406 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{
412 offset = map_8250_in_reg(p, offset) << p->regshift;
413 return readb(p->membase + offset);
414}
415
416static void mem_serial_out(struct uart_port *p, int offset, int value)
417{
418 offset = map_8250_out_reg(p, offset) << p->regshift;
419 writeb(value, p->membase + offset);
420}
421
422static void mem32_serial_out(struct uart_port *p, int offset, int value)
423{
424 offset = map_8250_out_reg(p, offset) << p->regshift;
425 writel(value, p->membase + offset);
426}
427
428static unsigned int mem32_serial_in(struct uart_port *p, int offset)
429{
430 offset = map_8250_in_reg(p, offset) << p->regshift;
431 return readl(p->membase + offset);
432}
433
David Daney7d6a07d2009-01-02 13:49:47 +0000434static unsigned int au_serial_in(struct uart_port *p, int offset)
435{
436 offset = map_8250_in_reg(p, offset) << p->regshift;
437 return __raw_readl(p->membase + offset);
438}
439
440static void au_serial_out(struct uart_port *p, int offset, int value)
441{
442 offset = map_8250_out_reg(p, offset) << p->regshift;
443 __raw_writel(value, p->membase + offset);
444}
David Daney7d6a07d2009-01-02 13:49:47 +0000445
446static unsigned int tsi_serial_in(struct uart_port *p, int offset)
447{
448 unsigned int tmp;
449 offset = map_8250_in_reg(p, offset) << p->regshift;
450 if (offset == UART_IIR) {
451 tmp = readl(p->membase + (UART_IIR & ~3));
452 return (tmp >> 16) & 0xff; /* UART_IIR % 4 == 2 */
453 } else
454 return readb(p->membase + offset);
455}
456
457static void tsi_serial_out(struct uart_port *p, int offset, int value)
458{
459 offset = map_8250_out_reg(p, offset) << p->regshift;
460 if (!((offset == UART_IER) && (value & UART_IER_UUE)))
461 writeb(value, p->membase + offset);
462}
463
David Daney7d6a07d2009-01-02 13:49:47 +0000464static unsigned int io_serial_in(struct uart_port *p, int offset)
465{
466 offset = map_8250_in_reg(p, offset) << p->regshift;
467 return inb(p->iobase + offset);
468}
469
470static void io_serial_out(struct uart_port *p, int offset, int value)
471{
472 offset = map_8250_out_reg(p, offset) << p->regshift;
473 outb(value, p->iobase + offset);
474}
475
Jamie Iles583d28e2011-08-15 10:17:52 +0100476static int serial8250_default_handle_irq(struct uart_port *port);
477
David Daney7d6a07d2009-01-02 13:49:47 +0000478static void set_io_from_upio(struct uart_port *p)
479{
Jamie Iles49d57412010-12-01 23:39:35 +0000480 struct uart_8250_port *up =
481 container_of(p, struct uart_8250_port, port);
David Daney7d6a07d2009-01-02 13:49:47 +0000482 switch (p->iotype) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700483 case UPIO_HUB6:
David Daney7d6a07d2009-01-02 13:49:47 +0000484 p->serial_in = hub6_serial_in;
485 p->serial_out = hub6_serial_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700486 break;
487
488 case UPIO_MEM:
David Daney7d6a07d2009-01-02 13:49:47 +0000489 p->serial_in = mem_serial_in;
490 p->serial_out = mem_serial_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700491 break;
492
Thomas Koellerbd71c182007-05-06 14:48:47 -0700493 case UPIO_RM9000:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700494 case UPIO_MEM32:
David Daney7d6a07d2009-01-02 13:49:47 +0000495 p->serial_in = mem32_serial_in;
496 p->serial_out = mem32_serial_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700497 break;
498
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000499 case UPIO_AU:
David Daney7d6a07d2009-01-02 13:49:47 +0000500 p->serial_in = au_serial_in;
501 p->serial_out = au_serial_out;
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000502 break;
Manuel Lauss12bf3f22010-07-15 21:45:05 +0200503
Zang Roy-r619113be91ec2006-06-30 02:29:58 -0700504 case UPIO_TSI:
David Daney7d6a07d2009-01-02 13:49:47 +0000505 p->serial_in = tsi_serial_in;
506 p->serial_out = tsi_serial_out;
Zang Roy-r619113be91ec2006-06-30 02:29:58 -0700507 break;
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000508
Linus Torvalds1da177e2005-04-16 15:20:36 -0700509 default:
David Daney7d6a07d2009-01-02 13:49:47 +0000510 p->serial_in = io_serial_in;
511 p->serial_out = io_serial_out;
512 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700513 }
Alan Coxb8e7e402009-05-28 14:01:35 +0100514 /* Remember loaded iotype */
515 up->cur_iotype = p->iotype;
Jamie Iles583d28e2011-08-15 10:17:52 +0100516 p->handle_irq = serial8250_default_handle_irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700517}
518
Alex Williamson40b36da2007-02-14 00:33:04 -0800519static void
520serial_out_sync(struct uart_8250_port *up, int offset, int value)
521{
David Daney7d6a07d2009-01-02 13:49:47 +0000522 struct uart_port *p = &up->port;
523 switch (p->iotype) {
Alex Williamson40b36da2007-02-14 00:33:04 -0800524 case UPIO_MEM:
525 case UPIO_MEM32:
Alex Williamson40b36da2007-02-14 00:33:04 -0800526 case UPIO_AU:
David Daney7d6a07d2009-01-02 13:49:47 +0000527 p->serial_out(p, offset, value);
528 p->serial_in(p, UART_LCR); /* safe, no side-effects */
Alex Williamson40b36da2007-02-14 00:33:04 -0800529 break;
530 default:
David Daney7d6a07d2009-01-02 13:49:47 +0000531 p->serial_out(p, offset, value);
Alex Williamson40b36da2007-02-14 00:33:04 -0800532 }
533}
534
David Daney7d6a07d2009-01-02 13:49:47 +0000535#define serial_in(up, offset) \
536 (up->port.serial_in(&(up)->port, (offset)))
537#define serial_out(up, offset, value) \
538 (up->port.serial_out(&(up)->port, (offset), (value)))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700539/*
540 * We used to support using pause I/O for certain machines. We
541 * haven't supported this for a while, but just in case it's badly
542 * needed for certain old 386 machines, I've left these #define's
543 * in....
544 */
545#define serial_inp(up, offset) serial_in(up, offset)
546#define serial_outp(up, offset, value) serial_out(up, offset, value)
547
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100548/* Uart divisor latch read */
549static inline int _serial_dl_read(struct uart_8250_port *up)
550{
551 return serial_inp(up, UART_DLL) | serial_inp(up, UART_DLM) << 8;
552}
553
554/* Uart divisor latch write */
555static inline void _serial_dl_write(struct uart_8250_port *up, int value)
556{
557 serial_outp(up, UART_DLL, value & 0xff);
558 serial_outp(up, UART_DLM, value >> 8 & 0xff);
559}
560
Manuel Lauss12bf3f22010-07-15 21:45:05 +0200561#if defined(CONFIG_MIPS_ALCHEMY)
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100562/* Au1x00 haven't got a standard divisor latch */
563static int serial_dl_read(struct uart_8250_port *up)
564{
565 if (up->port.iotype == UPIO_AU)
566 return __raw_readl(up->port.membase + 0x28);
567 else
568 return _serial_dl_read(up);
569}
570
571static void serial_dl_write(struct uart_8250_port *up, int value)
572{
573 if (up->port.iotype == UPIO_AU)
574 __raw_writel(value, up->port.membase + 0x28);
575 else
576 _serial_dl_write(up, value);
577}
Alan Cox6f803cd2008-02-08 04:18:52 -0800578#elif defined(CONFIG_SERIAL_8250_RM9K)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700579static int serial_dl_read(struct uart_8250_port *up)
580{
581 return (up->port.iotype == UPIO_RM9000) ?
582 (((__raw_readl(up->port.membase + 0x10) << 8) |
583 (__raw_readl(up->port.membase + 0x08) & 0xff)) & 0xffff) :
584 _serial_dl_read(up);
585}
586
587static void serial_dl_write(struct uart_8250_port *up, int value)
588{
589 if (up->port.iotype == UPIO_RM9000) {
590 __raw_writel(value, up->port.membase + 0x08);
591 __raw_writel(value >> 8, up->port.membase + 0x10);
592 } else {
593 _serial_dl_write(up, value);
594 }
595}
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100596#else
597#define serial_dl_read(up) _serial_dl_read(up)
598#define serial_dl_write(up, value) _serial_dl_write(up, value)
599#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700600
601/*
602 * For the 16C950
603 */
604static void serial_icr_write(struct uart_8250_port *up, int offset, int value)
605{
606 serial_out(up, UART_SCR, offset);
607 serial_out(up, UART_ICR, value);
608}
609
610static unsigned int serial_icr_read(struct uart_8250_port *up, int offset)
611{
612 unsigned int value;
613
614 serial_icr_write(up, UART_ACR, up->acr | UART_ACR_ICRRD);
615 serial_out(up, UART_SCR, offset);
616 value = serial_in(up, UART_ICR);
617 serial_icr_write(up, UART_ACR, up->acr);
618
619 return value;
620}
621
622/*
623 * FIFO support.
624 */
Will Newtonb5d674a2008-10-13 10:36:21 +0100625static void serial8250_clear_fifos(struct uart_8250_port *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700626{
627 if (p->capabilities & UART_CAP_FIFO) {
628 serial_outp(p, UART_FCR, UART_FCR_ENABLE_FIFO);
629 serial_outp(p, UART_FCR, UART_FCR_ENABLE_FIFO |
630 UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
631 serial_outp(p, UART_FCR, 0);
632 }
633}
634
635/*
636 * IER sleep support. UARTs which have EFRs need the "extended
637 * capability" bit enabled. Note that on XR16C850s, we need to
638 * reset LCR to write to IER.
639 */
Will Newtonb5d674a2008-10-13 10:36:21 +0100640static void serial8250_set_sleep(struct uart_8250_port *p, int sleep)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700641{
642 if (p->capabilities & UART_CAP_SLEEP) {
643 if (p->capabilities & UART_CAP_EFR) {
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -0800644 serial_outp(p, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700645 serial_outp(p, UART_EFR, UART_EFR_ECB);
646 serial_outp(p, UART_LCR, 0);
647 }
648 serial_outp(p, UART_IER, sleep ? UART_IERX_SLEEP : 0);
649 if (p->capabilities & UART_CAP_EFR) {
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -0800650 serial_outp(p, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700651 serial_outp(p, UART_EFR, 0);
652 serial_outp(p, UART_LCR, 0);
653 }
654 }
655}
656
657#ifdef CONFIG_SERIAL_8250_RSA
658/*
659 * Attempts to turn on the RSA FIFO. Returns zero on failure.
660 * We set the port uart clock rate if we succeed.
661 */
662static int __enable_rsa(struct uart_8250_port *up)
663{
664 unsigned char mode;
665 int result;
666
667 mode = serial_inp(up, UART_RSA_MSR);
668 result = mode & UART_RSA_MSR_FIFO;
669
670 if (!result) {
671 serial_outp(up, UART_RSA_MSR, mode | UART_RSA_MSR_FIFO);
672 mode = serial_inp(up, UART_RSA_MSR);
673 result = mode & UART_RSA_MSR_FIFO;
674 }
675
676 if (result)
677 up->port.uartclk = SERIAL_RSA_BAUD_BASE * 16;
678
679 return result;
680}
681
682static void enable_rsa(struct uart_8250_port *up)
683{
684 if (up->port.type == PORT_RSA) {
685 if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) {
686 spin_lock_irq(&up->port.lock);
687 __enable_rsa(up);
688 spin_unlock_irq(&up->port.lock);
689 }
690 if (up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16)
691 serial_outp(up, UART_RSA_FRR, 0);
692 }
693}
694
695/*
696 * Attempts to turn off the RSA FIFO. Returns zero on failure.
697 * It is unknown why interrupts were disabled in here. However,
698 * the caller is expected to preserve this behaviour by grabbing
699 * the spinlock before calling this function.
700 */
701static void disable_rsa(struct uart_8250_port *up)
702{
703 unsigned char mode;
704 int result;
705
706 if (up->port.type == PORT_RSA &&
707 up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) {
708 spin_lock_irq(&up->port.lock);
709
710 mode = serial_inp(up, UART_RSA_MSR);
711 result = !(mode & UART_RSA_MSR_FIFO);
712
713 if (!result) {
714 serial_outp(up, UART_RSA_MSR, mode & ~UART_RSA_MSR_FIFO);
715 mode = serial_inp(up, UART_RSA_MSR);
716 result = !(mode & UART_RSA_MSR_FIFO);
717 }
718
719 if (result)
720 up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16;
721 spin_unlock_irq(&up->port.lock);
722 }
723}
724#endif /* CONFIG_SERIAL_8250_RSA */
725
726/*
727 * This is a quickie test to see how big the FIFO is.
728 * It doesn't work at all the time, more's the pity.
729 */
730static int size_fifo(struct uart_8250_port *up)
731{
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100732 unsigned char old_fcr, old_mcr, old_lcr;
733 unsigned short old_dl;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700734 int count;
735
736 old_lcr = serial_inp(up, UART_LCR);
737 serial_outp(up, UART_LCR, 0);
738 old_fcr = serial_inp(up, UART_FCR);
739 old_mcr = serial_inp(up, UART_MCR);
740 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO |
741 UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
742 serial_outp(up, UART_MCR, UART_MCR_LOOP);
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -0800743 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_A);
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100744 old_dl = serial_dl_read(up);
745 serial_dl_write(up, 0x0001);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700746 serial_outp(up, UART_LCR, 0x03);
747 for (count = 0; count < 256; count++)
748 serial_outp(up, UART_TX, count);
749 mdelay(20);/* FIXME - schedule_timeout */
750 for (count = 0; (serial_inp(up, UART_LSR) & UART_LSR_DR) &&
751 (count < 256); count++)
752 serial_inp(up, UART_RX);
753 serial_outp(up, UART_FCR, old_fcr);
754 serial_outp(up, UART_MCR, old_mcr);
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -0800755 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_A);
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100756 serial_dl_write(up, old_dl);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700757 serial_outp(up, UART_LCR, old_lcr);
758
759 return count;
760}
761
762/*
763 * Read UART ID using the divisor method - set DLL and DLM to zero
764 * and the revision will be in DLL and device type in DLM. We
765 * preserve the device state across this.
766 */
767static unsigned int autoconfig_read_divisor_id(struct uart_8250_port *p)
768{
769 unsigned char old_dll, old_dlm, old_lcr;
770 unsigned int id;
771
772 old_lcr = serial_inp(p, UART_LCR);
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -0800773 serial_outp(p, UART_LCR, UART_LCR_CONF_MODE_A);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700774
775 old_dll = serial_inp(p, UART_DLL);
776 old_dlm = serial_inp(p, UART_DLM);
777
778 serial_outp(p, UART_DLL, 0);
779 serial_outp(p, UART_DLM, 0);
780
781 id = serial_inp(p, UART_DLL) | serial_inp(p, UART_DLM) << 8;
782
783 serial_outp(p, UART_DLL, old_dll);
784 serial_outp(p, UART_DLM, old_dlm);
785 serial_outp(p, UART_LCR, old_lcr);
786
787 return id;
788}
789
790/*
791 * This is a helper routine to autodetect StarTech/Exar/Oxsemi UART's.
792 * When this function is called we know it is at least a StarTech
793 * 16650 V2, but it might be one of several StarTech UARTs, or one of
794 * its clones. (We treat the broken original StarTech 16650 V1 as a
795 * 16550, and why not? Startech doesn't seem to even acknowledge its
796 * existence.)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700797 *
Linus Torvalds1da177e2005-04-16 15:20:36 -0700798 * What evil have men's minds wrought...
799 */
800static void autoconfig_has_efr(struct uart_8250_port *up)
801{
802 unsigned int id1, id2, id3, rev;
803
804 /*
805 * Everything with an EFR has SLEEP
806 */
807 up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP;
808
809 /*
810 * First we check to see if it's an Oxford Semiconductor UART.
811 *
812 * If we have to do this here because some non-National
813 * Semiconductor clone chips lock up if you try writing to the
814 * LSR register (which serial_icr_read does)
815 */
816
817 /*
818 * Check for Oxford Semiconductor 16C950.
819 *
820 * EFR [4] must be set else this test fails.
821 *
822 * This shouldn't be necessary, but Mike Hudson (Exoray@isys.ca)
823 * claims that it's needed for 952 dual UART's (which are not
824 * recommended for new designs).
825 */
826 up->acr = 0;
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -0800827 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700828 serial_out(up, UART_EFR, UART_EFR_ECB);
829 serial_out(up, UART_LCR, 0x00);
830 id1 = serial_icr_read(up, UART_ID1);
831 id2 = serial_icr_read(up, UART_ID2);
832 id3 = serial_icr_read(up, UART_ID3);
833 rev = serial_icr_read(up, UART_REV);
834
835 DEBUG_AUTOCONF("950id=%02x:%02x:%02x:%02x ", id1, id2, id3, rev);
836
837 if (id1 == 0x16 && id2 == 0xC9 &&
838 (id3 == 0x50 || id3 == 0x52 || id3 == 0x54)) {
839 up->port.type = PORT_16C950;
Russell King4ba5e352005-06-23 10:43:04 +0100840
841 /*
842 * Enable work around for the Oxford Semiconductor 952 rev B
843 * chip which causes it to seriously miscalculate baud rates
844 * when DLL is 0.
845 */
846 if (id3 == 0x52 && rev == 0x01)
847 up->bugs |= UART_BUG_QUOT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700848 return;
849 }
Thomas Koellerbd71c182007-05-06 14:48:47 -0700850
Linus Torvalds1da177e2005-04-16 15:20:36 -0700851 /*
852 * We check for a XR16C850 by setting DLL and DLM to 0, and then
853 * reading back DLL and DLM. The chip type depends on the DLM
854 * value read back:
855 * 0x10 - XR16C850 and the DLL contains the chip revision.
856 * 0x12 - XR16C2850.
857 * 0x14 - XR16C854.
858 */
859 id1 = autoconfig_read_divisor_id(up);
860 DEBUG_AUTOCONF("850id=%04x ", id1);
861
862 id2 = id1 >> 8;
863 if (id2 == 0x10 || id2 == 0x12 || id2 == 0x14) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700864 up->port.type = PORT_16850;
865 return;
866 }
867
868 /*
869 * It wasn't an XR16C850.
870 *
871 * We distinguish between the '654 and the '650 by counting
872 * how many bytes are in the FIFO. I'm using this for now,
873 * since that's the technique that was sent to me in the
874 * serial driver update, but I'm not convinced this works.
875 * I've had problems doing this in the past. -TYT
876 */
877 if (size_fifo(up) == 64)
878 up->port.type = PORT_16654;
879 else
880 up->port.type = PORT_16650V2;
881}
882
883/*
884 * We detected a chip without a FIFO. Only two fall into
885 * this category - the original 8250 and the 16450. The
886 * 16450 has a scratch register (accessible with LCR=0)
887 */
888static void autoconfig_8250(struct uart_8250_port *up)
889{
890 unsigned char scratch, status1, status2;
891
892 up->port.type = PORT_8250;
893
894 scratch = serial_in(up, UART_SCR);
895 serial_outp(up, UART_SCR, 0xa5);
896 status1 = serial_in(up, UART_SCR);
897 serial_outp(up, UART_SCR, 0x5a);
898 status2 = serial_in(up, UART_SCR);
899 serial_outp(up, UART_SCR, scratch);
900
901 if (status1 == 0xa5 && status2 == 0x5a)
902 up->port.type = PORT_16450;
903}
904
905static int broken_efr(struct uart_8250_port *up)
906{
907 /*
908 * Exar ST16C2550 "A2" devices incorrectly detect as
909 * having an EFR, and report an ID of 0x0201. See
Justin P. Mattock631dd1a2010-10-18 11:03:14 +0200910 * http://linux.derkeiler.com/Mailing-Lists/Kernel/2004-11/4812.html
Linus Torvalds1da177e2005-04-16 15:20:36 -0700911 */
912 if (autoconfig_read_divisor_id(up) == 0x0201 && size_fifo(up) == 16)
913 return 1;
914
915 return 0;
916}
917
Yin Kangkai0d0389e2011-02-09 11:35:18 +0800918static inline int ns16550a_goto_highspeed(struct uart_8250_port *up)
919{
920 unsigned char status;
921
922 status = serial_in(up, 0x04); /* EXCR2 */
923#define PRESL(x) ((x) & 0x30)
924 if (PRESL(status) == 0x10) {
925 /* already in high speed mode */
926 return 0;
927 } else {
928 status &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */
929 status |= 0x10; /* 1.625 divisor for baud_base --> 921600 */
930 serial_outp(up, 0x04, status);
931 }
932 return 1;
933}
934
Linus Torvalds1da177e2005-04-16 15:20:36 -0700935/*
936 * We know that the chip has FIFOs. Does it have an EFR? The
937 * EFR is located in the same register position as the IIR and
938 * we know the top two bits of the IIR are currently set. The
939 * EFR should contain zero. Try to read the EFR.
940 */
941static void autoconfig_16550a(struct uart_8250_port *up)
942{
943 unsigned char status1, status2;
944 unsigned int iersave;
945
946 up->port.type = PORT_16550A;
947 up->capabilities |= UART_CAP_FIFO;
948
949 /*
950 * Check for presence of the EFR when DLAB is set.
951 * Only ST16C650V1 UARTs pass this test.
952 */
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -0800953 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_A);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700954 if (serial_in(up, UART_EFR) == 0) {
955 serial_outp(up, UART_EFR, 0xA8);
956 if (serial_in(up, UART_EFR) != 0) {
957 DEBUG_AUTOCONF("EFRv1 ");
958 up->port.type = PORT_16650;
959 up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP;
960 } else {
961 DEBUG_AUTOCONF("Motorola 8xxx DUART ");
962 }
963 serial_outp(up, UART_EFR, 0);
964 return;
965 }
966
967 /*
968 * Maybe it requires 0xbf to be written to the LCR.
969 * (other ST16C650V2 UARTs, TI16C752A, etc)
970 */
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -0800971 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700972 if (serial_in(up, UART_EFR) == 0 && !broken_efr(up)) {
973 DEBUG_AUTOCONF("EFRv2 ");
974 autoconfig_has_efr(up);
975 return;
976 }
977
978 /*
979 * Check for a National Semiconductor SuperIO chip.
980 * Attempt to switch to bank 2, read the value of the LOOP bit
981 * from EXCR1. Switch back to bank 0, change it in MCR. Then
982 * switch back to bank 2, read it from EXCR1 again and check
983 * it's changed. If so, set baud_base in EXCR2 to 921600. -- dwmw2
Linus Torvalds1da177e2005-04-16 15:20:36 -0700984 */
985 serial_outp(up, UART_LCR, 0);
986 status1 = serial_in(up, UART_MCR);
987 serial_outp(up, UART_LCR, 0xE0);
988 status2 = serial_in(up, 0x02); /* EXCR1 */
989
990 if (!((status2 ^ status1) & UART_MCR_LOOP)) {
991 serial_outp(up, UART_LCR, 0);
992 serial_outp(up, UART_MCR, status1 ^ UART_MCR_LOOP);
993 serial_outp(up, UART_LCR, 0xE0);
994 status2 = serial_in(up, 0x02); /* EXCR1 */
995 serial_outp(up, UART_LCR, 0);
996 serial_outp(up, UART_MCR, status1);
997
998 if ((status2 ^ status1) & UART_MCR_LOOP) {
David Woodhouse857dde22005-05-21 15:52:23 +0100999 unsigned short quot;
1000
Linus Torvalds1da177e2005-04-16 15:20:36 -07001001 serial_outp(up, UART_LCR, 0xE0);
David Woodhouse857dde22005-05-21 15:52:23 +01001002
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +01001003 quot = serial_dl_read(up);
David Woodhouse857dde22005-05-21 15:52:23 +01001004 quot <<= 3;
1005
Yin Kangkai0d0389e2011-02-09 11:35:18 +08001006 if (ns16550a_goto_highspeed(up))
1007 serial_dl_write(up, quot);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001008
David Woodhouse857dde22005-05-21 15:52:23 +01001009 serial_outp(up, UART_LCR, 0);
1010
1011 up->port.uartclk = 921600*16;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001012 up->port.type = PORT_NS16550A;
1013 up->capabilities |= UART_NATSEMI;
1014 return;
1015 }
1016 }
1017
1018 /*
1019 * No EFR. Try to detect a TI16750, which only sets bit 5 of
1020 * the IIR when 64 byte FIFO mode is enabled when DLAB is set.
1021 * Try setting it with and without DLAB set. Cheap clones
1022 * set bit 5 without DLAB set.
1023 */
1024 serial_outp(up, UART_LCR, 0);
1025 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE);
1026 status1 = serial_in(up, UART_IIR) >> 5;
1027 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO);
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -08001028 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_A);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001029 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE);
1030 status2 = serial_in(up, UART_IIR) >> 5;
1031 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO);
1032 serial_outp(up, UART_LCR, 0);
1033
1034 DEBUG_AUTOCONF("iir1=%d iir2=%d ", status1, status2);
1035
1036 if (status1 == 6 && status2 == 7) {
1037 up->port.type = PORT_16750;
1038 up->capabilities |= UART_CAP_AFE | UART_CAP_SLEEP;
1039 return;
1040 }
1041
1042 /*
1043 * Try writing and reading the UART_IER_UUE bit (b6).
1044 * If it works, this is probably one of the Xscale platform's
1045 * internal UARTs.
1046 * We're going to explicitly set the UUE bit to 0 before
1047 * trying to write and read a 1 just to make sure it's not
1048 * already a 1 and maybe locked there before we even start start.
1049 */
1050 iersave = serial_in(up, UART_IER);
1051 serial_outp(up, UART_IER, iersave & ~UART_IER_UUE);
1052 if (!(serial_in(up, UART_IER) & UART_IER_UUE)) {
1053 /*
1054 * OK it's in a known zero state, try writing and reading
1055 * without disturbing the current state of the other bits.
1056 */
1057 serial_outp(up, UART_IER, iersave | UART_IER_UUE);
1058 if (serial_in(up, UART_IER) & UART_IER_UUE) {
1059 /*
1060 * It's an Xscale.
1061 * We'll leave the UART_IER_UUE bit set to 1 (enabled).
1062 */
1063 DEBUG_AUTOCONF("Xscale ");
1064 up->port.type = PORT_XSCALE;
Stephen Warren55681812011-06-17 09:45:07 -06001065 up->capabilities |= UART_CAP_UUE | UART_CAP_RTOIE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001066 return;
1067 }
1068 } else {
1069 /*
1070 * If we got here we couldn't force the IER_UUE bit to 0.
1071 * Log it and continue.
1072 */
1073 DEBUG_AUTOCONF("Couldn't force IER_UUE to 0 ");
1074 }
1075 serial_outp(up, UART_IER, iersave);
Philippe Langlais235dae52010-07-29 17:13:57 +02001076
1077 /*
1078 * We distinguish between 16550A and U6 16550A by counting
1079 * how many bytes are in the FIFO.
1080 */
1081 if (up->port.type == PORT_16550A && size_fifo(up) == 64) {
1082 up->port.type = PORT_U6_16550A;
1083 up->capabilities |= UART_CAP_AFE;
1084 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001085}
1086
1087/*
1088 * This routine is called by rs_init() to initialize a specific serial
1089 * port. It determines what type of UART chip this serial port is
1090 * using: 8250, 16450, 16550, 16550A. The important question is
1091 * whether or not this UART is a 16550A or not, since this will
1092 * determine whether or not we can use its FIFO features or not.
1093 */
1094static void autoconfig(struct uart_8250_port *up, unsigned int probeflags)
1095{
1096 unsigned char status1, scratch, scratch2, scratch3;
1097 unsigned char save_lcr, save_mcr;
1098 unsigned long flags;
1099
1100 if (!up->port.iobase && !up->port.mapbase && !up->port.membase)
1101 return;
1102
Lennert Buytenhek80647b92009-11-11 14:26:41 -08001103 DEBUG_AUTOCONF("ttyS%d: autoconf (0x%04lx, 0x%p): ",
David S. Miller84408382008-10-13 10:45:26 +01001104 serial_index(&up->port), up->port.iobase, up->port.membase);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001105
1106 /*
1107 * We really do need global IRQs disabled here - we're going to
1108 * be frobbing the chips IRQ enable register to see if it exists.
1109 */
1110 spin_lock_irqsave(&up->port.lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001111
1112 up->capabilities = 0;
Russell King4ba5e352005-06-23 10:43:04 +01001113 up->bugs = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001114
1115 if (!(up->port.flags & UPF_BUGGY_UART)) {
1116 /*
1117 * Do a simple existence test first; if we fail this,
1118 * there's no point trying anything else.
Thomas Koellerbd71c182007-05-06 14:48:47 -07001119 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001120 * 0x80 is used as a nonsense port to prevent against
1121 * false positives due to ISA bus float. The
1122 * assumption is that 0x80 is a non-existent port;
1123 * which should be safe since include/asm/io.h also
1124 * makes this assumption.
1125 *
1126 * Note: this is safe as long as MCR bit 4 is clear
1127 * and the device is in "PC" mode.
1128 */
1129 scratch = serial_inp(up, UART_IER);
1130 serial_outp(up, UART_IER, 0);
1131#ifdef __i386__
1132 outb(0xff, 0x080);
1133#endif
Thomas Hoehn48212002007-02-10 01:46:05 -08001134 /*
1135 * Mask out IER[7:4] bits for test as some UARTs (e.g. TL
1136 * 16C754B) allow only to modify them if an EFR bit is set.
1137 */
1138 scratch2 = serial_inp(up, UART_IER) & 0x0f;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001139 serial_outp(up, UART_IER, 0x0F);
1140#ifdef __i386__
1141 outb(0, 0x080);
1142#endif
Thomas Hoehn48212002007-02-10 01:46:05 -08001143 scratch3 = serial_inp(up, UART_IER) & 0x0f;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001144 serial_outp(up, UART_IER, scratch);
1145 if (scratch2 != 0 || scratch3 != 0x0F) {
1146 /*
1147 * We failed; there's nothing here
1148 */
1149 DEBUG_AUTOCONF("IER test failed (%02x, %02x) ",
1150 scratch2, scratch3);
1151 goto out;
1152 }
1153 }
1154
1155 save_mcr = serial_in(up, UART_MCR);
1156 save_lcr = serial_in(up, UART_LCR);
1157
Thomas Koellerbd71c182007-05-06 14:48:47 -07001158 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001159 * Check to see if a UART is really there. Certain broken
1160 * internal modems based on the Rockwell chipset fail this
1161 * test, because they apparently don't implement the loopback
1162 * test mode. So this test is skipped on the COM 1 through
1163 * COM 4 ports. This *should* be safe, since no board
1164 * manufacturer would be stupid enough to design a board
1165 * that conflicts with COM 1-4 --- we hope!
1166 */
1167 if (!(up->port.flags & UPF_SKIP_TEST)) {
1168 serial_outp(up, UART_MCR, UART_MCR_LOOP | 0x0A);
1169 status1 = serial_inp(up, UART_MSR) & 0xF0;
1170 serial_outp(up, UART_MCR, save_mcr);
1171 if (status1 != 0x90) {
1172 DEBUG_AUTOCONF("LOOP test failed (%02x) ",
1173 status1);
1174 goto out;
1175 }
1176 }
1177
1178 /*
1179 * We're pretty sure there's a port here. Lets find out what
1180 * type of port it is. The IIR top two bits allows us to find
Russell King6f0d6182005-09-09 16:17:58 +01001181 * out if it's 8250 or 16450, 16550, 16550A or later. This
Linus Torvalds1da177e2005-04-16 15:20:36 -07001182 * determines what we test for next.
1183 *
1184 * We also initialise the EFR (if any) to zero for later. The
1185 * EFR occupies the same register location as the FCR and IIR.
1186 */
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -08001187 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001188 serial_outp(up, UART_EFR, 0);
1189 serial_outp(up, UART_LCR, 0);
1190
1191 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO);
1192 scratch = serial_in(up, UART_IIR) >> 6;
1193
1194 DEBUG_AUTOCONF("iir=%d ", scratch);
1195
1196 switch (scratch) {
1197 case 0:
1198 autoconfig_8250(up);
1199 break;
1200 case 1:
1201 up->port.type = PORT_UNKNOWN;
1202 break;
1203 case 2:
1204 up->port.type = PORT_16550;
1205 break;
1206 case 3:
1207 autoconfig_16550a(up);
1208 break;
1209 }
1210
1211#ifdef CONFIG_SERIAL_8250_RSA
1212 /*
1213 * Only probe for RSA ports if we got the region.
1214 */
1215 if (up->port.type == PORT_16550A && probeflags & PROBE_RSA) {
1216 int i;
1217
1218 for (i = 0 ; i < probe_rsa_count; ++i) {
1219 if (probe_rsa[i] == up->port.iobase &&
1220 __enable_rsa(up)) {
1221 up->port.type = PORT_RSA;
1222 break;
1223 }
1224 }
1225 }
1226#endif
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00001227
Linus Torvalds1da177e2005-04-16 15:20:36 -07001228 serial_outp(up, UART_LCR, save_lcr);
1229
1230 if (up->capabilities != uart_config[up->port.type].flags) {
1231 printk(KERN_WARNING
1232 "ttyS%d: detected caps %08x should be %08x\n",
David S. Miller84408382008-10-13 10:45:26 +01001233 serial_index(&up->port), up->capabilities,
1234 uart_config[up->port.type].flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001235 }
1236
1237 up->port.fifosize = uart_config[up->port.type].fifo_size;
1238 up->capabilities = uart_config[up->port.type].flags;
1239 up->tx_loadsz = uart_config[up->port.type].tx_loadsz;
1240
1241 if (up->port.type == PORT_UNKNOWN)
1242 goto out;
1243
1244 /*
1245 * Reset the UART.
1246 */
1247#ifdef CONFIG_SERIAL_8250_RSA
1248 if (up->port.type == PORT_RSA)
1249 serial_outp(up, UART_RSA_FRR, 0);
1250#endif
1251 serial_outp(up, UART_MCR, save_mcr);
1252 serial8250_clear_fifos(up);
Alex Williamson40b36da2007-02-14 00:33:04 -08001253 serial_in(up, UART_RX);
Lennert Buytenhek5c8c7552005-11-12 21:58:05 +00001254 if (up->capabilities & UART_CAP_UUE)
1255 serial_outp(up, UART_IER, UART_IER_UUE);
1256 else
1257 serial_outp(up, UART_IER, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001258
Thomas Koellerbd71c182007-05-06 14:48:47 -07001259 out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001260 spin_unlock_irqrestore(&up->port.lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001261 DEBUG_AUTOCONF("type=%s\n", uart_config[up->port.type].name);
1262}
1263
1264static void autoconfig_irq(struct uart_8250_port *up)
1265{
1266 unsigned char save_mcr, save_ier;
1267 unsigned char save_ICP = 0;
1268 unsigned int ICP = 0;
1269 unsigned long irqs;
1270 int irq;
1271
1272 if (up->port.flags & UPF_FOURPORT) {
1273 ICP = (up->port.iobase & 0xfe0) | 0x1f;
1274 save_ICP = inb_p(ICP);
1275 outb_p(0x80, ICP);
1276 (void) inb_p(ICP);
1277 }
1278
1279 /* forget possible initially masked and pending IRQ */
1280 probe_irq_off(probe_irq_on());
1281 save_mcr = serial_inp(up, UART_MCR);
1282 save_ier = serial_inp(up, UART_IER);
1283 serial_outp(up, UART_MCR, UART_MCR_OUT1 | UART_MCR_OUT2);
Thomas Koellerbd71c182007-05-06 14:48:47 -07001284
Linus Torvalds1da177e2005-04-16 15:20:36 -07001285 irqs = probe_irq_on();
1286 serial_outp(up, UART_MCR, 0);
Alan Cox6f803cd2008-02-08 04:18:52 -08001287 udelay(10);
1288 if (up->port.flags & UPF_FOURPORT) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001289 serial_outp(up, UART_MCR,
1290 UART_MCR_DTR | UART_MCR_RTS);
1291 } else {
1292 serial_outp(up, UART_MCR,
1293 UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2);
1294 }
1295 serial_outp(up, UART_IER, 0x0f); /* enable all intrs */
1296 (void)serial_inp(up, UART_LSR);
1297 (void)serial_inp(up, UART_RX);
1298 (void)serial_inp(up, UART_IIR);
1299 (void)serial_inp(up, UART_MSR);
1300 serial_outp(up, UART_TX, 0xFF);
Alan Cox6f803cd2008-02-08 04:18:52 -08001301 udelay(20);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001302 irq = probe_irq_off(irqs);
1303
1304 serial_outp(up, UART_MCR, save_mcr);
1305 serial_outp(up, UART_IER, save_ier);
1306
1307 if (up->port.flags & UPF_FOURPORT)
1308 outb_p(save_ICP, ICP);
1309
1310 up->port.irq = (irq > 0) ? irq : 0;
1311}
1312
Russell Kinge763b902005-06-29 18:41:51 +01001313static inline void __stop_tx(struct uart_8250_port *p)
1314{
1315 if (p->ier & UART_IER_THRI) {
1316 p->ier &= ~UART_IER_THRI;
1317 serial_out(p, UART_IER, p->ier);
1318 }
1319}
1320
Russell Kingb129a8c2005-08-31 10:12:14 +01001321static void serial8250_stop_tx(struct uart_port *port)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001322{
Jamie Iles49d57412010-12-01 23:39:35 +00001323 struct uart_8250_port *up =
1324 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001325
Russell Kinge763b902005-06-29 18:41:51 +01001326 __stop_tx(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001327
1328 /*
Russell Kinge763b902005-06-29 18:41:51 +01001329 * We really want to stop the transmitter from sending.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001330 */
Russell Kinge763b902005-06-29 18:41:51 +01001331 if (up->port.type == PORT_16C950) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001332 up->acr |= UART_ACR_TXDIS;
1333 serial_icr_write(up, UART_ACR, up->acr);
1334 }
1335}
1336
Russell King55d3b282005-06-23 15:05:41 +01001337static void transmit_chars(struct uart_8250_port *up);
1338
Russell Kingb129a8c2005-08-31 10:12:14 +01001339static void serial8250_start_tx(struct uart_port *port)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001340{
Jamie Iles49d57412010-12-01 23:39:35 +00001341 struct uart_8250_port *up =
1342 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001343
1344 if (!(up->ier & UART_IER_THRI)) {
1345 up->ier |= UART_IER_THRI;
1346 serial_out(up, UART_IER, up->ier);
Russell King55d3b282005-06-23 15:05:41 +01001347
Russell King67f76542005-06-23 22:26:43 +01001348 if (up->bugs & UART_BUG_TXEN) {
Ian Jackson68cb4f82009-11-18 11:08:11 +01001349 unsigned char lsr;
Russell King55d3b282005-06-23 15:05:41 +01001350 lsr = serial_in(up, UART_LSR);
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001351 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
Thomas Koellerbd71c182007-05-06 14:48:47 -07001352 if ((up->port.type == PORT_RM9000) ?
Ian Jackson68cb4f82009-11-18 11:08:11 +01001353 (lsr & UART_LSR_THRE) :
1354 (lsr & UART_LSR_TEMT))
Russell King55d3b282005-06-23 15:05:41 +01001355 transmit_chars(up);
1356 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001357 }
Russell Kinge763b902005-06-29 18:41:51 +01001358
Linus Torvalds1da177e2005-04-16 15:20:36 -07001359 /*
Russell Kinge763b902005-06-29 18:41:51 +01001360 * Re-enable the transmitter if we disabled it.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001361 */
Russell Kinge763b902005-06-29 18:41:51 +01001362 if (up->port.type == PORT_16C950 && up->acr & UART_ACR_TXDIS) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001363 up->acr &= ~UART_ACR_TXDIS;
1364 serial_icr_write(up, UART_ACR, up->acr);
1365 }
1366}
1367
1368static void serial8250_stop_rx(struct uart_port *port)
1369{
Jamie Iles49d57412010-12-01 23:39:35 +00001370 struct uart_8250_port *up =
1371 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001372
1373 up->ier &= ~UART_IER_RLSI;
1374 up->port.read_status_mask &= ~UART_LSR_DR;
1375 serial_out(up, UART_IER, up->ier);
1376}
1377
1378static void serial8250_enable_ms(struct uart_port *port)
1379{
Jamie Iles49d57412010-12-01 23:39:35 +00001380 struct uart_8250_port *up =
1381 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001382
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00001383 /* no MSR capabilities */
1384 if (up->bugs & UART_BUG_NOMSR)
1385 return;
1386
Linus Torvalds1da177e2005-04-16 15:20:36 -07001387 up->ier |= UART_IER_MSI;
1388 serial_out(up, UART_IER, up->ier);
1389}
1390
Stephen Warren5f873ba2011-05-17 16:12:37 -06001391/*
1392 * Clear the Tegra rx fifo after a break
1393 *
1394 * FIXME: This needs to become a port specific callback once we have a
1395 * framework for this
1396 */
1397static void clear_rx_fifo(struct uart_8250_port *up)
1398{
1399 unsigned int status, tmout = 10000;
1400 do {
1401 status = serial_in(up, UART_LSR);
1402 if (status & (UART_LSR_FIFOE | UART_LSR_BRK_ERROR_BITS))
1403 status = serial_in(up, UART_RX);
1404 else
1405 break;
1406 if (--tmout == 0)
1407 break;
1408 udelay(1);
1409 } while (1);
1410}
1411
Russell Kingea8874d2006-01-04 19:43:24 +00001412static void
Thomas Koellercc79aa92007-02-20 13:58:05 -08001413receive_chars(struct uart_8250_port *up, unsigned int *status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001414{
Alan Coxebd2c8f2009-09-19 13:13:28 -07001415 struct tty_struct *tty = up->port.state->port.tty;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001416 unsigned char ch, lsr = *status;
1417 int max_count = 256;
1418 char flag;
1419
1420 do {
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001421 if (likely(lsr & UART_LSR_DR))
1422 ch = serial_inp(up, UART_RX);
1423 else
1424 /*
1425 * Intel 82571 has a Serial Over Lan device that will
1426 * set UART_LSR_BI without setting UART_LSR_DR when
1427 * it receives a break. To avoid reading from the
1428 * receive buffer without UART_LSR_DR bit set, we
1429 * just force the read character to be 0
1430 */
1431 ch = 0;
1432
Linus Torvalds1da177e2005-04-16 15:20:36 -07001433 flag = TTY_NORMAL;
1434 up->port.icount.rx++;
1435
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001436 lsr |= up->lsr_saved_flags;
1437 up->lsr_saved_flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001438
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001439 if (unlikely(lsr & UART_LSR_BRK_ERROR_BITS)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001440 /*
1441 * For statistics only
1442 */
1443 if (lsr & UART_LSR_BI) {
1444 lsr &= ~(UART_LSR_FE | UART_LSR_PE);
1445 up->port.icount.brk++;
1446 /*
Stephen Warren5f873ba2011-05-17 16:12:37 -06001447 * If tegra port then clear the rx fifo to
1448 * accept another break/character.
1449 */
1450 if (up->port.type == PORT_TEGRA)
1451 clear_rx_fifo(up);
1452
1453 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001454 * We do the SysRQ and SAK checking
1455 * here because otherwise the break
1456 * may get masked by ignore_status_mask
1457 * or read_status_mask.
1458 */
1459 if (uart_handle_break(&up->port))
1460 goto ignore_char;
1461 } else if (lsr & UART_LSR_PE)
1462 up->port.icount.parity++;
1463 else if (lsr & UART_LSR_FE)
1464 up->port.icount.frame++;
1465 if (lsr & UART_LSR_OE)
1466 up->port.icount.overrun++;
1467
1468 /*
Russell King23907eb2005-04-16 15:26:39 -07001469 * Mask off conditions which should be ignored.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001470 */
1471 lsr &= up->port.read_status_mask;
1472
1473 if (lsr & UART_LSR_BI) {
1474 DEBUG_INTR("handling break....");
1475 flag = TTY_BREAK;
1476 } else if (lsr & UART_LSR_PE)
1477 flag = TTY_PARITY;
1478 else if (lsr & UART_LSR_FE)
1479 flag = TTY_FRAME;
1480 }
David Howells7d12e782006-10-05 14:55:46 +01001481 if (uart_handle_sysrq_char(&up->port, ch))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001482 goto ignore_char;
Russell King05ab3012005-05-09 23:21:59 +01001483
1484 uart_insert_char(&up->port, lsr, UART_LSR_OE, ch, flag);
1485
Alan Cox6f803cd2008-02-08 04:18:52 -08001486ignore_char:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001487 lsr = serial_inp(up, UART_LSR);
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001488 } while ((lsr & (UART_LSR_DR | UART_LSR_BI)) && (max_count-- > 0));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001489 spin_unlock(&up->port.lock);
1490 tty_flip_buffer_push(tty);
1491 spin_lock(&up->port.lock);
1492 *status = lsr;
1493}
1494
Russell Kingea8874d2006-01-04 19:43:24 +00001495static void transmit_chars(struct uart_8250_port *up)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001496{
Alan Coxebd2c8f2009-09-19 13:13:28 -07001497 struct circ_buf *xmit = &up->port.state->xmit;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001498 int count;
1499
1500 if (up->port.x_char) {
1501 serial_outp(up, UART_TX, up->port.x_char);
1502 up->port.icount.tx++;
1503 up->port.x_char = 0;
1504 return;
1505 }
Russell Kingb129a8c2005-08-31 10:12:14 +01001506 if (uart_tx_stopped(&up->port)) {
1507 serial8250_stop_tx(&up->port);
1508 return;
1509 }
1510 if (uart_circ_empty(xmit)) {
Russell Kinge763b902005-06-29 18:41:51 +01001511 __stop_tx(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001512 return;
1513 }
1514
1515 count = up->tx_loadsz;
1516 do {
1517 serial_out(up, UART_TX, xmit->buf[xmit->tail]);
1518 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
1519 up->port.icount.tx++;
1520 if (uart_circ_empty(xmit))
1521 break;
1522 } while (--count > 0);
1523
1524 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
1525 uart_write_wakeup(&up->port);
1526
1527 DEBUG_INTR("THRE...");
1528
1529 if (uart_circ_empty(xmit))
Russell Kinge763b902005-06-29 18:41:51 +01001530 __stop_tx(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001531}
1532
Russell King2af7cd62006-01-04 16:55:09 +00001533static unsigned int check_modem_status(struct uart_8250_port *up)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001534{
Russell King2af7cd62006-01-04 16:55:09 +00001535 unsigned int status = serial_in(up, UART_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001536
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001537 status |= up->msr_saved_flags;
1538 up->msr_saved_flags = 0;
Taku Izumifdc30b32007-04-23 14:41:00 -07001539 if (status & UART_MSR_ANY_DELTA && up->ier & UART_IER_MSI &&
Alan Coxebd2c8f2009-09-19 13:13:28 -07001540 up->port.state != NULL) {
Russell King2af7cd62006-01-04 16:55:09 +00001541 if (status & UART_MSR_TERI)
1542 up->port.icount.rng++;
1543 if (status & UART_MSR_DDSR)
1544 up->port.icount.dsr++;
1545 if (status & UART_MSR_DDCD)
1546 uart_handle_dcd_change(&up->port, status & UART_MSR_DCD);
1547 if (status & UART_MSR_DCTS)
1548 uart_handle_cts_change(&up->port, status & UART_MSR_CTS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001549
Alan Coxbdc04e32009-09-19 13:13:31 -07001550 wake_up_interruptible(&up->port.state->port.delta_msr_wait);
Russell King2af7cd62006-01-04 16:55:09 +00001551 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001552
Russell King2af7cd62006-01-04 16:55:09 +00001553 return status;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001554}
1555
1556/*
1557 * This handles the interrupt from one port.
1558 */
Will Newtonb5d674a2008-10-13 10:36:21 +01001559static void serial8250_handle_port(struct uart_8250_port *up)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001560{
Russell King45e24602006-01-04 19:19:06 +00001561 unsigned int status;
Jiri Kosina4bf36312007-04-23 14:41:21 -07001562 unsigned long flags;
Russell King45e24602006-01-04 19:19:06 +00001563
Jiri Kosina4bf36312007-04-23 14:41:21 -07001564 spin_lock_irqsave(&up->port.lock, flags);
Russell King45e24602006-01-04 19:19:06 +00001565
1566 status = serial_inp(up, UART_LSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001567
1568 DEBUG_INTR("status = %x...", status);
1569
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001570 if (status & (UART_LSR_DR | UART_LSR_BI))
David Howells7d12e782006-10-05 14:55:46 +01001571 receive_chars(up, &status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001572 check_modem_status(up);
1573 if (status & UART_LSR_THRE)
1574 transmit_chars(up);
Russell King45e24602006-01-04 19:19:06 +00001575
Jiri Kosina4bf36312007-04-23 14:41:21 -07001576 spin_unlock_irqrestore(&up->port.lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001577}
1578
Jamie Iles583d28e2011-08-15 10:17:52 +01001579int serial8250_handle_irq(struct uart_port *port, unsigned int iir)
1580{
1581 struct uart_8250_port *up =
1582 container_of(port, struct uart_8250_port, port);
1583
1584 if (!(iir & UART_IIR_NO_INT)) {
1585 serial8250_handle_port(up);
1586 return 1;
1587 }
1588
1589 return 0;
1590}
Jamie Ilesc7a1bdc2011-08-26 19:04:49 +01001591EXPORT_SYMBOL_GPL(serial8250_handle_irq);
Jamie Iles583d28e2011-08-15 10:17:52 +01001592
1593static int serial8250_default_handle_irq(struct uart_port *port)
1594{
1595 struct uart_8250_port *up =
1596 container_of(port, struct uart_8250_port, port);
1597 unsigned int iir = serial_in(up, UART_IIR);
1598
1599 return serial8250_handle_irq(port, iir);
1600}
1601
Linus Torvalds1da177e2005-04-16 15:20:36 -07001602/*
1603 * This is the serial driver's interrupt routine.
1604 *
1605 * Arjan thinks the old way was overly complex, so it got simplified.
1606 * Alan disagrees, saying that need the complexity to handle the weird
1607 * nature of ISA shared interrupts. (This is a special exception.)
1608 *
1609 * In order to handle ISA shared interrupts properly, we need to check
1610 * that all ports have been serviced, and therefore the ISA interrupt
1611 * line has been de-asserted.
1612 *
1613 * This means we need to loop through all ports. checking that they
1614 * don't have an interrupt pending.
1615 */
David Howells7d12e782006-10-05 14:55:46 +01001616static irqreturn_t serial8250_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001617{
1618 struct irq_info *i = dev_id;
1619 struct list_head *l, *end = NULL;
1620 int pass_counter = 0, handled = 0;
1621
1622 DEBUG_INTR("serial8250_interrupt(%d)...", irq);
1623
1624 spin_lock(&i->lock);
1625
1626 l = i->head;
1627 do {
1628 struct uart_8250_port *up;
Jamie Iles583d28e2011-08-15 10:17:52 +01001629 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001630
1631 up = list_entry(l, struct uart_8250_port, list);
Jamie Iles583d28e2011-08-15 10:17:52 +01001632 port = &up->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001633
Jamie Iles583d28e2011-08-15 10:17:52 +01001634 if (port->handle_irq(port)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001635 handled = 1;
Marc St-Jeanbeab6972007-05-06 14:48:45 -07001636 end = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001637 } else if (end == NULL)
1638 end = l;
1639
1640 l = l->next;
1641
1642 if (l == i->head && pass_counter++ > PASS_LIMIT) {
1643 /* If we hit this, we're dead. */
Daniel Drakecd3ecad2010-10-20 16:00:48 -07001644 printk_ratelimited(KERN_ERR
1645 "serial8250: too much work for irq%d\n", irq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001646 break;
1647 }
1648 } while (l != end);
1649
1650 spin_unlock(&i->lock);
1651
1652 DEBUG_INTR("end.\n");
1653
1654 return IRQ_RETVAL(handled);
1655}
1656
1657/*
1658 * To support ISA shared interrupts, we need to have one interrupt
1659 * handler that ensures that the IRQ line has been deasserted
1660 * before returning. Failing to do this will result in the IRQ
1661 * line being stuck active, and, since ISA irqs are edge triggered,
1662 * no more IRQs will be seen.
1663 */
1664static void serial_do_unlink(struct irq_info *i, struct uart_8250_port *up)
1665{
1666 spin_lock_irq(&i->lock);
1667
1668 if (!list_empty(i->head)) {
1669 if (i->head == &up->list)
1670 i->head = i->head->next;
1671 list_del(&up->list);
1672 } else {
1673 BUG_ON(i->head != &up->list);
1674 i->head = NULL;
1675 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001676 spin_unlock_irq(&i->lock);
Alan Cox25db8ad2008-08-19 20:49:40 -07001677 /* List empty so throw away the hash node */
1678 if (i->head == NULL) {
1679 hlist_del(&i->node);
1680 kfree(i);
1681 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001682}
1683
1684static int serial_link_irq_chain(struct uart_8250_port *up)
1685{
Alan Cox25db8ad2008-08-19 20:49:40 -07001686 struct hlist_head *h;
1687 struct hlist_node *n;
1688 struct irq_info *i;
Thomas Gleixner40663cc2006-07-01 19:29:43 -07001689 int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? IRQF_SHARED : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001690
Alan Cox25db8ad2008-08-19 20:49:40 -07001691 mutex_lock(&hash_mutex);
1692
1693 h = &irq_lists[up->port.irq % NR_IRQ_HASH];
1694
1695 hlist_for_each(n, h) {
1696 i = hlist_entry(n, struct irq_info, node);
1697 if (i->irq == up->port.irq)
1698 break;
1699 }
1700
1701 if (n == NULL) {
1702 i = kzalloc(sizeof(struct irq_info), GFP_KERNEL);
1703 if (i == NULL) {
1704 mutex_unlock(&hash_mutex);
1705 return -ENOMEM;
1706 }
1707 spin_lock_init(&i->lock);
1708 i->irq = up->port.irq;
1709 hlist_add_head(&i->node, h);
1710 }
1711 mutex_unlock(&hash_mutex);
1712
Linus Torvalds1da177e2005-04-16 15:20:36 -07001713 spin_lock_irq(&i->lock);
1714
1715 if (i->head) {
1716 list_add(&up->list, i->head);
1717 spin_unlock_irq(&i->lock);
1718
1719 ret = 0;
1720 } else {
1721 INIT_LIST_HEAD(&up->list);
1722 i->head = &up->list;
1723 spin_unlock_irq(&i->lock);
Vikram Pandita1c2f0492009-09-19 13:13:19 -07001724 irq_flags |= up->port.irqflags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001725 ret = request_irq(up->port.irq, serial8250_interrupt,
1726 irq_flags, "serial", i);
1727 if (ret < 0)
1728 serial_do_unlink(i, up);
1729 }
1730
1731 return ret;
1732}
1733
1734static void serial_unlink_irq_chain(struct uart_8250_port *up)
1735{
Alan Cox25db8ad2008-08-19 20:49:40 -07001736 struct irq_info *i;
1737 struct hlist_node *n;
1738 struct hlist_head *h;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001739
Alan Cox25db8ad2008-08-19 20:49:40 -07001740 mutex_lock(&hash_mutex);
1741
1742 h = &irq_lists[up->port.irq % NR_IRQ_HASH];
1743
1744 hlist_for_each(n, h) {
1745 i = hlist_entry(n, struct irq_info, node);
1746 if (i->irq == up->port.irq)
1747 break;
1748 }
1749
1750 BUG_ON(n == NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001751 BUG_ON(i->head == NULL);
1752
1753 if (list_empty(i->head))
1754 free_irq(up->port.irq, i);
1755
1756 serial_do_unlink(i, up);
Alan Cox25db8ad2008-08-19 20:49:40 -07001757 mutex_unlock(&hash_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001758}
1759
1760/*
1761 * This function is used to handle ports that do not have an
1762 * interrupt. This doesn't work very well for 16450's, but gives
1763 * barely passable results for a 16550A. (Although at the expense
1764 * of much CPU overhead).
1765 */
1766static void serial8250_timeout(unsigned long data)
1767{
1768 struct uart_8250_port *up = (struct uart_8250_port *)data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001769 unsigned int iir;
1770
1771 iir = serial_in(up, UART_IIR);
Russell King45e24602006-01-04 19:19:06 +00001772 if (!(iir & UART_IIR_NO_INT))
David Howells7d12e782006-10-05 14:55:46 +01001773 serial8250_handle_port(up);
Anton Vorontsov54381062010-10-01 17:21:25 +04001774 mod_timer(&up->timer, jiffies + uart_poll_timeout(&up->port));
Alex Williamson40b36da2007-02-14 00:33:04 -08001775}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001776
Alex Williamson40b36da2007-02-14 00:33:04 -08001777static void serial8250_backup_timeout(unsigned long data)
1778{
1779 struct uart_8250_port *up = (struct uart_8250_port *)data;
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001780 unsigned int iir, ier = 0, lsr;
1781 unsigned long flags;
Alex Williamson40b36da2007-02-14 00:33:04 -08001782
1783 /*
1784 * Must disable interrupts or else we risk racing with the interrupt
1785 * based handler.
1786 */
1787 if (is_real_interrupt(up->port.irq)) {
1788 ier = serial_in(up, UART_IER);
1789 serial_out(up, UART_IER, 0);
1790 }
1791
1792 iir = serial_in(up, UART_IIR);
1793
1794 /*
1795 * This should be a safe test for anyone who doesn't trust the
1796 * IIR bits on their UART, but it's specifically designed for
1797 * the "Diva" UART used on the management processor on many HP
1798 * ia64 and parisc boxes.
1799 */
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001800 spin_lock_irqsave(&up->port.lock, flags);
1801 lsr = serial_in(up, UART_LSR);
1802 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
1803 spin_unlock_irqrestore(&up->port.lock, flags);
Alex Williamson40b36da2007-02-14 00:33:04 -08001804 if ((iir & UART_IIR_NO_INT) && (up->ier & UART_IER_THRI) &&
Alan Coxebd2c8f2009-09-19 13:13:28 -07001805 (!uart_circ_empty(&up->port.state->xmit) || up->port.x_char) &&
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001806 (lsr & UART_LSR_THRE)) {
Alex Williamson40b36da2007-02-14 00:33:04 -08001807 iir &= ~(UART_IIR_ID | UART_IIR_NO_INT);
1808 iir |= UART_IIR_THRI;
1809 }
1810
1811 if (!(iir & UART_IIR_NO_INT))
1812 serial8250_handle_port(up);
1813
1814 if (is_real_interrupt(up->port.irq))
1815 serial_out(up, UART_IER, ier);
1816
1817 /* Standard timer interval plus 0.2s to keep the port running */
Alan Cox6f803cd2008-02-08 04:18:52 -08001818 mod_timer(&up->timer,
Anton Vorontsov54381062010-10-01 17:21:25 +04001819 jiffies + uart_poll_timeout(&up->port) + HZ / 5);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001820}
1821
1822static unsigned int serial8250_tx_empty(struct uart_port *port)
1823{
Jamie Iles49d57412010-12-01 23:39:35 +00001824 struct uart_8250_port *up =
1825 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001826 unsigned long flags;
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001827 unsigned int lsr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001828
1829 spin_lock_irqsave(&up->port.lock, flags);
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001830 lsr = serial_in(up, UART_LSR);
1831 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001832 spin_unlock_irqrestore(&up->port.lock, flags);
1833
Dick Hollenbeckbca47612009-12-09 12:31:34 -08001834 return (lsr & BOTH_EMPTY) == BOTH_EMPTY ? TIOCSER_TEMT : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001835}
1836
1837static unsigned int serial8250_get_mctrl(struct uart_port *port)
1838{
Jamie Iles49d57412010-12-01 23:39:35 +00001839 struct uart_8250_port *up =
1840 container_of(port, struct uart_8250_port, port);
Russell King2af7cd62006-01-04 16:55:09 +00001841 unsigned int status;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001842 unsigned int ret;
1843
Russell King2af7cd62006-01-04 16:55:09 +00001844 status = check_modem_status(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001845
1846 ret = 0;
1847 if (status & UART_MSR_DCD)
1848 ret |= TIOCM_CAR;
1849 if (status & UART_MSR_RI)
1850 ret |= TIOCM_RNG;
1851 if (status & UART_MSR_DSR)
1852 ret |= TIOCM_DSR;
1853 if (status & UART_MSR_CTS)
1854 ret |= TIOCM_CTS;
1855 return ret;
1856}
1857
1858static void serial8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
1859{
Jamie Iles49d57412010-12-01 23:39:35 +00001860 struct uart_8250_port *up =
1861 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001862 unsigned char mcr = 0;
1863
1864 if (mctrl & TIOCM_RTS)
1865 mcr |= UART_MCR_RTS;
1866 if (mctrl & TIOCM_DTR)
1867 mcr |= UART_MCR_DTR;
1868 if (mctrl & TIOCM_OUT1)
1869 mcr |= UART_MCR_OUT1;
1870 if (mctrl & TIOCM_OUT2)
1871 mcr |= UART_MCR_OUT2;
1872 if (mctrl & TIOCM_LOOP)
1873 mcr |= UART_MCR_LOOP;
1874
1875 mcr = (mcr & up->mcr_mask) | up->mcr_force | up->mcr;
1876
1877 serial_out(up, UART_MCR, mcr);
1878}
1879
1880static void serial8250_break_ctl(struct uart_port *port, int break_state)
1881{
Jamie Iles49d57412010-12-01 23:39:35 +00001882 struct uart_8250_port *up =
1883 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001884 unsigned long flags;
1885
1886 spin_lock_irqsave(&up->port.lock, flags);
1887 if (break_state == -1)
1888 up->lcr |= UART_LCR_SBC;
1889 else
1890 up->lcr &= ~UART_LCR_SBC;
1891 serial_out(up, UART_LCR, up->lcr);
1892 spin_unlock_irqrestore(&up->port.lock, flags);
1893}
1894
Alex Williamson40b36da2007-02-14 00:33:04 -08001895/*
1896 * Wait for transmitter & holding register to empty
1897 */
Will Newtonb5d674a2008-10-13 10:36:21 +01001898static void wait_for_xmitr(struct uart_8250_port *up, int bits)
Alex Williamson40b36da2007-02-14 00:33:04 -08001899{
1900 unsigned int status, tmout = 10000;
1901
1902 /* Wait up to 10ms for the character(s) to be sent. */
David Daney97d303b2010-10-05 11:40:07 -07001903 for (;;) {
Alex Williamson40b36da2007-02-14 00:33:04 -08001904 status = serial_in(up, UART_LSR);
1905
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001906 up->lsr_saved_flags |= status & LSR_SAVE_FLAGS;
Alex Williamson40b36da2007-02-14 00:33:04 -08001907
David Daney97d303b2010-10-05 11:40:07 -07001908 if ((status & bits) == bits)
1909 break;
Alex Williamson40b36da2007-02-14 00:33:04 -08001910 if (--tmout == 0)
1911 break;
1912 udelay(1);
David Daney97d303b2010-10-05 11:40:07 -07001913 }
Alex Williamson40b36da2007-02-14 00:33:04 -08001914
1915 /* Wait up to 1s for flow control if necessary */
1916 if (up->port.flags & UPF_CONS_FLOW) {
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001917 unsigned int tmout;
1918 for (tmout = 1000000; tmout; tmout--) {
1919 unsigned int msr = serial_in(up, UART_MSR);
1920 up->msr_saved_flags |= msr & MSR_SAVE_FLAGS;
1921 if (msr & UART_MSR_CTS)
1922 break;
Alex Williamson40b36da2007-02-14 00:33:04 -08001923 udelay(1);
1924 touch_nmi_watchdog();
1925 }
1926 }
1927}
1928
Jason Wesself2d937f2008-04-17 20:05:37 +02001929#ifdef CONFIG_CONSOLE_POLL
1930/*
1931 * Console polling routines for writing and reading from the uart while
1932 * in an interrupt or debug context.
1933 */
1934
1935static int serial8250_get_poll_char(struct uart_port *port)
1936{
Jamie Iles49d57412010-12-01 23:39:35 +00001937 struct uart_8250_port *up =
1938 container_of(port, struct uart_8250_port, port);
Jason Wesself2d937f2008-04-17 20:05:37 +02001939 unsigned char lsr = serial_inp(up, UART_LSR);
1940
Jason Wesself5316b42010-05-20 21:04:22 -05001941 if (!(lsr & UART_LSR_DR))
1942 return NO_POLL_CHAR;
Jason Wesself2d937f2008-04-17 20:05:37 +02001943
1944 return serial_inp(up, UART_RX);
1945}
1946
1947
1948static void serial8250_put_poll_char(struct uart_port *port,
1949 unsigned char c)
1950{
1951 unsigned int ier;
Jamie Iles49d57412010-12-01 23:39:35 +00001952 struct uart_8250_port *up =
1953 container_of(port, struct uart_8250_port, port);
Jason Wesself2d937f2008-04-17 20:05:37 +02001954
1955 /*
1956 * First save the IER then disable the interrupts
1957 */
1958 ier = serial_in(up, UART_IER);
1959 if (up->capabilities & UART_CAP_UUE)
1960 serial_out(up, UART_IER, UART_IER_UUE);
1961 else
1962 serial_out(up, UART_IER, 0);
1963
1964 wait_for_xmitr(up, BOTH_EMPTY);
1965 /*
1966 * Send the character out.
1967 * If a LF, also do CR...
1968 */
1969 serial_out(up, UART_TX, c);
1970 if (c == 10) {
1971 wait_for_xmitr(up, BOTH_EMPTY);
1972 serial_out(up, UART_TX, 13);
1973 }
1974
1975 /*
1976 * Finally, wait for transmitter to become empty
1977 * and restore the IER
1978 */
1979 wait_for_xmitr(up, BOTH_EMPTY);
1980 serial_out(up, UART_IER, ier);
1981}
1982
1983#endif /* CONFIG_CONSOLE_POLL */
1984
Linus Torvalds1da177e2005-04-16 15:20:36 -07001985static int serial8250_startup(struct uart_port *port)
1986{
Jamie Iles49d57412010-12-01 23:39:35 +00001987 struct uart_8250_port *up =
1988 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001989 unsigned long flags;
Russell King55d3b282005-06-23 15:05:41 +01001990 unsigned char lsr, iir;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001991 int retval;
1992
Ondrej Puzmane4f05af2010-12-04 21:17:38 +01001993 up->port.fifosize = uart_config[up->port.type].fifo_size;
1994 up->tx_loadsz = uart_config[up->port.type].tx_loadsz;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001995 up->capabilities = uart_config[up->port.type].flags;
1996 up->mcr = 0;
1997
Alan Coxb8e7e402009-05-28 14:01:35 +01001998 if (up->port.iotype != up->cur_iotype)
1999 set_io_from_upio(port);
2000
Linus Torvalds1da177e2005-04-16 15:20:36 -07002001 if (up->port.type == PORT_16C950) {
2002 /* Wake up and initialize UART */
2003 up->acr = 0;
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -08002004 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002005 serial_outp(up, UART_EFR, UART_EFR_ECB);
2006 serial_outp(up, UART_IER, 0);
2007 serial_outp(up, UART_LCR, 0);
2008 serial_icr_write(up, UART_CSR, 0); /* Reset the UART */
2009 serial_outp(up, UART_LCR, 0xBF);
2010 serial_outp(up, UART_EFR, UART_EFR_ECB);
2011 serial_outp(up, UART_LCR, 0);
2012 }
2013
2014#ifdef CONFIG_SERIAL_8250_RSA
2015 /*
2016 * If this is an RSA port, see if we can kick it up to the
2017 * higher speed clock.
2018 */
2019 enable_rsa(up);
2020#endif
2021
2022 /*
2023 * Clear the FIFO buffers and disable them.
Alexey Dobriyan7f927fc2006-03-28 01:56:53 -08002024 * (they will be reenabled in set_termios())
Linus Torvalds1da177e2005-04-16 15:20:36 -07002025 */
2026 serial8250_clear_fifos(up);
2027
2028 /*
2029 * Clear the interrupt registers.
2030 */
2031 (void) serial_inp(up, UART_LSR);
2032 (void) serial_inp(up, UART_RX);
2033 (void) serial_inp(up, UART_IIR);
2034 (void) serial_inp(up, UART_MSR);
2035
2036 /*
2037 * At this point, there's no way the LSR could still be 0xff;
2038 * if it is, then bail out, because there's likely no UART
2039 * here.
2040 */
2041 if (!(up->port.flags & UPF_BUGGY_UART) &&
2042 (serial_inp(up, UART_LSR) == 0xff)) {
David S. Miller84408382008-10-13 10:45:26 +01002043 printk(KERN_INFO "ttyS%d: LSR safety check engaged!\n",
2044 serial_index(&up->port));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002045 return -ENODEV;
2046 }
2047
2048 /*
2049 * For a XR16C850, we need to set the trigger levels
2050 */
2051 if (up->port.type == PORT_16850) {
2052 unsigned char fctr;
2053
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -08002054 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002055
2056 fctr = serial_inp(up, UART_FCTR) & ~(UART_FCTR_RX|UART_FCTR_TX);
2057 serial_outp(up, UART_FCTR, fctr | UART_FCTR_TRGD | UART_FCTR_RX);
2058 serial_outp(up, UART_TRG, UART_TRG_96);
2059 serial_outp(up, UART_FCTR, fctr | UART_FCTR_TRGD | UART_FCTR_TX);
2060 serial_outp(up, UART_TRG, UART_TRG_96);
2061
2062 serial_outp(up, UART_LCR, 0);
2063 }
2064
Alex Williamson40b36da2007-02-14 00:33:04 -08002065 if (is_real_interrupt(up->port.irq)) {
Alex Williamson01c194d2008-04-28 02:14:09 -07002066 unsigned char iir1;
Alex Williamson40b36da2007-02-14 00:33:04 -08002067 /*
2068 * Test for UARTs that do not reassert THRE when the
2069 * transmitter is idle and the interrupt has already
2070 * been cleared. Real 16550s should always reassert
2071 * this interrupt whenever the transmitter is idle and
2072 * the interrupt is enabled. Delays are necessary to
2073 * allow register changes to become visible.
2074 */
Borislav Petkovc389d272008-07-29 22:33:32 -07002075 spin_lock_irqsave(&up->port.lock, flags);
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002076 if (up->port.irqflags & IRQF_SHARED)
Anton Vorontsov768aec02008-07-22 11:21:07 +01002077 disable_irq_nosync(up->port.irq);
Alex Williamson40b36da2007-02-14 00:33:04 -08002078
2079 wait_for_xmitr(up, UART_LSR_THRE);
2080 serial_out_sync(up, UART_IER, UART_IER_THRI);
2081 udelay(1); /* allow THRE to set */
Alex Williamson01c194d2008-04-28 02:14:09 -07002082 iir1 = serial_in(up, UART_IIR);
Alex Williamson40b36da2007-02-14 00:33:04 -08002083 serial_out(up, UART_IER, 0);
2084 serial_out_sync(up, UART_IER, UART_IER_THRI);
2085 udelay(1); /* allow a working UART time to re-assert THRE */
2086 iir = serial_in(up, UART_IIR);
2087 serial_out(up, UART_IER, 0);
2088
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002089 if (up->port.irqflags & IRQF_SHARED)
Anton Vorontsov768aec02008-07-22 11:21:07 +01002090 enable_irq(up->port.irq);
Borislav Petkovc389d272008-07-29 22:33:32 -07002091 spin_unlock_irqrestore(&up->port.lock, flags);
Alex Williamson40b36da2007-02-14 00:33:04 -08002092
2093 /*
2094 * If the interrupt is not reasserted, setup a timer to
2095 * kick the UART on a regular basis.
2096 */
Alex Williamson01c194d2008-04-28 02:14:09 -07002097 if (!(iir1 & UART_IIR_NO_INT) && (iir & UART_IIR_NO_INT)) {
Will Newton363f66f2008-09-02 14:35:44 -07002098 up->bugs |= UART_BUG_THRE;
David S. Miller84408382008-10-13 10:45:26 +01002099 pr_debug("ttyS%d - using backup timer\n",
2100 serial_index(port));
Alex Williamson40b36da2007-02-14 00:33:04 -08002101 }
2102 }
2103
Linus Torvalds1da177e2005-04-16 15:20:36 -07002104 /*
Will Newton363f66f2008-09-02 14:35:44 -07002105 * The above check will only give an accurate result the first time
2106 * the port is opened so this value needs to be preserved.
2107 */
2108 if (up->bugs & UART_BUG_THRE) {
2109 up->timer.function = serial8250_backup_timeout;
2110 up->timer.data = (unsigned long)up;
2111 mod_timer(&up->timer, jiffies +
Anton Vorontsov54381062010-10-01 17:21:25 +04002112 uart_poll_timeout(port) + HZ / 5);
Will Newton363f66f2008-09-02 14:35:44 -07002113 }
2114
2115 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002116 * If the "interrupt" for this port doesn't correspond with any
2117 * hardware interrupt, we use a timer-based system. The original
2118 * driver used to do this with IRQ0.
2119 */
2120 if (!is_real_interrupt(up->port.irq)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002121 up->timer.data = (unsigned long)up;
Anton Vorontsov54381062010-10-01 17:21:25 +04002122 mod_timer(&up->timer, jiffies + uart_poll_timeout(port));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002123 } else {
2124 retval = serial_link_irq_chain(up);
2125 if (retval)
2126 return retval;
2127 }
2128
2129 /*
2130 * Now, initialize the UART
2131 */
2132 serial_outp(up, UART_LCR, UART_LCR_WLEN8);
2133
2134 spin_lock_irqsave(&up->port.lock, flags);
2135 if (up->port.flags & UPF_FOURPORT) {
2136 if (!is_real_interrupt(up->port.irq))
2137 up->port.mctrl |= TIOCM_OUT1;
2138 } else
2139 /*
2140 * Most PC uarts need OUT2 raised to enable interrupts.
2141 */
2142 if (is_real_interrupt(up->port.irq))
2143 up->port.mctrl |= TIOCM_OUT2;
2144
2145 serial8250_set_mctrl(&up->port, up->port.mctrl);
Russell King55d3b282005-06-23 15:05:41 +01002146
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002147 /* Serial over Lan (SoL) hack:
2148 Intel 8257x Gigabit ethernet chips have a
2149 16550 emulation, to be used for Serial Over Lan.
2150 Those chips take a longer time than a normal
2151 serial device to signalize that a transmission
2152 data was queued. Due to that, the above test generally
2153 fails. One solution would be to delay the reading of
2154 iir. However, this is not reliable, since the timeout
2155 is variable. So, let's just don't test if we receive
2156 TX irq. This way, we'll never enable UART_BUG_TXEN.
2157 */
Chuck Ebbertd41a4b52009-10-01 15:44:26 -07002158 if (skip_txen_test || up->port.flags & UPF_NO_TXEN_TEST)
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002159 goto dont_test_tx_en;
2160
Russell King55d3b282005-06-23 15:05:41 +01002161 /*
2162 * Do a quick test to see if we receive an
2163 * interrupt when we enable the TX irq.
2164 */
2165 serial_outp(up, UART_IER, UART_IER_THRI);
2166 lsr = serial_in(up, UART_LSR);
2167 iir = serial_in(up, UART_IIR);
2168 serial_outp(up, UART_IER, 0);
2169
2170 if (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT) {
Russell King67f76542005-06-23 22:26:43 +01002171 if (!(up->bugs & UART_BUG_TXEN)) {
2172 up->bugs |= UART_BUG_TXEN;
Russell King55d3b282005-06-23 15:05:41 +01002173 pr_debug("ttyS%d - enabling bad tx status workarounds\n",
David S. Miller84408382008-10-13 10:45:26 +01002174 serial_index(port));
Russell King55d3b282005-06-23 15:05:41 +01002175 }
2176 } else {
Russell King67f76542005-06-23 22:26:43 +01002177 up->bugs &= ~UART_BUG_TXEN;
Russell King55d3b282005-06-23 15:05:41 +01002178 }
2179
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002180dont_test_tx_en:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002181 spin_unlock_irqrestore(&up->port.lock, flags);
2182
2183 /*
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002184 * Clear the interrupt registers again for luck, and clear the
2185 * saved flags to avoid getting false values from polling
2186 * routines or the previous session.
2187 */
2188 serial_inp(up, UART_LSR);
2189 serial_inp(up, UART_RX);
2190 serial_inp(up, UART_IIR);
2191 serial_inp(up, UART_MSR);
2192 up->lsr_saved_flags = 0;
2193 up->msr_saved_flags = 0;
2194
2195 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002196 * Finally, enable interrupts. Note: Modem status interrupts
2197 * are set via set_termios(), which will be occurring imminently
2198 * anyway, so we don't enable them here.
2199 */
2200 up->ier = UART_IER_RLSI | UART_IER_RDI;
2201 serial_outp(up, UART_IER, up->ier);
2202
2203 if (up->port.flags & UPF_FOURPORT) {
2204 unsigned int icp;
2205 /*
2206 * Enable interrupts on the AST Fourport board
2207 */
2208 icp = (up->port.iobase & 0xfe0) | 0x01f;
2209 outb_p(0x80, icp);
2210 (void) inb_p(icp);
2211 }
2212
Linus Torvalds1da177e2005-04-16 15:20:36 -07002213 return 0;
2214}
2215
2216static void serial8250_shutdown(struct uart_port *port)
2217{
Jamie Iles49d57412010-12-01 23:39:35 +00002218 struct uart_8250_port *up =
2219 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002220 unsigned long flags;
2221
2222 /*
2223 * Disable interrupts from this port
2224 */
2225 up->ier = 0;
2226 serial_outp(up, UART_IER, 0);
2227
2228 spin_lock_irqsave(&up->port.lock, flags);
2229 if (up->port.flags & UPF_FOURPORT) {
2230 /* reset interrupts on the AST Fourport board */
2231 inb((up->port.iobase & 0xfe0) | 0x1f);
2232 up->port.mctrl |= TIOCM_OUT1;
2233 } else
2234 up->port.mctrl &= ~TIOCM_OUT2;
2235
2236 serial8250_set_mctrl(&up->port, up->port.mctrl);
2237 spin_unlock_irqrestore(&up->port.lock, flags);
2238
2239 /*
2240 * Disable break condition and FIFOs
2241 */
2242 serial_out(up, UART_LCR, serial_inp(up, UART_LCR) & ~UART_LCR_SBC);
2243 serial8250_clear_fifos(up);
2244
2245#ifdef CONFIG_SERIAL_8250_RSA
2246 /*
2247 * Reset the RSA board back to 115kbps compat mode.
2248 */
2249 disable_rsa(up);
2250#endif
2251
2252 /*
2253 * Read data port to reset things, and then unlink from
2254 * the IRQ chain.
2255 */
2256 (void) serial_in(up, UART_RX);
2257
Alex Williamson40b36da2007-02-14 00:33:04 -08002258 del_timer_sync(&up->timer);
2259 up->timer.function = serial8250_timeout;
2260 if (is_real_interrupt(up->port.irq))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002261 serial_unlink_irq_chain(up);
2262}
2263
2264static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud)
2265{
2266 unsigned int quot;
2267
2268 /*
2269 * Handle magic divisors for baud rates above baud_base on
2270 * SMSC SuperIO chips.
2271 */
2272 if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
2273 baud == (port->uartclk/4))
2274 quot = 0x8001;
2275 else if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
2276 baud == (port->uartclk/8))
2277 quot = 0x8002;
2278 else
2279 quot = uart_get_divisor(port, baud);
2280
2281 return quot;
2282}
2283
Philippe Langlais235dae52010-07-29 17:13:57 +02002284void
2285serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
2286 struct ktermios *old)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002287{
Jamie Iles49d57412010-12-01 23:39:35 +00002288 struct uart_8250_port *up =
2289 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002290 unsigned char cval, fcr = 0;
2291 unsigned long flags;
2292 unsigned int baud, quot;
2293
2294 switch (termios->c_cflag & CSIZE) {
2295 case CS5:
Russell King0a8b80c52005-06-24 19:48:22 +01002296 cval = UART_LCR_WLEN5;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002297 break;
2298 case CS6:
Russell King0a8b80c52005-06-24 19:48:22 +01002299 cval = UART_LCR_WLEN6;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002300 break;
2301 case CS7:
Russell King0a8b80c52005-06-24 19:48:22 +01002302 cval = UART_LCR_WLEN7;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002303 break;
2304 default:
2305 case CS8:
Russell King0a8b80c52005-06-24 19:48:22 +01002306 cval = UART_LCR_WLEN8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002307 break;
2308 }
2309
2310 if (termios->c_cflag & CSTOPB)
Russell King0a8b80c52005-06-24 19:48:22 +01002311 cval |= UART_LCR_STOP;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002312 if (termios->c_cflag & PARENB)
2313 cval |= UART_LCR_PARITY;
2314 if (!(termios->c_cflag & PARODD))
2315 cval |= UART_LCR_EPAR;
2316#ifdef CMSPAR
2317 if (termios->c_cflag & CMSPAR)
2318 cval |= UART_LCR_SPAR;
2319#endif
2320
2321 /*
2322 * Ask the core to calculate the divisor for us.
2323 */
Anton Vorontsov24d481e2009-09-19 13:13:20 -07002324 baud = uart_get_baud_rate(port, termios, old,
2325 port->uartclk / 16 / 0xffff,
2326 port->uartclk / 16);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002327 quot = serial8250_get_divisor(port, baud);
2328
2329 /*
Russell King4ba5e352005-06-23 10:43:04 +01002330 * Oxford Semi 952 rev B workaround
Linus Torvalds1da177e2005-04-16 15:20:36 -07002331 */
Russell King4ba5e352005-06-23 10:43:04 +01002332 if (up->bugs & UART_BUG_QUOT && (quot & 0xff) == 0)
Alan Cox3e8d4e22008-02-04 22:27:53 -08002333 quot++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002334
2335 if (up->capabilities & UART_CAP_FIFO && up->port.fifosize > 1) {
2336 if (baud < 2400)
2337 fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1;
2338 else
2339 fcr = uart_config[up->port.type].fcr;
2340 }
2341
2342 /*
2343 * MCR-based auto flow control. When AFE is enabled, RTS will be
2344 * deasserted when the receive FIFO contains more characters than
2345 * the trigger, or the MCR RTS bit is cleared. In the case where
2346 * the remote UART is not using CTS auto flow control, we must
2347 * have sufficient FIFO entries for the latency of the remote
2348 * UART to respond. IOW, at least 32 bytes of FIFO.
2349 */
2350 if (up->capabilities & UART_CAP_AFE && up->port.fifosize >= 32) {
2351 up->mcr &= ~UART_MCR_AFE;
2352 if (termios->c_cflag & CRTSCTS)
2353 up->mcr |= UART_MCR_AFE;
2354 }
2355
2356 /*
2357 * Ok, we're now changing the port state. Do it with
2358 * interrupts disabled.
2359 */
2360 spin_lock_irqsave(&up->port.lock, flags);
2361
2362 /*
2363 * Update the per-port timeout.
2364 */
2365 uart_update_timeout(port, termios->c_cflag, baud);
2366
2367 up->port.read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR;
2368 if (termios->c_iflag & INPCK)
2369 up->port.read_status_mask |= UART_LSR_FE | UART_LSR_PE;
2370 if (termios->c_iflag & (BRKINT | PARMRK))
2371 up->port.read_status_mask |= UART_LSR_BI;
2372
2373 /*
2374 * Characteres to ignore
2375 */
2376 up->port.ignore_status_mask = 0;
2377 if (termios->c_iflag & IGNPAR)
2378 up->port.ignore_status_mask |= UART_LSR_PE | UART_LSR_FE;
2379 if (termios->c_iflag & IGNBRK) {
2380 up->port.ignore_status_mask |= UART_LSR_BI;
2381 /*
2382 * If we're ignoring parity and break indicators,
2383 * ignore overruns too (for real raw support).
2384 */
2385 if (termios->c_iflag & IGNPAR)
2386 up->port.ignore_status_mask |= UART_LSR_OE;
2387 }
2388
2389 /*
2390 * ignore all characters if CREAD is not set
2391 */
2392 if ((termios->c_cflag & CREAD) == 0)
2393 up->port.ignore_status_mask |= UART_LSR_DR;
2394
2395 /*
2396 * CTS flow control flag and modem status interrupts
2397 */
Ingo Molnarf8b372a2010-11-13 16:21:58 +01002398 up->ier &= ~UART_IER_MSI;
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00002399 if (!(up->bugs & UART_BUG_NOMSR) &&
2400 UART_ENABLE_MS(&up->port, termios->c_cflag))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002401 up->ier |= UART_IER_MSI;
2402 if (up->capabilities & UART_CAP_UUE)
Stephen Warren4539c242011-05-17 16:12:36 -06002403 up->ier |= UART_IER_UUE;
2404 if (up->capabilities & UART_CAP_RTOIE)
2405 up->ier |= UART_IER_RTOIE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002406
2407 serial_out(up, UART_IER, up->ier);
2408
2409 if (up->capabilities & UART_CAP_EFR) {
2410 unsigned char efr = 0;
2411 /*
2412 * TI16C752/Startech hardware flow control. FIXME:
2413 * - TI16C752 requires control thresholds to be set.
2414 * - UART_MCR_RTS is ineffective if auto-RTS mode is enabled.
2415 */
2416 if (termios->c_cflag & CRTSCTS)
2417 efr |= UART_EFR_CTS;
2418
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -08002419 serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002420 serial_outp(up, UART_EFR, efr);
2421 }
2422
Russell Kingf2eda272008-09-01 21:47:59 +01002423#ifdef CONFIG_ARCH_OMAP
Jonathan McDowell255341c2006-08-14 23:05:32 -07002424 /* Workaround to enable 115200 baud on OMAP1510 internal ports */
Russell King56685452008-09-01 21:25:33 +01002425 if (cpu_is_omap1510() && is_omap_port(up)) {
Jonathan McDowell255341c2006-08-14 23:05:32 -07002426 if (baud == 115200) {
2427 quot = 1;
2428 serial_out(up, UART_OMAP_OSC_12M_SEL, 1);
2429 } else
2430 serial_out(up, UART_OMAP_OSC_12M_SEL, 0);
2431 }
2432#endif
2433
Linus Torvalds1da177e2005-04-16 15:20:36 -07002434 if (up->capabilities & UART_NATSEMI) {
2435 /* Switch to bank 2 not bank 1, to avoid resetting EXCR2 */
2436 serial_outp(up, UART_LCR, 0xe0);
2437 } else {
2438 serial_outp(up, UART_LCR, cval | UART_LCR_DLAB);/* set DLAB */
2439 }
2440
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +01002441 serial_dl_write(up, quot);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002442
2443 /*
2444 * LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR
2445 * is written without DLAB set, this mode will be disabled.
2446 */
2447 if (up->port.type == PORT_16750)
2448 serial_outp(up, UART_FCR, fcr);
2449
2450 serial_outp(up, UART_LCR, cval); /* reset DLAB */
2451 up->lcr = cval; /* Save LCR */
2452 if (up->port.type != PORT_16750) {
2453 if (fcr & UART_FCR_ENABLE_FIFO) {
2454 /* emulated UARTs (Lucent Venus 167x) need two steps */
2455 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO);
2456 }
2457 serial_outp(up, UART_FCR, fcr); /* set fcr */
2458 }
2459 serial8250_set_mctrl(&up->port, up->port.mctrl);
2460 spin_unlock_irqrestore(&up->port.lock, flags);
Alan Coxe991a2b2008-04-28 02:14:06 -07002461 /* Don't rewrite B0 */
2462 if (tty_termios_baud_rate(termios))
2463 tty_termios_encode_baud_rate(termios, baud, baud);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002464}
Philippe Langlais235dae52010-07-29 17:13:57 +02002465EXPORT_SYMBOL(serial8250_do_set_termios);
2466
2467static void
2468serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
2469 struct ktermios *old)
2470{
2471 if (port->set_termios)
2472 port->set_termios(port, termios, old);
2473 else
2474 serial8250_do_set_termios(port, termios, old);
2475}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002476
2477static void
Arnd Bergmanna0821df2010-06-01 22:53:11 +02002478serial8250_set_ldisc(struct uart_port *port, int new)
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002479{
Arnd Bergmanna0821df2010-06-01 22:53:11 +02002480 if (new == N_PPS) {
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002481 port->flags |= UPF_HARDPPS_CD;
2482 serial8250_enable_ms(port);
2483 } else
2484 port->flags &= ~UPF_HARDPPS_CD;
2485}
2486
Manuel Laussc161afe2010-09-25 15:13:45 +02002487
2488void serial8250_do_pm(struct uart_port *port, unsigned int state,
2489 unsigned int oldstate)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002490{
Jamie Iles49d57412010-12-01 23:39:35 +00002491 struct uart_8250_port *p =
2492 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002493
2494 serial8250_set_sleep(p, state != 0);
Manuel Laussc161afe2010-09-25 15:13:45 +02002495}
2496EXPORT_SYMBOL(serial8250_do_pm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002497
Manuel Laussc161afe2010-09-25 15:13:45 +02002498static void
2499serial8250_pm(struct uart_port *port, unsigned int state,
2500 unsigned int oldstate)
2501{
2502 if (port->pm)
2503 port->pm(port, state, oldstate);
2504 else
2505 serial8250_do_pm(port, state, oldstate);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002506}
2507
Russell Kingf2eda272008-09-01 21:47:59 +01002508static unsigned int serial8250_port_size(struct uart_8250_port *pt)
2509{
2510 if (pt->port.iotype == UPIO_AU)
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002511 return 0x1000;
Russell Kingf2eda272008-09-01 21:47:59 +01002512#ifdef CONFIG_ARCH_OMAP
2513 if (is_omap_port(pt))
2514 return 0x16 << pt->port.regshift;
2515#endif
2516 return 8 << pt->port.regshift;
2517}
2518
Linus Torvalds1da177e2005-04-16 15:20:36 -07002519/*
2520 * Resource handling.
2521 */
2522static int serial8250_request_std_resource(struct uart_8250_port *up)
2523{
Russell Kingf2eda272008-09-01 21:47:59 +01002524 unsigned int size = serial8250_port_size(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002525 int ret = 0;
2526
2527 switch (up->port.iotype) {
Sergei Shtylyov85835f42006-04-30 11:15:58 +01002528 case UPIO_AU:
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002529 case UPIO_TSI:
2530 case UPIO_MEM32:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002531 case UPIO_MEM:
2532 if (!up->port.mapbase)
2533 break;
2534
2535 if (!request_mem_region(up->port.mapbase, size, "serial")) {
2536 ret = -EBUSY;
2537 break;
2538 }
2539
2540 if (up->port.flags & UPF_IOREMAP) {
Alan Cox6f441fe2008-05-01 04:34:59 -07002541 up->port.membase = ioremap_nocache(up->port.mapbase,
2542 size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002543 if (!up->port.membase) {
2544 release_mem_region(up->port.mapbase, size);
2545 ret = -ENOMEM;
2546 }
2547 }
2548 break;
2549
2550 case UPIO_HUB6:
2551 case UPIO_PORT:
2552 if (!request_region(up->port.iobase, size, "serial"))
2553 ret = -EBUSY;
2554 break;
2555 }
2556 return ret;
2557}
2558
2559static void serial8250_release_std_resource(struct uart_8250_port *up)
2560{
Russell Kingf2eda272008-09-01 21:47:59 +01002561 unsigned int size = serial8250_port_size(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002562
2563 switch (up->port.iotype) {
Sergei Shtylyov85835f42006-04-30 11:15:58 +01002564 case UPIO_AU:
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002565 case UPIO_TSI:
2566 case UPIO_MEM32:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002567 case UPIO_MEM:
2568 if (!up->port.mapbase)
2569 break;
2570
2571 if (up->port.flags & UPF_IOREMAP) {
2572 iounmap(up->port.membase);
2573 up->port.membase = NULL;
2574 }
2575
2576 release_mem_region(up->port.mapbase, size);
2577 break;
2578
2579 case UPIO_HUB6:
2580 case UPIO_PORT:
2581 release_region(up->port.iobase, size);
2582 break;
2583 }
2584}
2585
2586static int serial8250_request_rsa_resource(struct uart_8250_port *up)
2587{
2588 unsigned long start = UART_RSA_BASE << up->port.regshift;
2589 unsigned int size = 8 << up->port.regshift;
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002590 int ret = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002591
2592 switch (up->port.iotype) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002593 case UPIO_HUB6:
2594 case UPIO_PORT:
2595 start += up->port.iobase;
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002596 if (request_region(start, size, "serial-rsa"))
2597 ret = 0;
2598 else
Linus Torvalds1da177e2005-04-16 15:20:36 -07002599 ret = -EBUSY;
2600 break;
2601 }
2602
2603 return ret;
2604}
2605
2606static void serial8250_release_rsa_resource(struct uart_8250_port *up)
2607{
2608 unsigned long offset = UART_RSA_BASE << up->port.regshift;
2609 unsigned int size = 8 << up->port.regshift;
2610
2611 switch (up->port.iotype) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002612 case UPIO_HUB6:
2613 case UPIO_PORT:
2614 release_region(up->port.iobase + offset, size);
2615 break;
2616 }
2617}
2618
2619static void serial8250_release_port(struct uart_port *port)
2620{
Jamie Iles49d57412010-12-01 23:39:35 +00002621 struct uart_8250_port *up =
2622 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002623
2624 serial8250_release_std_resource(up);
2625 if (up->port.type == PORT_RSA)
2626 serial8250_release_rsa_resource(up);
2627}
2628
2629static int serial8250_request_port(struct uart_port *port)
2630{
Jamie Iles49d57412010-12-01 23:39:35 +00002631 struct uart_8250_port *up =
2632 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002633 int ret = 0;
2634
2635 ret = serial8250_request_std_resource(up);
2636 if (ret == 0 && up->port.type == PORT_RSA) {
2637 ret = serial8250_request_rsa_resource(up);
2638 if (ret < 0)
2639 serial8250_release_std_resource(up);
2640 }
2641
2642 return ret;
2643}
2644
2645static void serial8250_config_port(struct uart_port *port, int flags)
2646{
Jamie Iles49d57412010-12-01 23:39:35 +00002647 struct uart_8250_port *up =
2648 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002649 int probeflags = PROBE_ANY;
2650 int ret;
2651
2652 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002653 * Find the region that we can probe for. This in turn
2654 * tells us whether we can probe for the type of port.
2655 */
2656 ret = serial8250_request_std_resource(up);
2657 if (ret < 0)
2658 return;
2659
2660 ret = serial8250_request_rsa_resource(up);
2661 if (ret < 0)
2662 probeflags &= ~PROBE_RSA;
2663
Alan Coxb8e7e402009-05-28 14:01:35 +01002664 if (up->port.iotype != up->cur_iotype)
2665 set_io_from_upio(port);
2666
Linus Torvalds1da177e2005-04-16 15:20:36 -07002667 if (flags & UART_CONFIG_TYPE)
2668 autoconfig(up, probeflags);
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002669
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002670 /* if access method is AU, it is a 16550 with a quirk */
2671 if (up->port.type == PORT_16550A && up->port.iotype == UPIO_AU)
2672 up->bugs |= UART_BUG_NOMSR;
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002673
Linus Torvalds1da177e2005-04-16 15:20:36 -07002674 if (up->port.type != PORT_UNKNOWN && flags & UART_CONFIG_IRQ)
2675 autoconfig_irq(up);
2676
2677 if (up->port.type != PORT_RSA && probeflags & PROBE_RSA)
2678 serial8250_release_rsa_resource(up);
2679 if (up->port.type == PORT_UNKNOWN)
2680 serial8250_release_std_resource(up);
2681}
2682
2683static int
2684serial8250_verify_port(struct uart_port *port, struct serial_struct *ser)
2685{
Yinghai Lua62c4132008-08-19 20:49:55 -07002686 if (ser->irq >= nr_irqs || ser->irq < 0 ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07002687 ser->baud_base < 9600 || ser->type < PORT_UNKNOWN ||
2688 ser->type >= ARRAY_SIZE(uart_config) || ser->type == PORT_CIRRUS ||
2689 ser->type == PORT_STARTECH)
2690 return -EINVAL;
2691 return 0;
2692}
2693
2694static const char *
2695serial8250_type(struct uart_port *port)
2696{
2697 int type = port->type;
2698
2699 if (type >= ARRAY_SIZE(uart_config))
2700 type = 0;
2701 return uart_config[type].name;
2702}
2703
2704static struct uart_ops serial8250_pops = {
2705 .tx_empty = serial8250_tx_empty,
2706 .set_mctrl = serial8250_set_mctrl,
2707 .get_mctrl = serial8250_get_mctrl,
2708 .stop_tx = serial8250_stop_tx,
2709 .start_tx = serial8250_start_tx,
2710 .stop_rx = serial8250_stop_rx,
2711 .enable_ms = serial8250_enable_ms,
2712 .break_ctl = serial8250_break_ctl,
2713 .startup = serial8250_startup,
2714 .shutdown = serial8250_shutdown,
2715 .set_termios = serial8250_set_termios,
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002716 .set_ldisc = serial8250_set_ldisc,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002717 .pm = serial8250_pm,
2718 .type = serial8250_type,
2719 .release_port = serial8250_release_port,
2720 .request_port = serial8250_request_port,
2721 .config_port = serial8250_config_port,
2722 .verify_port = serial8250_verify_port,
Jason Wesself2d937f2008-04-17 20:05:37 +02002723#ifdef CONFIG_CONSOLE_POLL
2724 .poll_get_char = serial8250_get_poll_char,
2725 .poll_put_char = serial8250_put_poll_char,
2726#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07002727};
2728
2729static struct uart_8250_port serial8250_ports[UART_NR];
2730
Alan Coxaf7f3742010-10-18 11:38:02 -07002731static void (*serial8250_isa_config)(int port, struct uart_port *up,
2732 unsigned short *capabilities);
2733
2734void serial8250_set_isa_configurator(
2735 void (*v)(int port, struct uart_port *up, unsigned short *capabilities))
2736{
2737 serial8250_isa_config = v;
2738}
2739EXPORT_SYMBOL(serial8250_set_isa_configurator);
2740
Linus Torvalds1da177e2005-04-16 15:20:36 -07002741static void __init serial8250_isa_init_ports(void)
2742{
2743 struct uart_8250_port *up;
2744 static int first = 1;
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02002745 int i, irqflag = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002746
2747 if (!first)
2748 return;
2749 first = 0;
2750
Dave Jonesa61c2d72006-01-07 23:18:19 +00002751 for (i = 0; i < nr_uarts; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002752 struct uart_8250_port *up = &serial8250_ports[i];
2753
2754 up->port.line = i;
2755 spin_lock_init(&up->port.lock);
2756
2757 init_timer(&up->timer);
2758 up->timer.function = serial8250_timeout;
2759
2760 /*
2761 * ALPHA_KLUDGE_MCR needs to be killed.
2762 */
2763 up->mcr_mask = ~ALPHA_KLUDGE_MCR;
2764 up->mcr_force = ALPHA_KLUDGE_MCR;
2765
2766 up->port.ops = &serial8250_pops;
2767 }
2768
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02002769 if (share_irqs)
2770 irqflag = IRQF_SHARED;
2771
Russell King44454bc2005-06-30 22:41:22 +01002772 for (i = 0, up = serial8250_ports;
Dave Jonesa61c2d72006-01-07 23:18:19 +00002773 i < ARRAY_SIZE(old_serial_port) && i < nr_uarts;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002774 i++, up++) {
2775 up->port.iobase = old_serial_port[i].port;
2776 up->port.irq = irq_canonicalize(old_serial_port[i].irq);
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002777 up->port.irqflags = old_serial_port[i].irqflags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002778 up->port.uartclk = old_serial_port[i].baud_base * 16;
2779 up->port.flags = old_serial_port[i].flags;
2780 up->port.hub6 = old_serial_port[i].hub6;
2781 up->port.membase = old_serial_port[i].iomem_base;
2782 up->port.iotype = old_serial_port[i].io_type;
2783 up->port.regshift = old_serial_port[i].iomem_reg_shift;
David Daney7d6a07d2009-01-02 13:49:47 +00002784 set_io_from_upio(&up->port);
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02002785 up->port.irqflags |= irqflag;
Alan Coxaf7f3742010-10-18 11:38:02 -07002786 if (serial8250_isa_config != NULL)
2787 serial8250_isa_config(i, &up->port, &up->capabilities);
2788
Linus Torvalds1da177e2005-04-16 15:20:36 -07002789 }
2790}
2791
Shmulik Ladkanib5d228c2009-12-09 12:31:29 -08002792static void
2793serial8250_init_fixed_type_port(struct uart_8250_port *up, unsigned int type)
2794{
2795 up->port.type = type;
2796 up->port.fifosize = uart_config[type].fifo_size;
2797 up->capabilities = uart_config[type].flags;
2798 up->tx_loadsz = uart_config[type].tx_loadsz;
2799}
2800
Linus Torvalds1da177e2005-04-16 15:20:36 -07002801static void __init
2802serial8250_register_ports(struct uart_driver *drv, struct device *dev)
2803{
2804 int i;
2805
Alan Coxb8e7e402009-05-28 14:01:35 +01002806 for (i = 0; i < nr_uarts; i++) {
2807 struct uart_8250_port *up = &serial8250_ports[i];
2808 up->cur_iotype = 0xFF;
2809 }
2810
Linus Torvalds1da177e2005-04-16 15:20:36 -07002811 serial8250_isa_init_ports();
2812
Dave Jonesa61c2d72006-01-07 23:18:19 +00002813 for (i = 0; i < nr_uarts; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002814 struct uart_8250_port *up = &serial8250_ports[i];
2815
2816 up->port.dev = dev;
Shmulik Ladkanib5d228c2009-12-09 12:31:29 -08002817
2818 if (up->port.flags & UPF_FIXED_TYPE)
2819 serial8250_init_fixed_type_port(up, up->port.type);
2820
Linus Torvalds1da177e2005-04-16 15:20:36 -07002821 uart_add_one_port(drv, &up->port);
2822 }
2823}
2824
2825#ifdef CONFIG_SERIAL_8250_CONSOLE
2826
Russell Kingd3587882006-03-20 20:00:09 +00002827static void serial8250_console_putchar(struct uart_port *port, int ch)
2828{
Jamie Iles49d57412010-12-01 23:39:35 +00002829 struct uart_8250_port *up =
2830 container_of(port, struct uart_8250_port, port);
Russell Kingd3587882006-03-20 20:00:09 +00002831
2832 wait_for_xmitr(up, UART_LSR_THRE);
2833 serial_out(up, UART_TX, ch);
2834}
2835
Linus Torvalds1da177e2005-04-16 15:20:36 -07002836/*
2837 * Print a string to the serial port trying not to disturb
2838 * any possible real use of the port...
2839 *
2840 * The console_lock must be held when we get here.
2841 */
2842static void
2843serial8250_console_write(struct console *co, const char *s, unsigned int count)
2844{
2845 struct uart_8250_port *up = &serial8250_ports[co->index];
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002846 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002847 unsigned int ier;
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002848 int locked = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002849
Andrew Morton78512ec2005-11-07 00:59:13 -08002850 touch_nmi_watchdog();
2851
Andrew Morton68aa2c02006-06-30 02:29:59 -07002852 local_irq_save(flags);
2853 if (up->port.sysrq) {
2854 /* serial8250_handle_port() already took the lock */
2855 locked = 0;
2856 } else if (oops_in_progress) {
2857 locked = spin_trylock(&up->port.lock);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002858 } else
Andrew Morton68aa2c02006-06-30 02:29:59 -07002859 spin_lock(&up->port.lock);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002860
Linus Torvalds1da177e2005-04-16 15:20:36 -07002861 /*
Ralf Baechledc7bf132006-02-15 09:59:47 +00002862 * First save the IER then disable the interrupts
Linus Torvalds1da177e2005-04-16 15:20:36 -07002863 */
2864 ier = serial_in(up, UART_IER);
2865
2866 if (up->capabilities & UART_CAP_UUE)
2867 serial_out(up, UART_IER, UART_IER_UUE);
2868 else
2869 serial_out(up, UART_IER, 0);
2870
Russell Kingd3587882006-03-20 20:00:09 +00002871 uart_console_write(&up->port, s, count, serial8250_console_putchar);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002872
2873 /*
2874 * Finally, wait for transmitter to become empty
2875 * and restore the IER
2876 */
Alan Coxf91a3712006-01-21 14:59:12 +00002877 wait_for_xmitr(up, BOTH_EMPTY);
Russell Kinga88d75b2006-04-30 11:30:15 +01002878 serial_out(up, UART_IER, ier);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002879
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002880 /*
2881 * The receive handling will happen properly because the
2882 * receive ready bit will still be set; it is not cleared
2883 * on read. However, modem control will not, we must
2884 * call it if we have saved something in the saved flags
2885 * while processing with interrupts off.
2886 */
2887 if (up->msr_saved_flags)
2888 check_modem_status(up);
2889
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002890 if (locked)
Andrew Morton68aa2c02006-06-30 02:29:59 -07002891 spin_unlock(&up->port.lock);
2892 local_irq_restore(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002893}
2894
Vivek Goyal118c0ac2007-01-11 01:52:44 +01002895static int __init serial8250_console_setup(struct console *co, char *options)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002896{
2897 struct uart_port *port;
2898 int baud = 9600;
2899 int bits = 8;
2900 int parity = 'n';
2901 int flow = 'n';
2902
2903 /*
2904 * Check whether an invalid uart number has been specified, and
2905 * if so, search for the first available port that does have
2906 * console support.
2907 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00002908 if (co->index >= nr_uarts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002909 co->index = 0;
2910 port = &serial8250_ports[co->index].port;
2911 if (!port->iobase && !port->membase)
2912 return -ENODEV;
2913
2914 if (options)
2915 uart_parse_options(options, &baud, &parity, &bits, &flow);
2916
2917 return uart_set_options(port, co, baud, parity, bits, flow);
2918}
2919
Daniel Ritzb6b1d872007-08-03 16:07:43 +02002920static int serial8250_console_early_setup(void)
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002921{
2922 return serial8250_find_port_for_earlycon();
2923}
2924
Linus Torvalds1da177e2005-04-16 15:20:36 -07002925static struct console serial8250_console = {
2926 .name = "ttyS",
2927 .write = serial8250_console_write,
2928 .device = uart_console_device,
2929 .setup = serial8250_console_setup,
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002930 .early_setup = serial8250_console_early_setup,
Peter Zijlstraa80c49d2010-11-15 21:11:12 +01002931 .flags = CON_PRINTBUFFER | CON_ANYTIME,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002932 .index = -1,
2933 .data = &serial8250_reg,
2934};
2935
2936static int __init serial8250_console_init(void)
2937{
Eric W. Biederman05d81d22008-07-12 13:47:53 -07002938 if (nr_uarts > UART_NR)
2939 nr_uarts = UART_NR;
2940
Linus Torvalds1da177e2005-04-16 15:20:36 -07002941 serial8250_isa_init_ports();
2942 register_console(&serial8250_console);
2943 return 0;
2944}
2945console_initcall(serial8250_console_init);
2946
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002947int serial8250_find_port(struct uart_port *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002948{
2949 int line;
2950 struct uart_port *port;
2951
Dave Jonesa61c2d72006-01-07 23:18:19 +00002952 for (line = 0; line < nr_uarts; line++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002953 port = &serial8250_ports[line].port;
Russell King50aec3b52006-01-04 18:13:03 +00002954 if (uart_match_port(p, port))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002955 return line;
2956 }
2957 return -ENODEV;
2958}
2959
Linus Torvalds1da177e2005-04-16 15:20:36 -07002960#define SERIAL8250_CONSOLE &serial8250_console
2961#else
2962#define SERIAL8250_CONSOLE NULL
2963#endif
2964
2965static struct uart_driver serial8250_reg = {
2966 .owner = THIS_MODULE,
2967 .driver_name = "serial",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002968 .dev_name = "ttyS",
2969 .major = TTY_MAJOR,
2970 .minor = 64,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002971 .cons = SERIAL8250_CONSOLE,
2972};
2973
Russell Kingd856c662006-02-23 10:22:13 +00002974/*
2975 * early_serial_setup - early registration for 8250 ports
2976 *
2977 * Setup an 8250 port structure prior to console initialisation. Use
2978 * after console initialisation will cause undefined behaviour.
2979 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002980int __init early_serial_setup(struct uart_port *port)
2981{
David Daneyb4304282009-01-02 13:49:41 +00002982 struct uart_port *p;
2983
Linus Torvalds1da177e2005-04-16 15:20:36 -07002984 if (port->line >= ARRAY_SIZE(serial8250_ports))
2985 return -ENODEV;
2986
2987 serial8250_isa_init_ports();
David Daneyb4304282009-01-02 13:49:41 +00002988 p = &serial8250_ports[port->line].port;
2989 p->iobase = port->iobase;
2990 p->membase = port->membase;
2991 p->irq = port->irq;
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002992 p->irqflags = port->irqflags;
David Daneyb4304282009-01-02 13:49:41 +00002993 p->uartclk = port->uartclk;
2994 p->fifosize = port->fifosize;
2995 p->regshift = port->regshift;
2996 p->iotype = port->iotype;
2997 p->flags = port->flags;
2998 p->mapbase = port->mapbase;
2999 p->private_data = port->private_data;
Helge Deller125c97d2009-01-13 22:51:07 +01003000 p->type = port->type;
3001 p->line = port->line;
David Daney7d6a07d2009-01-02 13:49:47 +00003002
3003 set_io_from_upio(p);
3004 if (port->serial_in)
3005 p->serial_in = port->serial_in;
3006 if (port->serial_out)
3007 p->serial_out = port->serial_out;
Jamie Iles583d28e2011-08-15 10:17:52 +01003008 if (port->handle_irq)
3009 p->handle_irq = port->handle_irq;
3010 else
3011 p->handle_irq = serial8250_default_handle_irq;
David Daney7d6a07d2009-01-02 13:49:47 +00003012
Linus Torvalds1da177e2005-04-16 15:20:36 -07003013 return 0;
3014}
3015
3016/**
3017 * serial8250_suspend_port - suspend one serial port
3018 * @line: serial line number
Linus Torvalds1da177e2005-04-16 15:20:36 -07003019 *
3020 * Suspend one serial port.
3021 */
3022void serial8250_suspend_port(int line)
3023{
3024 uart_suspend_port(&serial8250_reg, &serial8250_ports[line].port);
3025}
3026
3027/**
3028 * serial8250_resume_port - resume one serial port
3029 * @line: serial line number
Linus Torvalds1da177e2005-04-16 15:20:36 -07003030 *
3031 * Resume one serial port.
3032 */
3033void serial8250_resume_port(int line)
3034{
David Woodhouseb5b82df2007-05-17 14:27:39 +08003035 struct uart_8250_port *up = &serial8250_ports[line];
3036
3037 if (up->capabilities & UART_NATSEMI) {
David Woodhouseb5b82df2007-05-17 14:27:39 +08003038 /* Ensure it's still in high speed mode */
3039 serial_outp(up, UART_LCR, 0xE0);
3040
Yin Kangkai0d0389e2011-02-09 11:35:18 +08003041 ns16550a_goto_highspeed(up);
David Woodhouseb5b82df2007-05-17 14:27:39 +08003042
3043 serial_outp(up, UART_LCR, 0);
Yin Kangkai95926d22011-02-09 11:34:20 +08003044 up->port.uartclk = 921600*16;
David Woodhouseb5b82df2007-05-17 14:27:39 +08003045 }
3046 uart_resume_port(&serial8250_reg, &up->port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003047}
3048
3049/*
3050 * Register a set of serial devices attached to a platform device. The
3051 * list is terminated with a zero flags entry, which means we expect
3052 * all entries to have at least UPF_BOOT_AUTOCONF set.
3053 */
Russell King3ae5eae2005-11-09 22:32:44 +00003054static int __devinit serial8250_probe(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003055{
Russell King3ae5eae2005-11-09 22:32:44 +00003056 struct plat_serial8250_port *p = dev->dev.platform_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003057 struct uart_port port;
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02003058 int ret, i, irqflag = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003059
3060 memset(&port, 0, sizeof(struct uart_port));
3061
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02003062 if (share_irqs)
3063 irqflag = IRQF_SHARED;
3064
Russell Kingec9f47c2005-06-27 11:12:54 +01003065 for (i = 0; p && p->flags != 0; p++, i++) {
Will Newton74a197412008-02-04 22:27:50 -08003066 port.iobase = p->iobase;
3067 port.membase = p->membase;
3068 port.irq = p->irq;
Vikram Pandita1c2f0492009-09-19 13:13:19 -07003069 port.irqflags = p->irqflags;
Will Newton74a197412008-02-04 22:27:50 -08003070 port.uartclk = p->uartclk;
3071 port.regshift = p->regshift;
3072 port.iotype = p->iotype;
3073 port.flags = p->flags;
3074 port.mapbase = p->mapbase;
3075 port.hub6 = p->hub6;
3076 port.private_data = p->private_data;
David Daney8e23fcc2009-01-02 13:49:54 +00003077 port.type = p->type;
David Daney7d6a07d2009-01-02 13:49:47 +00003078 port.serial_in = p->serial_in;
3079 port.serial_out = p->serial_out;
Jamie Iles583d28e2011-08-15 10:17:52 +01003080 port.handle_irq = p->handle_irq;
Philippe Langlais235dae52010-07-29 17:13:57 +02003081 port.set_termios = p->set_termios;
Manuel Laussc161afe2010-09-25 15:13:45 +02003082 port.pm = p->pm;
Will Newton74a197412008-02-04 22:27:50 -08003083 port.dev = &dev->dev;
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02003084 port.irqflags |= irqflag;
Russell Kingec9f47c2005-06-27 11:12:54 +01003085 ret = serial8250_register_port(&port);
3086 if (ret < 0) {
Russell King3ae5eae2005-11-09 22:32:44 +00003087 dev_err(&dev->dev, "unable to register port at index %d "
Josh Boyer4f640ef2007-07-23 18:43:44 -07003088 "(IO%lx MEM%llx IRQ%d): %d\n", i,
3089 p->iobase, (unsigned long long)p->mapbase,
3090 p->irq, ret);
Russell Kingec9f47c2005-06-27 11:12:54 +01003091 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003092 }
3093 return 0;
3094}
3095
3096/*
3097 * Remove serial ports registered against a platform device.
3098 */
Russell King3ae5eae2005-11-09 22:32:44 +00003099static int __devexit serial8250_remove(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003100{
3101 int i;
3102
Dave Jonesa61c2d72006-01-07 23:18:19 +00003103 for (i = 0; i < nr_uarts; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003104 struct uart_8250_port *up = &serial8250_ports[i];
3105
Russell King3ae5eae2005-11-09 22:32:44 +00003106 if (up->port.dev == &dev->dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003107 serial8250_unregister_port(i);
3108 }
3109 return 0;
3110}
3111
Russell King3ae5eae2005-11-09 22:32:44 +00003112static int serial8250_suspend(struct platform_device *dev, pm_message_t state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003113{
3114 int i;
3115
Linus Torvalds1da177e2005-04-16 15:20:36 -07003116 for (i = 0; i < UART_NR; i++) {
3117 struct uart_8250_port *up = &serial8250_ports[i];
3118
Russell King3ae5eae2005-11-09 22:32:44 +00003119 if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003120 uart_suspend_port(&serial8250_reg, &up->port);
3121 }
3122
3123 return 0;
3124}
3125
Russell King3ae5eae2005-11-09 22:32:44 +00003126static int serial8250_resume(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003127{
3128 int i;
3129
Linus Torvalds1da177e2005-04-16 15:20:36 -07003130 for (i = 0; i < UART_NR; i++) {
3131 struct uart_8250_port *up = &serial8250_ports[i];
3132
Russell King3ae5eae2005-11-09 22:32:44 +00003133 if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
David Woodhouseb5b82df2007-05-17 14:27:39 +08003134 serial8250_resume_port(i);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003135 }
3136
3137 return 0;
3138}
3139
Russell King3ae5eae2005-11-09 22:32:44 +00003140static struct platform_driver serial8250_isa_driver = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003141 .probe = serial8250_probe,
3142 .remove = __devexit_p(serial8250_remove),
3143 .suspend = serial8250_suspend,
3144 .resume = serial8250_resume,
Russell King3ae5eae2005-11-09 22:32:44 +00003145 .driver = {
3146 .name = "serial8250",
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003147 .owner = THIS_MODULE,
Russell King3ae5eae2005-11-09 22:32:44 +00003148 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07003149};
3150
3151/*
3152 * This "device" covers _all_ ISA 8250-compatible serial devices listed
3153 * in the table in include/asm/serial.h
3154 */
3155static struct platform_device *serial8250_isa_devs;
3156
3157/*
3158 * serial8250_register_port and serial8250_unregister_port allows for
3159 * 16x50 serial ports to be configured at run-time, to support PCMCIA
3160 * modems and PCI multiport cards.
3161 */
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003162static DEFINE_MUTEX(serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003163
3164static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *port)
3165{
3166 int i;
3167
3168 /*
3169 * First, find a port entry which matches.
3170 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003171 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003172 if (uart_match_port(&serial8250_ports[i].port, port))
3173 return &serial8250_ports[i];
3174
3175 /*
3176 * We didn't find a matching entry, so look for the first
3177 * free entry. We look for one which hasn't been previously
3178 * used (indicated by zero iobase).
3179 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003180 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003181 if (serial8250_ports[i].port.type == PORT_UNKNOWN &&
3182 serial8250_ports[i].port.iobase == 0)
3183 return &serial8250_ports[i];
3184
3185 /*
3186 * That also failed. Last resort is to find any entry which
3187 * doesn't have a real port associated with it.
3188 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003189 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003190 if (serial8250_ports[i].port.type == PORT_UNKNOWN)
3191 return &serial8250_ports[i];
3192
3193 return NULL;
3194}
3195
3196/**
3197 * serial8250_register_port - register a serial port
3198 * @port: serial port template
3199 *
3200 * Configure the serial port specified by the request. If the
3201 * port exists and is in use, it is hung up and unregistered
3202 * first.
3203 *
3204 * The port is then probed and if necessary the IRQ is autodetected
3205 * If this fails an error is returned.
3206 *
3207 * On success the port is ready to use and the line number is returned.
3208 */
3209int serial8250_register_port(struct uart_port *port)
3210{
3211 struct uart_8250_port *uart;
3212 int ret = -ENOSPC;
3213
3214 if (port->uartclk == 0)
3215 return -EINVAL;
3216
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003217 mutex_lock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003218
3219 uart = serial8250_find_match_or_unused(port);
3220 if (uart) {
3221 uart_remove_one_port(&serial8250_reg, &uart->port);
3222
Will Newton74a197412008-02-04 22:27:50 -08003223 uart->port.iobase = port->iobase;
3224 uart->port.membase = port->membase;
3225 uart->port.irq = port->irq;
Vikram Pandita1c2f0492009-09-19 13:13:19 -07003226 uart->port.irqflags = port->irqflags;
Will Newton74a197412008-02-04 22:27:50 -08003227 uart->port.uartclk = port->uartclk;
3228 uart->port.fifosize = port->fifosize;
3229 uart->port.regshift = port->regshift;
3230 uart->port.iotype = port->iotype;
3231 uart->port.flags = port->flags | UPF_BOOT_AUTOCONF;
3232 uart->port.mapbase = port->mapbase;
3233 uart->port.private_data = port->private_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003234 if (port->dev)
3235 uart->port.dev = port->dev;
David Daney8e23fcc2009-01-02 13:49:54 +00003236
Shmulik Ladkanib5d228c2009-12-09 12:31:29 -08003237 if (port->flags & UPF_FIXED_TYPE)
3238 serial8250_init_fixed_type_port(uart, port->type);
David Daney8e23fcc2009-01-02 13:49:54 +00003239
David Daney7d6a07d2009-01-02 13:49:47 +00003240 set_io_from_upio(&uart->port);
3241 /* Possibly override default I/O functions. */
3242 if (port->serial_in)
3243 uart->port.serial_in = port->serial_in;
3244 if (port->serial_out)
3245 uart->port.serial_out = port->serial_out;
Jamie Iles583d28e2011-08-15 10:17:52 +01003246 if (port->handle_irq)
3247 uart->port.handle_irq = port->handle_irq;
Philippe Langlais235dae52010-07-29 17:13:57 +02003248 /* Possibly override set_termios call */
3249 if (port->set_termios)
3250 uart->port.set_termios = port->set_termios;
Manuel Laussc161afe2010-09-25 15:13:45 +02003251 if (port->pm)
3252 uart->port.pm = port->pm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003253
Alan Coxaf7f3742010-10-18 11:38:02 -07003254 if (serial8250_isa_config != NULL)
3255 serial8250_isa_config(0, &uart->port,
3256 &uart->capabilities);
3257
Linus Torvalds1da177e2005-04-16 15:20:36 -07003258 ret = uart_add_one_port(&serial8250_reg, &uart->port);
3259 if (ret == 0)
3260 ret = uart->port.line;
3261 }
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003262 mutex_unlock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003263
3264 return ret;
3265}
3266EXPORT_SYMBOL(serial8250_register_port);
3267
3268/**
3269 * serial8250_unregister_port - remove a 16x50 serial port at runtime
3270 * @line: serial line number
3271 *
3272 * Remove one serial port. This may not be called from interrupt
3273 * context. We hand the port back to the our control.
3274 */
3275void serial8250_unregister_port(int line)
3276{
3277 struct uart_8250_port *uart = &serial8250_ports[line];
3278
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003279 mutex_lock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003280 uart_remove_one_port(&serial8250_reg, &uart->port);
3281 if (serial8250_isa_devs) {
3282 uart->port.flags &= ~UPF_BOOT_AUTOCONF;
3283 uart->port.type = PORT_UNKNOWN;
3284 uart->port.dev = &serial8250_isa_devs->dev;
leitao@linux.vnet.ibm.comcb01ece2011-05-26 11:18:39 -03003285 uart->capabilities = uart_config[uart->port.type].flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003286 uart_add_one_port(&serial8250_reg, &uart->port);
3287 } else {
3288 uart->port.dev = NULL;
3289 }
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003290 mutex_unlock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003291}
3292EXPORT_SYMBOL(serial8250_unregister_port);
3293
3294static int __init serial8250_init(void)
3295{
Alan Cox25db8ad2008-08-19 20:49:40 -07003296 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003297
Dave Jonesa61c2d72006-01-07 23:18:19 +00003298 if (nr_uarts > UART_NR)
3299 nr_uarts = UART_NR;
3300
Paul Bollef1fb9bb2008-12-30 14:06:43 +01003301 printk(KERN_INFO "Serial: 8250/16550 driver, "
Dave Jonesa61c2d72006-01-07 23:18:19 +00003302 "%d ports, IRQ sharing %sabled\n", nr_uarts,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003303 share_irqs ? "en" : "dis");
3304
David Millerb70ac772008-10-13 10:36:31 +01003305#ifdef CONFIG_SPARC
3306 ret = sunserial_register_minors(&serial8250_reg, UART_NR);
3307#else
3308 serial8250_reg.nr = UART_NR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003309 ret = uart_register_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003310#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003311 if (ret)
3312 goto out;
3313
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003314 serial8250_isa_devs = platform_device_alloc("serial8250",
3315 PLAT8250_DEV_LEGACY);
3316 if (!serial8250_isa_devs) {
3317 ret = -ENOMEM;
Russell Kingbc965a72006-01-18 09:54:29 +00003318 goto unreg_uart_drv;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003319 }
3320
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003321 ret = platform_device_add(serial8250_isa_devs);
3322 if (ret)
3323 goto put_dev;
3324
Linus Torvalds1da177e2005-04-16 15:20:36 -07003325 serial8250_register_ports(&serial8250_reg, &serial8250_isa_devs->dev);
3326
Russell Kingbc965a72006-01-18 09:54:29 +00003327 ret = platform_driver_register(&serial8250_isa_driver);
3328 if (ret == 0)
3329 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003330
Russell Kingbc965a72006-01-18 09:54:29 +00003331 platform_device_del(serial8250_isa_devs);
Alan Cox25db8ad2008-08-19 20:49:40 -07003332put_dev:
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003333 platform_device_put(serial8250_isa_devs);
Alan Cox25db8ad2008-08-19 20:49:40 -07003334unreg_uart_drv:
David Millerb70ac772008-10-13 10:36:31 +01003335#ifdef CONFIG_SPARC
3336 sunserial_unregister_minors(&serial8250_reg, UART_NR);
3337#else
Linus Torvalds1da177e2005-04-16 15:20:36 -07003338 uart_unregister_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003339#endif
Alan Cox25db8ad2008-08-19 20:49:40 -07003340out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07003341 return ret;
3342}
3343
3344static void __exit serial8250_exit(void)
3345{
3346 struct platform_device *isa_dev = serial8250_isa_devs;
3347
3348 /*
3349 * This tells serial8250_unregister_port() not to re-register
3350 * the ports (thereby making serial8250_isa_driver permanently
3351 * in use.)
3352 */
3353 serial8250_isa_devs = NULL;
3354
Russell King3ae5eae2005-11-09 22:32:44 +00003355 platform_driver_unregister(&serial8250_isa_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003356 platform_device_unregister(isa_dev);
3357
David Millerb70ac772008-10-13 10:36:31 +01003358#ifdef CONFIG_SPARC
3359 sunserial_unregister_minors(&serial8250_reg, UART_NR);
3360#else
Linus Torvalds1da177e2005-04-16 15:20:36 -07003361 uart_unregister_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003362#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003363}
3364
3365module_init(serial8250_init);
3366module_exit(serial8250_exit);
3367
3368EXPORT_SYMBOL(serial8250_suspend_port);
3369EXPORT_SYMBOL(serial8250_resume_port);
3370
3371MODULE_LICENSE("GPL");
Adrian Bunkd87a6d92008-07-16 21:53:31 +01003372MODULE_DESCRIPTION("Generic 8250/16x50 serial driver");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003373
3374module_param(share_irqs, uint, 0644);
3375MODULE_PARM_DESC(share_irqs, "Share IRQs with other non-8250/16x50 devices"
3376 " (unsafe)");
3377
Dave Jonesa61c2d72006-01-07 23:18:19 +00003378module_param(nr_uarts, uint, 0644);
3379MODULE_PARM_DESC(nr_uarts, "Maximum number of UARTs supported. (1-" __MODULE_STRING(CONFIG_SERIAL_8250_NR_UARTS) ")");
3380
Chuck Ebbertd41a4b52009-10-01 15:44:26 -07003381module_param(skip_txen_test, uint, 0644);
3382MODULE_PARM_DESC(skip_txen_test, "Skip checking for the TXEN bug at init time");
3383
Linus Torvalds1da177e2005-04-16 15:20:36 -07003384#ifdef CONFIG_SERIAL_8250_RSA
3385module_param_array(probe_rsa, ulong, &probe_rsa_count, 0444);
3386MODULE_PARM_DESC(probe_rsa, "Probe I/O ports for RSA");
3387#endif
3388MODULE_ALIAS_CHARDEV_MAJOR(TTY_MAJOR);