blob: 0b4ce47d987197cac0b3df1f636edfd399dbebd2 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * linux/drivers/char/8250.c
3 *
4 * Driver for 8250/16550-type serial ports
5 *
6 * Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
7 *
8 * Copyright (C) 2001 Russell King.
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070015 * A note about mapbase / membase
16 *
17 * mapbase is the physical address of the IO port.
18 * membase is an 'ioremapped' cookie.
19 */
Linus Torvalds1da177e2005-04-16 15:20:36 -070020
21#if defined(CONFIG_SERIAL_8250_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
22#define SUPPORT_SYSRQ
23#endif
24
25#include <linux/module.h>
26#include <linux/moduleparam.h>
27#include <linux/ioport.h>
28#include <linux/init.h>
29#include <linux/console.h>
30#include <linux/sysrq.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include <linux/delay.h>
Russell Kingd052d1b2005-10-29 19:07:23 +010032#include <linux/platform_device.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070033#include <linux/tty.h>
Daniel Drakecd3ecad2010-10-20 16:00:48 -070034#include <linux/ratelimit.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070035#include <linux/tty_flip.h>
36#include <linux/serial_reg.h>
37#include <linux/serial_core.h>
38#include <linux/serial.h>
39#include <linux/serial_8250.h>
Andrew Morton78512ec2005-11-07 00:59:13 -080040#include <linux/nmi.h>
Arjan van de Venf392ecf2006-01-12 18:44:32 +000041#include <linux/mutex.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090042#include <linux/slab.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070043
44#include <asm/io.h>
45#include <asm/irq.h>
46
47#include "8250.h"
48
David Millerb70ac772008-10-13 10:36:31 +010049#ifdef CONFIG_SPARC
50#include "suncore.h"
51#endif
52
Linus Torvalds1da177e2005-04-16 15:20:36 -070053/*
54 * Configuration:
Thomas Gleixner40663cc2006-07-01 19:29:43 -070055 * share_irqs - whether we pass IRQF_SHARED to request_irq(). This option
Linus Torvalds1da177e2005-04-16 15:20:36 -070056 * is unsafe when used on edge-triggered interrupts.
57 */
Adrian Bunk408b6642005-05-01 08:59:29 -070058static unsigned int share_irqs = SERIAL8250_SHARE_IRQS;
Linus Torvalds1da177e2005-04-16 15:20:36 -070059
Dave Jonesa61c2d72006-01-07 23:18:19 +000060static unsigned int nr_uarts = CONFIG_SERIAL_8250_RUNTIME_UARTS;
61
David S. Miller84408382008-10-13 10:45:26 +010062static struct uart_driver serial8250_reg;
63
64static int serial_index(struct uart_port *port)
65{
66 return (serial8250_reg.minor - 64) + port->line;
67}
68
Chuck Ebbertd41a4b52009-10-01 15:44:26 -070069static unsigned int skip_txen_test; /* force skip of txen test at init time */
70
Linus Torvalds1da177e2005-04-16 15:20:36 -070071/*
72 * Debugging.
73 */
74#if 0
75#define DEBUG_AUTOCONF(fmt...) printk(fmt)
76#else
77#define DEBUG_AUTOCONF(fmt...) do { } while (0)
78#endif
79
80#if 0
81#define DEBUG_INTR(fmt...) printk(fmt)
82#else
83#define DEBUG_INTR(fmt...) do { } while (0)
84#endif
85
86#define PASS_LIMIT 256
87
Dick Hollenbeckbca47612009-12-09 12:31:34 -080088#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
89
90
Linus Torvalds1da177e2005-04-16 15:20:36 -070091/*
92 * We default to IRQ0 for the "no irq" hack. Some
93 * machine types want others as well - they're free
94 * to redefine this in their header file.
95 */
96#define is_real_interrupt(irq) ((irq) != 0)
97
Linus Torvalds1da177e2005-04-16 15:20:36 -070098#ifdef CONFIG_SERIAL_8250_DETECT_IRQ
99#define CONFIG_SERIAL_DETECT_IRQ 1
100#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700101#ifdef CONFIG_SERIAL_8250_MANY_PORTS
102#define CONFIG_SERIAL_MANY_PORTS 1
103#endif
104
105/*
106 * HUB6 is always on. This will be removed once the header
107 * files have been cleaned.
108 */
109#define CONFIG_HUB6 1
110
Bryan Wua4ed1e42008-05-31 16:10:04 +0800111#include <asm/serial.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112/*
113 * SERIAL_PORT_DFNS tells us about built-in ports that have no
114 * standard enumeration mechanism. Platforms that can find all
115 * serial ports via mechanisms like ACPI or PCI need not supply it.
116 */
117#ifndef SERIAL_PORT_DFNS
118#define SERIAL_PORT_DFNS
119#endif
120
Arjan van de Vencb3592b2005-11-28 21:04:11 +0000121static const struct old_serial_port old_serial_port[] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700122 SERIAL_PORT_DFNS /* defined in asm/serial.h */
123};
124
Russell King026d02a2005-06-29 18:45:19 +0100125#define UART_NR CONFIG_SERIAL_8250_NR_UARTS
Linus Torvalds1da177e2005-04-16 15:20:36 -0700126
127#ifdef CONFIG_SERIAL_8250_RSA
128
129#define PORT_RSA_MAX 4
130static unsigned long probe_rsa[PORT_RSA_MAX];
131static unsigned int probe_rsa_count;
132#endif /* CONFIG_SERIAL_8250_RSA */
133
134struct uart_8250_port {
135 struct uart_port port;
136 struct timer_list timer; /* "no irq" timer */
137 struct list_head list; /* ports on this IRQ */
Russell King4ba5e352005-06-23 10:43:04 +0100138 unsigned short capabilities; /* port capabilities */
139 unsigned short bugs; /* port bugs */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700140 unsigned int tx_loadsz; /* transmit fifo load size */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700141 unsigned char acr;
142 unsigned char ier;
143 unsigned char lcr;
144 unsigned char mcr;
145 unsigned char mcr_mask; /* mask of user bits */
146 unsigned char mcr_force; /* mask of forced bits */
Alan Coxb8e7e402009-05-28 14:01:35 +0100147 unsigned char cur_iotype; /* Running I/O type */
Corey Minyardad4c2aa2007-08-22 14:01:18 -0700148
149 /*
150 * Some bits in registers are cleared on a read, so they must
151 * be saved whenever the register is read but the bits will not
152 * be immediately processed.
153 */
154#define LSR_SAVE_FLAGS UART_LSR_BRK_ERROR_BITS
155 unsigned char lsr_saved_flags;
156#define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA
157 unsigned char msr_saved_flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700158};
159
160struct irq_info {
Alan Cox25db8ad2008-08-19 20:49:40 -0700161 struct hlist_node node;
162 int irq;
163 spinlock_t lock; /* Protects list not the hash */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700164 struct list_head *head;
165};
166
Alan Cox25db8ad2008-08-19 20:49:40 -0700167#define NR_IRQ_HASH 32 /* Can be adjusted later */
168static struct hlist_head irq_lists[NR_IRQ_HASH];
169static DEFINE_MUTEX(hash_mutex); /* Used to walk the hash */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700170
171/*
172 * Here we define the default xmit fifo size used for each type of UART.
173 */
174static const struct serial8250_config uart_config[] = {
175 [PORT_UNKNOWN] = {
176 .name = "unknown",
177 .fifo_size = 1,
178 .tx_loadsz = 1,
179 },
180 [PORT_8250] = {
181 .name = "8250",
182 .fifo_size = 1,
183 .tx_loadsz = 1,
184 },
185 [PORT_16450] = {
186 .name = "16450",
187 .fifo_size = 1,
188 .tx_loadsz = 1,
189 },
190 [PORT_16550] = {
191 .name = "16550",
192 .fifo_size = 1,
193 .tx_loadsz = 1,
194 },
195 [PORT_16550A] = {
196 .name = "16550A",
197 .fifo_size = 16,
198 .tx_loadsz = 16,
199 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
200 .flags = UART_CAP_FIFO,
201 },
202 [PORT_CIRRUS] = {
203 .name = "Cirrus",
204 .fifo_size = 1,
205 .tx_loadsz = 1,
206 },
207 [PORT_16650] = {
208 .name = "ST16650",
209 .fifo_size = 1,
210 .tx_loadsz = 1,
211 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
212 },
213 [PORT_16650V2] = {
214 .name = "ST16650V2",
215 .fifo_size = 32,
216 .tx_loadsz = 16,
217 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
218 UART_FCR_T_TRIG_00,
219 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
220 },
221 [PORT_16750] = {
222 .name = "TI16750",
223 .fifo_size = 64,
224 .tx_loadsz = 64,
225 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 |
226 UART_FCR7_64BYTE,
227 .flags = UART_CAP_FIFO | UART_CAP_SLEEP | UART_CAP_AFE,
228 },
229 [PORT_STARTECH] = {
230 .name = "Startech",
231 .fifo_size = 1,
232 .tx_loadsz = 1,
233 },
234 [PORT_16C950] = {
235 .name = "16C950/954",
236 .fifo_size = 128,
237 .tx_loadsz = 128,
238 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
Yegor Yefremov7a56aa42010-06-16 16:29:55 +0200239 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700240 },
241 [PORT_16654] = {
242 .name = "ST16654",
243 .fifo_size = 64,
244 .tx_loadsz = 32,
245 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
246 UART_FCR_T_TRIG_10,
247 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
248 },
249 [PORT_16850] = {
250 .name = "XR16850",
251 .fifo_size = 128,
252 .tx_loadsz = 128,
253 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
254 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
255 },
256 [PORT_RSA] = {
257 .name = "RSA",
258 .fifo_size = 2048,
259 .tx_loadsz = 2048,
260 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_11,
261 .flags = UART_CAP_FIFO,
262 },
263 [PORT_NS16550A] = {
264 .name = "NS16550A",
265 .fifo_size = 16,
266 .tx_loadsz = 16,
267 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
268 .flags = UART_CAP_FIFO | UART_NATSEMI,
269 },
270 [PORT_XSCALE] = {
271 .name = "XScale",
272 .fifo_size = 32,
273 .tx_loadsz = 32,
274 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
275 .flags = UART_CAP_FIFO | UART_CAP_UUE,
276 },
Thomas Koellerbd71c182007-05-06 14:48:47 -0700277 [PORT_RM9000] = {
278 .name = "RM9000",
279 .fifo_size = 16,
280 .tx_loadsz = 16,
281 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
282 .flags = UART_CAP_FIFO,
283 },
David Daney6b06f192009-01-02 13:50:00 +0000284 [PORT_OCTEON] = {
285 .name = "OCTEON",
286 .fifo_size = 64,
287 .tx_loadsz = 64,
288 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
289 .flags = UART_CAP_FIFO,
290 },
Florian Fainelli08e09922009-06-11 13:21:24 +0100291 [PORT_AR7] = {
292 .name = "AR7",
293 .fifo_size = 16,
294 .tx_loadsz = 16,
295 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_00,
296 .flags = UART_CAP_FIFO | UART_CAP_AFE,
297 },
Philippe Langlais235dae52010-07-29 17:13:57 +0200298 [PORT_U6_16550A] = {
299 .name = "U6_16550A",
300 .fifo_size = 64,
301 .tx_loadsz = 64,
302 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
303 .flags = UART_CAP_FIFO | UART_CAP_AFE,
304 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700305};
306
Manuel Lauss12bf3f22010-07-15 21:45:05 +0200307#if defined(CONFIG_MIPS_ALCHEMY)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000308
309/* Au1x00 UART hardware has a weird register layout */
310static const u8 au_io_in_map[] = {
311 [UART_RX] = 0,
312 [UART_IER] = 2,
313 [UART_IIR] = 3,
314 [UART_LCR] = 5,
315 [UART_MCR] = 6,
316 [UART_LSR] = 7,
317 [UART_MSR] = 8,
318};
319
320static const u8 au_io_out_map[] = {
321 [UART_TX] = 1,
322 [UART_IER] = 2,
323 [UART_FCR] = 4,
324 [UART_LCR] = 5,
325 [UART_MCR] = 6,
326};
327
328/* sane hardware needs no mapping */
David Daney7d6a07d2009-01-02 13:49:47 +0000329static inline int map_8250_in_reg(struct uart_port *p, int offset)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000330{
David Daney7d6a07d2009-01-02 13:49:47 +0000331 if (p->iotype != UPIO_AU)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000332 return offset;
333 return au_io_in_map[offset];
334}
335
David Daney7d6a07d2009-01-02 13:49:47 +0000336static inline int map_8250_out_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_out_map[offset];
341}
342
Alan Cox6f803cd2008-02-08 04:18:52 -0800343#elif defined(CONFIG_SERIAL_8250_RM9K)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700344
345static const u8
346 regmap_in[8] = {
347 [UART_RX] = 0x00,
348 [UART_IER] = 0x0c,
349 [UART_IIR] = 0x14,
350 [UART_LCR] = 0x1c,
351 [UART_MCR] = 0x20,
352 [UART_LSR] = 0x24,
353 [UART_MSR] = 0x28,
354 [UART_SCR] = 0x2c
355 },
356 regmap_out[8] = {
357 [UART_TX] = 0x04,
358 [UART_IER] = 0x0c,
359 [UART_FCR] = 0x18,
360 [UART_LCR] = 0x1c,
361 [UART_MCR] = 0x20,
362 [UART_LSR] = 0x24,
363 [UART_MSR] = 0x28,
364 [UART_SCR] = 0x2c
365 };
366
David Daney7d6a07d2009-01-02 13:49:47 +0000367static inline int map_8250_in_reg(struct uart_port *p, int offset)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700368{
David Daney7d6a07d2009-01-02 13:49:47 +0000369 if (p->iotype != UPIO_RM9000)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700370 return offset;
371 return regmap_in[offset];
372}
373
David Daney7d6a07d2009-01-02 13:49:47 +0000374static inline int map_8250_out_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_out[offset];
379}
380
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000381#else
382
383/* sane hardware needs no mapping */
384#define map_8250_in_reg(up, offset) (offset)
385#define map_8250_out_reg(up, offset) (offset)
386
387#endif
388
David Daney7d6a07d2009-01-02 13:49:47 +0000389static unsigned int hub6_serial_in(struct uart_port *p, int offset)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700390{
David Daney7d6a07d2009-01-02 13:49:47 +0000391 offset = map_8250_in_reg(p, offset) << p->regshift;
392 outb(p->hub6 - 1 + offset, p->iobase);
393 return inb(p->iobase + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700394}
395
David Daney7d6a07d2009-01-02 13:49:47 +0000396static void hub6_serial_out(struct uart_port *p, int offset, int value)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700397{
David Daney7d6a07d2009-01-02 13:49:47 +0000398 offset = map_8250_out_reg(p, offset) << p->regshift;
399 outb(p->hub6 - 1 + offset, p->iobase);
400 outb(value, p->iobase + 1);
401}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700402
David Daney7d6a07d2009-01-02 13:49:47 +0000403static unsigned int mem_serial_in(struct uart_port *p, int offset)
404{
405 offset = map_8250_in_reg(p, offset) << p->regshift;
406 return readb(p->membase + offset);
407}
408
409static void mem_serial_out(struct uart_port *p, int offset, int value)
410{
411 offset = map_8250_out_reg(p, offset) << p->regshift;
412 writeb(value, p->membase + offset);
413}
414
415static void mem32_serial_out(struct uart_port *p, int offset, int value)
416{
417 offset = map_8250_out_reg(p, offset) << p->regshift;
418 writel(value, p->membase + offset);
419}
420
421static unsigned int mem32_serial_in(struct uart_port *p, int offset)
422{
423 offset = map_8250_in_reg(p, offset) << p->regshift;
424 return readl(p->membase + offset);
425}
426
David Daney7d6a07d2009-01-02 13:49:47 +0000427static unsigned int au_serial_in(struct uart_port *p, int offset)
428{
429 offset = map_8250_in_reg(p, offset) << p->regshift;
430 return __raw_readl(p->membase + offset);
431}
432
433static void au_serial_out(struct uart_port *p, int offset, int value)
434{
435 offset = map_8250_out_reg(p, offset) << p->regshift;
436 __raw_writel(value, p->membase + offset);
437}
David Daney7d6a07d2009-01-02 13:49:47 +0000438
439static unsigned int tsi_serial_in(struct uart_port *p, int offset)
440{
441 unsigned int tmp;
442 offset = map_8250_in_reg(p, offset) << p->regshift;
443 if (offset == UART_IIR) {
444 tmp = readl(p->membase + (UART_IIR & ~3));
445 return (tmp >> 16) & 0xff; /* UART_IIR % 4 == 2 */
446 } else
447 return readb(p->membase + offset);
448}
449
450static void tsi_serial_out(struct uart_port *p, int offset, int value)
451{
452 offset = map_8250_out_reg(p, offset) << p->regshift;
453 if (!((offset == UART_IER) && (value & UART_IER_UUE)))
454 writeb(value, p->membase + offset);
455}
456
457static void dwapb_serial_out(struct uart_port *p, int offset, int value)
458{
459 int save_offset = offset;
460 offset = map_8250_out_reg(p, offset) << p->regshift;
461 /* Save the LCR value so it can be re-written when a
462 * Busy Detect interrupt occurs. */
463 if (save_offset == UART_LCR) {
Jamie Iles49d57412010-12-01 23:39:35 +0000464 struct uart_8250_port *up =
465 container_of(p, struct uart_8250_port, port);
David Daney7d6a07d2009-01-02 13:49:47 +0000466 up->lcr = value;
467 }
468 writeb(value, p->membase + offset);
469 /* Read the IER to ensure any interrupt is cleared before
470 * returning from ISR. */
471 if (save_offset == UART_TX || save_offset == UART_IER)
472 value = p->serial_in(p, UART_IER);
473}
474
475static unsigned int io_serial_in(struct uart_port *p, int offset)
476{
477 offset = map_8250_in_reg(p, offset) << p->regshift;
478 return inb(p->iobase + offset);
479}
480
481static void io_serial_out(struct uart_port *p, int offset, int value)
482{
483 offset = map_8250_out_reg(p, offset) << p->regshift;
484 outb(value, p->iobase + offset);
485}
486
487static void set_io_from_upio(struct uart_port *p)
488{
Jamie Iles49d57412010-12-01 23:39:35 +0000489 struct uart_8250_port *up =
490 container_of(p, struct uart_8250_port, port);
David Daney7d6a07d2009-01-02 13:49:47 +0000491 switch (p->iotype) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700492 case UPIO_HUB6:
David Daney7d6a07d2009-01-02 13:49:47 +0000493 p->serial_in = hub6_serial_in;
494 p->serial_out = hub6_serial_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700495 break;
496
497 case UPIO_MEM:
David Daney7d6a07d2009-01-02 13:49:47 +0000498 p->serial_in = mem_serial_in;
499 p->serial_out = mem_serial_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700500 break;
501
Thomas Koellerbd71c182007-05-06 14:48:47 -0700502 case UPIO_RM9000:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700503 case UPIO_MEM32:
David Daney7d6a07d2009-01-02 13:49:47 +0000504 p->serial_in = mem32_serial_in;
505 p->serial_out = mem32_serial_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700506 break;
507
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000508 case UPIO_AU:
David Daney7d6a07d2009-01-02 13:49:47 +0000509 p->serial_in = au_serial_in;
510 p->serial_out = au_serial_out;
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000511 break;
Manuel Lauss12bf3f22010-07-15 21:45:05 +0200512
Zang Roy-r619113be91ec2006-06-30 02:29:58 -0700513 case UPIO_TSI:
David Daney7d6a07d2009-01-02 13:49:47 +0000514 p->serial_in = tsi_serial_in;
515 p->serial_out = tsi_serial_out;
Zang Roy-r619113be91ec2006-06-30 02:29:58 -0700516 break;
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000517
Marc St-Jeanbeab6972007-05-06 14:48:45 -0700518 case UPIO_DWAPB:
David Daney7d6a07d2009-01-02 13:49:47 +0000519 p->serial_in = mem_serial_in;
520 p->serial_out = dwapb_serial_out;
Marc St-Jeanbeab6972007-05-06 14:48:45 -0700521 break;
522
Linus Torvalds1da177e2005-04-16 15:20:36 -0700523 default:
David Daney7d6a07d2009-01-02 13:49:47 +0000524 p->serial_in = io_serial_in;
525 p->serial_out = io_serial_out;
526 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700527 }
Alan Coxb8e7e402009-05-28 14:01:35 +0100528 /* Remember loaded iotype */
529 up->cur_iotype = p->iotype;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700530}
531
Alex Williamson40b36da2007-02-14 00:33:04 -0800532static void
533serial_out_sync(struct uart_8250_port *up, int offset, int value)
534{
David Daney7d6a07d2009-01-02 13:49:47 +0000535 struct uart_port *p = &up->port;
536 switch (p->iotype) {
Alex Williamson40b36da2007-02-14 00:33:04 -0800537 case UPIO_MEM:
538 case UPIO_MEM32:
Alex Williamson40b36da2007-02-14 00:33:04 -0800539 case UPIO_AU:
Marc St-Jeanbeab6972007-05-06 14:48:45 -0700540 case UPIO_DWAPB:
David Daney7d6a07d2009-01-02 13:49:47 +0000541 p->serial_out(p, offset, value);
542 p->serial_in(p, UART_LCR); /* safe, no side-effects */
Alex Williamson40b36da2007-02-14 00:33:04 -0800543 break;
544 default:
David Daney7d6a07d2009-01-02 13:49:47 +0000545 p->serial_out(p, offset, value);
Alex Williamson40b36da2007-02-14 00:33:04 -0800546 }
547}
548
David Daney7d6a07d2009-01-02 13:49:47 +0000549#define serial_in(up, offset) \
550 (up->port.serial_in(&(up)->port, (offset)))
551#define serial_out(up, offset, value) \
552 (up->port.serial_out(&(up)->port, (offset), (value)))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700553/*
554 * We used to support using pause I/O for certain machines. We
555 * haven't supported this for a while, but just in case it's badly
556 * needed for certain old 386 machines, I've left these #define's
557 * in....
558 */
559#define serial_inp(up, offset) serial_in(up, offset)
560#define serial_outp(up, offset, value) serial_out(up, offset, value)
561
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100562/* Uart divisor latch read */
563static inline int _serial_dl_read(struct uart_8250_port *up)
564{
565 return serial_inp(up, UART_DLL) | serial_inp(up, UART_DLM) << 8;
566}
567
568/* Uart divisor latch write */
569static inline void _serial_dl_write(struct uart_8250_port *up, int value)
570{
571 serial_outp(up, UART_DLL, value & 0xff);
572 serial_outp(up, UART_DLM, value >> 8 & 0xff);
573}
574
Manuel Lauss12bf3f22010-07-15 21:45:05 +0200575#if defined(CONFIG_MIPS_ALCHEMY)
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100576/* Au1x00 haven't got a standard divisor latch */
577static int serial_dl_read(struct uart_8250_port *up)
578{
579 if (up->port.iotype == UPIO_AU)
580 return __raw_readl(up->port.membase + 0x28);
581 else
582 return _serial_dl_read(up);
583}
584
585static void serial_dl_write(struct uart_8250_port *up, int value)
586{
587 if (up->port.iotype == UPIO_AU)
588 __raw_writel(value, up->port.membase + 0x28);
589 else
590 _serial_dl_write(up, value);
591}
Alan Cox6f803cd2008-02-08 04:18:52 -0800592#elif defined(CONFIG_SERIAL_8250_RM9K)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700593static int serial_dl_read(struct uart_8250_port *up)
594{
595 return (up->port.iotype == UPIO_RM9000) ?
596 (((__raw_readl(up->port.membase + 0x10) << 8) |
597 (__raw_readl(up->port.membase + 0x08) & 0xff)) & 0xffff) :
598 _serial_dl_read(up);
599}
600
601static void serial_dl_write(struct uart_8250_port *up, int value)
602{
603 if (up->port.iotype == UPIO_RM9000) {
604 __raw_writel(value, up->port.membase + 0x08);
605 __raw_writel(value >> 8, up->port.membase + 0x10);
606 } else {
607 _serial_dl_write(up, value);
608 }
609}
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100610#else
611#define serial_dl_read(up) _serial_dl_read(up)
612#define serial_dl_write(up, value) _serial_dl_write(up, value)
613#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700614
615/*
616 * For the 16C950
617 */
618static void serial_icr_write(struct uart_8250_port *up, int offset, int value)
619{
620 serial_out(up, UART_SCR, offset);
621 serial_out(up, UART_ICR, value);
622}
623
624static unsigned int serial_icr_read(struct uart_8250_port *up, int offset)
625{
626 unsigned int value;
627
628 serial_icr_write(up, UART_ACR, up->acr | UART_ACR_ICRRD);
629 serial_out(up, UART_SCR, offset);
630 value = serial_in(up, UART_ICR);
631 serial_icr_write(up, UART_ACR, up->acr);
632
633 return value;
634}
635
636/*
637 * FIFO support.
638 */
Will Newtonb5d674a2008-10-13 10:36:21 +0100639static void serial8250_clear_fifos(struct uart_8250_port *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700640{
641 if (p->capabilities & UART_CAP_FIFO) {
642 serial_outp(p, UART_FCR, UART_FCR_ENABLE_FIFO);
643 serial_outp(p, UART_FCR, UART_FCR_ENABLE_FIFO |
644 UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
645 serial_outp(p, UART_FCR, 0);
646 }
647}
648
649/*
650 * IER sleep support. UARTs which have EFRs need the "extended
651 * capability" bit enabled. Note that on XR16C850s, we need to
652 * reset LCR to write to IER.
653 */
Will Newtonb5d674a2008-10-13 10:36:21 +0100654static void serial8250_set_sleep(struct uart_8250_port *p, int sleep)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700655{
656 if (p->capabilities & UART_CAP_SLEEP) {
657 if (p->capabilities & UART_CAP_EFR) {
658 serial_outp(p, UART_LCR, 0xBF);
659 serial_outp(p, UART_EFR, UART_EFR_ECB);
660 serial_outp(p, UART_LCR, 0);
661 }
662 serial_outp(p, UART_IER, sleep ? UART_IERX_SLEEP : 0);
663 if (p->capabilities & UART_CAP_EFR) {
664 serial_outp(p, UART_LCR, 0xBF);
665 serial_outp(p, UART_EFR, 0);
666 serial_outp(p, UART_LCR, 0);
667 }
668 }
669}
670
671#ifdef CONFIG_SERIAL_8250_RSA
672/*
673 * Attempts to turn on the RSA FIFO. Returns zero on failure.
674 * We set the port uart clock rate if we succeed.
675 */
676static int __enable_rsa(struct uart_8250_port *up)
677{
678 unsigned char mode;
679 int result;
680
681 mode = serial_inp(up, UART_RSA_MSR);
682 result = mode & UART_RSA_MSR_FIFO;
683
684 if (!result) {
685 serial_outp(up, UART_RSA_MSR, mode | UART_RSA_MSR_FIFO);
686 mode = serial_inp(up, UART_RSA_MSR);
687 result = mode & UART_RSA_MSR_FIFO;
688 }
689
690 if (result)
691 up->port.uartclk = SERIAL_RSA_BAUD_BASE * 16;
692
693 return result;
694}
695
696static void enable_rsa(struct uart_8250_port *up)
697{
698 if (up->port.type == PORT_RSA) {
699 if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) {
700 spin_lock_irq(&up->port.lock);
701 __enable_rsa(up);
702 spin_unlock_irq(&up->port.lock);
703 }
704 if (up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16)
705 serial_outp(up, UART_RSA_FRR, 0);
706 }
707}
708
709/*
710 * Attempts to turn off the RSA FIFO. Returns zero on failure.
711 * It is unknown why interrupts were disabled in here. However,
712 * the caller is expected to preserve this behaviour by grabbing
713 * the spinlock before calling this function.
714 */
715static void disable_rsa(struct uart_8250_port *up)
716{
717 unsigned char mode;
718 int result;
719
720 if (up->port.type == PORT_RSA &&
721 up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) {
722 spin_lock_irq(&up->port.lock);
723
724 mode = serial_inp(up, UART_RSA_MSR);
725 result = !(mode & UART_RSA_MSR_FIFO);
726
727 if (!result) {
728 serial_outp(up, UART_RSA_MSR, mode & ~UART_RSA_MSR_FIFO);
729 mode = serial_inp(up, UART_RSA_MSR);
730 result = !(mode & UART_RSA_MSR_FIFO);
731 }
732
733 if (result)
734 up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16;
735 spin_unlock_irq(&up->port.lock);
736 }
737}
738#endif /* CONFIG_SERIAL_8250_RSA */
739
740/*
741 * This is a quickie test to see how big the FIFO is.
742 * It doesn't work at all the time, more's the pity.
743 */
744static int size_fifo(struct uart_8250_port *up)
745{
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100746 unsigned char old_fcr, old_mcr, old_lcr;
747 unsigned short old_dl;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700748 int count;
749
750 old_lcr = serial_inp(up, UART_LCR);
751 serial_outp(up, UART_LCR, 0);
752 old_fcr = serial_inp(up, UART_FCR);
753 old_mcr = serial_inp(up, UART_MCR);
754 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO |
755 UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
756 serial_outp(up, UART_MCR, UART_MCR_LOOP);
757 serial_outp(up, UART_LCR, UART_LCR_DLAB);
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100758 old_dl = serial_dl_read(up);
759 serial_dl_write(up, 0x0001);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700760 serial_outp(up, UART_LCR, 0x03);
761 for (count = 0; count < 256; count++)
762 serial_outp(up, UART_TX, count);
763 mdelay(20);/* FIXME - schedule_timeout */
764 for (count = 0; (serial_inp(up, UART_LSR) & UART_LSR_DR) &&
765 (count < 256); count++)
766 serial_inp(up, UART_RX);
767 serial_outp(up, UART_FCR, old_fcr);
768 serial_outp(up, UART_MCR, old_mcr);
769 serial_outp(up, UART_LCR, UART_LCR_DLAB);
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100770 serial_dl_write(up, old_dl);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700771 serial_outp(up, UART_LCR, old_lcr);
772
773 return count;
774}
775
776/*
777 * Read UART ID using the divisor method - set DLL and DLM to zero
778 * and the revision will be in DLL and device type in DLM. We
779 * preserve the device state across this.
780 */
781static unsigned int autoconfig_read_divisor_id(struct uart_8250_port *p)
782{
783 unsigned char old_dll, old_dlm, old_lcr;
784 unsigned int id;
785
786 old_lcr = serial_inp(p, UART_LCR);
787 serial_outp(p, UART_LCR, UART_LCR_DLAB);
788
789 old_dll = serial_inp(p, UART_DLL);
790 old_dlm = serial_inp(p, UART_DLM);
791
792 serial_outp(p, UART_DLL, 0);
793 serial_outp(p, UART_DLM, 0);
794
795 id = serial_inp(p, UART_DLL) | serial_inp(p, UART_DLM) << 8;
796
797 serial_outp(p, UART_DLL, old_dll);
798 serial_outp(p, UART_DLM, old_dlm);
799 serial_outp(p, UART_LCR, old_lcr);
800
801 return id;
802}
803
804/*
805 * This is a helper routine to autodetect StarTech/Exar/Oxsemi UART's.
806 * When this function is called we know it is at least a StarTech
807 * 16650 V2, but it might be one of several StarTech UARTs, or one of
808 * its clones. (We treat the broken original StarTech 16650 V1 as a
809 * 16550, and why not? Startech doesn't seem to even acknowledge its
810 * existence.)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700811 *
Linus Torvalds1da177e2005-04-16 15:20:36 -0700812 * What evil have men's minds wrought...
813 */
814static void autoconfig_has_efr(struct uart_8250_port *up)
815{
816 unsigned int id1, id2, id3, rev;
817
818 /*
819 * Everything with an EFR has SLEEP
820 */
821 up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP;
822
823 /*
824 * First we check to see if it's an Oxford Semiconductor UART.
825 *
826 * If we have to do this here because some non-National
827 * Semiconductor clone chips lock up if you try writing to the
828 * LSR register (which serial_icr_read does)
829 */
830
831 /*
832 * Check for Oxford Semiconductor 16C950.
833 *
834 * EFR [4] must be set else this test fails.
835 *
836 * This shouldn't be necessary, but Mike Hudson (Exoray@isys.ca)
837 * claims that it's needed for 952 dual UART's (which are not
838 * recommended for new designs).
839 */
840 up->acr = 0;
841 serial_out(up, UART_LCR, 0xBF);
842 serial_out(up, UART_EFR, UART_EFR_ECB);
843 serial_out(up, UART_LCR, 0x00);
844 id1 = serial_icr_read(up, UART_ID1);
845 id2 = serial_icr_read(up, UART_ID2);
846 id3 = serial_icr_read(up, UART_ID3);
847 rev = serial_icr_read(up, UART_REV);
848
849 DEBUG_AUTOCONF("950id=%02x:%02x:%02x:%02x ", id1, id2, id3, rev);
850
851 if (id1 == 0x16 && id2 == 0xC9 &&
852 (id3 == 0x50 || id3 == 0x52 || id3 == 0x54)) {
853 up->port.type = PORT_16C950;
Russell King4ba5e352005-06-23 10:43:04 +0100854
855 /*
856 * Enable work around for the Oxford Semiconductor 952 rev B
857 * chip which causes it to seriously miscalculate baud rates
858 * when DLL is 0.
859 */
860 if (id3 == 0x52 && rev == 0x01)
861 up->bugs |= UART_BUG_QUOT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700862 return;
863 }
Thomas Koellerbd71c182007-05-06 14:48:47 -0700864
Linus Torvalds1da177e2005-04-16 15:20:36 -0700865 /*
866 * We check for a XR16C850 by setting DLL and DLM to 0, and then
867 * reading back DLL and DLM. The chip type depends on the DLM
868 * value read back:
869 * 0x10 - XR16C850 and the DLL contains the chip revision.
870 * 0x12 - XR16C2850.
871 * 0x14 - XR16C854.
872 */
873 id1 = autoconfig_read_divisor_id(up);
874 DEBUG_AUTOCONF("850id=%04x ", id1);
875
876 id2 = id1 >> 8;
877 if (id2 == 0x10 || id2 == 0x12 || id2 == 0x14) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700878 up->port.type = PORT_16850;
879 return;
880 }
881
882 /*
883 * It wasn't an XR16C850.
884 *
885 * We distinguish between the '654 and the '650 by counting
886 * how many bytes are in the FIFO. I'm using this for now,
887 * since that's the technique that was sent to me in the
888 * serial driver update, but I'm not convinced this works.
889 * I've had problems doing this in the past. -TYT
890 */
891 if (size_fifo(up) == 64)
892 up->port.type = PORT_16654;
893 else
894 up->port.type = PORT_16650V2;
895}
896
897/*
898 * We detected a chip without a FIFO. Only two fall into
899 * this category - the original 8250 and the 16450. The
900 * 16450 has a scratch register (accessible with LCR=0)
901 */
902static void autoconfig_8250(struct uart_8250_port *up)
903{
904 unsigned char scratch, status1, status2;
905
906 up->port.type = PORT_8250;
907
908 scratch = serial_in(up, UART_SCR);
909 serial_outp(up, UART_SCR, 0xa5);
910 status1 = serial_in(up, UART_SCR);
911 serial_outp(up, UART_SCR, 0x5a);
912 status2 = serial_in(up, UART_SCR);
913 serial_outp(up, UART_SCR, scratch);
914
915 if (status1 == 0xa5 && status2 == 0x5a)
916 up->port.type = PORT_16450;
917}
918
919static int broken_efr(struct uart_8250_port *up)
920{
921 /*
922 * Exar ST16C2550 "A2" devices incorrectly detect as
923 * having an EFR, and report an ID of 0x0201. See
Justin P. Mattock631dd1a2010-10-18 11:03:14 +0200924 * http://linux.derkeiler.com/Mailing-Lists/Kernel/2004-11/4812.html
Linus Torvalds1da177e2005-04-16 15:20:36 -0700925 */
926 if (autoconfig_read_divisor_id(up) == 0x0201 && size_fifo(up) == 16)
927 return 1;
928
929 return 0;
930}
931
932/*
933 * We know that the chip has FIFOs. Does it have an EFR? The
934 * EFR is located in the same register position as the IIR and
935 * we know the top two bits of the IIR are currently set. The
936 * EFR should contain zero. Try to read the EFR.
937 */
938static void autoconfig_16550a(struct uart_8250_port *up)
939{
940 unsigned char status1, status2;
941 unsigned int iersave;
942
943 up->port.type = PORT_16550A;
944 up->capabilities |= UART_CAP_FIFO;
945
946 /*
947 * Check for presence of the EFR when DLAB is set.
948 * Only ST16C650V1 UARTs pass this test.
949 */
950 serial_outp(up, UART_LCR, UART_LCR_DLAB);
951 if (serial_in(up, UART_EFR) == 0) {
952 serial_outp(up, UART_EFR, 0xA8);
953 if (serial_in(up, UART_EFR) != 0) {
954 DEBUG_AUTOCONF("EFRv1 ");
955 up->port.type = PORT_16650;
956 up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP;
957 } else {
958 DEBUG_AUTOCONF("Motorola 8xxx DUART ");
959 }
960 serial_outp(up, UART_EFR, 0);
961 return;
962 }
963
964 /*
965 * Maybe it requires 0xbf to be written to the LCR.
966 * (other ST16C650V2 UARTs, TI16C752A, etc)
967 */
968 serial_outp(up, UART_LCR, 0xBF);
969 if (serial_in(up, UART_EFR) == 0 && !broken_efr(up)) {
970 DEBUG_AUTOCONF("EFRv2 ");
971 autoconfig_has_efr(up);
972 return;
973 }
974
975 /*
976 * Check for a National Semiconductor SuperIO chip.
977 * Attempt to switch to bank 2, read the value of the LOOP bit
978 * from EXCR1. Switch back to bank 0, change it in MCR. Then
979 * switch back to bank 2, read it from EXCR1 again and check
980 * it's changed. If so, set baud_base in EXCR2 to 921600. -- dwmw2
Linus Torvalds1da177e2005-04-16 15:20:36 -0700981 */
982 serial_outp(up, UART_LCR, 0);
983 status1 = serial_in(up, UART_MCR);
984 serial_outp(up, UART_LCR, 0xE0);
985 status2 = serial_in(up, 0x02); /* EXCR1 */
986
987 if (!((status2 ^ status1) & UART_MCR_LOOP)) {
988 serial_outp(up, UART_LCR, 0);
989 serial_outp(up, UART_MCR, status1 ^ UART_MCR_LOOP);
990 serial_outp(up, UART_LCR, 0xE0);
991 status2 = serial_in(up, 0x02); /* EXCR1 */
992 serial_outp(up, UART_LCR, 0);
993 serial_outp(up, UART_MCR, status1);
994
995 if ((status2 ^ status1) & UART_MCR_LOOP) {
David Woodhouse857dde22005-05-21 15:52:23 +0100996 unsigned short quot;
997
Linus Torvalds1da177e2005-04-16 15:20:36 -0700998 serial_outp(up, UART_LCR, 0xE0);
David Woodhouse857dde22005-05-21 15:52:23 +0100999
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +01001000 quot = serial_dl_read(up);
David Woodhouse857dde22005-05-21 15:52:23 +01001001 quot <<= 3;
1002
David Woodhouseb5b82df2007-05-17 14:27:39 +08001003 status1 = serial_in(up, 0x04); /* EXCR2 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001004 status1 &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */
1005 status1 |= 0x10; /* 1.625 divisor for baud_base --> 921600 */
1006 serial_outp(up, 0x04, status1);
Thomas Koellerbd71c182007-05-06 14:48:47 -07001007
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +01001008 serial_dl_write(up, quot);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001009
David Woodhouse857dde22005-05-21 15:52:23 +01001010 serial_outp(up, UART_LCR, 0);
1011
1012 up->port.uartclk = 921600*16;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001013 up->port.type = PORT_NS16550A;
1014 up->capabilities |= UART_NATSEMI;
1015 return;
1016 }
1017 }
1018
1019 /*
1020 * No EFR. Try to detect a TI16750, which only sets bit 5 of
1021 * the IIR when 64 byte FIFO mode is enabled when DLAB is set.
1022 * Try setting it with and without DLAB set. Cheap clones
1023 * set bit 5 without DLAB set.
1024 */
1025 serial_outp(up, UART_LCR, 0);
1026 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE);
1027 status1 = serial_in(up, UART_IIR) >> 5;
1028 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO);
1029 serial_outp(up, UART_LCR, UART_LCR_DLAB);
1030 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE);
1031 status2 = serial_in(up, UART_IIR) >> 5;
1032 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO);
1033 serial_outp(up, UART_LCR, 0);
1034
1035 DEBUG_AUTOCONF("iir1=%d iir2=%d ", status1, status2);
1036
1037 if (status1 == 6 && status2 == 7) {
1038 up->port.type = PORT_16750;
1039 up->capabilities |= UART_CAP_AFE | UART_CAP_SLEEP;
1040 return;
1041 }
1042
1043 /*
1044 * Try writing and reading the UART_IER_UUE bit (b6).
1045 * If it works, this is probably one of the Xscale platform's
1046 * internal UARTs.
1047 * We're going to explicitly set the UUE bit to 0 before
1048 * trying to write and read a 1 just to make sure it's not
1049 * already a 1 and maybe locked there before we even start start.
1050 */
1051 iersave = serial_in(up, UART_IER);
1052 serial_outp(up, UART_IER, iersave & ~UART_IER_UUE);
1053 if (!(serial_in(up, UART_IER) & UART_IER_UUE)) {
1054 /*
1055 * OK it's in a known zero state, try writing and reading
1056 * without disturbing the current state of the other bits.
1057 */
1058 serial_outp(up, UART_IER, iersave | UART_IER_UUE);
1059 if (serial_in(up, UART_IER) & UART_IER_UUE) {
1060 /*
1061 * It's an Xscale.
1062 * We'll leave the UART_IER_UUE bit set to 1 (enabled).
1063 */
1064 DEBUG_AUTOCONF("Xscale ");
1065 up->port.type = PORT_XSCALE;
1066 up->capabilities |= UART_CAP_UUE;
1067 return;
1068 }
1069 } else {
1070 /*
1071 * If we got here we couldn't force the IER_UUE bit to 0.
1072 * Log it and continue.
1073 */
1074 DEBUG_AUTOCONF("Couldn't force IER_UUE to 0 ");
1075 }
1076 serial_outp(up, UART_IER, iersave);
Philippe Langlais235dae52010-07-29 17:13:57 +02001077
1078 /*
1079 * We distinguish between 16550A and U6 16550A by counting
1080 * how many bytes are in the FIFO.
1081 */
1082 if (up->port.type == PORT_16550A && size_fifo(up) == 64) {
1083 up->port.type = PORT_U6_16550A;
1084 up->capabilities |= UART_CAP_AFE;
1085 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001086}
1087
1088/*
1089 * This routine is called by rs_init() to initialize a specific serial
1090 * port. It determines what type of UART chip this serial port is
1091 * using: 8250, 16450, 16550, 16550A. The important question is
1092 * whether or not this UART is a 16550A or not, since this will
1093 * determine whether or not we can use its FIFO features or not.
1094 */
1095static void autoconfig(struct uart_8250_port *up, unsigned int probeflags)
1096{
1097 unsigned char status1, scratch, scratch2, scratch3;
1098 unsigned char save_lcr, save_mcr;
1099 unsigned long flags;
1100
1101 if (!up->port.iobase && !up->port.mapbase && !up->port.membase)
1102 return;
1103
Lennert Buytenhek80647b92009-11-11 14:26:41 -08001104 DEBUG_AUTOCONF("ttyS%d: autoconf (0x%04lx, 0x%p): ",
David S. Miller84408382008-10-13 10:45:26 +01001105 serial_index(&up->port), up->port.iobase, up->port.membase);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001106
1107 /*
1108 * We really do need global IRQs disabled here - we're going to
1109 * be frobbing the chips IRQ enable register to see if it exists.
1110 */
1111 spin_lock_irqsave(&up->port.lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001112
1113 up->capabilities = 0;
Russell King4ba5e352005-06-23 10:43:04 +01001114 up->bugs = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001115
1116 if (!(up->port.flags & UPF_BUGGY_UART)) {
1117 /*
1118 * Do a simple existence test first; if we fail this,
1119 * there's no point trying anything else.
Thomas Koellerbd71c182007-05-06 14:48:47 -07001120 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001121 * 0x80 is used as a nonsense port to prevent against
1122 * false positives due to ISA bus float. The
1123 * assumption is that 0x80 is a non-existent port;
1124 * which should be safe since include/asm/io.h also
1125 * makes this assumption.
1126 *
1127 * Note: this is safe as long as MCR bit 4 is clear
1128 * and the device is in "PC" mode.
1129 */
1130 scratch = serial_inp(up, UART_IER);
1131 serial_outp(up, UART_IER, 0);
1132#ifdef __i386__
1133 outb(0xff, 0x080);
1134#endif
Thomas Hoehn48212002007-02-10 01:46:05 -08001135 /*
1136 * Mask out IER[7:4] bits for test as some UARTs (e.g. TL
1137 * 16C754B) allow only to modify them if an EFR bit is set.
1138 */
1139 scratch2 = serial_inp(up, UART_IER) & 0x0f;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001140 serial_outp(up, UART_IER, 0x0F);
1141#ifdef __i386__
1142 outb(0, 0x080);
1143#endif
Thomas Hoehn48212002007-02-10 01:46:05 -08001144 scratch3 = serial_inp(up, UART_IER) & 0x0f;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001145 serial_outp(up, UART_IER, scratch);
1146 if (scratch2 != 0 || scratch3 != 0x0F) {
1147 /*
1148 * We failed; there's nothing here
1149 */
1150 DEBUG_AUTOCONF("IER test failed (%02x, %02x) ",
1151 scratch2, scratch3);
1152 goto out;
1153 }
1154 }
1155
1156 save_mcr = serial_in(up, UART_MCR);
1157 save_lcr = serial_in(up, UART_LCR);
1158
Thomas Koellerbd71c182007-05-06 14:48:47 -07001159 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001160 * Check to see if a UART is really there. Certain broken
1161 * internal modems based on the Rockwell chipset fail this
1162 * test, because they apparently don't implement the loopback
1163 * test mode. So this test is skipped on the COM 1 through
1164 * COM 4 ports. This *should* be safe, since no board
1165 * manufacturer would be stupid enough to design a board
1166 * that conflicts with COM 1-4 --- we hope!
1167 */
1168 if (!(up->port.flags & UPF_SKIP_TEST)) {
1169 serial_outp(up, UART_MCR, UART_MCR_LOOP | 0x0A);
1170 status1 = serial_inp(up, UART_MSR) & 0xF0;
1171 serial_outp(up, UART_MCR, save_mcr);
1172 if (status1 != 0x90) {
1173 DEBUG_AUTOCONF("LOOP test failed (%02x) ",
1174 status1);
1175 goto out;
1176 }
1177 }
1178
1179 /*
1180 * We're pretty sure there's a port here. Lets find out what
1181 * type of port it is. The IIR top two bits allows us to find
Russell King6f0d6182005-09-09 16:17:58 +01001182 * out if it's 8250 or 16450, 16550, 16550A or later. This
Linus Torvalds1da177e2005-04-16 15:20:36 -07001183 * determines what we test for next.
1184 *
1185 * We also initialise the EFR (if any) to zero for later. The
1186 * EFR occupies the same register location as the FCR and IIR.
1187 */
1188 serial_outp(up, UART_LCR, 0xBF);
1189 serial_outp(up, UART_EFR, 0);
1190 serial_outp(up, UART_LCR, 0);
1191
1192 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO);
1193 scratch = serial_in(up, UART_IIR) >> 6;
1194
1195 DEBUG_AUTOCONF("iir=%d ", scratch);
1196
1197 switch (scratch) {
1198 case 0:
1199 autoconfig_8250(up);
1200 break;
1201 case 1:
1202 up->port.type = PORT_UNKNOWN;
1203 break;
1204 case 2:
1205 up->port.type = PORT_16550;
1206 break;
1207 case 3:
1208 autoconfig_16550a(up);
1209 break;
1210 }
1211
1212#ifdef CONFIG_SERIAL_8250_RSA
1213 /*
1214 * Only probe for RSA ports if we got the region.
1215 */
1216 if (up->port.type == PORT_16550A && probeflags & PROBE_RSA) {
1217 int i;
1218
1219 for (i = 0 ; i < probe_rsa_count; ++i) {
1220 if (probe_rsa[i] == up->port.iobase &&
1221 __enable_rsa(up)) {
1222 up->port.type = PORT_RSA;
1223 break;
1224 }
1225 }
1226 }
1227#endif
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00001228
Linus Torvalds1da177e2005-04-16 15:20:36 -07001229 serial_outp(up, UART_LCR, save_lcr);
1230
1231 if (up->capabilities != uart_config[up->port.type].flags) {
1232 printk(KERN_WARNING
1233 "ttyS%d: detected caps %08x should be %08x\n",
David S. Miller84408382008-10-13 10:45:26 +01001234 serial_index(&up->port), up->capabilities,
1235 uart_config[up->port.type].flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001236 }
1237
1238 up->port.fifosize = uart_config[up->port.type].fifo_size;
1239 up->capabilities = uart_config[up->port.type].flags;
1240 up->tx_loadsz = uart_config[up->port.type].tx_loadsz;
1241
1242 if (up->port.type == PORT_UNKNOWN)
1243 goto out;
1244
1245 /*
1246 * Reset the UART.
1247 */
1248#ifdef CONFIG_SERIAL_8250_RSA
1249 if (up->port.type == PORT_RSA)
1250 serial_outp(up, UART_RSA_FRR, 0);
1251#endif
1252 serial_outp(up, UART_MCR, save_mcr);
1253 serial8250_clear_fifos(up);
Alex Williamson40b36da2007-02-14 00:33:04 -08001254 serial_in(up, UART_RX);
Lennert Buytenhek5c8c7552005-11-12 21:58:05 +00001255 if (up->capabilities & UART_CAP_UUE)
1256 serial_outp(up, UART_IER, UART_IER_UUE);
1257 else
1258 serial_outp(up, UART_IER, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001259
Thomas Koellerbd71c182007-05-06 14:48:47 -07001260 out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001261 spin_unlock_irqrestore(&up->port.lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001262 DEBUG_AUTOCONF("type=%s\n", uart_config[up->port.type].name);
1263}
1264
1265static void autoconfig_irq(struct uart_8250_port *up)
1266{
1267 unsigned char save_mcr, save_ier;
1268 unsigned char save_ICP = 0;
1269 unsigned int ICP = 0;
1270 unsigned long irqs;
1271 int irq;
1272
1273 if (up->port.flags & UPF_FOURPORT) {
1274 ICP = (up->port.iobase & 0xfe0) | 0x1f;
1275 save_ICP = inb_p(ICP);
1276 outb_p(0x80, ICP);
1277 (void) inb_p(ICP);
1278 }
1279
1280 /* forget possible initially masked and pending IRQ */
1281 probe_irq_off(probe_irq_on());
1282 save_mcr = serial_inp(up, UART_MCR);
1283 save_ier = serial_inp(up, UART_IER);
1284 serial_outp(up, UART_MCR, UART_MCR_OUT1 | UART_MCR_OUT2);
Thomas Koellerbd71c182007-05-06 14:48:47 -07001285
Linus Torvalds1da177e2005-04-16 15:20:36 -07001286 irqs = probe_irq_on();
1287 serial_outp(up, UART_MCR, 0);
Alan Cox6f803cd2008-02-08 04:18:52 -08001288 udelay(10);
1289 if (up->port.flags & UPF_FOURPORT) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001290 serial_outp(up, UART_MCR,
1291 UART_MCR_DTR | UART_MCR_RTS);
1292 } else {
1293 serial_outp(up, UART_MCR,
1294 UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2);
1295 }
1296 serial_outp(up, UART_IER, 0x0f); /* enable all intrs */
1297 (void)serial_inp(up, UART_LSR);
1298 (void)serial_inp(up, UART_RX);
1299 (void)serial_inp(up, UART_IIR);
1300 (void)serial_inp(up, UART_MSR);
1301 serial_outp(up, UART_TX, 0xFF);
Alan Cox6f803cd2008-02-08 04:18:52 -08001302 udelay(20);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001303 irq = probe_irq_off(irqs);
1304
1305 serial_outp(up, UART_MCR, save_mcr);
1306 serial_outp(up, UART_IER, save_ier);
1307
1308 if (up->port.flags & UPF_FOURPORT)
1309 outb_p(save_ICP, ICP);
1310
1311 up->port.irq = (irq > 0) ? irq : 0;
1312}
1313
Russell Kinge763b902005-06-29 18:41:51 +01001314static inline void __stop_tx(struct uart_8250_port *p)
1315{
1316 if (p->ier & UART_IER_THRI) {
1317 p->ier &= ~UART_IER_THRI;
1318 serial_out(p, UART_IER, p->ier);
1319 }
1320}
1321
Russell Kingb129a8c2005-08-31 10:12:14 +01001322static void serial8250_stop_tx(struct uart_port *port)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001323{
Jamie Iles49d57412010-12-01 23:39:35 +00001324 struct uart_8250_port *up =
1325 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001326
Russell Kinge763b902005-06-29 18:41:51 +01001327 __stop_tx(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001328
1329 /*
Russell Kinge763b902005-06-29 18:41:51 +01001330 * We really want to stop the transmitter from sending.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001331 */
Russell Kinge763b902005-06-29 18:41:51 +01001332 if (up->port.type == PORT_16C950) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001333 up->acr |= UART_ACR_TXDIS;
1334 serial_icr_write(up, UART_ACR, up->acr);
1335 }
1336}
1337
Russell King55d3b282005-06-23 15:05:41 +01001338static void transmit_chars(struct uart_8250_port *up);
1339
Russell Kingb129a8c2005-08-31 10:12:14 +01001340static void serial8250_start_tx(struct uart_port *port)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001341{
Jamie Iles49d57412010-12-01 23:39:35 +00001342 struct uart_8250_port *up =
1343 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001344
1345 if (!(up->ier & UART_IER_THRI)) {
1346 up->ier |= UART_IER_THRI;
1347 serial_out(up, UART_IER, up->ier);
Russell King55d3b282005-06-23 15:05:41 +01001348
Russell King67f76542005-06-23 22:26:43 +01001349 if (up->bugs & UART_BUG_TXEN) {
Ian Jackson68cb4f82009-11-18 11:08:11 +01001350 unsigned char lsr;
Russell King55d3b282005-06-23 15:05:41 +01001351 lsr = serial_in(up, UART_LSR);
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001352 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
Thomas Koellerbd71c182007-05-06 14:48:47 -07001353 if ((up->port.type == PORT_RM9000) ?
Ian Jackson68cb4f82009-11-18 11:08:11 +01001354 (lsr & UART_LSR_THRE) :
1355 (lsr & UART_LSR_TEMT))
Russell King55d3b282005-06-23 15:05:41 +01001356 transmit_chars(up);
1357 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001358 }
Russell Kinge763b902005-06-29 18:41:51 +01001359
Linus Torvalds1da177e2005-04-16 15:20:36 -07001360 /*
Russell Kinge763b902005-06-29 18:41:51 +01001361 * Re-enable the transmitter if we disabled it.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001362 */
Russell Kinge763b902005-06-29 18:41:51 +01001363 if (up->port.type == PORT_16C950 && up->acr & UART_ACR_TXDIS) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001364 up->acr &= ~UART_ACR_TXDIS;
1365 serial_icr_write(up, UART_ACR, up->acr);
1366 }
1367}
1368
1369static void serial8250_stop_rx(struct uart_port *port)
1370{
Jamie Iles49d57412010-12-01 23:39:35 +00001371 struct uart_8250_port *up =
1372 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001373
1374 up->ier &= ~UART_IER_RLSI;
1375 up->port.read_status_mask &= ~UART_LSR_DR;
1376 serial_out(up, UART_IER, up->ier);
1377}
1378
1379static void serial8250_enable_ms(struct uart_port *port)
1380{
Jamie Iles49d57412010-12-01 23:39:35 +00001381 struct uart_8250_port *up =
1382 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001383
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00001384 /* no MSR capabilities */
1385 if (up->bugs & UART_BUG_NOMSR)
1386 return;
1387
Linus Torvalds1da177e2005-04-16 15:20:36 -07001388 up->ier |= UART_IER_MSI;
1389 serial_out(up, UART_IER, up->ier);
1390}
1391
Russell Kingea8874d2006-01-04 19:43:24 +00001392static void
Thomas Koellercc79aa92007-02-20 13:58:05 -08001393receive_chars(struct uart_8250_port *up, unsigned int *status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001394{
Alan Coxebd2c8f2009-09-19 13:13:28 -07001395 struct tty_struct *tty = up->port.state->port.tty;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001396 unsigned char ch, lsr = *status;
1397 int max_count = 256;
1398 char flag;
1399
1400 do {
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001401 if (likely(lsr & UART_LSR_DR))
1402 ch = serial_inp(up, UART_RX);
1403 else
1404 /*
1405 * Intel 82571 has a Serial Over Lan device that will
1406 * set UART_LSR_BI without setting UART_LSR_DR when
1407 * it receives a break. To avoid reading from the
1408 * receive buffer without UART_LSR_DR bit set, we
1409 * just force the read character to be 0
1410 */
1411 ch = 0;
1412
Linus Torvalds1da177e2005-04-16 15:20:36 -07001413 flag = TTY_NORMAL;
1414 up->port.icount.rx++;
1415
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001416 lsr |= up->lsr_saved_flags;
1417 up->lsr_saved_flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001418
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001419 if (unlikely(lsr & UART_LSR_BRK_ERROR_BITS)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001420 /*
1421 * For statistics only
1422 */
1423 if (lsr & UART_LSR_BI) {
1424 lsr &= ~(UART_LSR_FE | UART_LSR_PE);
1425 up->port.icount.brk++;
1426 /*
1427 * We do the SysRQ and SAK checking
1428 * here because otherwise the break
1429 * may get masked by ignore_status_mask
1430 * or read_status_mask.
1431 */
1432 if (uart_handle_break(&up->port))
1433 goto ignore_char;
1434 } else if (lsr & UART_LSR_PE)
1435 up->port.icount.parity++;
1436 else if (lsr & UART_LSR_FE)
1437 up->port.icount.frame++;
1438 if (lsr & UART_LSR_OE)
1439 up->port.icount.overrun++;
1440
1441 /*
Russell King23907eb2005-04-16 15:26:39 -07001442 * Mask off conditions which should be ignored.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001443 */
1444 lsr &= up->port.read_status_mask;
1445
1446 if (lsr & UART_LSR_BI) {
1447 DEBUG_INTR("handling break....");
1448 flag = TTY_BREAK;
1449 } else if (lsr & UART_LSR_PE)
1450 flag = TTY_PARITY;
1451 else if (lsr & UART_LSR_FE)
1452 flag = TTY_FRAME;
1453 }
David Howells7d12e782006-10-05 14:55:46 +01001454 if (uart_handle_sysrq_char(&up->port, ch))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001455 goto ignore_char;
Russell King05ab3012005-05-09 23:21:59 +01001456
1457 uart_insert_char(&up->port, lsr, UART_LSR_OE, ch, flag);
1458
Alan Cox6f803cd2008-02-08 04:18:52 -08001459ignore_char:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001460 lsr = serial_inp(up, UART_LSR);
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001461 } while ((lsr & (UART_LSR_DR | UART_LSR_BI)) && (max_count-- > 0));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001462 spin_unlock(&up->port.lock);
1463 tty_flip_buffer_push(tty);
1464 spin_lock(&up->port.lock);
1465 *status = lsr;
1466}
1467
Russell Kingea8874d2006-01-04 19:43:24 +00001468static void transmit_chars(struct uart_8250_port *up)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001469{
Alan Coxebd2c8f2009-09-19 13:13:28 -07001470 struct circ_buf *xmit = &up->port.state->xmit;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001471 int count;
1472
1473 if (up->port.x_char) {
1474 serial_outp(up, UART_TX, up->port.x_char);
1475 up->port.icount.tx++;
1476 up->port.x_char = 0;
1477 return;
1478 }
Russell Kingb129a8c2005-08-31 10:12:14 +01001479 if (uart_tx_stopped(&up->port)) {
1480 serial8250_stop_tx(&up->port);
1481 return;
1482 }
1483 if (uart_circ_empty(xmit)) {
Russell Kinge763b902005-06-29 18:41:51 +01001484 __stop_tx(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001485 return;
1486 }
1487
1488 count = up->tx_loadsz;
1489 do {
1490 serial_out(up, UART_TX, xmit->buf[xmit->tail]);
1491 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
1492 up->port.icount.tx++;
1493 if (uart_circ_empty(xmit))
1494 break;
1495 } while (--count > 0);
1496
1497 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
1498 uart_write_wakeup(&up->port);
1499
1500 DEBUG_INTR("THRE...");
1501
1502 if (uart_circ_empty(xmit))
Russell Kinge763b902005-06-29 18:41:51 +01001503 __stop_tx(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001504}
1505
Russell King2af7cd62006-01-04 16:55:09 +00001506static unsigned int check_modem_status(struct uart_8250_port *up)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001507{
Russell King2af7cd62006-01-04 16:55:09 +00001508 unsigned int status = serial_in(up, UART_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001509
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001510 status |= up->msr_saved_flags;
1511 up->msr_saved_flags = 0;
Taku Izumifdc30b32007-04-23 14:41:00 -07001512 if (status & UART_MSR_ANY_DELTA && up->ier & UART_IER_MSI &&
Alan Coxebd2c8f2009-09-19 13:13:28 -07001513 up->port.state != NULL) {
Russell King2af7cd62006-01-04 16:55:09 +00001514 if (status & UART_MSR_TERI)
1515 up->port.icount.rng++;
1516 if (status & UART_MSR_DDSR)
1517 up->port.icount.dsr++;
1518 if (status & UART_MSR_DDCD)
1519 uart_handle_dcd_change(&up->port, status & UART_MSR_DCD);
1520 if (status & UART_MSR_DCTS)
1521 uart_handle_cts_change(&up->port, status & UART_MSR_CTS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001522
Alan Coxbdc04e32009-09-19 13:13:31 -07001523 wake_up_interruptible(&up->port.state->port.delta_msr_wait);
Russell King2af7cd62006-01-04 16:55:09 +00001524 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001525
Russell King2af7cd62006-01-04 16:55:09 +00001526 return status;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001527}
1528
1529/*
1530 * This handles the interrupt from one port.
1531 */
Will Newtonb5d674a2008-10-13 10:36:21 +01001532static void serial8250_handle_port(struct uart_8250_port *up)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001533{
Russell King45e24602006-01-04 19:19:06 +00001534 unsigned int status;
Jiri Kosina4bf36312007-04-23 14:41:21 -07001535 unsigned long flags;
Russell King45e24602006-01-04 19:19:06 +00001536
Jiri Kosina4bf36312007-04-23 14:41:21 -07001537 spin_lock_irqsave(&up->port.lock, flags);
Russell King45e24602006-01-04 19:19:06 +00001538
1539 status = serial_inp(up, UART_LSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001540
1541 DEBUG_INTR("status = %x...", status);
1542
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001543 if (status & (UART_LSR_DR | UART_LSR_BI))
David Howells7d12e782006-10-05 14:55:46 +01001544 receive_chars(up, &status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001545 check_modem_status(up);
1546 if (status & UART_LSR_THRE)
1547 transmit_chars(up);
Russell King45e24602006-01-04 19:19:06 +00001548
Jiri Kosina4bf36312007-04-23 14:41:21 -07001549 spin_unlock_irqrestore(&up->port.lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001550}
1551
1552/*
1553 * This is the serial driver's interrupt routine.
1554 *
1555 * Arjan thinks the old way was overly complex, so it got simplified.
1556 * Alan disagrees, saying that need the complexity to handle the weird
1557 * nature of ISA shared interrupts. (This is a special exception.)
1558 *
1559 * In order to handle ISA shared interrupts properly, we need to check
1560 * that all ports have been serviced, and therefore the ISA interrupt
1561 * line has been de-asserted.
1562 *
1563 * This means we need to loop through all ports. checking that they
1564 * don't have an interrupt pending.
1565 */
David Howells7d12e782006-10-05 14:55:46 +01001566static irqreturn_t serial8250_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001567{
1568 struct irq_info *i = dev_id;
1569 struct list_head *l, *end = NULL;
1570 int pass_counter = 0, handled = 0;
1571
1572 DEBUG_INTR("serial8250_interrupt(%d)...", irq);
1573
1574 spin_lock(&i->lock);
1575
1576 l = i->head;
1577 do {
1578 struct uart_8250_port *up;
1579 unsigned int iir;
1580
1581 up = list_entry(l, struct uart_8250_port, list);
1582
1583 iir = serial_in(up, UART_IIR);
1584 if (!(iir & UART_IIR_NO_INT)) {
David Howells7d12e782006-10-05 14:55:46 +01001585 serial8250_handle_port(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001586
1587 handled = 1;
1588
1589 end = NULL;
Marc St-Jeanbeab6972007-05-06 14:48:45 -07001590 } else if (up->port.iotype == UPIO_DWAPB &&
1591 (iir & UART_IIR_BUSY) == UART_IIR_BUSY) {
1592 /* The DesignWare APB UART has an Busy Detect (0x07)
1593 * interrupt meaning an LCR write attempt occured while the
1594 * UART was busy. The interrupt must be cleared by reading
1595 * the UART status register (USR) and the LCR re-written. */
1596 unsigned int status;
1597 status = *(volatile u32 *)up->port.private_data;
1598 serial_out(up, UART_LCR, up->lcr);
1599
1600 handled = 1;
1601
1602 end = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001603 } else if (end == NULL)
1604 end = l;
1605
1606 l = l->next;
1607
1608 if (l == i->head && pass_counter++ > PASS_LIMIT) {
1609 /* If we hit this, we're dead. */
Daniel Drakecd3ecad2010-10-20 16:00:48 -07001610 printk_ratelimited(KERN_ERR
1611 "serial8250: too much work for irq%d\n", irq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001612 break;
1613 }
1614 } while (l != end);
1615
1616 spin_unlock(&i->lock);
1617
1618 DEBUG_INTR("end.\n");
1619
1620 return IRQ_RETVAL(handled);
1621}
1622
1623/*
1624 * To support ISA shared interrupts, we need to have one interrupt
1625 * handler that ensures that the IRQ line has been deasserted
1626 * before returning. Failing to do this will result in the IRQ
1627 * line being stuck active, and, since ISA irqs are edge triggered,
1628 * no more IRQs will be seen.
1629 */
1630static void serial_do_unlink(struct irq_info *i, struct uart_8250_port *up)
1631{
1632 spin_lock_irq(&i->lock);
1633
1634 if (!list_empty(i->head)) {
1635 if (i->head == &up->list)
1636 i->head = i->head->next;
1637 list_del(&up->list);
1638 } else {
1639 BUG_ON(i->head != &up->list);
1640 i->head = NULL;
1641 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001642 spin_unlock_irq(&i->lock);
Alan Cox25db8ad2008-08-19 20:49:40 -07001643 /* List empty so throw away the hash node */
1644 if (i->head == NULL) {
1645 hlist_del(&i->node);
1646 kfree(i);
1647 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001648}
1649
1650static int serial_link_irq_chain(struct uart_8250_port *up)
1651{
Alan Cox25db8ad2008-08-19 20:49:40 -07001652 struct hlist_head *h;
1653 struct hlist_node *n;
1654 struct irq_info *i;
Thomas Gleixner40663cc2006-07-01 19:29:43 -07001655 int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? IRQF_SHARED : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001656
Alan Cox25db8ad2008-08-19 20:49:40 -07001657 mutex_lock(&hash_mutex);
1658
1659 h = &irq_lists[up->port.irq % NR_IRQ_HASH];
1660
1661 hlist_for_each(n, h) {
1662 i = hlist_entry(n, struct irq_info, node);
1663 if (i->irq == up->port.irq)
1664 break;
1665 }
1666
1667 if (n == NULL) {
1668 i = kzalloc(sizeof(struct irq_info), GFP_KERNEL);
1669 if (i == NULL) {
1670 mutex_unlock(&hash_mutex);
1671 return -ENOMEM;
1672 }
1673 spin_lock_init(&i->lock);
1674 i->irq = up->port.irq;
1675 hlist_add_head(&i->node, h);
1676 }
1677 mutex_unlock(&hash_mutex);
1678
Linus Torvalds1da177e2005-04-16 15:20:36 -07001679 spin_lock_irq(&i->lock);
1680
1681 if (i->head) {
1682 list_add(&up->list, i->head);
1683 spin_unlock_irq(&i->lock);
1684
1685 ret = 0;
1686 } else {
1687 INIT_LIST_HEAD(&up->list);
1688 i->head = &up->list;
1689 spin_unlock_irq(&i->lock);
Vikram Pandita1c2f0492009-09-19 13:13:19 -07001690 irq_flags |= up->port.irqflags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001691 ret = request_irq(up->port.irq, serial8250_interrupt,
1692 irq_flags, "serial", i);
1693 if (ret < 0)
1694 serial_do_unlink(i, up);
1695 }
1696
1697 return ret;
1698}
1699
1700static void serial_unlink_irq_chain(struct uart_8250_port *up)
1701{
Alan Cox25db8ad2008-08-19 20:49:40 -07001702 struct irq_info *i;
1703 struct hlist_node *n;
1704 struct hlist_head *h;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001705
Alan Cox25db8ad2008-08-19 20:49:40 -07001706 mutex_lock(&hash_mutex);
1707
1708 h = &irq_lists[up->port.irq % NR_IRQ_HASH];
1709
1710 hlist_for_each(n, h) {
1711 i = hlist_entry(n, struct irq_info, node);
1712 if (i->irq == up->port.irq)
1713 break;
1714 }
1715
1716 BUG_ON(n == NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001717 BUG_ON(i->head == NULL);
1718
1719 if (list_empty(i->head))
1720 free_irq(up->port.irq, i);
1721
1722 serial_do_unlink(i, up);
Alan Cox25db8ad2008-08-19 20:49:40 -07001723 mutex_unlock(&hash_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001724}
1725
1726/*
1727 * This function is used to handle ports that do not have an
1728 * interrupt. This doesn't work very well for 16450's, but gives
1729 * barely passable results for a 16550A. (Although at the expense
1730 * of much CPU overhead).
1731 */
1732static void serial8250_timeout(unsigned long data)
1733{
1734 struct uart_8250_port *up = (struct uart_8250_port *)data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001735 unsigned int iir;
1736
1737 iir = serial_in(up, UART_IIR);
Russell King45e24602006-01-04 19:19:06 +00001738 if (!(iir & UART_IIR_NO_INT))
David Howells7d12e782006-10-05 14:55:46 +01001739 serial8250_handle_port(up);
Anton Vorontsov54381062010-10-01 17:21:25 +04001740 mod_timer(&up->timer, jiffies + uart_poll_timeout(&up->port));
Alex Williamson40b36da2007-02-14 00:33:04 -08001741}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001742
Alex Williamson40b36da2007-02-14 00:33:04 -08001743static void serial8250_backup_timeout(unsigned long data)
1744{
1745 struct uart_8250_port *up = (struct uart_8250_port *)data;
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001746 unsigned int iir, ier = 0, lsr;
1747 unsigned long flags;
Alex Williamson40b36da2007-02-14 00:33:04 -08001748
1749 /*
1750 * Must disable interrupts or else we risk racing with the interrupt
1751 * based handler.
1752 */
1753 if (is_real_interrupt(up->port.irq)) {
1754 ier = serial_in(up, UART_IER);
1755 serial_out(up, UART_IER, 0);
1756 }
1757
1758 iir = serial_in(up, UART_IIR);
1759
1760 /*
1761 * This should be a safe test for anyone who doesn't trust the
1762 * IIR bits on their UART, but it's specifically designed for
1763 * the "Diva" UART used on the management processor on many HP
1764 * ia64 and parisc boxes.
1765 */
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001766 spin_lock_irqsave(&up->port.lock, flags);
1767 lsr = serial_in(up, UART_LSR);
1768 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
1769 spin_unlock_irqrestore(&up->port.lock, flags);
Alex Williamson40b36da2007-02-14 00:33:04 -08001770 if ((iir & UART_IIR_NO_INT) && (up->ier & UART_IER_THRI) &&
Alan Coxebd2c8f2009-09-19 13:13:28 -07001771 (!uart_circ_empty(&up->port.state->xmit) || up->port.x_char) &&
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001772 (lsr & UART_LSR_THRE)) {
Alex Williamson40b36da2007-02-14 00:33:04 -08001773 iir &= ~(UART_IIR_ID | UART_IIR_NO_INT);
1774 iir |= UART_IIR_THRI;
1775 }
1776
1777 if (!(iir & UART_IIR_NO_INT))
1778 serial8250_handle_port(up);
1779
1780 if (is_real_interrupt(up->port.irq))
1781 serial_out(up, UART_IER, ier);
1782
1783 /* Standard timer interval plus 0.2s to keep the port running */
Alan Cox6f803cd2008-02-08 04:18:52 -08001784 mod_timer(&up->timer,
Anton Vorontsov54381062010-10-01 17:21:25 +04001785 jiffies + uart_poll_timeout(&up->port) + HZ / 5);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001786}
1787
1788static unsigned int serial8250_tx_empty(struct uart_port *port)
1789{
Jamie Iles49d57412010-12-01 23:39:35 +00001790 struct uart_8250_port *up =
1791 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001792 unsigned long flags;
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001793 unsigned int lsr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001794
1795 spin_lock_irqsave(&up->port.lock, flags);
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001796 lsr = serial_in(up, UART_LSR);
1797 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001798 spin_unlock_irqrestore(&up->port.lock, flags);
1799
Dick Hollenbeckbca47612009-12-09 12:31:34 -08001800 return (lsr & BOTH_EMPTY) == BOTH_EMPTY ? TIOCSER_TEMT : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001801}
1802
1803static unsigned int serial8250_get_mctrl(struct uart_port *port)
1804{
Jamie Iles49d57412010-12-01 23:39:35 +00001805 struct uart_8250_port *up =
1806 container_of(port, struct uart_8250_port, port);
Russell King2af7cd62006-01-04 16:55:09 +00001807 unsigned int status;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001808 unsigned int ret;
1809
Russell King2af7cd62006-01-04 16:55:09 +00001810 status = check_modem_status(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001811
1812 ret = 0;
1813 if (status & UART_MSR_DCD)
1814 ret |= TIOCM_CAR;
1815 if (status & UART_MSR_RI)
1816 ret |= TIOCM_RNG;
1817 if (status & UART_MSR_DSR)
1818 ret |= TIOCM_DSR;
1819 if (status & UART_MSR_CTS)
1820 ret |= TIOCM_CTS;
1821 return ret;
1822}
1823
1824static void serial8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
1825{
Jamie Iles49d57412010-12-01 23:39:35 +00001826 struct uart_8250_port *up =
1827 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001828 unsigned char mcr = 0;
1829
1830 if (mctrl & TIOCM_RTS)
1831 mcr |= UART_MCR_RTS;
1832 if (mctrl & TIOCM_DTR)
1833 mcr |= UART_MCR_DTR;
1834 if (mctrl & TIOCM_OUT1)
1835 mcr |= UART_MCR_OUT1;
1836 if (mctrl & TIOCM_OUT2)
1837 mcr |= UART_MCR_OUT2;
1838 if (mctrl & TIOCM_LOOP)
1839 mcr |= UART_MCR_LOOP;
1840
1841 mcr = (mcr & up->mcr_mask) | up->mcr_force | up->mcr;
1842
1843 serial_out(up, UART_MCR, mcr);
1844}
1845
1846static void serial8250_break_ctl(struct uart_port *port, int break_state)
1847{
Jamie Iles49d57412010-12-01 23:39:35 +00001848 struct uart_8250_port *up =
1849 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001850 unsigned long flags;
1851
1852 spin_lock_irqsave(&up->port.lock, flags);
1853 if (break_state == -1)
1854 up->lcr |= UART_LCR_SBC;
1855 else
1856 up->lcr &= ~UART_LCR_SBC;
1857 serial_out(up, UART_LCR, up->lcr);
1858 spin_unlock_irqrestore(&up->port.lock, flags);
1859}
1860
Alex Williamson40b36da2007-02-14 00:33:04 -08001861/*
1862 * Wait for transmitter & holding register to empty
1863 */
Will Newtonb5d674a2008-10-13 10:36:21 +01001864static void wait_for_xmitr(struct uart_8250_port *up, int bits)
Alex Williamson40b36da2007-02-14 00:33:04 -08001865{
1866 unsigned int status, tmout = 10000;
1867
1868 /* Wait up to 10ms for the character(s) to be sent. */
David Daney97d303b2010-10-05 11:40:07 -07001869 for (;;) {
Alex Williamson40b36da2007-02-14 00:33:04 -08001870 status = serial_in(up, UART_LSR);
1871
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001872 up->lsr_saved_flags |= status & LSR_SAVE_FLAGS;
Alex Williamson40b36da2007-02-14 00:33:04 -08001873
David Daney97d303b2010-10-05 11:40:07 -07001874 if ((status & bits) == bits)
1875 break;
Alex Williamson40b36da2007-02-14 00:33:04 -08001876 if (--tmout == 0)
1877 break;
1878 udelay(1);
David Daney97d303b2010-10-05 11:40:07 -07001879 }
Alex Williamson40b36da2007-02-14 00:33:04 -08001880
1881 /* Wait up to 1s for flow control if necessary */
1882 if (up->port.flags & UPF_CONS_FLOW) {
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001883 unsigned int tmout;
1884 for (tmout = 1000000; tmout; tmout--) {
1885 unsigned int msr = serial_in(up, UART_MSR);
1886 up->msr_saved_flags |= msr & MSR_SAVE_FLAGS;
1887 if (msr & UART_MSR_CTS)
1888 break;
Alex Williamson40b36da2007-02-14 00:33:04 -08001889 udelay(1);
1890 touch_nmi_watchdog();
1891 }
1892 }
1893}
1894
Jason Wesself2d937f2008-04-17 20:05:37 +02001895#ifdef CONFIG_CONSOLE_POLL
1896/*
1897 * Console polling routines for writing and reading from the uart while
1898 * in an interrupt or debug context.
1899 */
1900
1901static int serial8250_get_poll_char(struct uart_port *port)
1902{
Jamie Iles49d57412010-12-01 23:39:35 +00001903 struct uart_8250_port *up =
1904 container_of(port, struct uart_8250_port, port);
Jason Wesself2d937f2008-04-17 20:05:37 +02001905 unsigned char lsr = serial_inp(up, UART_LSR);
1906
Jason Wesself5316b42010-05-20 21:04:22 -05001907 if (!(lsr & UART_LSR_DR))
1908 return NO_POLL_CHAR;
Jason Wesself2d937f2008-04-17 20:05:37 +02001909
1910 return serial_inp(up, UART_RX);
1911}
1912
1913
1914static void serial8250_put_poll_char(struct uart_port *port,
1915 unsigned char c)
1916{
1917 unsigned int ier;
Jamie Iles49d57412010-12-01 23:39:35 +00001918 struct uart_8250_port *up =
1919 container_of(port, struct uart_8250_port, port);
Jason Wesself2d937f2008-04-17 20:05:37 +02001920
1921 /*
1922 * First save the IER then disable the interrupts
1923 */
1924 ier = serial_in(up, UART_IER);
1925 if (up->capabilities & UART_CAP_UUE)
1926 serial_out(up, UART_IER, UART_IER_UUE);
1927 else
1928 serial_out(up, UART_IER, 0);
1929
1930 wait_for_xmitr(up, BOTH_EMPTY);
1931 /*
1932 * Send the character out.
1933 * If a LF, also do CR...
1934 */
1935 serial_out(up, UART_TX, c);
1936 if (c == 10) {
1937 wait_for_xmitr(up, BOTH_EMPTY);
1938 serial_out(up, UART_TX, 13);
1939 }
1940
1941 /*
1942 * Finally, wait for transmitter to become empty
1943 * and restore the IER
1944 */
1945 wait_for_xmitr(up, BOTH_EMPTY);
1946 serial_out(up, UART_IER, ier);
1947}
1948
1949#endif /* CONFIG_CONSOLE_POLL */
1950
Linus Torvalds1da177e2005-04-16 15:20:36 -07001951static int serial8250_startup(struct uart_port *port)
1952{
Jamie Iles49d57412010-12-01 23:39:35 +00001953 struct uart_8250_port *up =
1954 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001955 unsigned long flags;
Russell King55d3b282005-06-23 15:05:41 +01001956 unsigned char lsr, iir;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001957 int retval;
1958
1959 up->capabilities = uart_config[up->port.type].flags;
1960 up->mcr = 0;
1961
Alan Coxb8e7e402009-05-28 14:01:35 +01001962 if (up->port.iotype != up->cur_iotype)
1963 set_io_from_upio(port);
1964
Linus Torvalds1da177e2005-04-16 15:20:36 -07001965 if (up->port.type == PORT_16C950) {
1966 /* Wake up and initialize UART */
1967 up->acr = 0;
1968 serial_outp(up, UART_LCR, 0xBF);
1969 serial_outp(up, UART_EFR, UART_EFR_ECB);
1970 serial_outp(up, UART_IER, 0);
1971 serial_outp(up, UART_LCR, 0);
1972 serial_icr_write(up, UART_CSR, 0); /* Reset the UART */
1973 serial_outp(up, UART_LCR, 0xBF);
1974 serial_outp(up, UART_EFR, UART_EFR_ECB);
1975 serial_outp(up, UART_LCR, 0);
1976 }
1977
1978#ifdef CONFIG_SERIAL_8250_RSA
1979 /*
1980 * If this is an RSA port, see if we can kick it up to the
1981 * higher speed clock.
1982 */
1983 enable_rsa(up);
1984#endif
1985
1986 /*
1987 * Clear the FIFO buffers and disable them.
Alexey Dobriyan7f927fc2006-03-28 01:56:53 -08001988 * (they will be reenabled in set_termios())
Linus Torvalds1da177e2005-04-16 15:20:36 -07001989 */
1990 serial8250_clear_fifos(up);
1991
1992 /*
1993 * Clear the interrupt registers.
1994 */
1995 (void) serial_inp(up, UART_LSR);
1996 (void) serial_inp(up, UART_RX);
1997 (void) serial_inp(up, UART_IIR);
1998 (void) serial_inp(up, UART_MSR);
1999
2000 /*
2001 * At this point, there's no way the LSR could still be 0xff;
2002 * if it is, then bail out, because there's likely no UART
2003 * here.
2004 */
2005 if (!(up->port.flags & UPF_BUGGY_UART) &&
2006 (serial_inp(up, UART_LSR) == 0xff)) {
David S. Miller84408382008-10-13 10:45:26 +01002007 printk(KERN_INFO "ttyS%d: LSR safety check engaged!\n",
2008 serial_index(&up->port));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002009 return -ENODEV;
2010 }
2011
2012 /*
2013 * For a XR16C850, we need to set the trigger levels
2014 */
2015 if (up->port.type == PORT_16850) {
2016 unsigned char fctr;
2017
2018 serial_outp(up, UART_LCR, 0xbf);
2019
2020 fctr = serial_inp(up, UART_FCTR) & ~(UART_FCTR_RX|UART_FCTR_TX);
2021 serial_outp(up, UART_FCTR, fctr | UART_FCTR_TRGD | UART_FCTR_RX);
2022 serial_outp(up, UART_TRG, UART_TRG_96);
2023 serial_outp(up, UART_FCTR, fctr | UART_FCTR_TRGD | UART_FCTR_TX);
2024 serial_outp(up, UART_TRG, UART_TRG_96);
2025
2026 serial_outp(up, UART_LCR, 0);
2027 }
2028
Alex Williamson40b36da2007-02-14 00:33:04 -08002029 if (is_real_interrupt(up->port.irq)) {
Alex Williamson01c194d2008-04-28 02:14:09 -07002030 unsigned char iir1;
Alex Williamson40b36da2007-02-14 00:33:04 -08002031 /*
2032 * Test for UARTs that do not reassert THRE when the
2033 * transmitter is idle and the interrupt has already
2034 * been cleared. Real 16550s should always reassert
2035 * this interrupt whenever the transmitter is idle and
2036 * the interrupt is enabled. Delays are necessary to
2037 * allow register changes to become visible.
2038 */
Borislav Petkovc389d272008-07-29 22:33:32 -07002039 spin_lock_irqsave(&up->port.lock, flags);
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002040 if (up->port.irqflags & IRQF_SHARED)
Anton Vorontsov768aec02008-07-22 11:21:07 +01002041 disable_irq_nosync(up->port.irq);
Alex Williamson40b36da2007-02-14 00:33:04 -08002042
2043 wait_for_xmitr(up, UART_LSR_THRE);
2044 serial_out_sync(up, UART_IER, UART_IER_THRI);
2045 udelay(1); /* allow THRE to set */
Alex Williamson01c194d2008-04-28 02:14:09 -07002046 iir1 = serial_in(up, UART_IIR);
Alex Williamson40b36da2007-02-14 00:33:04 -08002047 serial_out(up, UART_IER, 0);
2048 serial_out_sync(up, UART_IER, UART_IER_THRI);
2049 udelay(1); /* allow a working UART time to re-assert THRE */
2050 iir = serial_in(up, UART_IIR);
2051 serial_out(up, UART_IER, 0);
2052
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002053 if (up->port.irqflags & IRQF_SHARED)
Anton Vorontsov768aec02008-07-22 11:21:07 +01002054 enable_irq(up->port.irq);
Borislav Petkovc389d272008-07-29 22:33:32 -07002055 spin_unlock_irqrestore(&up->port.lock, flags);
Alex Williamson40b36da2007-02-14 00:33:04 -08002056
2057 /*
2058 * If the interrupt is not reasserted, setup a timer to
2059 * kick the UART on a regular basis.
2060 */
Alex Williamson01c194d2008-04-28 02:14:09 -07002061 if (!(iir1 & UART_IIR_NO_INT) && (iir & UART_IIR_NO_INT)) {
Will Newton363f66f2008-09-02 14:35:44 -07002062 up->bugs |= UART_BUG_THRE;
David S. Miller84408382008-10-13 10:45:26 +01002063 pr_debug("ttyS%d - using backup timer\n",
2064 serial_index(port));
Alex Williamson40b36da2007-02-14 00:33:04 -08002065 }
2066 }
2067
Linus Torvalds1da177e2005-04-16 15:20:36 -07002068 /*
Will Newton363f66f2008-09-02 14:35:44 -07002069 * The above check will only give an accurate result the first time
2070 * the port is opened so this value needs to be preserved.
2071 */
2072 if (up->bugs & UART_BUG_THRE) {
2073 up->timer.function = serial8250_backup_timeout;
2074 up->timer.data = (unsigned long)up;
2075 mod_timer(&up->timer, jiffies +
Anton Vorontsov54381062010-10-01 17:21:25 +04002076 uart_poll_timeout(port) + HZ / 5);
Will Newton363f66f2008-09-02 14:35:44 -07002077 }
2078
2079 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002080 * If the "interrupt" for this port doesn't correspond with any
2081 * hardware interrupt, we use a timer-based system. The original
2082 * driver used to do this with IRQ0.
2083 */
2084 if (!is_real_interrupt(up->port.irq)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002085 up->timer.data = (unsigned long)up;
Anton Vorontsov54381062010-10-01 17:21:25 +04002086 mod_timer(&up->timer, jiffies + uart_poll_timeout(port));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002087 } else {
2088 retval = serial_link_irq_chain(up);
2089 if (retval)
2090 return retval;
2091 }
2092
2093 /*
2094 * Now, initialize the UART
2095 */
2096 serial_outp(up, UART_LCR, UART_LCR_WLEN8);
2097
2098 spin_lock_irqsave(&up->port.lock, flags);
2099 if (up->port.flags & UPF_FOURPORT) {
2100 if (!is_real_interrupt(up->port.irq))
2101 up->port.mctrl |= TIOCM_OUT1;
2102 } else
2103 /*
2104 * Most PC uarts need OUT2 raised to enable interrupts.
2105 */
2106 if (is_real_interrupt(up->port.irq))
2107 up->port.mctrl |= TIOCM_OUT2;
2108
2109 serial8250_set_mctrl(&up->port, up->port.mctrl);
Russell King55d3b282005-06-23 15:05:41 +01002110
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002111 /* Serial over Lan (SoL) hack:
2112 Intel 8257x Gigabit ethernet chips have a
2113 16550 emulation, to be used for Serial Over Lan.
2114 Those chips take a longer time than a normal
2115 serial device to signalize that a transmission
2116 data was queued. Due to that, the above test generally
2117 fails. One solution would be to delay the reading of
2118 iir. However, this is not reliable, since the timeout
2119 is variable. So, let's just don't test if we receive
2120 TX irq. This way, we'll never enable UART_BUG_TXEN.
2121 */
Chuck Ebbertd41a4b52009-10-01 15:44:26 -07002122 if (skip_txen_test || up->port.flags & UPF_NO_TXEN_TEST)
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002123 goto dont_test_tx_en;
2124
Russell King55d3b282005-06-23 15:05:41 +01002125 /*
2126 * Do a quick test to see if we receive an
2127 * interrupt when we enable the TX irq.
2128 */
2129 serial_outp(up, UART_IER, UART_IER_THRI);
2130 lsr = serial_in(up, UART_LSR);
2131 iir = serial_in(up, UART_IIR);
2132 serial_outp(up, UART_IER, 0);
2133
2134 if (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT) {
Russell King67f76542005-06-23 22:26:43 +01002135 if (!(up->bugs & UART_BUG_TXEN)) {
2136 up->bugs |= UART_BUG_TXEN;
Russell King55d3b282005-06-23 15:05:41 +01002137 pr_debug("ttyS%d - enabling bad tx status workarounds\n",
David S. Miller84408382008-10-13 10:45:26 +01002138 serial_index(port));
Russell King55d3b282005-06-23 15:05:41 +01002139 }
2140 } else {
Russell King67f76542005-06-23 22:26:43 +01002141 up->bugs &= ~UART_BUG_TXEN;
Russell King55d3b282005-06-23 15:05:41 +01002142 }
2143
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002144dont_test_tx_en:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002145 spin_unlock_irqrestore(&up->port.lock, flags);
2146
2147 /*
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002148 * Clear the interrupt registers again for luck, and clear the
2149 * saved flags to avoid getting false values from polling
2150 * routines or the previous session.
2151 */
2152 serial_inp(up, UART_LSR);
2153 serial_inp(up, UART_RX);
2154 serial_inp(up, UART_IIR);
2155 serial_inp(up, UART_MSR);
2156 up->lsr_saved_flags = 0;
2157 up->msr_saved_flags = 0;
2158
2159 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002160 * Finally, enable interrupts. Note: Modem status interrupts
2161 * are set via set_termios(), which will be occurring imminently
2162 * anyway, so we don't enable them here.
2163 */
2164 up->ier = UART_IER_RLSI | UART_IER_RDI;
2165 serial_outp(up, UART_IER, up->ier);
2166
2167 if (up->port.flags & UPF_FOURPORT) {
2168 unsigned int icp;
2169 /*
2170 * Enable interrupts on the AST Fourport board
2171 */
2172 icp = (up->port.iobase & 0xfe0) | 0x01f;
2173 outb_p(0x80, icp);
2174 (void) inb_p(icp);
2175 }
2176
Linus Torvalds1da177e2005-04-16 15:20:36 -07002177 return 0;
2178}
2179
2180static void serial8250_shutdown(struct uart_port *port)
2181{
Jamie Iles49d57412010-12-01 23:39:35 +00002182 struct uart_8250_port *up =
2183 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002184 unsigned long flags;
2185
2186 /*
2187 * Disable interrupts from this port
2188 */
2189 up->ier = 0;
2190 serial_outp(up, UART_IER, 0);
2191
2192 spin_lock_irqsave(&up->port.lock, flags);
2193 if (up->port.flags & UPF_FOURPORT) {
2194 /* reset interrupts on the AST Fourport board */
2195 inb((up->port.iobase & 0xfe0) | 0x1f);
2196 up->port.mctrl |= TIOCM_OUT1;
2197 } else
2198 up->port.mctrl &= ~TIOCM_OUT2;
2199
2200 serial8250_set_mctrl(&up->port, up->port.mctrl);
2201 spin_unlock_irqrestore(&up->port.lock, flags);
2202
2203 /*
2204 * Disable break condition and FIFOs
2205 */
2206 serial_out(up, UART_LCR, serial_inp(up, UART_LCR) & ~UART_LCR_SBC);
2207 serial8250_clear_fifos(up);
2208
2209#ifdef CONFIG_SERIAL_8250_RSA
2210 /*
2211 * Reset the RSA board back to 115kbps compat mode.
2212 */
2213 disable_rsa(up);
2214#endif
2215
2216 /*
2217 * Read data port to reset things, and then unlink from
2218 * the IRQ chain.
2219 */
2220 (void) serial_in(up, UART_RX);
2221
Alex Williamson40b36da2007-02-14 00:33:04 -08002222 del_timer_sync(&up->timer);
2223 up->timer.function = serial8250_timeout;
2224 if (is_real_interrupt(up->port.irq))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002225 serial_unlink_irq_chain(up);
2226}
2227
2228static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud)
2229{
2230 unsigned int quot;
2231
2232 /*
2233 * Handle magic divisors for baud rates above baud_base on
2234 * SMSC SuperIO chips.
2235 */
2236 if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
2237 baud == (port->uartclk/4))
2238 quot = 0x8001;
2239 else if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
2240 baud == (port->uartclk/8))
2241 quot = 0x8002;
2242 else
2243 quot = uart_get_divisor(port, baud);
2244
2245 return quot;
2246}
2247
Philippe Langlais235dae52010-07-29 17:13:57 +02002248void
2249serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
2250 struct ktermios *old)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002251{
Jamie Iles49d57412010-12-01 23:39:35 +00002252 struct uart_8250_port *up =
2253 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002254 unsigned char cval, fcr = 0;
2255 unsigned long flags;
2256 unsigned int baud, quot;
2257
2258 switch (termios->c_cflag & CSIZE) {
2259 case CS5:
Russell King0a8b80c52005-06-24 19:48:22 +01002260 cval = UART_LCR_WLEN5;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002261 break;
2262 case CS6:
Russell King0a8b80c52005-06-24 19:48:22 +01002263 cval = UART_LCR_WLEN6;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002264 break;
2265 case CS7:
Russell King0a8b80c52005-06-24 19:48:22 +01002266 cval = UART_LCR_WLEN7;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002267 break;
2268 default:
2269 case CS8:
Russell King0a8b80c52005-06-24 19:48:22 +01002270 cval = UART_LCR_WLEN8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002271 break;
2272 }
2273
2274 if (termios->c_cflag & CSTOPB)
Russell King0a8b80c52005-06-24 19:48:22 +01002275 cval |= UART_LCR_STOP;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002276 if (termios->c_cflag & PARENB)
2277 cval |= UART_LCR_PARITY;
2278 if (!(termios->c_cflag & PARODD))
2279 cval |= UART_LCR_EPAR;
2280#ifdef CMSPAR
2281 if (termios->c_cflag & CMSPAR)
2282 cval |= UART_LCR_SPAR;
2283#endif
2284
2285 /*
2286 * Ask the core to calculate the divisor for us.
2287 */
Anton Vorontsov24d481e2009-09-19 13:13:20 -07002288 baud = uart_get_baud_rate(port, termios, old,
2289 port->uartclk / 16 / 0xffff,
2290 port->uartclk / 16);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002291 quot = serial8250_get_divisor(port, baud);
2292
2293 /*
Russell King4ba5e352005-06-23 10:43:04 +01002294 * Oxford Semi 952 rev B workaround
Linus Torvalds1da177e2005-04-16 15:20:36 -07002295 */
Russell King4ba5e352005-06-23 10:43:04 +01002296 if (up->bugs & UART_BUG_QUOT && (quot & 0xff) == 0)
Alan Cox3e8d4e22008-02-04 22:27:53 -08002297 quot++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002298
2299 if (up->capabilities & UART_CAP_FIFO && up->port.fifosize > 1) {
2300 if (baud < 2400)
2301 fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1;
2302 else
2303 fcr = uart_config[up->port.type].fcr;
2304 }
2305
2306 /*
2307 * MCR-based auto flow control. When AFE is enabled, RTS will be
2308 * deasserted when the receive FIFO contains more characters than
2309 * the trigger, or the MCR RTS bit is cleared. In the case where
2310 * the remote UART is not using CTS auto flow control, we must
2311 * have sufficient FIFO entries for the latency of the remote
2312 * UART to respond. IOW, at least 32 bytes of FIFO.
2313 */
2314 if (up->capabilities & UART_CAP_AFE && up->port.fifosize >= 32) {
2315 up->mcr &= ~UART_MCR_AFE;
2316 if (termios->c_cflag & CRTSCTS)
2317 up->mcr |= UART_MCR_AFE;
2318 }
2319
2320 /*
2321 * Ok, we're now changing the port state. Do it with
2322 * interrupts disabled.
2323 */
2324 spin_lock_irqsave(&up->port.lock, flags);
2325
2326 /*
2327 * Update the per-port timeout.
2328 */
2329 uart_update_timeout(port, termios->c_cflag, baud);
2330
2331 up->port.read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR;
2332 if (termios->c_iflag & INPCK)
2333 up->port.read_status_mask |= UART_LSR_FE | UART_LSR_PE;
2334 if (termios->c_iflag & (BRKINT | PARMRK))
2335 up->port.read_status_mask |= UART_LSR_BI;
2336
2337 /*
2338 * Characteres to ignore
2339 */
2340 up->port.ignore_status_mask = 0;
2341 if (termios->c_iflag & IGNPAR)
2342 up->port.ignore_status_mask |= UART_LSR_PE | UART_LSR_FE;
2343 if (termios->c_iflag & IGNBRK) {
2344 up->port.ignore_status_mask |= UART_LSR_BI;
2345 /*
2346 * If we're ignoring parity and break indicators,
2347 * ignore overruns too (for real raw support).
2348 */
2349 if (termios->c_iflag & IGNPAR)
2350 up->port.ignore_status_mask |= UART_LSR_OE;
2351 }
2352
2353 /*
2354 * ignore all characters if CREAD is not set
2355 */
2356 if ((termios->c_cflag & CREAD) == 0)
2357 up->port.ignore_status_mask |= UART_LSR_DR;
2358
2359 /*
2360 * CTS flow control flag and modem status interrupts
2361 */
2362 up->ier &= ~UART_IER_MSI;
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00002363 if (!(up->bugs & UART_BUG_NOMSR) &&
2364 UART_ENABLE_MS(&up->port, termios->c_cflag))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002365 up->ier |= UART_IER_MSI;
2366 if (up->capabilities & UART_CAP_UUE)
2367 up->ier |= UART_IER_UUE | UART_IER_RTOIE;
2368
2369 serial_out(up, UART_IER, up->ier);
2370
2371 if (up->capabilities & UART_CAP_EFR) {
2372 unsigned char efr = 0;
2373 /*
2374 * TI16C752/Startech hardware flow control. FIXME:
2375 * - TI16C752 requires control thresholds to be set.
2376 * - UART_MCR_RTS is ineffective if auto-RTS mode is enabled.
2377 */
2378 if (termios->c_cflag & CRTSCTS)
2379 efr |= UART_EFR_CTS;
2380
2381 serial_outp(up, UART_LCR, 0xBF);
2382 serial_outp(up, UART_EFR, efr);
2383 }
2384
Russell Kingf2eda272008-09-01 21:47:59 +01002385#ifdef CONFIG_ARCH_OMAP
Jonathan McDowell255341c2006-08-14 23:05:32 -07002386 /* Workaround to enable 115200 baud on OMAP1510 internal ports */
Russell King56685452008-09-01 21:25:33 +01002387 if (cpu_is_omap1510() && is_omap_port(up)) {
Jonathan McDowell255341c2006-08-14 23:05:32 -07002388 if (baud == 115200) {
2389 quot = 1;
2390 serial_out(up, UART_OMAP_OSC_12M_SEL, 1);
2391 } else
2392 serial_out(up, UART_OMAP_OSC_12M_SEL, 0);
2393 }
2394#endif
2395
Linus Torvalds1da177e2005-04-16 15:20:36 -07002396 if (up->capabilities & UART_NATSEMI) {
2397 /* Switch to bank 2 not bank 1, to avoid resetting EXCR2 */
2398 serial_outp(up, UART_LCR, 0xe0);
2399 } else {
2400 serial_outp(up, UART_LCR, cval | UART_LCR_DLAB);/* set DLAB */
2401 }
2402
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +01002403 serial_dl_write(up, quot);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002404
2405 /*
2406 * LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR
2407 * is written without DLAB set, this mode will be disabled.
2408 */
2409 if (up->port.type == PORT_16750)
2410 serial_outp(up, UART_FCR, fcr);
2411
2412 serial_outp(up, UART_LCR, cval); /* reset DLAB */
2413 up->lcr = cval; /* Save LCR */
2414 if (up->port.type != PORT_16750) {
2415 if (fcr & UART_FCR_ENABLE_FIFO) {
2416 /* emulated UARTs (Lucent Venus 167x) need two steps */
2417 serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO);
2418 }
2419 serial_outp(up, UART_FCR, fcr); /* set fcr */
2420 }
2421 serial8250_set_mctrl(&up->port, up->port.mctrl);
2422 spin_unlock_irqrestore(&up->port.lock, flags);
Alan Coxe991a2b2008-04-28 02:14:06 -07002423 /* Don't rewrite B0 */
2424 if (tty_termios_baud_rate(termios))
2425 tty_termios_encode_baud_rate(termios, baud, baud);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002426}
Philippe Langlais235dae52010-07-29 17:13:57 +02002427EXPORT_SYMBOL(serial8250_do_set_termios);
2428
2429static void
2430serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
2431 struct ktermios *old)
2432{
2433 if (port->set_termios)
2434 port->set_termios(port, termios, old);
2435 else
2436 serial8250_do_set_termios(port, termios, old);
2437}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002438
2439static void
Arnd Bergmanna0821df2010-06-01 22:53:11 +02002440serial8250_set_ldisc(struct uart_port *port, int new)
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002441{
Arnd Bergmanna0821df2010-06-01 22:53:11 +02002442 if (new == N_PPS) {
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002443 port->flags |= UPF_HARDPPS_CD;
2444 serial8250_enable_ms(port);
2445 } else
2446 port->flags &= ~UPF_HARDPPS_CD;
2447}
2448
Manuel Laussc161afe2010-09-25 15:13:45 +02002449
2450void serial8250_do_pm(struct uart_port *port, unsigned int state,
2451 unsigned int oldstate)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002452{
Jamie Iles49d57412010-12-01 23:39:35 +00002453 struct uart_8250_port *p =
2454 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002455
2456 serial8250_set_sleep(p, state != 0);
Manuel Laussc161afe2010-09-25 15:13:45 +02002457}
2458EXPORT_SYMBOL(serial8250_do_pm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002459
Manuel Laussc161afe2010-09-25 15:13:45 +02002460static void
2461serial8250_pm(struct uart_port *port, unsigned int state,
2462 unsigned int oldstate)
2463{
2464 if (port->pm)
2465 port->pm(port, state, oldstate);
2466 else
2467 serial8250_do_pm(port, state, oldstate);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002468}
2469
Russell Kingf2eda272008-09-01 21:47:59 +01002470static unsigned int serial8250_port_size(struct uart_8250_port *pt)
2471{
2472 if (pt->port.iotype == UPIO_AU)
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002473 return 0x1000;
Russell Kingf2eda272008-09-01 21:47:59 +01002474#ifdef CONFIG_ARCH_OMAP
2475 if (is_omap_port(pt))
2476 return 0x16 << pt->port.regshift;
2477#endif
2478 return 8 << pt->port.regshift;
2479}
2480
Linus Torvalds1da177e2005-04-16 15:20:36 -07002481/*
2482 * Resource handling.
2483 */
2484static int serial8250_request_std_resource(struct uart_8250_port *up)
2485{
Russell Kingf2eda272008-09-01 21:47:59 +01002486 unsigned int size = serial8250_port_size(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002487 int ret = 0;
2488
2489 switch (up->port.iotype) {
Sergei Shtylyov85835f42006-04-30 11:15:58 +01002490 case UPIO_AU:
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002491 case UPIO_TSI:
2492 case UPIO_MEM32:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002493 case UPIO_MEM:
Marc St-Jeanbeab6972007-05-06 14:48:45 -07002494 case UPIO_DWAPB:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002495 if (!up->port.mapbase)
2496 break;
2497
2498 if (!request_mem_region(up->port.mapbase, size, "serial")) {
2499 ret = -EBUSY;
2500 break;
2501 }
2502
2503 if (up->port.flags & UPF_IOREMAP) {
Alan Cox6f441fe2008-05-01 04:34:59 -07002504 up->port.membase = ioremap_nocache(up->port.mapbase,
2505 size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002506 if (!up->port.membase) {
2507 release_mem_region(up->port.mapbase, size);
2508 ret = -ENOMEM;
2509 }
2510 }
2511 break;
2512
2513 case UPIO_HUB6:
2514 case UPIO_PORT:
2515 if (!request_region(up->port.iobase, size, "serial"))
2516 ret = -EBUSY;
2517 break;
2518 }
2519 return ret;
2520}
2521
2522static void serial8250_release_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
2526 switch (up->port.iotype) {
Sergei Shtylyov85835f42006-04-30 11:15:58 +01002527 case UPIO_AU:
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002528 case UPIO_TSI:
2529 case UPIO_MEM32:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002530 case UPIO_MEM:
Marc St-Jeanbeab6972007-05-06 14:48:45 -07002531 case UPIO_DWAPB:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002532 if (!up->port.mapbase)
2533 break;
2534
2535 if (up->port.flags & UPF_IOREMAP) {
2536 iounmap(up->port.membase);
2537 up->port.membase = NULL;
2538 }
2539
2540 release_mem_region(up->port.mapbase, size);
2541 break;
2542
2543 case UPIO_HUB6:
2544 case UPIO_PORT:
2545 release_region(up->port.iobase, size);
2546 break;
2547 }
2548}
2549
2550static int serial8250_request_rsa_resource(struct uart_8250_port *up)
2551{
2552 unsigned long start = UART_RSA_BASE << up->port.regshift;
2553 unsigned int size = 8 << up->port.regshift;
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002554 int ret = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002555
2556 switch (up->port.iotype) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002557 case UPIO_HUB6:
2558 case UPIO_PORT:
2559 start += up->port.iobase;
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002560 if (request_region(start, size, "serial-rsa"))
2561 ret = 0;
2562 else
Linus Torvalds1da177e2005-04-16 15:20:36 -07002563 ret = -EBUSY;
2564 break;
2565 }
2566
2567 return ret;
2568}
2569
2570static void serial8250_release_rsa_resource(struct uart_8250_port *up)
2571{
2572 unsigned long offset = UART_RSA_BASE << up->port.regshift;
2573 unsigned int size = 8 << up->port.regshift;
2574
2575 switch (up->port.iotype) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002576 case UPIO_HUB6:
2577 case UPIO_PORT:
2578 release_region(up->port.iobase + offset, size);
2579 break;
2580 }
2581}
2582
2583static void serial8250_release_port(struct uart_port *port)
2584{
Jamie Iles49d57412010-12-01 23:39:35 +00002585 struct uart_8250_port *up =
2586 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002587
2588 serial8250_release_std_resource(up);
2589 if (up->port.type == PORT_RSA)
2590 serial8250_release_rsa_resource(up);
2591}
2592
2593static int serial8250_request_port(struct uart_port *port)
2594{
Jamie Iles49d57412010-12-01 23:39:35 +00002595 struct uart_8250_port *up =
2596 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002597 int ret = 0;
2598
2599 ret = serial8250_request_std_resource(up);
2600 if (ret == 0 && up->port.type == PORT_RSA) {
2601 ret = serial8250_request_rsa_resource(up);
2602 if (ret < 0)
2603 serial8250_release_std_resource(up);
2604 }
2605
2606 return ret;
2607}
2608
2609static void serial8250_config_port(struct uart_port *port, int flags)
2610{
Jamie Iles49d57412010-12-01 23:39:35 +00002611 struct uart_8250_port *up =
2612 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002613 int probeflags = PROBE_ANY;
2614 int ret;
2615
2616 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002617 * Find the region that we can probe for. This in turn
2618 * tells us whether we can probe for the type of port.
2619 */
2620 ret = serial8250_request_std_resource(up);
2621 if (ret < 0)
2622 return;
2623
2624 ret = serial8250_request_rsa_resource(up);
2625 if (ret < 0)
2626 probeflags &= ~PROBE_RSA;
2627
Alan Coxb8e7e402009-05-28 14:01:35 +01002628 if (up->port.iotype != up->cur_iotype)
2629 set_io_from_upio(port);
2630
Linus Torvalds1da177e2005-04-16 15:20:36 -07002631 if (flags & UART_CONFIG_TYPE)
2632 autoconfig(up, probeflags);
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002633
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002634 /* if access method is AU, it is a 16550 with a quirk */
2635 if (up->port.type == PORT_16550A && up->port.iotype == UPIO_AU)
2636 up->bugs |= UART_BUG_NOMSR;
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002637
Linus Torvalds1da177e2005-04-16 15:20:36 -07002638 if (up->port.type != PORT_UNKNOWN && flags & UART_CONFIG_IRQ)
2639 autoconfig_irq(up);
2640
2641 if (up->port.type != PORT_RSA && probeflags & PROBE_RSA)
2642 serial8250_release_rsa_resource(up);
2643 if (up->port.type == PORT_UNKNOWN)
2644 serial8250_release_std_resource(up);
2645}
2646
2647static int
2648serial8250_verify_port(struct uart_port *port, struct serial_struct *ser)
2649{
Yinghai Lua62c4132008-08-19 20:49:55 -07002650 if (ser->irq >= nr_irqs || ser->irq < 0 ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07002651 ser->baud_base < 9600 || ser->type < PORT_UNKNOWN ||
2652 ser->type >= ARRAY_SIZE(uart_config) || ser->type == PORT_CIRRUS ||
2653 ser->type == PORT_STARTECH)
2654 return -EINVAL;
2655 return 0;
2656}
2657
2658static const char *
2659serial8250_type(struct uart_port *port)
2660{
2661 int type = port->type;
2662
2663 if (type >= ARRAY_SIZE(uart_config))
2664 type = 0;
2665 return uart_config[type].name;
2666}
2667
2668static struct uart_ops serial8250_pops = {
2669 .tx_empty = serial8250_tx_empty,
2670 .set_mctrl = serial8250_set_mctrl,
2671 .get_mctrl = serial8250_get_mctrl,
2672 .stop_tx = serial8250_stop_tx,
2673 .start_tx = serial8250_start_tx,
2674 .stop_rx = serial8250_stop_rx,
2675 .enable_ms = serial8250_enable_ms,
2676 .break_ctl = serial8250_break_ctl,
2677 .startup = serial8250_startup,
2678 .shutdown = serial8250_shutdown,
2679 .set_termios = serial8250_set_termios,
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002680 .set_ldisc = serial8250_set_ldisc,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002681 .pm = serial8250_pm,
2682 .type = serial8250_type,
2683 .release_port = serial8250_release_port,
2684 .request_port = serial8250_request_port,
2685 .config_port = serial8250_config_port,
2686 .verify_port = serial8250_verify_port,
Jason Wesself2d937f2008-04-17 20:05:37 +02002687#ifdef CONFIG_CONSOLE_POLL
2688 .poll_get_char = serial8250_get_poll_char,
2689 .poll_put_char = serial8250_put_poll_char,
2690#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07002691};
2692
2693static struct uart_8250_port serial8250_ports[UART_NR];
2694
Alan Coxaf7f3742010-10-18 11:38:02 -07002695static void (*serial8250_isa_config)(int port, struct uart_port *up,
2696 unsigned short *capabilities);
2697
2698void serial8250_set_isa_configurator(
2699 void (*v)(int port, struct uart_port *up, unsigned short *capabilities))
2700{
2701 serial8250_isa_config = v;
2702}
2703EXPORT_SYMBOL(serial8250_set_isa_configurator);
2704
Linus Torvalds1da177e2005-04-16 15:20:36 -07002705static void __init serial8250_isa_init_ports(void)
2706{
2707 struct uart_8250_port *up;
2708 static int first = 1;
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02002709 int i, irqflag = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002710
2711 if (!first)
2712 return;
2713 first = 0;
2714
Dave Jonesa61c2d72006-01-07 23:18:19 +00002715 for (i = 0; i < nr_uarts; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002716 struct uart_8250_port *up = &serial8250_ports[i];
2717
2718 up->port.line = i;
2719 spin_lock_init(&up->port.lock);
2720
2721 init_timer(&up->timer);
2722 up->timer.function = serial8250_timeout;
2723
2724 /*
2725 * ALPHA_KLUDGE_MCR needs to be killed.
2726 */
2727 up->mcr_mask = ~ALPHA_KLUDGE_MCR;
2728 up->mcr_force = ALPHA_KLUDGE_MCR;
2729
2730 up->port.ops = &serial8250_pops;
2731 }
2732
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02002733 if (share_irqs)
2734 irqflag = IRQF_SHARED;
2735
Russell King44454bc2005-06-30 22:41:22 +01002736 for (i = 0, up = serial8250_ports;
Dave Jonesa61c2d72006-01-07 23:18:19 +00002737 i < ARRAY_SIZE(old_serial_port) && i < nr_uarts;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002738 i++, up++) {
2739 up->port.iobase = old_serial_port[i].port;
2740 up->port.irq = irq_canonicalize(old_serial_port[i].irq);
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002741 up->port.irqflags = old_serial_port[i].irqflags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002742 up->port.uartclk = old_serial_port[i].baud_base * 16;
2743 up->port.flags = old_serial_port[i].flags;
2744 up->port.hub6 = old_serial_port[i].hub6;
2745 up->port.membase = old_serial_port[i].iomem_base;
2746 up->port.iotype = old_serial_port[i].io_type;
2747 up->port.regshift = old_serial_port[i].iomem_reg_shift;
David Daney7d6a07d2009-01-02 13:49:47 +00002748 set_io_from_upio(&up->port);
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02002749 up->port.irqflags |= irqflag;
Alan Coxaf7f3742010-10-18 11:38:02 -07002750 if (serial8250_isa_config != NULL)
2751 serial8250_isa_config(i, &up->port, &up->capabilities);
2752
Linus Torvalds1da177e2005-04-16 15:20:36 -07002753 }
2754}
2755
Shmulik Ladkanib5d228c2009-12-09 12:31:29 -08002756static void
2757serial8250_init_fixed_type_port(struct uart_8250_port *up, unsigned int type)
2758{
2759 up->port.type = type;
2760 up->port.fifosize = uart_config[type].fifo_size;
2761 up->capabilities = uart_config[type].flags;
2762 up->tx_loadsz = uart_config[type].tx_loadsz;
2763}
2764
Linus Torvalds1da177e2005-04-16 15:20:36 -07002765static void __init
2766serial8250_register_ports(struct uart_driver *drv, struct device *dev)
2767{
2768 int i;
2769
Alan Coxb8e7e402009-05-28 14:01:35 +01002770 for (i = 0; i < nr_uarts; i++) {
2771 struct uart_8250_port *up = &serial8250_ports[i];
2772 up->cur_iotype = 0xFF;
2773 }
2774
Linus Torvalds1da177e2005-04-16 15:20:36 -07002775 serial8250_isa_init_ports();
2776
Dave Jonesa61c2d72006-01-07 23:18:19 +00002777 for (i = 0; i < nr_uarts; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002778 struct uart_8250_port *up = &serial8250_ports[i];
2779
2780 up->port.dev = dev;
Shmulik Ladkanib5d228c2009-12-09 12:31:29 -08002781
2782 if (up->port.flags & UPF_FIXED_TYPE)
2783 serial8250_init_fixed_type_port(up, up->port.type);
2784
Linus Torvalds1da177e2005-04-16 15:20:36 -07002785 uart_add_one_port(drv, &up->port);
2786 }
2787}
2788
2789#ifdef CONFIG_SERIAL_8250_CONSOLE
2790
Russell Kingd3587882006-03-20 20:00:09 +00002791static void serial8250_console_putchar(struct uart_port *port, int ch)
2792{
Jamie Iles49d57412010-12-01 23:39:35 +00002793 struct uart_8250_port *up =
2794 container_of(port, struct uart_8250_port, port);
Russell Kingd3587882006-03-20 20:00:09 +00002795
2796 wait_for_xmitr(up, UART_LSR_THRE);
2797 serial_out(up, UART_TX, ch);
2798}
2799
Linus Torvalds1da177e2005-04-16 15:20:36 -07002800/*
2801 * Print a string to the serial port trying not to disturb
2802 * any possible real use of the port...
2803 *
2804 * The console_lock must be held when we get here.
2805 */
2806static void
2807serial8250_console_write(struct console *co, const char *s, unsigned int count)
2808{
2809 struct uart_8250_port *up = &serial8250_ports[co->index];
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002810 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002811 unsigned int ier;
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002812 int locked = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002813
Andrew Morton78512ec2005-11-07 00:59:13 -08002814 touch_nmi_watchdog();
2815
Andrew Morton68aa2c02006-06-30 02:29:59 -07002816 local_irq_save(flags);
2817 if (up->port.sysrq) {
2818 /* serial8250_handle_port() already took the lock */
2819 locked = 0;
2820 } else if (oops_in_progress) {
2821 locked = spin_trylock(&up->port.lock);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002822 } else
Andrew Morton68aa2c02006-06-30 02:29:59 -07002823 spin_lock(&up->port.lock);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002824
Linus Torvalds1da177e2005-04-16 15:20:36 -07002825 /*
Ralf Baechledc7bf132006-02-15 09:59:47 +00002826 * First save the IER then disable the interrupts
Linus Torvalds1da177e2005-04-16 15:20:36 -07002827 */
2828 ier = serial_in(up, UART_IER);
2829
2830 if (up->capabilities & UART_CAP_UUE)
2831 serial_out(up, UART_IER, UART_IER_UUE);
2832 else
2833 serial_out(up, UART_IER, 0);
2834
Russell Kingd3587882006-03-20 20:00:09 +00002835 uart_console_write(&up->port, s, count, serial8250_console_putchar);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002836
2837 /*
2838 * Finally, wait for transmitter to become empty
2839 * and restore the IER
2840 */
Alan Coxf91a3712006-01-21 14:59:12 +00002841 wait_for_xmitr(up, BOTH_EMPTY);
Russell Kinga88d75b2006-04-30 11:30:15 +01002842 serial_out(up, UART_IER, ier);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002843
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002844 /*
2845 * The receive handling will happen properly because the
2846 * receive ready bit will still be set; it is not cleared
2847 * on read. However, modem control will not, we must
2848 * call it if we have saved something in the saved flags
2849 * while processing with interrupts off.
2850 */
2851 if (up->msr_saved_flags)
2852 check_modem_status(up);
2853
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002854 if (locked)
Andrew Morton68aa2c02006-06-30 02:29:59 -07002855 spin_unlock(&up->port.lock);
2856 local_irq_restore(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002857}
2858
Vivek Goyal118c0ac2007-01-11 01:52:44 +01002859static int __init serial8250_console_setup(struct console *co, char *options)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002860{
2861 struct uart_port *port;
2862 int baud = 9600;
2863 int bits = 8;
2864 int parity = 'n';
2865 int flow = 'n';
2866
2867 /*
2868 * Check whether an invalid uart number has been specified, and
2869 * if so, search for the first available port that does have
2870 * console support.
2871 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00002872 if (co->index >= nr_uarts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002873 co->index = 0;
2874 port = &serial8250_ports[co->index].port;
2875 if (!port->iobase && !port->membase)
2876 return -ENODEV;
2877
2878 if (options)
2879 uart_parse_options(options, &baud, &parity, &bits, &flow);
2880
2881 return uart_set_options(port, co, baud, parity, bits, flow);
2882}
2883
Daniel Ritzb6b1d872007-08-03 16:07:43 +02002884static int serial8250_console_early_setup(void)
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002885{
2886 return serial8250_find_port_for_earlycon();
2887}
2888
Linus Torvalds1da177e2005-04-16 15:20:36 -07002889static struct console serial8250_console = {
2890 .name = "ttyS",
2891 .write = serial8250_console_write,
2892 .device = uart_console_device,
2893 .setup = serial8250_console_setup,
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002894 .early_setup = serial8250_console_early_setup,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002895 .flags = CON_PRINTBUFFER,
2896 .index = -1,
2897 .data = &serial8250_reg,
2898};
2899
2900static int __init serial8250_console_init(void)
2901{
Eric W. Biederman05d81d22008-07-12 13:47:53 -07002902 if (nr_uarts > UART_NR)
2903 nr_uarts = UART_NR;
2904
Linus Torvalds1da177e2005-04-16 15:20:36 -07002905 serial8250_isa_init_ports();
2906 register_console(&serial8250_console);
2907 return 0;
2908}
2909console_initcall(serial8250_console_init);
2910
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002911int serial8250_find_port(struct uart_port *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002912{
2913 int line;
2914 struct uart_port *port;
2915
Dave Jonesa61c2d72006-01-07 23:18:19 +00002916 for (line = 0; line < nr_uarts; line++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002917 port = &serial8250_ports[line].port;
Russell King50aec3b52006-01-04 18:13:03 +00002918 if (uart_match_port(p, port))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002919 return line;
2920 }
2921 return -ENODEV;
2922}
2923
Linus Torvalds1da177e2005-04-16 15:20:36 -07002924#define SERIAL8250_CONSOLE &serial8250_console
2925#else
2926#define SERIAL8250_CONSOLE NULL
2927#endif
2928
2929static struct uart_driver serial8250_reg = {
2930 .owner = THIS_MODULE,
2931 .driver_name = "serial",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002932 .dev_name = "ttyS",
2933 .major = TTY_MAJOR,
2934 .minor = 64,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002935 .cons = SERIAL8250_CONSOLE,
2936};
2937
Russell Kingd856c662006-02-23 10:22:13 +00002938/*
2939 * early_serial_setup - early registration for 8250 ports
2940 *
2941 * Setup an 8250 port structure prior to console initialisation. Use
2942 * after console initialisation will cause undefined behaviour.
2943 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002944int __init early_serial_setup(struct uart_port *port)
2945{
David Daneyb4304282009-01-02 13:49:41 +00002946 struct uart_port *p;
2947
Linus Torvalds1da177e2005-04-16 15:20:36 -07002948 if (port->line >= ARRAY_SIZE(serial8250_ports))
2949 return -ENODEV;
2950
2951 serial8250_isa_init_ports();
David Daneyb4304282009-01-02 13:49:41 +00002952 p = &serial8250_ports[port->line].port;
2953 p->iobase = port->iobase;
2954 p->membase = port->membase;
2955 p->irq = port->irq;
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002956 p->irqflags = port->irqflags;
David Daneyb4304282009-01-02 13:49:41 +00002957 p->uartclk = port->uartclk;
2958 p->fifosize = port->fifosize;
2959 p->regshift = port->regshift;
2960 p->iotype = port->iotype;
2961 p->flags = port->flags;
2962 p->mapbase = port->mapbase;
2963 p->private_data = port->private_data;
Helge Deller125c97d2009-01-13 22:51:07 +01002964 p->type = port->type;
2965 p->line = port->line;
David Daney7d6a07d2009-01-02 13:49:47 +00002966
2967 set_io_from_upio(p);
2968 if (port->serial_in)
2969 p->serial_in = port->serial_in;
2970 if (port->serial_out)
2971 p->serial_out = port->serial_out;
2972
Linus Torvalds1da177e2005-04-16 15:20:36 -07002973 return 0;
2974}
2975
2976/**
2977 * serial8250_suspend_port - suspend one serial port
2978 * @line: serial line number
Linus Torvalds1da177e2005-04-16 15:20:36 -07002979 *
2980 * Suspend one serial port.
2981 */
2982void serial8250_suspend_port(int line)
2983{
2984 uart_suspend_port(&serial8250_reg, &serial8250_ports[line].port);
2985}
2986
2987/**
2988 * serial8250_resume_port - resume one serial port
2989 * @line: serial line number
Linus Torvalds1da177e2005-04-16 15:20:36 -07002990 *
2991 * Resume one serial port.
2992 */
2993void serial8250_resume_port(int line)
2994{
David Woodhouseb5b82df2007-05-17 14:27:39 +08002995 struct uart_8250_port *up = &serial8250_ports[line];
2996
2997 if (up->capabilities & UART_NATSEMI) {
2998 unsigned char tmp;
2999
3000 /* Ensure it's still in high speed mode */
3001 serial_outp(up, UART_LCR, 0xE0);
3002
3003 tmp = serial_in(up, 0x04); /* EXCR2 */
3004 tmp &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */
3005 tmp |= 0x10; /* 1.625 divisor for baud_base --> 921600 */
3006 serial_outp(up, 0x04, tmp);
3007
3008 serial_outp(up, UART_LCR, 0);
3009 }
3010 uart_resume_port(&serial8250_reg, &up->port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003011}
3012
3013/*
3014 * Register a set of serial devices attached to a platform device. The
3015 * list is terminated with a zero flags entry, which means we expect
3016 * all entries to have at least UPF_BOOT_AUTOCONF set.
3017 */
Russell King3ae5eae2005-11-09 22:32:44 +00003018static int __devinit serial8250_probe(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003019{
Russell King3ae5eae2005-11-09 22:32:44 +00003020 struct plat_serial8250_port *p = dev->dev.platform_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003021 struct uart_port port;
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02003022 int ret, i, irqflag = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003023
3024 memset(&port, 0, sizeof(struct uart_port));
3025
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02003026 if (share_irqs)
3027 irqflag = IRQF_SHARED;
3028
Russell Kingec9f47c2005-06-27 11:12:54 +01003029 for (i = 0; p && p->flags != 0; p++, i++) {
Will Newton74a197412008-02-04 22:27:50 -08003030 port.iobase = p->iobase;
3031 port.membase = p->membase;
3032 port.irq = p->irq;
Vikram Pandita1c2f0492009-09-19 13:13:19 -07003033 port.irqflags = p->irqflags;
Will Newton74a197412008-02-04 22:27:50 -08003034 port.uartclk = p->uartclk;
3035 port.regshift = p->regshift;
3036 port.iotype = p->iotype;
3037 port.flags = p->flags;
3038 port.mapbase = p->mapbase;
3039 port.hub6 = p->hub6;
3040 port.private_data = p->private_data;
David Daney8e23fcc2009-01-02 13:49:54 +00003041 port.type = p->type;
David Daney7d6a07d2009-01-02 13:49:47 +00003042 port.serial_in = p->serial_in;
3043 port.serial_out = p->serial_out;
Philippe Langlais235dae52010-07-29 17:13:57 +02003044 port.set_termios = p->set_termios;
Manuel Laussc161afe2010-09-25 15:13:45 +02003045 port.pm = p->pm;
Will Newton74a197412008-02-04 22:27:50 -08003046 port.dev = &dev->dev;
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02003047 port.irqflags |= irqflag;
Russell Kingec9f47c2005-06-27 11:12:54 +01003048 ret = serial8250_register_port(&port);
3049 if (ret < 0) {
Russell King3ae5eae2005-11-09 22:32:44 +00003050 dev_err(&dev->dev, "unable to register port at index %d "
Josh Boyer4f640ef2007-07-23 18:43:44 -07003051 "(IO%lx MEM%llx IRQ%d): %d\n", i,
3052 p->iobase, (unsigned long long)p->mapbase,
3053 p->irq, ret);
Russell Kingec9f47c2005-06-27 11:12:54 +01003054 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003055 }
3056 return 0;
3057}
3058
3059/*
3060 * Remove serial ports registered against a platform device.
3061 */
Russell King3ae5eae2005-11-09 22:32:44 +00003062static int __devexit serial8250_remove(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003063{
3064 int i;
3065
Dave Jonesa61c2d72006-01-07 23:18:19 +00003066 for (i = 0; i < nr_uarts; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003067 struct uart_8250_port *up = &serial8250_ports[i];
3068
Russell King3ae5eae2005-11-09 22:32:44 +00003069 if (up->port.dev == &dev->dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003070 serial8250_unregister_port(i);
3071 }
3072 return 0;
3073}
3074
Russell King3ae5eae2005-11-09 22:32:44 +00003075static int serial8250_suspend(struct platform_device *dev, pm_message_t state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003076{
3077 int i;
3078
Linus Torvalds1da177e2005-04-16 15:20:36 -07003079 for (i = 0; i < UART_NR; i++) {
3080 struct uart_8250_port *up = &serial8250_ports[i];
3081
Russell King3ae5eae2005-11-09 22:32:44 +00003082 if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003083 uart_suspend_port(&serial8250_reg, &up->port);
3084 }
3085
3086 return 0;
3087}
3088
Russell King3ae5eae2005-11-09 22:32:44 +00003089static int serial8250_resume(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003090{
3091 int i;
3092
Linus Torvalds1da177e2005-04-16 15:20:36 -07003093 for (i = 0; i < UART_NR; i++) {
3094 struct uart_8250_port *up = &serial8250_ports[i];
3095
Russell King3ae5eae2005-11-09 22:32:44 +00003096 if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
David Woodhouseb5b82df2007-05-17 14:27:39 +08003097 serial8250_resume_port(i);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003098 }
3099
3100 return 0;
3101}
3102
Russell King3ae5eae2005-11-09 22:32:44 +00003103static struct platform_driver serial8250_isa_driver = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003104 .probe = serial8250_probe,
3105 .remove = __devexit_p(serial8250_remove),
3106 .suspend = serial8250_suspend,
3107 .resume = serial8250_resume,
Russell King3ae5eae2005-11-09 22:32:44 +00003108 .driver = {
3109 .name = "serial8250",
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003110 .owner = THIS_MODULE,
Russell King3ae5eae2005-11-09 22:32:44 +00003111 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07003112};
3113
3114/*
3115 * This "device" covers _all_ ISA 8250-compatible serial devices listed
3116 * in the table in include/asm/serial.h
3117 */
3118static struct platform_device *serial8250_isa_devs;
3119
3120/*
3121 * serial8250_register_port and serial8250_unregister_port allows for
3122 * 16x50 serial ports to be configured at run-time, to support PCMCIA
3123 * modems and PCI multiport cards.
3124 */
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003125static DEFINE_MUTEX(serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003126
3127static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *port)
3128{
3129 int i;
3130
3131 /*
3132 * First, find a port entry which matches.
3133 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003134 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003135 if (uart_match_port(&serial8250_ports[i].port, port))
3136 return &serial8250_ports[i];
3137
3138 /*
3139 * We didn't find a matching entry, so look for the first
3140 * free entry. We look for one which hasn't been previously
3141 * used (indicated by zero iobase).
3142 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003143 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003144 if (serial8250_ports[i].port.type == PORT_UNKNOWN &&
3145 serial8250_ports[i].port.iobase == 0)
3146 return &serial8250_ports[i];
3147
3148 /*
3149 * That also failed. Last resort is to find any entry which
3150 * doesn't have a real port associated with it.
3151 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003152 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003153 if (serial8250_ports[i].port.type == PORT_UNKNOWN)
3154 return &serial8250_ports[i];
3155
3156 return NULL;
3157}
3158
3159/**
3160 * serial8250_register_port - register a serial port
3161 * @port: serial port template
3162 *
3163 * Configure the serial port specified by the request. If the
3164 * port exists and is in use, it is hung up and unregistered
3165 * first.
3166 *
3167 * The port is then probed and if necessary the IRQ is autodetected
3168 * If this fails an error is returned.
3169 *
3170 * On success the port is ready to use and the line number is returned.
3171 */
3172int serial8250_register_port(struct uart_port *port)
3173{
3174 struct uart_8250_port *uart;
3175 int ret = -ENOSPC;
3176
3177 if (port->uartclk == 0)
3178 return -EINVAL;
3179
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003180 mutex_lock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003181
3182 uart = serial8250_find_match_or_unused(port);
3183 if (uart) {
3184 uart_remove_one_port(&serial8250_reg, &uart->port);
3185
Will Newton74a197412008-02-04 22:27:50 -08003186 uart->port.iobase = port->iobase;
3187 uart->port.membase = port->membase;
3188 uart->port.irq = port->irq;
Vikram Pandita1c2f0492009-09-19 13:13:19 -07003189 uart->port.irqflags = port->irqflags;
Will Newton74a197412008-02-04 22:27:50 -08003190 uart->port.uartclk = port->uartclk;
3191 uart->port.fifosize = port->fifosize;
3192 uart->port.regshift = port->regshift;
3193 uart->port.iotype = port->iotype;
3194 uart->port.flags = port->flags | UPF_BOOT_AUTOCONF;
3195 uart->port.mapbase = port->mapbase;
3196 uart->port.private_data = port->private_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003197 if (port->dev)
3198 uart->port.dev = port->dev;
David Daney8e23fcc2009-01-02 13:49:54 +00003199
Shmulik Ladkanib5d228c2009-12-09 12:31:29 -08003200 if (port->flags & UPF_FIXED_TYPE)
3201 serial8250_init_fixed_type_port(uart, port->type);
David Daney8e23fcc2009-01-02 13:49:54 +00003202
David Daney7d6a07d2009-01-02 13:49:47 +00003203 set_io_from_upio(&uart->port);
3204 /* Possibly override default I/O functions. */
3205 if (port->serial_in)
3206 uart->port.serial_in = port->serial_in;
3207 if (port->serial_out)
3208 uart->port.serial_out = port->serial_out;
Philippe Langlais235dae52010-07-29 17:13:57 +02003209 /* Possibly override set_termios call */
3210 if (port->set_termios)
3211 uart->port.set_termios = port->set_termios;
Manuel Laussc161afe2010-09-25 15:13:45 +02003212 if (port->pm)
3213 uart->port.pm = port->pm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003214
Alan Coxaf7f3742010-10-18 11:38:02 -07003215 if (serial8250_isa_config != NULL)
3216 serial8250_isa_config(0, &uart->port,
3217 &uart->capabilities);
3218
Linus Torvalds1da177e2005-04-16 15:20:36 -07003219 ret = uart_add_one_port(&serial8250_reg, &uart->port);
3220 if (ret == 0)
3221 ret = uart->port.line;
3222 }
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003223 mutex_unlock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003224
3225 return ret;
3226}
3227EXPORT_SYMBOL(serial8250_register_port);
3228
3229/**
3230 * serial8250_unregister_port - remove a 16x50 serial port at runtime
3231 * @line: serial line number
3232 *
3233 * Remove one serial port. This may not be called from interrupt
3234 * context. We hand the port back to the our control.
3235 */
3236void serial8250_unregister_port(int line)
3237{
3238 struct uart_8250_port *uart = &serial8250_ports[line];
3239
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003240 mutex_lock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003241 uart_remove_one_port(&serial8250_reg, &uart->port);
3242 if (serial8250_isa_devs) {
3243 uart->port.flags &= ~UPF_BOOT_AUTOCONF;
3244 uart->port.type = PORT_UNKNOWN;
3245 uart->port.dev = &serial8250_isa_devs->dev;
3246 uart_add_one_port(&serial8250_reg, &uart->port);
3247 } else {
3248 uart->port.dev = NULL;
3249 }
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003250 mutex_unlock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003251}
3252EXPORT_SYMBOL(serial8250_unregister_port);
3253
3254static int __init serial8250_init(void)
3255{
Alan Cox25db8ad2008-08-19 20:49:40 -07003256 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003257
Dave Jonesa61c2d72006-01-07 23:18:19 +00003258 if (nr_uarts > UART_NR)
3259 nr_uarts = UART_NR;
3260
Paul Bollef1fb9bb2008-12-30 14:06:43 +01003261 printk(KERN_INFO "Serial: 8250/16550 driver, "
Dave Jonesa61c2d72006-01-07 23:18:19 +00003262 "%d ports, IRQ sharing %sabled\n", nr_uarts,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003263 share_irqs ? "en" : "dis");
3264
David Millerb70ac772008-10-13 10:36:31 +01003265#ifdef CONFIG_SPARC
3266 ret = sunserial_register_minors(&serial8250_reg, UART_NR);
3267#else
3268 serial8250_reg.nr = UART_NR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003269 ret = uart_register_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003270#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003271 if (ret)
3272 goto out;
3273
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003274 serial8250_isa_devs = platform_device_alloc("serial8250",
3275 PLAT8250_DEV_LEGACY);
3276 if (!serial8250_isa_devs) {
3277 ret = -ENOMEM;
Russell Kingbc965a72006-01-18 09:54:29 +00003278 goto unreg_uart_drv;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003279 }
3280
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003281 ret = platform_device_add(serial8250_isa_devs);
3282 if (ret)
3283 goto put_dev;
3284
Linus Torvalds1da177e2005-04-16 15:20:36 -07003285 serial8250_register_ports(&serial8250_reg, &serial8250_isa_devs->dev);
3286
Russell Kingbc965a72006-01-18 09:54:29 +00003287 ret = platform_driver_register(&serial8250_isa_driver);
3288 if (ret == 0)
3289 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003290
Russell Kingbc965a72006-01-18 09:54:29 +00003291 platform_device_del(serial8250_isa_devs);
Alan Cox25db8ad2008-08-19 20:49:40 -07003292put_dev:
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003293 platform_device_put(serial8250_isa_devs);
Alan Cox25db8ad2008-08-19 20:49:40 -07003294unreg_uart_drv:
David Millerb70ac772008-10-13 10:36:31 +01003295#ifdef CONFIG_SPARC
3296 sunserial_unregister_minors(&serial8250_reg, UART_NR);
3297#else
Linus Torvalds1da177e2005-04-16 15:20:36 -07003298 uart_unregister_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003299#endif
Alan Cox25db8ad2008-08-19 20:49:40 -07003300out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07003301 return ret;
3302}
3303
3304static void __exit serial8250_exit(void)
3305{
3306 struct platform_device *isa_dev = serial8250_isa_devs;
3307
3308 /*
3309 * This tells serial8250_unregister_port() not to re-register
3310 * the ports (thereby making serial8250_isa_driver permanently
3311 * in use.)
3312 */
3313 serial8250_isa_devs = NULL;
3314
Russell King3ae5eae2005-11-09 22:32:44 +00003315 platform_driver_unregister(&serial8250_isa_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003316 platform_device_unregister(isa_dev);
3317
David Millerb70ac772008-10-13 10:36:31 +01003318#ifdef CONFIG_SPARC
3319 sunserial_unregister_minors(&serial8250_reg, UART_NR);
3320#else
Linus Torvalds1da177e2005-04-16 15:20:36 -07003321 uart_unregister_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003322#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003323}
3324
3325module_init(serial8250_init);
3326module_exit(serial8250_exit);
3327
3328EXPORT_SYMBOL(serial8250_suspend_port);
3329EXPORT_SYMBOL(serial8250_resume_port);
3330
3331MODULE_LICENSE("GPL");
Adrian Bunkd87a6d92008-07-16 21:53:31 +01003332MODULE_DESCRIPTION("Generic 8250/16x50 serial driver");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003333
3334module_param(share_irqs, uint, 0644);
3335MODULE_PARM_DESC(share_irqs, "Share IRQs with other non-8250/16x50 devices"
3336 " (unsafe)");
3337
Dave Jonesa61c2d72006-01-07 23:18:19 +00003338module_param(nr_uarts, uint, 0644);
3339MODULE_PARM_DESC(nr_uarts, "Maximum number of UARTs supported. (1-" __MODULE_STRING(CONFIG_SERIAL_8250_NR_UARTS) ")");
3340
Chuck Ebbertd41a4b52009-10-01 15:44:26 -07003341module_param(skip_txen_test, uint, 0644);
3342MODULE_PARM_DESC(skip_txen_test, "Skip checking for the TXEN bug at init time");
3343
Linus Torvalds1da177e2005-04-16 15:20:36 -07003344#ifdef CONFIG_SERIAL_8250_RSA
3345module_param_array(probe_rsa, ulong, &probe_rsa_count, 0444);
3346MODULE_PARM_DESC(probe_rsa, "Probe I/O ports for RSA");
3347#endif
3348MODULE_ALIAS_CHARDEV_MAJOR(TTY_MAJOR);