blob: 0efc815a496869fbe80cec247fb99af9286105f9 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 * Driver for 8250/16550-type serial ports
3 *
4 * Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
5 *
6 * Copyright (C) 2001 Russell King.
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070013 * A note about mapbase / membase
14 *
15 * mapbase is the physical address of the IO port.
16 * membase is an 'ioremapped' cookie.
17 */
Linus Torvalds1da177e2005-04-16 15:20:36 -070018
19#if defined(CONFIG_SERIAL_8250_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
20#define SUPPORT_SYSRQ
21#endif
22
23#include <linux/module.h>
24#include <linux/moduleparam.h>
25#include <linux/ioport.h>
26#include <linux/init.h>
27#include <linux/console.h>
28#include <linux/sysrq.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070029#include <linux/delay.h>
Russell Kingd052d1b2005-10-29 19:07:23 +010030#include <linux/platform_device.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include <linux/tty.h>
Daniel Drakecd3ecad2010-10-20 16:00:48 -070032#include <linux/ratelimit.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070033#include <linux/tty_flip.h>
34#include <linux/serial_reg.h>
35#include <linux/serial_core.h>
36#include <linux/serial.h>
37#include <linux/serial_8250.h>
Andrew Morton78512ec2005-11-07 00:59:13 -080038#include <linux/nmi.h>
Arjan van de Venf392ecf2006-01-12 18:44:32 +000039#include <linux/mutex.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090040#include <linux/slab.h>
Paul Gortmaker68163832012-02-09 18:48:19 -050041#ifdef CONFIG_SPARC
42#include <linux/sunserialcore.h>
43#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070044
45#include <asm/io.h>
46#include <asm/irq.h>
47
48#include "8250.h"
49
50/*
51 * Configuration:
Thomas Gleixner40663cc2006-07-01 19:29:43 -070052 * share_irqs - whether we pass IRQF_SHARED to request_irq(). This option
Linus Torvalds1da177e2005-04-16 15:20:36 -070053 * is unsafe when used on edge-triggered interrupts.
54 */
Adrian Bunk408b6642005-05-01 08:59:29 -070055static unsigned int share_irqs = SERIAL8250_SHARE_IRQS;
Linus Torvalds1da177e2005-04-16 15:20:36 -070056
Dave Jonesa61c2d72006-01-07 23:18:19 +000057static unsigned int nr_uarts = CONFIG_SERIAL_8250_RUNTIME_UARTS;
58
David S. Miller84408382008-10-13 10:45:26 +010059static struct uart_driver serial8250_reg;
60
61static int serial_index(struct uart_port *port)
62{
63 return (serial8250_reg.minor - 64) + port->line;
64}
65
Chuck Ebbertd41a4b52009-10-01 15:44:26 -070066static unsigned int skip_txen_test; /* force skip of txen test at init time */
67
Linus Torvalds1da177e2005-04-16 15:20:36 -070068/*
69 * Debugging.
70 */
71#if 0
72#define DEBUG_AUTOCONF(fmt...) printk(fmt)
73#else
74#define DEBUG_AUTOCONF(fmt...) do { } while (0)
75#endif
76
77#if 0
78#define DEBUG_INTR(fmt...) printk(fmt)
79#else
80#define DEBUG_INTR(fmt...) do { } while (0)
81#endif
82
Jiri Slabye7328ae2011-06-05 22:51:49 +020083#define PASS_LIMIT 512
Linus Torvalds1da177e2005-04-16 15:20:36 -070084
Dick Hollenbeckbca47612009-12-09 12:31:34 -080085#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
86
87
Linus Torvalds1da177e2005-04-16 15:20:36 -070088#ifdef CONFIG_SERIAL_8250_DETECT_IRQ
89#define CONFIG_SERIAL_DETECT_IRQ 1
90#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070091#ifdef CONFIG_SERIAL_8250_MANY_PORTS
92#define CONFIG_SERIAL_MANY_PORTS 1
93#endif
94
95/*
96 * HUB6 is always on. This will be removed once the header
97 * files have been cleaned.
98 */
99#define CONFIG_HUB6 1
100
Bryan Wua4ed1e42008-05-31 16:10:04 +0800101#include <asm/serial.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102/*
103 * SERIAL_PORT_DFNS tells us about built-in ports that have no
104 * standard enumeration mechanism. Platforms that can find all
105 * serial ports via mechanisms like ACPI or PCI need not supply it.
106 */
107#ifndef SERIAL_PORT_DFNS
108#define SERIAL_PORT_DFNS
109#endif
110
Arjan van de Vencb3592b2005-11-28 21:04:11 +0000111static const struct old_serial_port old_serial_port[] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112 SERIAL_PORT_DFNS /* defined in asm/serial.h */
113};
114
Russell King026d02a2005-06-29 18:45:19 +0100115#define UART_NR CONFIG_SERIAL_8250_NR_UARTS
Linus Torvalds1da177e2005-04-16 15:20:36 -0700116
117#ifdef CONFIG_SERIAL_8250_RSA
118
119#define PORT_RSA_MAX 4
120static unsigned long probe_rsa[PORT_RSA_MAX];
121static unsigned int probe_rsa_count;
122#endif /* CONFIG_SERIAL_8250_RSA */
123
Linus Torvalds1da177e2005-04-16 15:20:36 -0700124struct irq_info {
Alan Cox25db8ad2008-08-19 20:49:40 -0700125 struct hlist_node node;
126 int irq;
127 spinlock_t lock; /* Protects list not the hash */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700128 struct list_head *head;
129};
130
Alan Cox25db8ad2008-08-19 20:49:40 -0700131#define NR_IRQ_HASH 32 /* Can be adjusted later */
132static struct hlist_head irq_lists[NR_IRQ_HASH];
133static DEFINE_MUTEX(hash_mutex); /* Used to walk the hash */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700134
135/*
136 * Here we define the default xmit fifo size used for each type of UART.
137 */
138static const struct serial8250_config uart_config[] = {
139 [PORT_UNKNOWN] = {
140 .name = "unknown",
141 .fifo_size = 1,
142 .tx_loadsz = 1,
143 },
144 [PORT_8250] = {
145 .name = "8250",
146 .fifo_size = 1,
147 .tx_loadsz = 1,
148 },
149 [PORT_16450] = {
150 .name = "16450",
151 .fifo_size = 1,
152 .tx_loadsz = 1,
153 },
154 [PORT_16550] = {
155 .name = "16550",
156 .fifo_size = 1,
157 .tx_loadsz = 1,
158 },
159 [PORT_16550A] = {
160 .name = "16550A",
161 .fifo_size = 16,
162 .tx_loadsz = 16,
163 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
164 .flags = UART_CAP_FIFO,
165 },
166 [PORT_CIRRUS] = {
167 .name = "Cirrus",
168 .fifo_size = 1,
169 .tx_loadsz = 1,
170 },
171 [PORT_16650] = {
172 .name = "ST16650",
173 .fifo_size = 1,
174 .tx_loadsz = 1,
175 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
176 },
177 [PORT_16650V2] = {
178 .name = "ST16650V2",
179 .fifo_size = 32,
180 .tx_loadsz = 16,
181 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
182 UART_FCR_T_TRIG_00,
183 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
184 },
185 [PORT_16750] = {
186 .name = "TI16750",
187 .fifo_size = 64,
188 .tx_loadsz = 64,
189 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 |
190 UART_FCR7_64BYTE,
191 .flags = UART_CAP_FIFO | UART_CAP_SLEEP | UART_CAP_AFE,
192 },
193 [PORT_STARTECH] = {
194 .name = "Startech",
195 .fifo_size = 1,
196 .tx_loadsz = 1,
197 },
198 [PORT_16C950] = {
199 .name = "16C950/954",
200 .fifo_size = 128,
201 .tx_loadsz = 128,
202 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
Pavel Machekd0694e22011-01-09 08:38:48 +0100203 /* UART_CAP_EFR breaks billionon CF bluetooth card. */
204 .flags = UART_CAP_FIFO | UART_CAP_SLEEP,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700205 },
206 [PORT_16654] = {
207 .name = "ST16654",
208 .fifo_size = 64,
209 .tx_loadsz = 32,
210 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
211 UART_FCR_T_TRIG_10,
212 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
213 },
214 [PORT_16850] = {
215 .name = "XR16850",
216 .fifo_size = 128,
217 .tx_loadsz = 128,
218 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
219 .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
220 },
221 [PORT_RSA] = {
222 .name = "RSA",
223 .fifo_size = 2048,
224 .tx_loadsz = 2048,
225 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_11,
226 .flags = UART_CAP_FIFO,
227 },
228 [PORT_NS16550A] = {
229 .name = "NS16550A",
230 .fifo_size = 16,
231 .tx_loadsz = 16,
232 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
233 .flags = UART_CAP_FIFO | UART_NATSEMI,
234 },
235 [PORT_XSCALE] = {
236 .name = "XScale",
237 .fifo_size = 32,
238 .tx_loadsz = 32,
239 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
Stephen Warren4539c242011-05-17 16:12:36 -0600240 .flags = UART_CAP_FIFO | UART_CAP_UUE | UART_CAP_RTOIE,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700241 },
David Daney6b06f192009-01-02 13:50:00 +0000242 [PORT_OCTEON] = {
243 .name = "OCTEON",
244 .fifo_size = 64,
245 .tx_loadsz = 64,
246 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
247 .flags = UART_CAP_FIFO,
248 },
Florian Fainelli08e09922009-06-11 13:21:24 +0100249 [PORT_AR7] = {
250 .name = "AR7",
251 .fifo_size = 16,
252 .tx_loadsz = 16,
253 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_00,
254 .flags = UART_CAP_FIFO | UART_CAP_AFE,
255 },
Philippe Langlais235dae52010-07-29 17:13:57 +0200256 [PORT_U6_16550A] = {
257 .name = "U6_16550A",
258 .fifo_size = 64,
259 .tx_loadsz = 64,
260 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
261 .flags = UART_CAP_FIFO | UART_CAP_AFE,
262 },
Stephen Warren4539c242011-05-17 16:12:36 -0600263 [PORT_TEGRA] = {
264 .name = "Tegra",
265 .fifo_size = 32,
266 .tx_loadsz = 8,
267 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
268 UART_FCR_T_TRIG_01,
269 .flags = UART_CAP_FIFO | UART_CAP_RTOIE,
270 },
Søren Holm06315342011-09-02 22:55:37 +0200271 [PORT_XR17D15X] = {
272 .name = "XR17D15X",
273 .fifo_size = 64,
274 .tx_loadsz = 64,
275 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
Matt Schulte81db0772012-11-21 09:39:07 -0600276 .flags = UART_CAP_FIFO | UART_CAP_AFE | UART_CAP_EFR |
277 UART_CAP_SLEEP,
Søren Holm06315342011-09-02 22:55:37 +0200278 },
Matt Schultedc96efb2012-11-19 09:12:04 -0600279 [PORT_XR17V35X] = {
280 .name = "XR17V35X",
281 .fifo_size = 256,
282 .tx_loadsz = 256,
283 .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_11 |
284 UART_FCR_T_TRIG_11,
285 .flags = UART_CAP_FIFO | UART_CAP_AFE | UART_CAP_EFR |
286 UART_CAP_SLEEP,
287 },
Roland Stigge7a514592012-06-11 21:57:13 +0200288 [PORT_LPC3220] = {
289 .name = "LPC3220",
290 .fifo_size = 64,
291 .tx_loadsz = 32,
292 .fcr = UART_FCR_DMA_SELECT | UART_FCR_ENABLE_FIFO |
293 UART_FCR_R_TRIG_00 | UART_FCR_T_TRIG_00,
294 .flags = UART_CAP_FIFO,
295 },
Stephen Hurdebebd492013-01-17 14:14:53 -0800296 [PORT_BRCM_TRUMANAGE] = {
297 .name = "TruManage",
298 .fifo_size = 1,
299 .tx_loadsz = 1024,
300 .flags = UART_CAP_HFIFO,
301 },
Sean Young65ecc9c2012-09-07 19:06:24 +0100302 [PORT_8250_CIR] = {
303 .name = "CIR port"
304 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700305};
306
Magnus Dammcc419fa02012-05-02 21:46:51 +0900307/* Uart divisor latch read */
Magnus Damme8155622012-05-02 21:47:18 +0900308static int default_serial_dl_read(struct uart_8250_port *up)
Magnus Dammcc419fa02012-05-02 21:46:51 +0900309{
310 return serial_in(up, UART_DLL) | serial_in(up, UART_DLM) << 8;
311}
312
313/* Uart divisor latch write */
Magnus Damme8155622012-05-02 21:47:18 +0900314static void default_serial_dl_write(struct uart_8250_port *up, int value)
Magnus Dammcc419fa02012-05-02 21:46:51 +0900315{
316 serial_out(up, UART_DLL, value & 0xff);
317 serial_out(up, UART_DLM, value >> 8 & 0xff);
318}
319
John Crispinc4208112013-01-25 19:39:51 +0100320#if defined(CONFIG_MIPS_ALCHEMY) || defined(CONFIG_SERIAL_8250_RT288X)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000321
John Crispinc4208112013-01-25 19:39:51 +0100322/* Au1x00/RT288x UART hardware has a weird register layout */
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000323static const u8 au_io_in_map[] = {
324 [UART_RX] = 0,
325 [UART_IER] = 2,
326 [UART_IIR] = 3,
327 [UART_LCR] = 5,
328 [UART_MCR] = 6,
329 [UART_LSR] = 7,
330 [UART_MSR] = 8,
331};
332
333static const u8 au_io_out_map[] = {
334 [UART_TX] = 1,
335 [UART_IER] = 2,
336 [UART_FCR] = 4,
337 [UART_LCR] = 5,
338 [UART_MCR] = 6,
339};
340
Magnus Damm6b416032012-05-02 21:47:00 +0900341static unsigned int au_serial_in(struct uart_port *p, int offset)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000342{
Magnus Damm6b416032012-05-02 21:47:00 +0900343 offset = au_io_in_map[offset] << p->regshift;
344 return __raw_readl(p->membase + offset);
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000345}
346
Magnus Damm6b416032012-05-02 21:47:00 +0900347static void au_serial_out(struct uart_port *p, int offset, int value)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000348{
Magnus Damm6b416032012-05-02 21:47:00 +0900349 offset = au_io_out_map[offset] << p->regshift;
350 __raw_writel(value, p->membase + offset);
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000351}
352
Magnus Damm6b416032012-05-02 21:47:00 +0900353/* Au1x00 haven't got a standard divisor latch */
354static int au_serial_dl_read(struct uart_8250_port *up)
355{
356 return __raw_readl(up->port.membase + 0x28);
357}
358
359static void au_serial_dl_write(struct uart_8250_port *up, int value)
360{
361 __raw_writel(value, up->port.membase + 0x28);
362}
363
364#endif
365
David Daney7d6a07d2009-01-02 13:49:47 +0000366static unsigned int hub6_serial_in(struct uart_port *p, int offset)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700367{
Magnus Damme8155622012-05-02 21:47:18 +0900368 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000369 outb(p->hub6 - 1 + offset, p->iobase);
370 return inb(p->iobase + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700371}
372
David Daney7d6a07d2009-01-02 13:49:47 +0000373static void hub6_serial_out(struct uart_port *p, int offset, int value)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700374{
Magnus Damme8155622012-05-02 21:47:18 +0900375 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000376 outb(p->hub6 - 1 + offset, p->iobase);
377 outb(value, p->iobase + 1);
378}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700379
David Daney7d6a07d2009-01-02 13:49:47 +0000380static unsigned int mem_serial_in(struct uart_port *p, int offset)
381{
Magnus Damme8155622012-05-02 21:47:18 +0900382 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000383 return readb(p->membase + offset);
384}
385
386static void mem_serial_out(struct uart_port *p, int offset, int value)
387{
Magnus Damme8155622012-05-02 21:47:18 +0900388 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000389 writeb(value, p->membase + offset);
390}
391
392static void mem32_serial_out(struct uart_port *p, int offset, int value)
393{
Magnus Damme8155622012-05-02 21:47:18 +0900394 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000395 writel(value, p->membase + offset);
396}
397
398static unsigned int mem32_serial_in(struct uart_port *p, int offset)
399{
Magnus Damme8155622012-05-02 21:47:18 +0900400 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000401 return readl(p->membase + offset);
402}
403
David Daney7d6a07d2009-01-02 13:49:47 +0000404static unsigned int io_serial_in(struct uart_port *p, int offset)
405{
Magnus Damme8155622012-05-02 21:47:18 +0900406 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000407 return inb(p->iobase + offset);
408}
409
410static void io_serial_out(struct uart_port *p, int offset, int value)
411{
Magnus Damme8155622012-05-02 21:47:18 +0900412 offset = offset << p->regshift;
David Daney7d6a07d2009-01-02 13:49:47 +0000413 outb(value, p->iobase + offset);
414}
415
Jamie Iles583d28e2011-08-15 10:17:52 +0100416static int serial8250_default_handle_irq(struct uart_port *port);
Matt Schultedc96efb2012-11-19 09:12:04 -0600417static int exar_handle_irq(struct uart_port *port);
Jamie Iles583d28e2011-08-15 10:17:52 +0100418
David Daney7d6a07d2009-01-02 13:49:47 +0000419static void set_io_from_upio(struct uart_port *p)
420{
Jamie Iles49d57412010-12-01 23:39:35 +0000421 struct uart_8250_port *up =
422 container_of(p, struct uart_8250_port, port);
Magnus Dammcc419fa02012-05-02 21:46:51 +0900423
Magnus Damme8155622012-05-02 21:47:18 +0900424 up->dl_read = default_serial_dl_read;
425 up->dl_write = default_serial_dl_write;
Magnus Dammcc419fa02012-05-02 21:46:51 +0900426
David Daney7d6a07d2009-01-02 13:49:47 +0000427 switch (p->iotype) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700428 case UPIO_HUB6:
David Daney7d6a07d2009-01-02 13:49:47 +0000429 p->serial_in = hub6_serial_in;
430 p->serial_out = hub6_serial_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700431 break;
432
433 case UPIO_MEM:
David Daney7d6a07d2009-01-02 13:49:47 +0000434 p->serial_in = mem_serial_in;
435 p->serial_out = mem_serial_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700436 break;
437
438 case UPIO_MEM32:
David Daney7d6a07d2009-01-02 13:49:47 +0000439 p->serial_in = mem32_serial_in;
440 p->serial_out = mem32_serial_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700441 break;
442
John Crispinc4208112013-01-25 19:39:51 +0100443#if defined(CONFIG_MIPS_ALCHEMY) || defined(CONFIG_SERIAL_8250_RT288X)
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000444 case UPIO_AU:
David Daney7d6a07d2009-01-02 13:49:47 +0000445 p->serial_in = au_serial_in;
446 p->serial_out = au_serial_out;
Magnus Damm6b416032012-05-02 21:47:00 +0900447 up->dl_read = au_serial_dl_read;
448 up->dl_write = au_serial_dl_write;
Pantelis Antoniou21c614a2005-11-06 09:07:03 +0000449 break;
Magnus Damm6b416032012-05-02 21:47:00 +0900450#endif
Manuel Lauss12bf3f22010-07-15 21:45:05 +0200451
Linus Torvalds1da177e2005-04-16 15:20:36 -0700452 default:
David Daney7d6a07d2009-01-02 13:49:47 +0000453 p->serial_in = io_serial_in;
454 p->serial_out = io_serial_out;
455 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700456 }
Alan Coxb8e7e402009-05-28 14:01:35 +0100457 /* Remember loaded iotype */
458 up->cur_iotype = p->iotype;
Jamie Iles583d28e2011-08-15 10:17:52 +0100459 p->handle_irq = serial8250_default_handle_irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700460}
461
Alex Williamson40b36da2007-02-14 00:33:04 -0800462static void
Paul Gortmaker55e40162012-03-08 19:12:14 -0500463serial_port_out_sync(struct uart_port *p, int offset, int value)
Alex Williamson40b36da2007-02-14 00:33:04 -0800464{
David Daney7d6a07d2009-01-02 13:49:47 +0000465 switch (p->iotype) {
Alex Williamson40b36da2007-02-14 00:33:04 -0800466 case UPIO_MEM:
467 case UPIO_MEM32:
Alex Williamson40b36da2007-02-14 00:33:04 -0800468 case UPIO_AU:
David Daney7d6a07d2009-01-02 13:49:47 +0000469 p->serial_out(p, offset, value);
470 p->serial_in(p, UART_LCR); /* safe, no side-effects */
Alex Williamson40b36da2007-02-14 00:33:04 -0800471 break;
472 default:
David Daney7d6a07d2009-01-02 13:49:47 +0000473 p->serial_out(p, offset, value);
Alex Williamson40b36da2007-02-14 00:33:04 -0800474 }
475}
476
Linus Torvalds1da177e2005-04-16 15:20:36 -0700477/*
478 * For the 16C950
479 */
480static void serial_icr_write(struct uart_8250_port *up, int offset, int value)
481{
482 serial_out(up, UART_SCR, offset);
483 serial_out(up, UART_ICR, value);
484}
485
486static unsigned int serial_icr_read(struct uart_8250_port *up, int offset)
487{
488 unsigned int value;
489
490 serial_icr_write(up, UART_ACR, up->acr | UART_ACR_ICRRD);
491 serial_out(up, UART_SCR, offset);
492 value = serial_in(up, UART_ICR);
493 serial_icr_write(up, UART_ACR, up->acr);
494
495 return value;
496}
497
498/*
499 * FIFO support.
500 */
Will Newtonb5d674a2008-10-13 10:36:21 +0100501static void serial8250_clear_fifos(struct uart_8250_port *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700502{
503 if (p->capabilities & UART_CAP_FIFO) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500504 serial_out(p, UART_FCR, UART_FCR_ENABLE_FIFO);
505 serial_out(p, UART_FCR, UART_FCR_ENABLE_FIFO |
Linus Torvalds1da177e2005-04-16 15:20:36 -0700506 UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500507 serial_out(p, UART_FCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700508 }
509}
510
Sudhakar Mamillapalli0ad372b2012-04-10 14:10:58 -0700511void serial8250_clear_and_reinit_fifos(struct uart_8250_port *p)
512{
513 unsigned char fcr;
514
515 serial8250_clear_fifos(p);
516 fcr = uart_config[p->port.type].fcr;
517 serial_out(p, UART_FCR, fcr);
518}
519EXPORT_SYMBOL_GPL(serial8250_clear_and_reinit_fifos);
520
Linus Torvalds1da177e2005-04-16 15:20:36 -0700521/*
522 * IER sleep support. UARTs which have EFRs need the "extended
523 * capability" bit enabled. Note that on XR16C850s, we need to
524 * reset LCR to write to IER.
525 */
Will Newtonb5d674a2008-10-13 10:36:21 +0100526static void serial8250_set_sleep(struct uart_8250_port *p, int sleep)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700527{
Matt Schultedc96efb2012-11-19 09:12:04 -0600528 /*
529 * Exar UARTs have a SLEEP register that enables or disables
530 * each UART to enter sleep mode separately. On the XR17V35x the
531 * register is accessible to each UART at the UART_EXAR_SLEEP
532 * offset but the UART channel may only write to the corresponding
533 * bit.
534 */
Matt Schulte81db0772012-11-21 09:39:07 -0600535 if ((p->port.type == PORT_XR17V35X) ||
536 (p->port.type == PORT_XR17D15X)) {
Matt Schultedc96efb2012-11-19 09:12:04 -0600537 serial_out(p, UART_EXAR_SLEEP, 0xff);
538 return;
539 }
540
Linus Torvalds1da177e2005-04-16 15:20:36 -0700541 if (p->capabilities & UART_CAP_SLEEP) {
542 if (p->capabilities & UART_CAP_EFR) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500543 serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B);
544 serial_out(p, UART_EFR, UART_EFR_ECB);
545 serial_out(p, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700546 }
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500547 serial_out(p, UART_IER, sleep ? UART_IERX_SLEEP : 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700548 if (p->capabilities & UART_CAP_EFR) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500549 serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B);
550 serial_out(p, UART_EFR, 0);
551 serial_out(p, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700552 }
553 }
554}
555
556#ifdef CONFIG_SERIAL_8250_RSA
557/*
558 * Attempts to turn on the RSA FIFO. Returns zero on failure.
559 * We set the port uart clock rate if we succeed.
560 */
561static int __enable_rsa(struct uart_8250_port *up)
562{
563 unsigned char mode;
564 int result;
565
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500566 mode = serial_in(up, UART_RSA_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700567 result = mode & UART_RSA_MSR_FIFO;
568
569 if (!result) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500570 serial_out(up, UART_RSA_MSR, mode | UART_RSA_MSR_FIFO);
571 mode = serial_in(up, UART_RSA_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700572 result = mode & UART_RSA_MSR_FIFO;
573 }
574
575 if (result)
576 up->port.uartclk = SERIAL_RSA_BAUD_BASE * 16;
577
578 return result;
579}
580
581static void enable_rsa(struct uart_8250_port *up)
582{
583 if (up->port.type == PORT_RSA) {
584 if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) {
585 spin_lock_irq(&up->port.lock);
586 __enable_rsa(up);
587 spin_unlock_irq(&up->port.lock);
588 }
589 if (up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16)
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500590 serial_out(up, UART_RSA_FRR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700591 }
592}
593
594/*
595 * Attempts to turn off the RSA FIFO. Returns zero on failure.
596 * It is unknown why interrupts were disabled in here. However,
597 * the caller is expected to preserve this behaviour by grabbing
598 * the spinlock before calling this function.
599 */
600static void disable_rsa(struct uart_8250_port *up)
601{
602 unsigned char mode;
603 int result;
604
605 if (up->port.type == PORT_RSA &&
606 up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) {
607 spin_lock_irq(&up->port.lock);
608
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500609 mode = serial_in(up, UART_RSA_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700610 result = !(mode & UART_RSA_MSR_FIFO);
611
612 if (!result) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500613 serial_out(up, UART_RSA_MSR, mode & ~UART_RSA_MSR_FIFO);
614 mode = serial_in(up, UART_RSA_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700615 result = !(mode & UART_RSA_MSR_FIFO);
616 }
617
618 if (result)
619 up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16;
620 spin_unlock_irq(&up->port.lock);
621 }
622}
623#endif /* CONFIG_SERIAL_8250_RSA */
624
625/*
626 * This is a quickie test to see how big the FIFO is.
627 * It doesn't work at all the time, more's the pity.
628 */
629static int size_fifo(struct uart_8250_port *up)
630{
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100631 unsigned char old_fcr, old_mcr, old_lcr;
632 unsigned short old_dl;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700633 int count;
634
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500635 old_lcr = serial_in(up, UART_LCR);
636 serial_out(up, UART_LCR, 0);
637 old_fcr = serial_in(up, UART_FCR);
638 old_mcr = serial_in(up, UART_MCR);
639 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO |
Linus Torvalds1da177e2005-04-16 15:20:36 -0700640 UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500641 serial_out(up, UART_MCR, UART_MCR_LOOP);
642 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100643 old_dl = serial_dl_read(up);
644 serial_dl_write(up, 0x0001);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500645 serial_out(up, UART_LCR, 0x03);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700646 for (count = 0; count < 256; count++)
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500647 serial_out(up, UART_TX, count);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700648 mdelay(20);/* FIXME - schedule_timeout */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500649 for (count = 0; (serial_in(up, UART_LSR) & UART_LSR_DR) &&
Linus Torvalds1da177e2005-04-16 15:20:36 -0700650 (count < 256); count++)
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500651 serial_in(up, UART_RX);
652 serial_out(up, UART_FCR, old_fcr);
653 serial_out(up, UART_MCR, old_mcr);
654 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100655 serial_dl_write(up, old_dl);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500656 serial_out(up, UART_LCR, old_lcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700657
658 return count;
659}
660
661/*
662 * Read UART ID using the divisor method - set DLL and DLM to zero
663 * and the revision will be in DLL and device type in DLM. We
664 * preserve the device state across this.
665 */
666static unsigned int autoconfig_read_divisor_id(struct uart_8250_port *p)
667{
668 unsigned char old_dll, old_dlm, old_lcr;
669 unsigned int id;
670
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500671 old_lcr = serial_in(p, UART_LCR);
672 serial_out(p, UART_LCR, UART_LCR_CONF_MODE_A);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700673
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500674 old_dll = serial_in(p, UART_DLL);
675 old_dlm = serial_in(p, UART_DLM);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700676
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500677 serial_out(p, UART_DLL, 0);
678 serial_out(p, UART_DLM, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700679
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500680 id = serial_in(p, UART_DLL) | serial_in(p, UART_DLM) << 8;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700681
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500682 serial_out(p, UART_DLL, old_dll);
683 serial_out(p, UART_DLM, old_dlm);
684 serial_out(p, UART_LCR, old_lcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700685
686 return id;
687}
688
689/*
690 * This is a helper routine to autodetect StarTech/Exar/Oxsemi UART's.
691 * When this function is called we know it is at least a StarTech
692 * 16650 V2, but it might be one of several StarTech UARTs, or one of
693 * its clones. (We treat the broken original StarTech 16650 V1 as a
694 * 16550, and why not? Startech doesn't seem to even acknowledge its
695 * existence.)
Thomas Koellerbd71c182007-05-06 14:48:47 -0700696 *
Linus Torvalds1da177e2005-04-16 15:20:36 -0700697 * What evil have men's minds wrought...
698 */
699static void autoconfig_has_efr(struct uart_8250_port *up)
700{
701 unsigned int id1, id2, id3, rev;
702
703 /*
704 * Everything with an EFR has SLEEP
705 */
706 up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP;
707
708 /*
709 * First we check to see if it's an Oxford Semiconductor UART.
710 *
711 * If we have to do this here because some non-National
712 * Semiconductor clone chips lock up if you try writing to the
713 * LSR register (which serial_icr_read does)
714 */
715
716 /*
717 * Check for Oxford Semiconductor 16C950.
718 *
719 * EFR [4] must be set else this test fails.
720 *
721 * This shouldn't be necessary, but Mike Hudson (Exoray@isys.ca)
722 * claims that it's needed for 952 dual UART's (which are not
723 * recommended for new designs).
724 */
725 up->acr = 0;
Andrei Emeltchenko662b083a2010-11-30 14:11:49 -0800726 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700727 serial_out(up, UART_EFR, UART_EFR_ECB);
728 serial_out(up, UART_LCR, 0x00);
729 id1 = serial_icr_read(up, UART_ID1);
730 id2 = serial_icr_read(up, UART_ID2);
731 id3 = serial_icr_read(up, UART_ID3);
732 rev = serial_icr_read(up, UART_REV);
733
734 DEBUG_AUTOCONF("950id=%02x:%02x:%02x:%02x ", id1, id2, id3, rev);
735
736 if (id1 == 0x16 && id2 == 0xC9 &&
737 (id3 == 0x50 || id3 == 0x52 || id3 == 0x54)) {
738 up->port.type = PORT_16C950;
Russell King4ba5e352005-06-23 10:43:04 +0100739
740 /*
741 * Enable work around for the Oxford Semiconductor 952 rev B
742 * chip which causes it to seriously miscalculate baud rates
743 * when DLL is 0.
744 */
745 if (id3 == 0x52 && rev == 0x01)
746 up->bugs |= UART_BUG_QUOT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700747 return;
748 }
Thomas Koellerbd71c182007-05-06 14:48:47 -0700749
Linus Torvalds1da177e2005-04-16 15:20:36 -0700750 /*
751 * We check for a XR16C850 by setting DLL and DLM to 0, and then
752 * reading back DLL and DLM. The chip type depends on the DLM
753 * value read back:
754 * 0x10 - XR16C850 and the DLL contains the chip revision.
755 * 0x12 - XR16C2850.
756 * 0x14 - XR16C854.
757 */
758 id1 = autoconfig_read_divisor_id(up);
759 DEBUG_AUTOCONF("850id=%04x ", id1);
760
761 id2 = id1 >> 8;
762 if (id2 == 0x10 || id2 == 0x12 || id2 == 0x14) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700763 up->port.type = PORT_16850;
764 return;
765 }
766
767 /*
768 * It wasn't an XR16C850.
769 *
770 * We distinguish between the '654 and the '650 by counting
771 * how many bytes are in the FIFO. I'm using this for now,
772 * since that's the technique that was sent to me in the
773 * serial driver update, but I'm not convinced this works.
774 * I've had problems doing this in the past. -TYT
775 */
776 if (size_fifo(up) == 64)
777 up->port.type = PORT_16654;
778 else
779 up->port.type = PORT_16650V2;
780}
781
782/*
783 * We detected a chip without a FIFO. Only two fall into
784 * this category - the original 8250 and the 16450. The
785 * 16450 has a scratch register (accessible with LCR=0)
786 */
787static void autoconfig_8250(struct uart_8250_port *up)
788{
789 unsigned char scratch, status1, status2;
790
791 up->port.type = PORT_8250;
792
793 scratch = serial_in(up, UART_SCR);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500794 serial_out(up, UART_SCR, 0xa5);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700795 status1 = serial_in(up, UART_SCR);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500796 serial_out(up, UART_SCR, 0x5a);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700797 status2 = serial_in(up, UART_SCR);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500798 serial_out(up, UART_SCR, scratch);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700799
800 if (status1 == 0xa5 && status2 == 0x5a)
801 up->port.type = PORT_16450;
802}
803
804static int broken_efr(struct uart_8250_port *up)
805{
806 /*
807 * Exar ST16C2550 "A2" devices incorrectly detect as
808 * having an EFR, and report an ID of 0x0201. See
Justin P. Mattock631dd1a2010-10-18 11:03:14 +0200809 * http://linux.derkeiler.com/Mailing-Lists/Kernel/2004-11/4812.html
Linus Torvalds1da177e2005-04-16 15:20:36 -0700810 */
811 if (autoconfig_read_divisor_id(up) == 0x0201 && size_fifo(up) == 16)
812 return 1;
813
814 return 0;
815}
816
Yin Kangkai0d0389e2011-02-09 11:35:18 +0800817static inline int ns16550a_goto_highspeed(struct uart_8250_port *up)
818{
819 unsigned char status;
820
821 status = serial_in(up, 0x04); /* EXCR2 */
822#define PRESL(x) ((x) & 0x30)
823 if (PRESL(status) == 0x10) {
824 /* already in high speed mode */
825 return 0;
826 } else {
827 status &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */
828 status |= 0x10; /* 1.625 divisor for baud_base --> 921600 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500829 serial_out(up, 0x04, status);
Yin Kangkai0d0389e2011-02-09 11:35:18 +0800830 }
831 return 1;
832}
833
Linus Torvalds1da177e2005-04-16 15:20:36 -0700834/*
835 * We know that the chip has FIFOs. Does it have an EFR? The
836 * EFR is located in the same register position as the IIR and
837 * we know the top two bits of the IIR are currently set. The
838 * EFR should contain zero. Try to read the EFR.
839 */
840static void autoconfig_16550a(struct uart_8250_port *up)
841{
842 unsigned char status1, status2;
843 unsigned int iersave;
844
845 up->port.type = PORT_16550A;
846 up->capabilities |= UART_CAP_FIFO;
847
848 /*
Matt Schultedc96efb2012-11-19 09:12:04 -0600849 * XR17V35x UARTs have an extra divisor register, DLD
850 * that gets enabled with when DLAB is set which will
851 * cause the device to incorrectly match and assign
852 * port type to PORT_16650. The EFR for this UART is
853 * found at offset 0x09. Instead check the Deice ID (DVID)
854 * register for a 2, 4 or 8 port UART.
855 */
Matt Schulteb7a7e142012-11-20 11:23:56 -0600856 if (up->port.flags & UPF_EXAR_EFR) {
857 status1 = serial_in(up, UART_EXAR_DVID);
858 if (status1 == 0x82 || status1 == 0x84 || status1 == 0x88) {
Matt Schultedc96efb2012-11-19 09:12:04 -0600859 DEBUG_AUTOCONF("Exar XR17V35x ");
860 up->port.type = PORT_XR17V35X;
861 up->capabilities |= UART_CAP_AFE | UART_CAP_EFR |
862 UART_CAP_SLEEP;
863
864 return;
865 }
866
867 }
868
869 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700870 * Check for presence of the EFR when DLAB is set.
871 * Only ST16C650V1 UARTs pass this test.
872 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500873 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700874 if (serial_in(up, UART_EFR) == 0) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500875 serial_out(up, UART_EFR, 0xA8);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700876 if (serial_in(up, UART_EFR) != 0) {
877 DEBUG_AUTOCONF("EFRv1 ");
878 up->port.type = PORT_16650;
879 up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP;
880 } else {
881 DEBUG_AUTOCONF("Motorola 8xxx DUART ");
882 }
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500883 serial_out(up, UART_EFR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700884 return;
885 }
886
887 /*
888 * Maybe it requires 0xbf to be written to the LCR.
889 * (other ST16C650V2 UARTs, TI16C752A, etc)
890 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500891 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700892 if (serial_in(up, UART_EFR) == 0 && !broken_efr(up)) {
893 DEBUG_AUTOCONF("EFRv2 ");
894 autoconfig_has_efr(up);
895 return;
896 }
897
898 /*
899 * Check for a National Semiconductor SuperIO chip.
900 * Attempt to switch to bank 2, read the value of the LOOP bit
901 * from EXCR1. Switch back to bank 0, change it in MCR. Then
902 * switch back to bank 2, read it from EXCR1 again and check
903 * it's changed. If so, set baud_base in EXCR2 to 921600. -- dwmw2
Linus Torvalds1da177e2005-04-16 15:20:36 -0700904 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500905 serial_out(up, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700906 status1 = serial_in(up, UART_MCR);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500907 serial_out(up, UART_LCR, 0xE0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700908 status2 = serial_in(up, 0x02); /* EXCR1 */
909
910 if (!((status2 ^ status1) & UART_MCR_LOOP)) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500911 serial_out(up, UART_LCR, 0);
912 serial_out(up, UART_MCR, status1 ^ UART_MCR_LOOP);
913 serial_out(up, UART_LCR, 0xE0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700914 status2 = serial_in(up, 0x02); /* EXCR1 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500915 serial_out(up, UART_LCR, 0);
916 serial_out(up, UART_MCR, status1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700917
918 if ((status2 ^ status1) & UART_MCR_LOOP) {
David Woodhouse857dde22005-05-21 15:52:23 +0100919 unsigned short quot;
920
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500921 serial_out(up, UART_LCR, 0xE0);
David Woodhouse857dde22005-05-21 15:52:23 +0100922
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +0100923 quot = serial_dl_read(up);
David Woodhouse857dde22005-05-21 15:52:23 +0100924 quot <<= 3;
925
Yin Kangkai0d0389e2011-02-09 11:35:18 +0800926 if (ns16550a_goto_highspeed(up))
927 serial_dl_write(up, quot);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700928
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500929 serial_out(up, UART_LCR, 0);
David Woodhouse857dde22005-05-21 15:52:23 +0100930
931 up->port.uartclk = 921600*16;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700932 up->port.type = PORT_NS16550A;
933 up->capabilities |= UART_NATSEMI;
934 return;
935 }
936 }
937
938 /*
939 * No EFR. Try to detect a TI16750, which only sets bit 5 of
940 * the IIR when 64 byte FIFO mode is enabled when DLAB is set.
941 * Try setting it with and without DLAB set. Cheap clones
942 * set bit 5 without DLAB set.
943 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500944 serial_out(up, UART_LCR, 0);
945 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700946 status1 = serial_in(up, UART_IIR) >> 5;
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500947 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
948 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
949 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700950 status2 = serial_in(up, UART_IIR) >> 5;
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500951 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
952 serial_out(up, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700953
954 DEBUG_AUTOCONF("iir1=%d iir2=%d ", status1, status2);
955
956 if (status1 == 6 && status2 == 7) {
957 up->port.type = PORT_16750;
958 up->capabilities |= UART_CAP_AFE | UART_CAP_SLEEP;
959 return;
960 }
961
962 /*
963 * Try writing and reading the UART_IER_UUE bit (b6).
964 * If it works, this is probably one of the Xscale platform's
965 * internal UARTs.
966 * We're going to explicitly set the UUE bit to 0 before
967 * trying to write and read a 1 just to make sure it's not
968 * already a 1 and maybe locked there before we even start start.
969 */
970 iersave = serial_in(up, UART_IER);
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500971 serial_out(up, UART_IER, iersave & ~UART_IER_UUE);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700972 if (!(serial_in(up, UART_IER) & UART_IER_UUE)) {
973 /*
974 * OK it's in a known zero state, try writing and reading
975 * without disturbing the current state of the other bits.
976 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500977 serial_out(up, UART_IER, iersave | UART_IER_UUE);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700978 if (serial_in(up, UART_IER) & UART_IER_UUE) {
979 /*
980 * It's an Xscale.
981 * We'll leave the UART_IER_UUE bit set to 1 (enabled).
982 */
983 DEBUG_AUTOCONF("Xscale ");
984 up->port.type = PORT_XSCALE;
Stephen Warren55681812011-06-17 09:45:07 -0600985 up->capabilities |= UART_CAP_UUE | UART_CAP_RTOIE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700986 return;
987 }
988 } else {
989 /*
990 * If we got here we couldn't force the IER_UUE bit to 0.
991 * Log it and continue.
992 */
993 DEBUG_AUTOCONF("Couldn't force IER_UUE to 0 ");
994 }
Paul Gortmaker0acf5192012-03-08 19:12:08 -0500995 serial_out(up, UART_IER, iersave);
Philippe Langlais235dae52010-07-29 17:13:57 +0200996
997 /*
Søren Holm06315342011-09-02 22:55:37 +0200998 * Exar uarts have EFR in a weird location
999 */
1000 if (up->port.flags & UPF_EXAR_EFR) {
Matt Schulte81db0772012-11-21 09:39:07 -06001001 DEBUG_AUTOCONF("Exar XR17D15x ");
Søren Holm06315342011-09-02 22:55:37 +02001002 up->port.type = PORT_XR17D15X;
Matt Schulte81db0772012-11-21 09:39:07 -06001003 up->capabilities |= UART_CAP_AFE | UART_CAP_EFR |
1004 UART_CAP_SLEEP;
1005
1006 return;
Søren Holm06315342011-09-02 22:55:37 +02001007 }
1008
1009 /*
Philippe Langlais235dae52010-07-29 17:13:57 +02001010 * We distinguish between 16550A and U6 16550A by counting
1011 * how many bytes are in the FIFO.
1012 */
1013 if (up->port.type == PORT_16550A && size_fifo(up) == 64) {
1014 up->port.type = PORT_U6_16550A;
1015 up->capabilities |= UART_CAP_AFE;
1016 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001017}
1018
1019/*
1020 * This routine is called by rs_init() to initialize a specific serial
1021 * port. It determines what type of UART chip this serial port is
1022 * using: 8250, 16450, 16550, 16550A. The important question is
1023 * whether or not this UART is a 16550A or not, since this will
1024 * determine whether or not we can use its FIFO features or not.
1025 */
1026static void autoconfig(struct uart_8250_port *up, unsigned int probeflags)
1027{
1028 unsigned char status1, scratch, scratch2, scratch3;
1029 unsigned char save_lcr, save_mcr;
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001030 struct uart_port *port = &up->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001031 unsigned long flags;
Flavio Leitnerbd21f552012-09-18 16:21:32 -03001032 unsigned int old_capabilities;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001033
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001034 if (!port->iobase && !port->mapbase && !port->membase)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001035 return;
1036
Lennert Buytenhek80647b92009-11-11 14:26:41 -08001037 DEBUG_AUTOCONF("ttyS%d: autoconf (0x%04lx, 0x%p): ",
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001038 serial_index(port), port->iobase, port->membase);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001039
1040 /*
1041 * We really do need global IRQs disabled here - we're going to
1042 * be frobbing the chips IRQ enable register to see if it exists.
1043 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001044 spin_lock_irqsave(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001045
1046 up->capabilities = 0;
Russell King4ba5e352005-06-23 10:43:04 +01001047 up->bugs = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001048
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001049 if (!(port->flags & UPF_BUGGY_UART)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001050 /*
1051 * Do a simple existence test first; if we fail this,
1052 * there's no point trying anything else.
Thomas Koellerbd71c182007-05-06 14:48:47 -07001053 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001054 * 0x80 is used as a nonsense port to prevent against
1055 * false positives due to ISA bus float. The
1056 * assumption is that 0x80 is a non-existent port;
1057 * which should be safe since include/asm/io.h also
1058 * makes this assumption.
1059 *
1060 * Note: this is safe as long as MCR bit 4 is clear
1061 * and the device is in "PC" mode.
1062 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001063 scratch = serial_in(up, UART_IER);
1064 serial_out(up, UART_IER, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001065#ifdef __i386__
1066 outb(0xff, 0x080);
1067#endif
Thomas Hoehn48212002007-02-10 01:46:05 -08001068 /*
1069 * Mask out IER[7:4] bits for test as some UARTs (e.g. TL
1070 * 16C754B) allow only to modify them if an EFR bit is set.
1071 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001072 scratch2 = serial_in(up, UART_IER) & 0x0f;
1073 serial_out(up, UART_IER, 0x0F);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001074#ifdef __i386__
1075 outb(0, 0x080);
1076#endif
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001077 scratch3 = serial_in(up, UART_IER) & 0x0f;
1078 serial_out(up, UART_IER, scratch);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001079 if (scratch2 != 0 || scratch3 != 0x0F) {
1080 /*
1081 * We failed; there's nothing here
1082 */
Flavio Leitnerbd21f552012-09-18 16:21:32 -03001083 spin_unlock_irqrestore(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001084 DEBUG_AUTOCONF("IER test failed (%02x, %02x) ",
1085 scratch2, scratch3);
1086 goto out;
1087 }
1088 }
1089
1090 save_mcr = serial_in(up, UART_MCR);
1091 save_lcr = serial_in(up, UART_LCR);
1092
Thomas Koellerbd71c182007-05-06 14:48:47 -07001093 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001094 * Check to see if a UART is really there. Certain broken
1095 * internal modems based on the Rockwell chipset fail this
1096 * test, because they apparently don't implement the loopback
1097 * test mode. So this test is skipped on the COM 1 through
1098 * COM 4 ports. This *should* be safe, since no board
1099 * manufacturer would be stupid enough to design a board
1100 * that conflicts with COM 1-4 --- we hope!
1101 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001102 if (!(port->flags & UPF_SKIP_TEST)) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001103 serial_out(up, UART_MCR, UART_MCR_LOOP | 0x0A);
1104 status1 = serial_in(up, UART_MSR) & 0xF0;
1105 serial_out(up, UART_MCR, save_mcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001106 if (status1 != 0x90) {
Flavio Leitnerbd21f552012-09-18 16:21:32 -03001107 spin_unlock_irqrestore(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001108 DEBUG_AUTOCONF("LOOP test failed (%02x) ",
1109 status1);
1110 goto out;
1111 }
1112 }
1113
1114 /*
1115 * We're pretty sure there's a port here. Lets find out what
1116 * type of port it is. The IIR top two bits allows us to find
Russell King6f0d6182005-09-09 16:17:58 +01001117 * out if it's 8250 or 16450, 16550, 16550A or later. This
Linus Torvalds1da177e2005-04-16 15:20:36 -07001118 * determines what we test for next.
1119 *
1120 * We also initialise the EFR (if any) to zero for later. The
1121 * EFR occupies the same register location as the FCR and IIR.
1122 */
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001123 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
1124 serial_out(up, UART_EFR, 0);
1125 serial_out(up, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001126
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001127 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001128 scratch = serial_in(up, UART_IIR) >> 6;
1129
Linus Torvalds1da177e2005-04-16 15:20:36 -07001130 switch (scratch) {
1131 case 0:
1132 autoconfig_8250(up);
1133 break;
1134 case 1:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001135 port->type = PORT_UNKNOWN;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001136 break;
1137 case 2:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001138 port->type = PORT_16550;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001139 break;
1140 case 3:
1141 autoconfig_16550a(up);
1142 break;
1143 }
1144
1145#ifdef CONFIG_SERIAL_8250_RSA
1146 /*
1147 * Only probe for RSA ports if we got the region.
1148 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001149 if (port->type == PORT_16550A && probeflags & PROBE_RSA) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001150 int i;
1151
1152 for (i = 0 ; i < probe_rsa_count; ++i) {
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001153 if (probe_rsa[i] == port->iobase && __enable_rsa(up)) {
1154 port->type = PORT_RSA;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001155 break;
1156 }
1157 }
1158 }
1159#endif
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00001160
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001161 serial_out(up, UART_LCR, save_lcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001162
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001163 port->fifosize = uart_config[up->port.type].fifo_size;
Flavio Leitnerbd21f552012-09-18 16:21:32 -03001164 old_capabilities = up->capabilities;
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001165 up->capabilities = uart_config[port->type].flags;
1166 up->tx_loadsz = uart_config[port->type].tx_loadsz;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001167
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001168 if (port->type == PORT_UNKNOWN)
Flavio Leitnerbd21f552012-09-18 16:21:32 -03001169 goto out_lock;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001170
1171 /*
1172 * Reset the UART.
1173 */
1174#ifdef CONFIG_SERIAL_8250_RSA
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001175 if (port->type == PORT_RSA)
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001176 serial_out(up, UART_RSA_FRR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001177#endif
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001178 serial_out(up, UART_MCR, save_mcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001179 serial8250_clear_fifos(up);
Alex Williamson40b36da2007-02-14 00:33:04 -08001180 serial_in(up, UART_RX);
Lennert Buytenhek5c8c7552005-11-12 21:58:05 +00001181 if (up->capabilities & UART_CAP_UUE)
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001182 serial_out(up, UART_IER, UART_IER_UUE);
Lennert Buytenhek5c8c7552005-11-12 21:58:05 +00001183 else
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001184 serial_out(up, UART_IER, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001185
Flavio Leitnerbd21f552012-09-18 16:21:32 -03001186out_lock:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001187 spin_unlock_irqrestore(&port->lock, flags);
Flavio Leitnerbd21f552012-09-18 16:21:32 -03001188 if (up->capabilities != old_capabilities) {
1189 printk(KERN_WARNING
1190 "ttyS%d: detected caps %08x should be %08x\n",
1191 serial_index(port), old_capabilities,
1192 up->capabilities);
1193 }
1194out:
1195 DEBUG_AUTOCONF("iir=%d ", scratch);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001196 DEBUG_AUTOCONF("type=%s\n", uart_config[port->type].name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001197}
1198
1199static void autoconfig_irq(struct uart_8250_port *up)
1200{
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001201 struct uart_port *port = &up->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001202 unsigned char save_mcr, save_ier;
1203 unsigned char save_ICP = 0;
1204 unsigned int ICP = 0;
1205 unsigned long irqs;
1206 int irq;
1207
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001208 if (port->flags & UPF_FOURPORT) {
1209 ICP = (port->iobase & 0xfe0) | 0x1f;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001210 save_ICP = inb_p(ICP);
1211 outb_p(0x80, ICP);
Paul Gortmaker0d263a22012-03-08 19:12:10 -05001212 inb_p(ICP);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001213 }
1214
1215 /* forget possible initially masked and pending IRQ */
1216 probe_irq_off(probe_irq_on());
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001217 save_mcr = serial_in(up, UART_MCR);
1218 save_ier = serial_in(up, UART_IER);
1219 serial_out(up, UART_MCR, UART_MCR_OUT1 | UART_MCR_OUT2);
Thomas Koellerbd71c182007-05-06 14:48:47 -07001220
Linus Torvalds1da177e2005-04-16 15:20:36 -07001221 irqs = probe_irq_on();
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001222 serial_out(up, UART_MCR, 0);
Alan Cox6f803cd2008-02-08 04:18:52 -08001223 udelay(10);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001224 if (port->flags & UPF_FOURPORT) {
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001225 serial_out(up, UART_MCR,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001226 UART_MCR_DTR | UART_MCR_RTS);
1227 } else {
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001228 serial_out(up, UART_MCR,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001229 UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2);
1230 }
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001231 serial_out(up, UART_IER, 0x0f); /* enable all intrs */
Paul Gortmaker0d263a22012-03-08 19:12:10 -05001232 serial_in(up, UART_LSR);
1233 serial_in(up, UART_RX);
1234 serial_in(up, UART_IIR);
1235 serial_in(up, UART_MSR);
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001236 serial_out(up, UART_TX, 0xFF);
Alan Cox6f803cd2008-02-08 04:18:52 -08001237 udelay(20);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001238 irq = probe_irq_off(irqs);
1239
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001240 serial_out(up, UART_MCR, save_mcr);
1241 serial_out(up, UART_IER, save_ier);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001242
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001243 if (port->flags & UPF_FOURPORT)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001244 outb_p(save_ICP, ICP);
1245
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001246 port->irq = (irq > 0) ? irq : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001247}
1248
Russell Kinge763b902005-06-29 18:41:51 +01001249static inline void __stop_tx(struct uart_8250_port *p)
1250{
1251 if (p->ier & UART_IER_THRI) {
1252 p->ier &= ~UART_IER_THRI;
1253 serial_out(p, UART_IER, p->ier);
1254 }
1255}
1256
Russell Kingb129a8c2005-08-31 10:12:14 +01001257static void serial8250_stop_tx(struct uart_port *port)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001258{
Jamie Iles49d57412010-12-01 23:39:35 +00001259 struct uart_8250_port *up =
1260 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001261
Russell Kinge763b902005-06-29 18:41:51 +01001262 __stop_tx(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001263
1264 /*
Russell Kinge763b902005-06-29 18:41:51 +01001265 * We really want to stop the transmitter from sending.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001266 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001267 if (port->type == PORT_16C950) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001268 up->acr |= UART_ACR_TXDIS;
1269 serial_icr_write(up, UART_ACR, up->acr);
1270 }
1271}
1272
Russell Kingb129a8c2005-08-31 10:12:14 +01001273static void serial8250_start_tx(struct uart_port *port)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001274{
Jamie Iles49d57412010-12-01 23:39:35 +00001275 struct uart_8250_port *up =
1276 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001277
Heikki Krogerus9ee4b832013-01-10 11:25:11 +02001278 if (up->dma && !serial8250_tx_dma(up)) {
1279 return;
1280 } else if (!(up->ier & UART_IER_THRI)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001281 up->ier |= UART_IER_THRI;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001282 serial_port_out(port, UART_IER, up->ier);
Russell King55d3b282005-06-23 15:05:41 +01001283
Russell King67f76542005-06-23 22:26:43 +01001284 if (up->bugs & UART_BUG_TXEN) {
Ian Jackson68cb4f82009-11-18 11:08:11 +01001285 unsigned char lsr;
Russell King55d3b282005-06-23 15:05:41 +01001286 lsr = serial_in(up, UART_LSR);
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001287 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
Ralf Baechlea205a562012-12-18 11:41:14 +01001288 if (lsr & UART_LSR_TEMT)
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001289 serial8250_tx_chars(up);
Russell King55d3b282005-06-23 15:05:41 +01001290 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001291 }
Russell Kinge763b902005-06-29 18:41:51 +01001292
Linus Torvalds1da177e2005-04-16 15:20:36 -07001293 /*
Russell Kinge763b902005-06-29 18:41:51 +01001294 * Re-enable the transmitter if we disabled it.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001295 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001296 if (port->type == PORT_16C950 && up->acr & UART_ACR_TXDIS) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001297 up->acr &= ~UART_ACR_TXDIS;
1298 serial_icr_write(up, UART_ACR, up->acr);
1299 }
1300}
1301
1302static void serial8250_stop_rx(struct uart_port *port)
1303{
Jamie Iles49d57412010-12-01 23:39:35 +00001304 struct uart_8250_port *up =
1305 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001306
1307 up->ier &= ~UART_IER_RLSI;
1308 up->port.read_status_mask &= ~UART_LSR_DR;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001309 serial_port_out(port, UART_IER, up->ier);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001310}
1311
1312static void serial8250_enable_ms(struct uart_port *port)
1313{
Jamie Iles49d57412010-12-01 23:39:35 +00001314 struct uart_8250_port *up =
1315 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001316
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00001317 /* no MSR capabilities */
1318 if (up->bugs & UART_BUG_NOMSR)
1319 return;
1320
Linus Torvalds1da177e2005-04-16 15:20:36 -07001321 up->ier |= UART_IER_MSI;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001322 serial_port_out(port, UART_IER, up->ier);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001323}
1324
Stephen Warren5f873ba2011-05-17 16:12:37 -06001325/*
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001326 * serial8250_rx_chars: processes according to the passed in LSR
Paul Gortmaker0690f412011-12-04 18:42:19 -05001327 * value, and returns the remaining LSR bits not handled
1328 * by this Rx routine.
1329 */
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001330unsigned char
1331serial8250_rx_chars(struct uart_8250_port *up, unsigned char lsr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001332{
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001333 struct uart_port *port = &up->port;
Paul Gortmaker0690f412011-12-04 18:42:19 -05001334 unsigned char ch;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001335 int max_count = 256;
1336 char flag;
1337
1338 do {
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001339 if (likely(lsr & UART_LSR_DR))
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001340 ch = serial_in(up, UART_RX);
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001341 else
1342 /*
1343 * Intel 82571 has a Serial Over Lan device that will
1344 * set UART_LSR_BI without setting UART_LSR_DR when
1345 * it receives a break. To avoid reading from the
1346 * receive buffer without UART_LSR_DR bit set, we
1347 * just force the read character to be 0
1348 */
1349 ch = 0;
1350
Linus Torvalds1da177e2005-04-16 15:20:36 -07001351 flag = TTY_NORMAL;
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001352 port->icount.rx++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001353
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001354 lsr |= up->lsr_saved_flags;
1355 up->lsr_saved_flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001356
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001357 if (unlikely(lsr & UART_LSR_BRK_ERROR_BITS)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001358 if (lsr & UART_LSR_BI) {
1359 lsr &= ~(UART_LSR_FE | UART_LSR_PE);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001360 port->icount.brk++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001361 /*
1362 * We do the SysRQ and SAK checking
1363 * here because otherwise the break
1364 * may get masked by ignore_status_mask
1365 * or read_status_mask.
1366 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001367 if (uart_handle_break(port))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001368 goto ignore_char;
1369 } else if (lsr & UART_LSR_PE)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001370 port->icount.parity++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001371 else if (lsr & UART_LSR_FE)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001372 port->icount.frame++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001373 if (lsr & UART_LSR_OE)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001374 port->icount.overrun++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001375
1376 /*
Russell King23907eb2005-04-16 15:26:39 -07001377 * Mask off conditions which should be ignored.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001378 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001379 lsr &= port->read_status_mask;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001380
1381 if (lsr & UART_LSR_BI) {
1382 DEBUG_INTR("handling break....");
1383 flag = TTY_BREAK;
1384 } else if (lsr & UART_LSR_PE)
1385 flag = TTY_PARITY;
1386 else if (lsr & UART_LSR_FE)
1387 flag = TTY_FRAME;
1388 }
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001389 if (uart_handle_sysrq_char(port, ch))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001390 goto ignore_char;
Russell King05ab3012005-05-09 23:21:59 +01001391
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001392 uart_insert_char(port, lsr, UART_LSR_OE, ch, flag);
Russell King05ab3012005-05-09 23:21:59 +01001393
Alan Cox6f803cd2008-02-08 04:18:52 -08001394ignore_char:
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001395 lsr = serial_in(up, UART_LSR);
Aristeu Rozanski7500b1f2008-07-23 21:29:45 -07001396 } while ((lsr & (UART_LSR_DR | UART_LSR_BI)) && (max_count-- > 0));
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001397 spin_unlock(&port->lock);
Jiri Slaby2e124b42013-01-03 15:53:06 +01001398 tty_flip_buffer_push(&port->state->port);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001399 spin_lock(&port->lock);
Paul Gortmaker0690f412011-12-04 18:42:19 -05001400 return lsr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001401}
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001402EXPORT_SYMBOL_GPL(serial8250_rx_chars);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001403
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001404void serial8250_tx_chars(struct uart_8250_port *up)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001405{
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001406 struct uart_port *port = &up->port;
1407 struct circ_buf *xmit = &port->state->xmit;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001408 int count;
1409
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001410 if (port->x_char) {
1411 serial_out(up, UART_TX, port->x_char);
1412 port->icount.tx++;
1413 port->x_char = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001414 return;
1415 }
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001416 if (uart_tx_stopped(port)) {
1417 serial8250_stop_tx(port);
Russell Kingb129a8c2005-08-31 10:12:14 +01001418 return;
1419 }
1420 if (uart_circ_empty(xmit)) {
Russell Kinge763b902005-06-29 18:41:51 +01001421 __stop_tx(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001422 return;
1423 }
1424
1425 count = up->tx_loadsz;
1426 do {
1427 serial_out(up, UART_TX, xmit->buf[xmit->tail]);
1428 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001429 port->icount.tx++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001430 if (uart_circ_empty(xmit))
1431 break;
Stephen Hurdebebd492013-01-17 14:14:53 -08001432 if (up->capabilities & UART_CAP_HFIFO) {
1433 if ((serial_port_in(port, UART_LSR) & BOTH_EMPTY) !=
1434 BOTH_EMPTY)
1435 break;
1436 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001437 } while (--count > 0);
1438
1439 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001440 uart_write_wakeup(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001441
1442 DEBUG_INTR("THRE...");
1443
1444 if (uart_circ_empty(xmit))
Russell Kinge763b902005-06-29 18:41:51 +01001445 __stop_tx(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001446}
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001447EXPORT_SYMBOL_GPL(serial8250_tx_chars);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001448
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001449unsigned int serial8250_modem_status(struct uart_8250_port *up)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001450{
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001451 struct uart_port *port = &up->port;
Russell King2af7cd62006-01-04 16:55:09 +00001452 unsigned int status = serial_in(up, UART_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001453
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001454 status |= up->msr_saved_flags;
1455 up->msr_saved_flags = 0;
Taku Izumifdc30b32007-04-23 14:41:00 -07001456 if (status & UART_MSR_ANY_DELTA && up->ier & UART_IER_MSI &&
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001457 port->state != NULL) {
Russell King2af7cd62006-01-04 16:55:09 +00001458 if (status & UART_MSR_TERI)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001459 port->icount.rng++;
Russell King2af7cd62006-01-04 16:55:09 +00001460 if (status & UART_MSR_DDSR)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001461 port->icount.dsr++;
Russell King2af7cd62006-01-04 16:55:09 +00001462 if (status & UART_MSR_DDCD)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001463 uart_handle_dcd_change(port, status & UART_MSR_DCD);
Russell King2af7cd62006-01-04 16:55:09 +00001464 if (status & UART_MSR_DCTS)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001465 uart_handle_cts_change(port, status & UART_MSR_CTS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001466
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001467 wake_up_interruptible(&port->state->port.delta_msr_wait);
Russell King2af7cd62006-01-04 16:55:09 +00001468 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001469
Russell King2af7cd62006-01-04 16:55:09 +00001470 return status;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001471}
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001472EXPORT_SYMBOL_GPL(serial8250_modem_status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001473
1474/*
1475 * This handles the interrupt from one port.
1476 */
Paul Gortmaker86b21192011-12-04 18:42:22 -05001477int serial8250_handle_irq(struct uart_port *port, unsigned int iir)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001478{
Paul Gortmaker0690f412011-12-04 18:42:19 -05001479 unsigned char status;
Jiri Kosina4bf36312007-04-23 14:41:21 -07001480 unsigned long flags;
Paul Gortmaker86b21192011-12-04 18:42:22 -05001481 struct uart_8250_port *up =
1482 container_of(port, struct uart_8250_port, port);
Heikki Krogerus9ee4b832013-01-10 11:25:11 +02001483 int dma_err = 0;
Paul Gortmaker86b21192011-12-04 18:42:22 -05001484
1485 if (iir & UART_IIR_NO_INT)
1486 return 0;
Russell King45e24602006-01-04 19:19:06 +00001487
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001488 spin_lock_irqsave(&port->lock, flags);
Russell King45e24602006-01-04 19:19:06 +00001489
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001490 status = serial_port_in(port, UART_LSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001491
1492 DEBUG_INTR("status = %x...", status);
1493
Heikki Krogerus9ee4b832013-01-10 11:25:11 +02001494 if (status & (UART_LSR_DR | UART_LSR_BI)) {
1495 if (up->dma)
1496 dma_err = serial8250_rx_dma(up, iir);
1497
1498 if (!up->dma || dma_err)
1499 status = serial8250_rx_chars(up, status);
1500 }
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001501 serial8250_modem_status(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001502 if (status & UART_LSR_THRE)
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001503 serial8250_tx_chars(up);
Russell King45e24602006-01-04 19:19:06 +00001504
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001505 spin_unlock_irqrestore(&port->lock, flags);
Paul Gortmaker86b21192011-12-04 18:42:22 -05001506 return 1;
Jamie Iles583d28e2011-08-15 10:17:52 +01001507}
Jamie Ilesc7a1bdc2011-08-26 19:04:49 +01001508EXPORT_SYMBOL_GPL(serial8250_handle_irq);
Jamie Iles583d28e2011-08-15 10:17:52 +01001509
1510static int serial8250_default_handle_irq(struct uart_port *port)
1511{
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001512 unsigned int iir = serial_port_in(port, UART_IIR);
Jamie Iles583d28e2011-08-15 10:17:52 +01001513
1514 return serial8250_handle_irq(port, iir);
1515}
1516
Linus Torvalds1da177e2005-04-16 15:20:36 -07001517/*
Matt Schultedc96efb2012-11-19 09:12:04 -06001518 * These Exar UARTs have an extra interrupt indicator that could
1519 * fire for a few unimplemented interrupts. One of which is a
1520 * wakeup event when coming out of sleep. Put this here just
1521 * to be on the safe side that these interrupts don't go unhandled.
1522 */
1523static int exar_handle_irq(struct uart_port *port)
1524{
1525 unsigned char int0, int1, int2, int3;
1526 unsigned int iir = serial_port_in(port, UART_IIR);
1527 int ret;
1528
1529 ret = serial8250_handle_irq(port, iir);
1530
Matt Schulte30fa96a2012-11-21 09:40:49 -06001531 if ((port->type == PORT_XR17V35X) ||
1532 (port->type == PORT_XR17D15X)) {
Matt Schultedc96efb2012-11-19 09:12:04 -06001533 int0 = serial_port_in(port, 0x80);
1534 int1 = serial_port_in(port, 0x81);
1535 int2 = serial_port_in(port, 0x82);
1536 int3 = serial_port_in(port, 0x83);
1537 }
1538
1539 return ret;
1540}
1541
1542/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001543 * This is the serial driver's interrupt routine.
1544 *
1545 * Arjan thinks the old way was overly complex, so it got simplified.
1546 * Alan disagrees, saying that need the complexity to handle the weird
1547 * nature of ISA shared interrupts. (This is a special exception.)
1548 *
1549 * In order to handle ISA shared interrupts properly, we need to check
1550 * that all ports have been serviced, and therefore the ISA interrupt
1551 * line has been de-asserted.
1552 *
1553 * This means we need to loop through all ports. checking that they
1554 * don't have an interrupt pending.
1555 */
David Howells7d12e782006-10-05 14:55:46 +01001556static irqreturn_t serial8250_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001557{
1558 struct irq_info *i = dev_id;
1559 struct list_head *l, *end = NULL;
1560 int pass_counter = 0, handled = 0;
1561
1562 DEBUG_INTR("serial8250_interrupt(%d)...", irq);
1563
1564 spin_lock(&i->lock);
1565
1566 l = i->head;
1567 do {
1568 struct uart_8250_port *up;
Jamie Iles583d28e2011-08-15 10:17:52 +01001569 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001570
1571 up = list_entry(l, struct uart_8250_port, list);
Jamie Iles583d28e2011-08-15 10:17:52 +01001572 port = &up->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001573
Dan Williams49b532f2012-04-06 11:49:44 -07001574 if (port->handle_irq(port)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001575 handled = 1;
Marc St-Jeanbeab6972007-05-06 14:48:45 -07001576 end = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001577 } else if (end == NULL)
1578 end = l;
1579
1580 l = l->next;
1581
1582 if (l == i->head && pass_counter++ > PASS_LIMIT) {
1583 /* If we hit this, we're dead. */
Daniel Drakecd3ecad2010-10-20 16:00:48 -07001584 printk_ratelimited(KERN_ERR
1585 "serial8250: too much work for irq%d\n", irq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001586 break;
1587 }
1588 } while (l != end);
1589
1590 spin_unlock(&i->lock);
1591
1592 DEBUG_INTR("end.\n");
1593
1594 return IRQ_RETVAL(handled);
1595}
1596
1597/*
1598 * To support ISA shared interrupts, we need to have one interrupt
1599 * handler that ensures that the IRQ line has been deasserted
1600 * before returning. Failing to do this will result in the IRQ
1601 * line being stuck active, and, since ISA irqs are edge triggered,
1602 * no more IRQs will be seen.
1603 */
1604static void serial_do_unlink(struct irq_info *i, struct uart_8250_port *up)
1605{
1606 spin_lock_irq(&i->lock);
1607
1608 if (!list_empty(i->head)) {
1609 if (i->head == &up->list)
1610 i->head = i->head->next;
1611 list_del(&up->list);
1612 } else {
1613 BUG_ON(i->head != &up->list);
1614 i->head = NULL;
1615 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001616 spin_unlock_irq(&i->lock);
Alan Cox25db8ad2008-08-19 20:49:40 -07001617 /* List empty so throw away the hash node */
1618 if (i->head == NULL) {
1619 hlist_del(&i->node);
1620 kfree(i);
1621 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001622}
1623
1624static int serial_link_irq_chain(struct uart_8250_port *up)
1625{
Alan Cox25db8ad2008-08-19 20:49:40 -07001626 struct hlist_head *h;
1627 struct hlist_node *n;
1628 struct irq_info *i;
Thomas Gleixner40663cc2006-07-01 19:29:43 -07001629 int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? IRQF_SHARED : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001630
Alan Cox25db8ad2008-08-19 20:49:40 -07001631 mutex_lock(&hash_mutex);
1632
1633 h = &irq_lists[up->port.irq % NR_IRQ_HASH];
1634
1635 hlist_for_each(n, h) {
1636 i = hlist_entry(n, struct irq_info, node);
1637 if (i->irq == up->port.irq)
1638 break;
1639 }
1640
1641 if (n == NULL) {
1642 i = kzalloc(sizeof(struct irq_info), GFP_KERNEL);
1643 if (i == NULL) {
1644 mutex_unlock(&hash_mutex);
1645 return -ENOMEM;
1646 }
1647 spin_lock_init(&i->lock);
1648 i->irq = up->port.irq;
1649 hlist_add_head(&i->node, h);
1650 }
1651 mutex_unlock(&hash_mutex);
1652
Linus Torvalds1da177e2005-04-16 15:20:36 -07001653 spin_lock_irq(&i->lock);
1654
1655 if (i->head) {
1656 list_add(&up->list, i->head);
1657 spin_unlock_irq(&i->lock);
1658
1659 ret = 0;
1660 } else {
1661 INIT_LIST_HEAD(&up->list);
1662 i->head = &up->list;
1663 spin_unlock_irq(&i->lock);
Vikram Pandita1c2f0492009-09-19 13:13:19 -07001664 irq_flags |= up->port.irqflags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001665 ret = request_irq(up->port.irq, serial8250_interrupt,
1666 irq_flags, "serial", i);
1667 if (ret < 0)
1668 serial_do_unlink(i, up);
1669 }
1670
1671 return ret;
1672}
1673
1674static void serial_unlink_irq_chain(struct uart_8250_port *up)
1675{
Alan Cox25db8ad2008-08-19 20:49:40 -07001676 struct irq_info *i;
1677 struct hlist_node *n;
1678 struct hlist_head *h;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001679
Alan Cox25db8ad2008-08-19 20:49:40 -07001680 mutex_lock(&hash_mutex);
1681
1682 h = &irq_lists[up->port.irq % NR_IRQ_HASH];
1683
1684 hlist_for_each(n, h) {
1685 i = hlist_entry(n, struct irq_info, node);
1686 if (i->irq == up->port.irq)
1687 break;
1688 }
1689
1690 BUG_ON(n == NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001691 BUG_ON(i->head == NULL);
1692
1693 if (list_empty(i->head))
1694 free_irq(up->port.irq, i);
1695
1696 serial_do_unlink(i, up);
Alan Cox25db8ad2008-08-19 20:49:40 -07001697 mutex_unlock(&hash_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001698}
1699
1700/*
1701 * This function is used to handle ports that do not have an
1702 * interrupt. This doesn't work very well for 16450's, but gives
1703 * barely passable results for a 16550A. (Although at the expense
1704 * of much CPU overhead).
1705 */
1706static void serial8250_timeout(unsigned long data)
1707{
1708 struct uart_8250_port *up = (struct uart_8250_port *)data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001709
Paul Gortmakera0431472011-12-04 18:42:21 -05001710 up->port.handle_irq(&up->port);
Anton Vorontsov54381062010-10-01 17:21:25 +04001711 mod_timer(&up->timer, jiffies + uart_poll_timeout(&up->port));
Alex Williamson40b36da2007-02-14 00:33:04 -08001712}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001713
Alex Williamson40b36da2007-02-14 00:33:04 -08001714static void serial8250_backup_timeout(unsigned long data)
1715{
1716 struct uart_8250_port *up = (struct uart_8250_port *)data;
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001717 unsigned int iir, ier = 0, lsr;
1718 unsigned long flags;
Alex Williamson40b36da2007-02-14 00:33:04 -08001719
Al Cooperdbb3b1c2011-07-25 16:19:52 -04001720 spin_lock_irqsave(&up->port.lock, flags);
1721
Alex Williamson40b36da2007-02-14 00:33:04 -08001722 /*
1723 * Must disable interrupts or else we risk racing with the interrupt
1724 * based handler.
1725 */
Alan Coxd4e33fa2012-01-26 17:44:09 +00001726 if (up->port.irq) {
Alex Williamson40b36da2007-02-14 00:33:04 -08001727 ier = serial_in(up, UART_IER);
1728 serial_out(up, UART_IER, 0);
1729 }
1730
1731 iir = serial_in(up, UART_IIR);
1732
1733 /*
1734 * This should be a safe test for anyone who doesn't trust the
1735 * IIR bits on their UART, but it's specifically designed for
1736 * the "Diva" UART used on the management processor on many HP
1737 * ia64 and parisc boxes.
1738 */
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001739 lsr = serial_in(up, UART_LSR);
1740 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
Alex Williamson40b36da2007-02-14 00:33:04 -08001741 if ((iir & UART_IIR_NO_INT) && (up->ier & UART_IER_THRI) &&
Alan Coxebd2c8f2009-09-19 13:13:28 -07001742 (!uart_circ_empty(&up->port.state->xmit) || up->port.x_char) &&
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001743 (lsr & UART_LSR_THRE)) {
Alex Williamson40b36da2007-02-14 00:33:04 -08001744 iir &= ~(UART_IIR_ID | UART_IIR_NO_INT);
1745 iir |= UART_IIR_THRI;
1746 }
1747
1748 if (!(iir & UART_IIR_NO_INT))
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001749 serial8250_tx_chars(up);
Alex Williamson40b36da2007-02-14 00:33:04 -08001750
Alan Coxd4e33fa2012-01-26 17:44:09 +00001751 if (up->port.irq)
Alex Williamson40b36da2007-02-14 00:33:04 -08001752 serial_out(up, UART_IER, ier);
1753
Al Cooperdbb3b1c2011-07-25 16:19:52 -04001754 spin_unlock_irqrestore(&up->port.lock, flags);
1755
Alex Williamson40b36da2007-02-14 00:33:04 -08001756 /* Standard timer interval plus 0.2s to keep the port running */
Alan Cox6f803cd2008-02-08 04:18:52 -08001757 mod_timer(&up->timer,
Anton Vorontsov54381062010-10-01 17:21:25 +04001758 jiffies + uart_poll_timeout(&up->port) + HZ / 5);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001759}
1760
1761static unsigned int serial8250_tx_empty(struct uart_port *port)
1762{
Jamie Iles49d57412010-12-01 23:39:35 +00001763 struct uart_8250_port *up =
1764 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001765 unsigned long flags;
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001766 unsigned int lsr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001767
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001768 spin_lock_irqsave(&port->lock, flags);
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001769 lsr = serial_port_in(port, UART_LSR);
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001770 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001771 spin_unlock_irqrestore(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001772
Dick Hollenbeckbca47612009-12-09 12:31:34 -08001773 return (lsr & BOTH_EMPTY) == BOTH_EMPTY ? TIOCSER_TEMT : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001774}
1775
1776static unsigned int serial8250_get_mctrl(struct uart_port *port)
1777{
Jamie Iles49d57412010-12-01 23:39:35 +00001778 struct uart_8250_port *up =
1779 container_of(port, struct uart_8250_port, port);
Russell King2af7cd62006-01-04 16:55:09 +00001780 unsigned int status;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001781 unsigned int ret;
1782
Paul Gortmaker3986fb22011-12-04 18:42:20 -05001783 status = serial8250_modem_status(up);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001784
1785 ret = 0;
1786 if (status & UART_MSR_DCD)
1787 ret |= TIOCM_CAR;
1788 if (status & UART_MSR_RI)
1789 ret |= TIOCM_RNG;
1790 if (status & UART_MSR_DSR)
1791 ret |= TIOCM_DSR;
1792 if (status & UART_MSR_CTS)
1793 ret |= TIOCM_CTS;
1794 return ret;
1795}
1796
1797static void serial8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
1798{
Jamie Iles49d57412010-12-01 23:39:35 +00001799 struct uart_8250_port *up =
1800 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001801 unsigned char mcr = 0;
1802
1803 if (mctrl & TIOCM_RTS)
1804 mcr |= UART_MCR_RTS;
1805 if (mctrl & TIOCM_DTR)
1806 mcr |= UART_MCR_DTR;
1807 if (mctrl & TIOCM_OUT1)
1808 mcr |= UART_MCR_OUT1;
1809 if (mctrl & TIOCM_OUT2)
1810 mcr |= UART_MCR_OUT2;
1811 if (mctrl & TIOCM_LOOP)
1812 mcr |= UART_MCR_LOOP;
1813
1814 mcr = (mcr & up->mcr_mask) | up->mcr_force | up->mcr;
1815
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001816 serial_port_out(port, UART_MCR, mcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001817}
1818
1819static void serial8250_break_ctl(struct uart_port *port, int break_state)
1820{
Jamie Iles49d57412010-12-01 23:39:35 +00001821 struct uart_8250_port *up =
1822 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001823 unsigned long flags;
1824
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001825 spin_lock_irqsave(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001826 if (break_state == -1)
1827 up->lcr |= UART_LCR_SBC;
1828 else
1829 up->lcr &= ~UART_LCR_SBC;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001830 serial_port_out(port, UART_LCR, up->lcr);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001831 spin_unlock_irqrestore(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001832}
1833
Alex Williamson40b36da2007-02-14 00:33:04 -08001834/*
1835 * Wait for transmitter & holding register to empty
1836 */
Will Newtonb5d674a2008-10-13 10:36:21 +01001837static void wait_for_xmitr(struct uart_8250_port *up, int bits)
Alex Williamson40b36da2007-02-14 00:33:04 -08001838{
1839 unsigned int status, tmout = 10000;
1840
1841 /* Wait up to 10ms for the character(s) to be sent. */
David Daney97d303b2010-10-05 11:40:07 -07001842 for (;;) {
Alex Williamson40b36da2007-02-14 00:33:04 -08001843 status = serial_in(up, UART_LSR);
1844
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001845 up->lsr_saved_flags |= status & LSR_SAVE_FLAGS;
Alex Williamson40b36da2007-02-14 00:33:04 -08001846
David Daney97d303b2010-10-05 11:40:07 -07001847 if ((status & bits) == bits)
1848 break;
Alex Williamson40b36da2007-02-14 00:33:04 -08001849 if (--tmout == 0)
1850 break;
1851 udelay(1);
David Daney97d303b2010-10-05 11:40:07 -07001852 }
Alex Williamson40b36da2007-02-14 00:33:04 -08001853
1854 /* Wait up to 1s for flow control if necessary */
1855 if (up->port.flags & UPF_CONS_FLOW) {
Corey Minyardad4c2aa2007-08-22 14:01:18 -07001856 unsigned int tmout;
1857 for (tmout = 1000000; tmout; tmout--) {
1858 unsigned int msr = serial_in(up, UART_MSR);
1859 up->msr_saved_flags |= msr & MSR_SAVE_FLAGS;
1860 if (msr & UART_MSR_CTS)
1861 break;
Alex Williamson40b36da2007-02-14 00:33:04 -08001862 udelay(1);
1863 touch_nmi_watchdog();
1864 }
1865 }
1866}
1867
Jason Wesself2d937f2008-04-17 20:05:37 +02001868#ifdef CONFIG_CONSOLE_POLL
1869/*
1870 * Console polling routines for writing and reading from the uart while
1871 * in an interrupt or debug context.
1872 */
1873
1874static int serial8250_get_poll_char(struct uart_port *port)
1875{
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001876 unsigned char lsr = serial_port_in(port, UART_LSR);
Jason Wesself2d937f2008-04-17 20:05:37 +02001877
Jason Wesself5316b42010-05-20 21:04:22 -05001878 if (!(lsr & UART_LSR_DR))
1879 return NO_POLL_CHAR;
Jason Wesself2d937f2008-04-17 20:05:37 +02001880
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001881 return serial_port_in(port, UART_RX);
Jason Wesself2d937f2008-04-17 20:05:37 +02001882}
1883
1884
1885static void serial8250_put_poll_char(struct uart_port *port,
1886 unsigned char c)
1887{
1888 unsigned int ier;
Jamie Iles49d57412010-12-01 23:39:35 +00001889 struct uart_8250_port *up =
1890 container_of(port, struct uart_8250_port, port);
Jason Wesself2d937f2008-04-17 20:05:37 +02001891
1892 /*
1893 * First save the IER then disable the interrupts
1894 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001895 ier = serial_port_in(port, UART_IER);
Jason Wesself2d937f2008-04-17 20:05:37 +02001896 if (up->capabilities & UART_CAP_UUE)
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001897 serial_port_out(port, UART_IER, UART_IER_UUE);
Jason Wesself2d937f2008-04-17 20:05:37 +02001898 else
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001899 serial_port_out(port, UART_IER, 0);
Jason Wesself2d937f2008-04-17 20:05:37 +02001900
1901 wait_for_xmitr(up, BOTH_EMPTY);
1902 /*
1903 * Send the character out.
1904 * If a LF, also do CR...
1905 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001906 serial_port_out(port, UART_TX, c);
Jason Wesself2d937f2008-04-17 20:05:37 +02001907 if (c == 10) {
1908 wait_for_xmitr(up, BOTH_EMPTY);
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001909 serial_port_out(port, UART_TX, 13);
Jason Wesself2d937f2008-04-17 20:05:37 +02001910 }
1911
1912 /*
1913 * Finally, wait for transmitter to become empty
1914 * and restore the IER
1915 */
1916 wait_for_xmitr(up, BOTH_EMPTY);
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001917 serial_port_out(port, UART_IER, ier);
Jason Wesself2d937f2008-04-17 20:05:37 +02001918}
1919
1920#endif /* CONFIG_CONSOLE_POLL */
1921
Linus Torvalds1da177e2005-04-16 15:20:36 -07001922static int serial8250_startup(struct uart_port *port)
1923{
Jamie Iles49d57412010-12-01 23:39:35 +00001924 struct uart_8250_port *up =
1925 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001926 unsigned long flags;
Russell King55d3b282005-06-23 15:05:41 +01001927 unsigned char lsr, iir;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001928 int retval;
1929
Sean Young65ecc9c2012-09-07 19:06:24 +01001930 if (port->type == PORT_8250_CIR)
1931 return -ENODEV;
1932
Heikki Krogerus96604972013-01-10 11:25:05 +02001933 if (!port->fifosize)
1934 port->fifosize = uart_config[port->type].fifo_size;
1935 if (!up->tx_loadsz)
1936 up->tx_loadsz = uart_config[port->type].tx_loadsz;
1937 if (!up->capabilities)
1938 up->capabilities = uart_config[port->type].flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001939 up->mcr = 0;
1940
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001941 if (port->iotype != up->cur_iotype)
Alan Coxb8e7e402009-05-28 14:01:35 +01001942 set_io_from_upio(port);
1943
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001944 if (port->type == PORT_16C950) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001945 /* Wake up and initialize UART */
1946 up->acr = 0;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001947 serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B);
1948 serial_port_out(port, UART_EFR, UART_EFR_ECB);
1949 serial_port_out(port, UART_IER, 0);
1950 serial_port_out(port, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001951 serial_icr_write(up, UART_CSR, 0); /* Reset the UART */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001952 serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B);
1953 serial_port_out(port, UART_EFR, UART_EFR_ECB);
1954 serial_port_out(port, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001955 }
1956
1957#ifdef CONFIG_SERIAL_8250_RSA
1958 /*
1959 * If this is an RSA port, see if we can kick it up to the
1960 * higher speed clock.
1961 */
1962 enable_rsa(up);
1963#endif
1964
1965 /*
1966 * Clear the FIFO buffers and disable them.
Alexey Dobriyan7f927fc2006-03-28 01:56:53 -08001967 * (they will be reenabled in set_termios())
Linus Torvalds1da177e2005-04-16 15:20:36 -07001968 */
1969 serial8250_clear_fifos(up);
1970
1971 /*
1972 * Clear the interrupt registers.
1973 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001974 serial_port_in(port, UART_LSR);
1975 serial_port_in(port, UART_RX);
1976 serial_port_in(port, UART_IIR);
1977 serial_port_in(port, UART_MSR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001978
1979 /*
1980 * At this point, there's no way the LSR could still be 0xff;
1981 * if it is, then bail out, because there's likely no UART
1982 * here.
1983 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001984 if (!(port->flags & UPF_BUGGY_UART) &&
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05001985 (serial_port_in(port, UART_LSR) == 0xff)) {
Konrad Rzeszutek Wilk7808a4c2011-09-26 09:14:34 -04001986 printk_ratelimited(KERN_INFO "ttyS%d: LSR safety check engaged!\n",
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001987 serial_index(port));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001988 return -ENODEV;
1989 }
1990
1991 /*
1992 * For a XR16C850, we need to set the trigger levels
1993 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05001994 if (port->type == PORT_16850) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001995 unsigned char fctr;
1996
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001997 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001998
Paul Gortmaker0acf5192012-03-08 19:12:08 -05001999 fctr = serial_in(up, UART_FCTR) & ~(UART_FCTR_RX|UART_FCTR_TX);
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002000 serial_port_out(port, UART_FCTR,
2001 fctr | UART_FCTR_TRGD | UART_FCTR_RX);
2002 serial_port_out(port, UART_TRG, UART_TRG_96);
2003 serial_port_out(port, UART_FCTR,
2004 fctr | UART_FCTR_TRGD | UART_FCTR_TX);
2005 serial_port_out(port, UART_TRG, UART_TRG_96);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002006
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002007 serial_port_out(port, UART_LCR, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002008 }
2009
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002010 if (port->irq) {
Alex Williamson01c194d2008-04-28 02:14:09 -07002011 unsigned char iir1;
Alex Williamson40b36da2007-02-14 00:33:04 -08002012 /*
2013 * Test for UARTs that do not reassert THRE when the
2014 * transmitter is idle and the interrupt has already
2015 * been cleared. Real 16550s should always reassert
2016 * this interrupt whenever the transmitter is idle and
2017 * the interrupt is enabled. Delays are necessary to
2018 * allow register changes to become visible.
2019 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002020 spin_lock_irqsave(&port->lock, flags);
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002021 if (up->port.irqflags & IRQF_SHARED)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002022 disable_irq_nosync(port->irq);
Alex Williamson40b36da2007-02-14 00:33:04 -08002023
2024 wait_for_xmitr(up, UART_LSR_THRE);
Paul Gortmaker55e40162012-03-08 19:12:14 -05002025 serial_port_out_sync(port, UART_IER, UART_IER_THRI);
Alex Williamson40b36da2007-02-14 00:33:04 -08002026 udelay(1); /* allow THRE to set */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002027 iir1 = serial_port_in(port, UART_IIR);
2028 serial_port_out(port, UART_IER, 0);
Paul Gortmaker55e40162012-03-08 19:12:14 -05002029 serial_port_out_sync(port, UART_IER, UART_IER_THRI);
Alex Williamson40b36da2007-02-14 00:33:04 -08002030 udelay(1); /* allow a working UART time to re-assert THRE */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002031 iir = serial_port_in(port, UART_IIR);
2032 serial_port_out(port, UART_IER, 0);
Alex Williamson40b36da2007-02-14 00:33:04 -08002033
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002034 if (port->irqflags & IRQF_SHARED)
2035 enable_irq(port->irq);
2036 spin_unlock_irqrestore(&port->lock, flags);
Alex Williamson40b36da2007-02-14 00:33:04 -08002037
2038 /*
Dan Williamsbc02d152012-04-06 11:49:50 -07002039 * If the interrupt is not reasserted, or we otherwise
2040 * don't trust the iir, setup a timer to kick the UART
2041 * on a regular basis.
Alex Williamson40b36da2007-02-14 00:33:04 -08002042 */
Dan Williamsbc02d152012-04-06 11:49:50 -07002043 if ((!(iir1 & UART_IIR_NO_INT) && (iir & UART_IIR_NO_INT)) ||
2044 up->port.flags & UPF_BUG_THRE) {
Will Newton363f66f2008-09-02 14:35:44 -07002045 up->bugs |= UART_BUG_THRE;
David S. Miller84408382008-10-13 10:45:26 +01002046 pr_debug("ttyS%d - using backup timer\n",
2047 serial_index(port));
Alex Williamson40b36da2007-02-14 00:33:04 -08002048 }
2049 }
2050
Linus Torvalds1da177e2005-04-16 15:20:36 -07002051 /*
Will Newton363f66f2008-09-02 14:35:44 -07002052 * The above check will only give an accurate result the first time
2053 * the port is opened so this value needs to be preserved.
2054 */
2055 if (up->bugs & UART_BUG_THRE) {
2056 up->timer.function = serial8250_backup_timeout;
2057 up->timer.data = (unsigned long)up;
2058 mod_timer(&up->timer, jiffies +
Anton Vorontsov54381062010-10-01 17:21:25 +04002059 uart_poll_timeout(port) + HZ / 5);
Will Newton363f66f2008-09-02 14:35:44 -07002060 }
2061
2062 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002063 * If the "interrupt" for this port doesn't correspond with any
2064 * hardware interrupt, we use a timer-based system. The original
2065 * driver used to do this with IRQ0.
2066 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002067 if (!port->irq) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002068 up->timer.data = (unsigned long)up;
Anton Vorontsov54381062010-10-01 17:21:25 +04002069 mod_timer(&up->timer, jiffies + uart_poll_timeout(port));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002070 } else {
2071 retval = serial_link_irq_chain(up);
2072 if (retval)
2073 return retval;
2074 }
2075
2076 /*
2077 * Now, initialize the UART
2078 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002079 serial_port_out(port, UART_LCR, UART_LCR_WLEN8);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002080
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002081 spin_lock_irqsave(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002082 if (up->port.flags & UPF_FOURPORT) {
Alan Coxd4e33fa2012-01-26 17:44:09 +00002083 if (!up->port.irq)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002084 up->port.mctrl |= TIOCM_OUT1;
2085 } else
2086 /*
2087 * Most PC uarts need OUT2 raised to enable interrupts.
2088 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002089 if (port->irq)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002090 up->port.mctrl |= TIOCM_OUT2;
2091
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002092 serial8250_set_mctrl(port, port->mctrl);
Russell King55d3b282005-06-23 15:05:41 +01002093
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002094 /* Serial over Lan (SoL) hack:
2095 Intel 8257x Gigabit ethernet chips have a
2096 16550 emulation, to be used for Serial Over Lan.
2097 Those chips take a longer time than a normal
2098 serial device to signalize that a transmission
2099 data was queued. Due to that, the above test generally
2100 fails. One solution would be to delay the reading of
2101 iir. However, this is not reliable, since the timeout
2102 is variable. So, let's just don't test if we receive
2103 TX irq. This way, we'll never enable UART_BUG_TXEN.
2104 */
Chuck Ebbertd41a4b52009-10-01 15:44:26 -07002105 if (skip_txen_test || up->port.flags & UPF_NO_TXEN_TEST)
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002106 goto dont_test_tx_en;
2107
Russell King55d3b282005-06-23 15:05:41 +01002108 /*
2109 * Do a quick test to see if we receive an
2110 * interrupt when we enable the TX irq.
2111 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002112 serial_port_out(port, UART_IER, UART_IER_THRI);
2113 lsr = serial_port_in(port, UART_LSR);
2114 iir = serial_port_in(port, UART_IIR);
2115 serial_port_out(port, UART_IER, 0);
Russell King55d3b282005-06-23 15:05:41 +01002116
2117 if (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT) {
Russell King67f76542005-06-23 22:26:43 +01002118 if (!(up->bugs & UART_BUG_TXEN)) {
2119 up->bugs |= UART_BUG_TXEN;
Russell King55d3b282005-06-23 15:05:41 +01002120 pr_debug("ttyS%d - enabling bad tx status workarounds\n",
David S. Miller84408382008-10-13 10:45:26 +01002121 serial_index(port));
Russell King55d3b282005-06-23 15:05:41 +01002122 }
2123 } else {
Russell King67f76542005-06-23 22:26:43 +01002124 up->bugs &= ~UART_BUG_TXEN;
Russell King55d3b282005-06-23 15:05:41 +01002125 }
2126
Mauro Carvalho Chehabb6adea32009-02-20 15:38:52 -08002127dont_test_tx_en:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002128 spin_unlock_irqrestore(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002129
2130 /*
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002131 * Clear the interrupt registers again for luck, and clear the
2132 * saved flags to avoid getting false values from polling
2133 * routines or the previous session.
2134 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002135 serial_port_in(port, UART_LSR);
2136 serial_port_in(port, UART_RX);
2137 serial_port_in(port, UART_IIR);
2138 serial_port_in(port, UART_MSR);
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002139 up->lsr_saved_flags = 0;
2140 up->msr_saved_flags = 0;
2141
2142 /*
Heikki Krogerus9ee4b832013-01-10 11:25:11 +02002143 * Request DMA channels for both RX and TX.
2144 */
2145 if (up->dma) {
2146 retval = serial8250_request_dma(up);
2147 if (retval) {
2148 pr_warn_ratelimited("ttyS%d - failed to request DMA\n",
2149 serial_index(port));
2150 up->dma = NULL;
2151 }
2152 }
2153
2154 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002155 * Finally, enable interrupts. Note: Modem status interrupts
2156 * are set via set_termios(), which will be occurring imminently
2157 * anyway, so we don't enable them here.
2158 */
2159 up->ier = UART_IER_RLSI | UART_IER_RDI;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002160 serial_port_out(port, UART_IER, up->ier);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002161
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002162 if (port->flags & UPF_FOURPORT) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002163 unsigned int icp;
2164 /*
2165 * Enable interrupts on the AST Fourport board
2166 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002167 icp = (port->iobase & 0xfe0) | 0x01f;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002168 outb_p(0x80, icp);
Paul Gortmaker0d263a22012-03-08 19:12:10 -05002169 inb_p(icp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002170 }
2171
Linus Torvalds1da177e2005-04-16 15:20:36 -07002172 return 0;
2173}
2174
2175static void serial8250_shutdown(struct uart_port *port)
2176{
Jamie Iles49d57412010-12-01 23:39:35 +00002177 struct uart_8250_port *up =
2178 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002179 unsigned long flags;
2180
2181 /*
2182 * Disable interrupts from this port
2183 */
2184 up->ier = 0;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002185 serial_port_out(port, UART_IER, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002186
Heikki Krogerus9ee4b832013-01-10 11:25:11 +02002187 if (up->dma)
2188 serial8250_release_dma(up);
2189
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002190 spin_lock_irqsave(&port->lock, flags);
2191 if (port->flags & UPF_FOURPORT) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002192 /* reset interrupts on the AST Fourport board */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002193 inb((port->iobase & 0xfe0) | 0x1f);
2194 port->mctrl |= TIOCM_OUT1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002195 } else
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002196 port->mctrl &= ~TIOCM_OUT2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002197
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002198 serial8250_set_mctrl(port, port->mctrl);
2199 spin_unlock_irqrestore(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002200
2201 /*
2202 * Disable break condition and FIFOs
2203 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002204 serial_port_out(port, UART_LCR,
2205 serial_port_in(port, UART_LCR) & ~UART_LCR_SBC);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002206 serial8250_clear_fifos(up);
2207
2208#ifdef CONFIG_SERIAL_8250_RSA
2209 /*
2210 * Reset the RSA board back to 115kbps compat mode.
2211 */
2212 disable_rsa(up);
2213#endif
2214
2215 /*
2216 * Read data port to reset things, and then unlink from
2217 * the IRQ chain.
2218 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002219 serial_port_in(port, UART_RX);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002220
Alex Williamson40b36da2007-02-14 00:33:04 -08002221 del_timer_sync(&up->timer);
2222 up->timer.function = serial8250_timeout;
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002223 if (port->irq)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002224 serial_unlink_irq_chain(up);
2225}
2226
2227static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud)
2228{
2229 unsigned int quot;
2230
2231 /*
2232 * Handle magic divisors for baud rates above baud_base on
2233 * SMSC SuperIO chips.
2234 */
2235 if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
2236 baud == (port->uartclk/4))
2237 quot = 0x8001;
2238 else if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
2239 baud == (port->uartclk/8))
2240 quot = 0x8002;
2241 else
2242 quot = uart_get_divisor(port, baud);
2243
2244 return quot;
2245}
2246
Philippe Langlais235dae52010-07-29 17:13:57 +02002247void
2248serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
2249 struct ktermios *old)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002250{
Jamie Iles49d57412010-12-01 23:39:35 +00002251 struct uart_8250_port *up =
2252 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002253 unsigned char cval, fcr = 0;
2254 unsigned long flags;
2255 unsigned int baud, quot;
Alan Coxeb26dfe2012-07-12 13:00:31 +01002256 int fifo_bug = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002257
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;
Alan Coxeb26dfe2012-07-12 13:00:31 +01002276 if (termios->c_cflag & PARENB) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002277 cval |= UART_LCR_PARITY;
Alan Coxeb26dfe2012-07-12 13:00:31 +01002278 if (up->bugs & UART_BUG_PARITY)
2279 fifo_bug = 1;
2280 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002281 if (!(termios->c_cflag & PARODD))
2282 cval |= UART_LCR_EPAR;
2283#ifdef CMSPAR
2284 if (termios->c_cflag & CMSPAR)
2285 cval |= UART_LCR_SPAR;
2286#endif
2287
2288 /*
2289 * Ask the core to calculate the divisor for us.
2290 */
Anton Vorontsov24d481e2009-09-19 13:13:20 -07002291 baud = uart_get_baud_rate(port, termios, old,
2292 port->uartclk / 16 / 0xffff,
2293 port->uartclk / 16);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002294 quot = serial8250_get_divisor(port, baud);
2295
2296 /*
Russell King4ba5e352005-06-23 10:43:04 +01002297 * Oxford Semi 952 rev B workaround
Linus Torvalds1da177e2005-04-16 15:20:36 -07002298 */
Russell King4ba5e352005-06-23 10:43:04 +01002299 if (up->bugs & UART_BUG_QUOT && (quot & 0xff) == 0)
Alan Cox3e8d4e22008-02-04 22:27:53 -08002300 quot++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002301
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002302 if (up->capabilities & UART_CAP_FIFO && port->fifosize > 1) {
Christian Melkif9a91112012-04-30 11:21:26 +02002303 fcr = uart_config[port->type].fcr;
Alan Coxeb26dfe2012-07-12 13:00:31 +01002304 if (baud < 2400 || fifo_bug) {
Christian Melkif9a91112012-04-30 11:21:26 +02002305 fcr &= ~UART_FCR_TRIGGER_MASK;
2306 fcr |= UART_FCR_TRIGGER_1;
2307 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002308 }
2309
2310 /*
2311 * MCR-based auto flow control. When AFE is enabled, RTS will be
2312 * deasserted when the receive FIFO contains more characters than
2313 * the trigger, or the MCR RTS bit is cleared. In the case where
2314 * the remote UART is not using CTS auto flow control, we must
2315 * have sufficient FIFO entries for the latency of the remote
2316 * UART to respond. IOW, at least 32 bytes of FIFO.
2317 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002318 if (up->capabilities & UART_CAP_AFE && port->fifosize >= 32) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002319 up->mcr &= ~UART_MCR_AFE;
2320 if (termios->c_cflag & CRTSCTS)
2321 up->mcr |= UART_MCR_AFE;
2322 }
2323
2324 /*
2325 * Ok, we're now changing the port state. Do it with
2326 * interrupts disabled.
2327 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002328 spin_lock_irqsave(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002329
2330 /*
2331 * Update the per-port timeout.
2332 */
2333 uart_update_timeout(port, termios->c_cflag, baud);
2334
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002335 port->read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002336 if (termios->c_iflag & INPCK)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002337 port->read_status_mask |= UART_LSR_FE | UART_LSR_PE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002338 if (termios->c_iflag & (BRKINT | PARMRK))
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002339 port->read_status_mask |= UART_LSR_BI;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002340
2341 /*
2342 * Characteres to ignore
2343 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002344 port->ignore_status_mask = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002345 if (termios->c_iflag & IGNPAR)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002346 port->ignore_status_mask |= UART_LSR_PE | UART_LSR_FE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002347 if (termios->c_iflag & IGNBRK) {
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002348 port->ignore_status_mask |= UART_LSR_BI;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002349 /*
2350 * If we're ignoring parity and break indicators,
2351 * ignore overruns too (for real raw support).
2352 */
2353 if (termios->c_iflag & IGNPAR)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002354 port->ignore_status_mask |= UART_LSR_OE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002355 }
2356
2357 /*
2358 * ignore all characters if CREAD is not set
2359 */
2360 if ((termios->c_cflag & CREAD) == 0)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002361 port->ignore_status_mask |= UART_LSR_DR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002362
2363 /*
2364 * CTS flow control flag and modem status interrupts
2365 */
Ingo Molnarf8b372a2010-11-13 16:21:58 +01002366 up->ier &= ~UART_IER_MSI;
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00002367 if (!(up->bugs & UART_BUG_NOMSR) &&
2368 UART_ENABLE_MS(&up->port, termios->c_cflag))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002369 up->ier |= UART_IER_MSI;
2370 if (up->capabilities & UART_CAP_UUE)
Stephen Warren4539c242011-05-17 16:12:36 -06002371 up->ier |= UART_IER_UUE;
2372 if (up->capabilities & UART_CAP_RTOIE)
2373 up->ier |= UART_IER_RTOIE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002374
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002375 serial_port_out(port, UART_IER, up->ier);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002376
2377 if (up->capabilities & UART_CAP_EFR) {
2378 unsigned char efr = 0;
2379 /*
2380 * TI16C752/Startech hardware flow control. FIXME:
2381 * - TI16C752 requires control thresholds to be set.
2382 * - UART_MCR_RTS is ineffective if auto-RTS mode is enabled.
2383 */
2384 if (termios->c_cflag & CRTSCTS)
2385 efr |= UART_EFR_CTS;
2386
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002387 serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002388 if (port->flags & UPF_EXAR_EFR)
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002389 serial_port_out(port, UART_XR_EFR, efr);
Søren Holm06315342011-09-02 22:55:37 +02002390 else
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002391 serial_port_out(port, UART_EFR, efr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002392 }
2393
Jonathan McDowell255341c2006-08-14 23:05:32 -07002394 /* Workaround to enable 115200 baud on OMAP1510 internal ports */
Tony Lindgren54ec52b2012-10-03 15:31:58 -07002395 if (is_omap1510_8250(up)) {
Jonathan McDowell255341c2006-08-14 23:05:32 -07002396 if (baud == 115200) {
2397 quot = 1;
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002398 serial_port_out(port, UART_OMAP_OSC_12M_SEL, 1);
Jonathan McDowell255341c2006-08-14 23:05:32 -07002399 } else
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002400 serial_port_out(port, UART_OMAP_OSC_12M_SEL, 0);
Jonathan McDowell255341c2006-08-14 23:05:32 -07002401 }
Jonathan McDowell255341c2006-08-14 23:05:32 -07002402
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002403 /*
2404 * For NatSemi, switch to bank 2 not bank 1, to avoid resetting EXCR2,
2405 * otherwise just set DLAB
2406 */
2407 if (up->capabilities & UART_NATSEMI)
2408 serial_port_out(port, UART_LCR, 0xe0);
2409 else
2410 serial_port_out(port, UART_LCR, cval | UART_LCR_DLAB);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002411
Jon Anders Haugumb32b19b2006-04-30 11:20:56 +01002412 serial_dl_write(up, quot);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002413
2414 /*
2415 * LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR
2416 * is written without DLAB set, this mode will be disabled.
2417 */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002418 if (port->type == PORT_16750)
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002419 serial_port_out(port, UART_FCR, fcr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002420
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002421 serial_port_out(port, UART_LCR, cval); /* reset DLAB */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002422 up->lcr = cval; /* Save LCR */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002423 if (port->type != PORT_16750) {
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002424 /* emulated UARTs (Lucent Venus 167x) need two steps */
2425 if (fcr & UART_FCR_ENABLE_FIFO)
2426 serial_port_out(port, UART_FCR, UART_FCR_ENABLE_FIFO);
2427 serial_port_out(port, UART_FCR, fcr); /* set fcr */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002428 }
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002429 serial8250_set_mctrl(port, port->mctrl);
2430 spin_unlock_irqrestore(&port->lock, flags);
Alan Coxe991a2b2008-04-28 02:14:06 -07002431 /* Don't rewrite B0 */
2432 if (tty_termios_baud_rate(termios))
2433 tty_termios_encode_baud_rate(termios, baud, baud);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002434}
Philippe Langlais235dae52010-07-29 17:13:57 +02002435EXPORT_SYMBOL(serial8250_do_set_termios);
2436
2437static void
2438serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
2439 struct ktermios *old)
2440{
2441 if (port->set_termios)
2442 port->set_termios(port, termios, old);
2443 else
2444 serial8250_do_set_termios(port, termios, old);
2445}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002446
2447static void
Arnd Bergmanna0821df2010-06-01 22:53:11 +02002448serial8250_set_ldisc(struct uart_port *port, int new)
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002449{
Arnd Bergmanna0821df2010-06-01 22:53:11 +02002450 if (new == N_PPS) {
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002451 port->flags |= UPF_HARDPPS_CD;
2452 serial8250_enable_ms(port);
2453 } else
2454 port->flags &= ~UPF_HARDPPS_CD;
2455}
2456
Manuel Laussc161afe2010-09-25 15:13:45 +02002457
2458void serial8250_do_pm(struct uart_port *port, unsigned int state,
2459 unsigned int oldstate)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002460{
Jamie Iles49d57412010-12-01 23:39:35 +00002461 struct uart_8250_port *p =
2462 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002463
2464 serial8250_set_sleep(p, state != 0);
Manuel Laussc161afe2010-09-25 15:13:45 +02002465}
2466EXPORT_SYMBOL(serial8250_do_pm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002467
Manuel Laussc161afe2010-09-25 15:13:45 +02002468static void
2469serial8250_pm(struct uart_port *port, unsigned int state,
2470 unsigned int oldstate)
2471{
2472 if (port->pm)
2473 port->pm(port, state, oldstate);
2474 else
2475 serial8250_do_pm(port, state, oldstate);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002476}
2477
Russell Kingf2eda272008-09-01 21:47:59 +01002478static unsigned int serial8250_port_size(struct uart_8250_port *pt)
2479{
2480 if (pt->port.iotype == UPIO_AU)
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002481 return 0x1000;
Tony Lindgren54ec52b2012-10-03 15:31:58 -07002482 if (is_omap1_8250(pt))
Russell Kingf2eda272008-09-01 21:47:59 +01002483 return 0x16 << pt->port.regshift;
Tony Lindgren54ec52b2012-10-03 15:31:58 -07002484
Russell Kingf2eda272008-09-01 21:47:59 +01002485 return 8 << pt->port.regshift;
2486}
2487
Linus Torvalds1da177e2005-04-16 15:20:36 -07002488/*
2489 * Resource handling.
2490 */
2491static int serial8250_request_std_resource(struct uart_8250_port *up)
2492{
Russell Kingf2eda272008-09-01 21:47:59 +01002493 unsigned int size = serial8250_port_size(up);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002494 struct uart_port *port = &up->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002495 int ret = 0;
2496
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002497 switch (port->iotype) {
Sergei Shtylyov85835f42006-04-30 11:15:58 +01002498 case UPIO_AU:
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002499 case UPIO_TSI:
2500 case UPIO_MEM32:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002501 case UPIO_MEM:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002502 if (!port->mapbase)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002503 break;
2504
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002505 if (!request_mem_region(port->mapbase, size, "serial")) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002506 ret = -EBUSY;
2507 break;
2508 }
2509
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002510 if (port->flags & UPF_IOREMAP) {
2511 port->membase = ioremap_nocache(port->mapbase, size);
2512 if (!port->membase) {
2513 release_mem_region(port->mapbase, size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002514 ret = -ENOMEM;
2515 }
2516 }
2517 break;
2518
2519 case UPIO_HUB6:
2520 case UPIO_PORT:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002521 if (!request_region(port->iobase, size, "serial"))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002522 ret = -EBUSY;
2523 break;
2524 }
2525 return ret;
2526}
2527
2528static void serial8250_release_std_resource(struct uart_8250_port *up)
2529{
Russell Kingf2eda272008-09-01 21:47:59 +01002530 unsigned int size = serial8250_port_size(up);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002531 struct uart_port *port = &up->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002532
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002533 switch (port->iotype) {
Sergei Shtylyov85835f42006-04-30 11:15:58 +01002534 case UPIO_AU:
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002535 case UPIO_TSI:
2536 case UPIO_MEM32:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002537 case UPIO_MEM:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002538 if (!port->mapbase)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002539 break;
2540
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002541 if (port->flags & UPF_IOREMAP) {
2542 iounmap(port->membase);
2543 port->membase = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002544 }
2545
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002546 release_mem_region(port->mapbase, size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002547 break;
2548
2549 case UPIO_HUB6:
2550 case UPIO_PORT:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002551 release_region(port->iobase, size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002552 break;
2553 }
2554}
2555
2556static int serial8250_request_rsa_resource(struct uart_8250_port *up)
2557{
2558 unsigned long start = UART_RSA_BASE << up->port.regshift;
2559 unsigned int size = 8 << up->port.regshift;
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002560 struct uart_port *port = &up->port;
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002561 int ret = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002562
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002563 switch (port->iotype) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002564 case UPIO_HUB6:
2565 case UPIO_PORT:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002566 start += port->iobase;
Sergei Shtylyov0b30d662006-09-09 22:23:56 +04002567 if (request_region(start, size, "serial-rsa"))
2568 ret = 0;
2569 else
Linus Torvalds1da177e2005-04-16 15:20:36 -07002570 ret = -EBUSY;
2571 break;
2572 }
2573
2574 return ret;
2575}
2576
2577static void serial8250_release_rsa_resource(struct uart_8250_port *up)
2578{
2579 unsigned long offset = UART_RSA_BASE << up->port.regshift;
2580 unsigned int size = 8 << up->port.regshift;
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002581 struct uart_port *port = &up->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002582
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002583 switch (port->iotype) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002584 case UPIO_HUB6:
2585 case UPIO_PORT:
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002586 release_region(port->iobase + offset, size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002587 break;
2588 }
2589}
2590
2591static void serial8250_release_port(struct uart_port *port)
2592{
Jamie Iles49d57412010-12-01 23:39:35 +00002593 struct uart_8250_port *up =
2594 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002595
2596 serial8250_release_std_resource(up);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002597 if (port->type == PORT_RSA)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002598 serial8250_release_rsa_resource(up);
2599}
2600
2601static int serial8250_request_port(struct uart_port *port)
2602{
Jamie Iles49d57412010-12-01 23:39:35 +00002603 struct uart_8250_port *up =
2604 container_of(port, struct uart_8250_port, port);
Sean Young65ecc9c2012-09-07 19:06:24 +01002605 int ret;
2606
2607 if (port->type == PORT_8250_CIR)
2608 return -ENODEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002609
2610 ret = serial8250_request_std_resource(up);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002611 if (ret == 0 && port->type == PORT_RSA) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002612 ret = serial8250_request_rsa_resource(up);
2613 if (ret < 0)
2614 serial8250_release_std_resource(up);
2615 }
2616
2617 return ret;
2618}
2619
2620static void serial8250_config_port(struct uart_port *port, int flags)
2621{
Jamie Iles49d57412010-12-01 23:39:35 +00002622 struct uart_8250_port *up =
2623 container_of(port, struct uart_8250_port, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002624 int probeflags = PROBE_ANY;
2625 int ret;
2626
Sean Young65ecc9c2012-09-07 19:06:24 +01002627 if (port->type == PORT_8250_CIR)
2628 return;
2629
Linus Torvalds1da177e2005-04-16 15:20:36 -07002630 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002631 * Find the region that we can probe for. This in turn
2632 * tells us whether we can probe for the type of port.
2633 */
2634 ret = serial8250_request_std_resource(up);
2635 if (ret < 0)
2636 return;
2637
2638 ret = serial8250_request_rsa_resource(up);
2639 if (ret < 0)
2640 probeflags &= ~PROBE_RSA;
2641
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002642 if (port->iotype != up->cur_iotype)
Alan Coxb8e7e402009-05-28 14:01:35 +01002643 set_io_from_upio(port);
2644
Linus Torvalds1da177e2005-04-16 15:20:36 -07002645 if (flags & UART_CONFIG_TYPE)
2646 autoconfig(up, probeflags);
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002647
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002648 /* if access method is AU, it is a 16550 with a quirk */
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002649 if (port->type == PORT_16550A && port->iotype == UPIO_AU)
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002650 up->bugs |= UART_BUG_NOMSR;
Manuel Laussb2b13cd2009-10-28 21:37:28 +01002651
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002652 if (port->type != PORT_UNKNOWN && flags & UART_CONFIG_IRQ)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002653 autoconfig_irq(up);
2654
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002655 if (port->type != PORT_RSA && probeflags & PROBE_RSA)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002656 serial8250_release_rsa_resource(up);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002657 if (port->type == PORT_UNKNOWN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002658 serial8250_release_std_resource(up);
Matt Schultedc96efb2012-11-19 09:12:04 -06002659
2660 /* Fixme: probably not the best place for this */
Matt Schulte30fa96a2012-11-21 09:40:49 -06002661 if ((port->type == PORT_XR17V35X) ||
2662 (port->type == PORT_XR17D15X))
Matt Schultedc96efb2012-11-19 09:12:04 -06002663 port->handle_irq = exar_handle_irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002664}
2665
2666static int
2667serial8250_verify_port(struct uart_port *port, struct serial_struct *ser)
2668{
Yinghai Lua62c4132008-08-19 20:49:55 -07002669 if (ser->irq >= nr_irqs || ser->irq < 0 ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07002670 ser->baud_base < 9600 || ser->type < PORT_UNKNOWN ||
2671 ser->type >= ARRAY_SIZE(uart_config) || ser->type == PORT_CIRRUS ||
2672 ser->type == PORT_STARTECH)
2673 return -EINVAL;
2674 return 0;
2675}
2676
2677static const char *
2678serial8250_type(struct uart_port *port)
2679{
2680 int type = port->type;
2681
2682 if (type >= ARRAY_SIZE(uart_config))
2683 type = 0;
2684 return uart_config[type].name;
2685}
2686
2687static struct uart_ops serial8250_pops = {
2688 .tx_empty = serial8250_tx_empty,
2689 .set_mctrl = serial8250_set_mctrl,
2690 .get_mctrl = serial8250_get_mctrl,
2691 .stop_tx = serial8250_stop_tx,
2692 .start_tx = serial8250_start_tx,
2693 .stop_rx = serial8250_stop_rx,
2694 .enable_ms = serial8250_enable_ms,
2695 .break_ctl = serial8250_break_ctl,
2696 .startup = serial8250_startup,
2697 .shutdown = serial8250_shutdown,
2698 .set_termios = serial8250_set_termios,
Rodolfo Giomettidc77f162010-03-10 15:23:48 -08002699 .set_ldisc = serial8250_set_ldisc,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002700 .pm = serial8250_pm,
2701 .type = serial8250_type,
2702 .release_port = serial8250_release_port,
2703 .request_port = serial8250_request_port,
2704 .config_port = serial8250_config_port,
2705 .verify_port = serial8250_verify_port,
Jason Wesself2d937f2008-04-17 20:05:37 +02002706#ifdef CONFIG_CONSOLE_POLL
2707 .poll_get_char = serial8250_get_poll_char,
2708 .poll_put_char = serial8250_put_poll_char,
2709#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07002710};
2711
2712static struct uart_8250_port serial8250_ports[UART_NR];
2713
Alan Coxaf7f3742010-10-18 11:38:02 -07002714static void (*serial8250_isa_config)(int port, struct uart_port *up,
2715 unsigned short *capabilities);
2716
2717void serial8250_set_isa_configurator(
2718 void (*v)(int port, struct uart_port *up, unsigned short *capabilities))
2719{
2720 serial8250_isa_config = v;
2721}
2722EXPORT_SYMBOL(serial8250_set_isa_configurator);
2723
Linus Torvalds1da177e2005-04-16 15:20:36 -07002724static void __init serial8250_isa_init_ports(void)
2725{
2726 struct uart_8250_port *up;
2727 static int first = 1;
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02002728 int i, irqflag = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002729
2730 if (!first)
2731 return;
2732 first = 0;
2733
Sean Young835d8442012-09-07 19:06:23 +01002734 if (nr_uarts > UART_NR)
2735 nr_uarts = UART_NR;
2736
Dave Jonesa61c2d72006-01-07 23:18:19 +00002737 for (i = 0; i < nr_uarts; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002738 struct uart_8250_port *up = &serial8250_ports[i];
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002739 struct uart_port *port = &up->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002740
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002741 port->line = i;
2742 spin_lock_init(&port->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002743
2744 init_timer(&up->timer);
2745 up->timer.function = serial8250_timeout;
Sean Young835d8442012-09-07 19:06:23 +01002746 up->cur_iotype = 0xFF;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002747
2748 /*
2749 * ALPHA_KLUDGE_MCR needs to be killed.
2750 */
2751 up->mcr_mask = ~ALPHA_KLUDGE_MCR;
2752 up->mcr_force = ALPHA_KLUDGE_MCR;
2753
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002754 port->ops = &serial8250_pops;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002755 }
2756
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02002757 if (share_irqs)
2758 irqflag = IRQF_SHARED;
2759
Russell King44454bc2005-06-30 22:41:22 +01002760 for (i = 0, up = serial8250_ports;
Dave Jonesa61c2d72006-01-07 23:18:19 +00002761 i < ARRAY_SIZE(old_serial_port) && i < nr_uarts;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002762 i++, up++) {
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002763 struct uart_port *port = &up->port;
2764
2765 port->iobase = old_serial_port[i].port;
2766 port->irq = irq_canonicalize(old_serial_port[i].irq);
2767 port->irqflags = old_serial_port[i].irqflags;
2768 port->uartclk = old_serial_port[i].baud_base * 16;
2769 port->flags = old_serial_port[i].flags;
2770 port->hub6 = old_serial_port[i].hub6;
2771 port->membase = old_serial_port[i].iomem_base;
2772 port->iotype = old_serial_port[i].io_type;
2773 port->regshift = old_serial_port[i].iomem_reg_shift;
2774 set_io_from_upio(port);
2775 port->irqflags |= irqflag;
Alan Coxaf7f3742010-10-18 11:38:02 -07002776 if (serial8250_isa_config != NULL)
2777 serial8250_isa_config(i, &up->port, &up->capabilities);
2778
Linus Torvalds1da177e2005-04-16 15:20:36 -07002779 }
2780}
2781
Shmulik Ladkanib5d228c2009-12-09 12:31:29 -08002782static void
2783serial8250_init_fixed_type_port(struct uart_8250_port *up, unsigned int type)
2784{
2785 up->port.type = type;
Heikki Krogerus96604972013-01-10 11:25:05 +02002786 if (!up->port.fifosize)
2787 up->port.fifosize = uart_config[type].fifo_size;
2788 if (!up->tx_loadsz)
2789 up->tx_loadsz = uart_config[type].tx_loadsz;
2790 if (!up->capabilities)
2791 up->capabilities = uart_config[type].flags;
Shmulik Ladkanib5d228c2009-12-09 12:31:29 -08002792}
2793
Linus Torvalds1da177e2005-04-16 15:20:36 -07002794static void __init
2795serial8250_register_ports(struct uart_driver *drv, struct device *dev)
2796{
2797 int i;
2798
Alan Coxb8e7e402009-05-28 14:01:35 +01002799 for (i = 0; i < nr_uarts; i++) {
2800 struct uart_8250_port *up = &serial8250_ports[i];
Alan Coxb8e7e402009-05-28 14:01:35 +01002801
Sean Young835d8442012-09-07 19:06:23 +01002802 if (up->port.dev)
2803 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002804
2805 up->port.dev = dev;
Shmulik Ladkanib5d228c2009-12-09 12:31:29 -08002806
2807 if (up->port.flags & UPF_FIXED_TYPE)
2808 serial8250_init_fixed_type_port(up, up->port.type);
2809
Linus Torvalds1da177e2005-04-16 15:20:36 -07002810 uart_add_one_port(drv, &up->port);
2811 }
2812}
2813
2814#ifdef CONFIG_SERIAL_8250_CONSOLE
2815
Russell Kingd3587882006-03-20 20:00:09 +00002816static void serial8250_console_putchar(struct uart_port *port, int ch)
2817{
Jamie Iles49d57412010-12-01 23:39:35 +00002818 struct uart_8250_port *up =
2819 container_of(port, struct uart_8250_port, port);
Russell Kingd3587882006-03-20 20:00:09 +00002820
2821 wait_for_xmitr(up, UART_LSR_THRE);
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002822 serial_port_out(port, UART_TX, ch);
Russell Kingd3587882006-03-20 20:00:09 +00002823}
2824
Linus Torvalds1da177e2005-04-16 15:20:36 -07002825/*
2826 * Print a string to the serial port trying not to disturb
2827 * any possible real use of the port...
2828 *
2829 * The console_lock must be held when we get here.
2830 */
2831static void
2832serial8250_console_write(struct console *co, const char *s, unsigned int count)
2833{
2834 struct uart_8250_port *up = &serial8250_ports[co->index];
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002835 struct uart_port *port = &up->port;
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002836 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002837 unsigned int ier;
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002838 int locked = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002839
Andrew Morton78512ec2005-11-07 00:59:13 -08002840 touch_nmi_watchdog();
2841
Andrew Morton68aa2c02006-06-30 02:29:59 -07002842 local_irq_save(flags);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002843 if (port->sysrq) {
Paul Gortmaker86b21192011-12-04 18:42:22 -05002844 /* serial8250_handle_irq() already took the lock */
Andrew Morton68aa2c02006-06-30 02:29:59 -07002845 locked = 0;
2846 } else if (oops_in_progress) {
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002847 locked = spin_trylock(&port->lock);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002848 } else
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002849 spin_lock(&port->lock);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002850
Linus Torvalds1da177e2005-04-16 15:20:36 -07002851 /*
Ralf Baechledc7bf132006-02-15 09:59:47 +00002852 * First save the IER then disable the interrupts
Linus Torvalds1da177e2005-04-16 15:20:36 -07002853 */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002854 ier = serial_port_in(port, UART_IER);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002855
2856 if (up->capabilities & UART_CAP_UUE)
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002857 serial_port_out(port, UART_IER, UART_IER_UUE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002858 else
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002859 serial_port_out(port, UART_IER, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002860
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002861 uart_console_write(port, s, count, serial8250_console_putchar);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002862
2863 /*
2864 * Finally, wait for transmitter to become empty
2865 * and restore the IER
2866 */
Alan Coxf91a3712006-01-21 14:59:12 +00002867 wait_for_xmitr(up, BOTH_EMPTY);
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05002868 serial_port_out(port, UART_IER, ier);
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002869
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002870 /*
2871 * The receive handling will happen properly because the
2872 * receive ready bit will still be set; it is not cleared
2873 * on read. However, modem control will not, we must
2874 * call it if we have saved something in the saved flags
2875 * while processing with interrupts off.
2876 */
2877 if (up->msr_saved_flags)
Paul Gortmaker3986fb22011-12-04 18:42:20 -05002878 serial8250_modem_status(up);
Corey Minyardad4c2aa2007-08-22 14:01:18 -07002879
Russell Kingd8a5a8d2006-05-02 16:04:29 +01002880 if (locked)
Paul Gortmakerdfe42442012-03-08 19:12:11 -05002881 spin_unlock(&port->lock);
Andrew Morton68aa2c02006-06-30 02:29:59 -07002882 local_irq_restore(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002883}
2884
Vivek Goyal118c0ac2007-01-11 01:52:44 +01002885static int __init serial8250_console_setup(struct console *co, char *options)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002886{
2887 struct uart_port *port;
2888 int baud = 9600;
2889 int bits = 8;
2890 int parity = 'n';
2891 int flow = 'n';
2892
2893 /*
2894 * Check whether an invalid uart number has been specified, and
2895 * if so, search for the first available port that does have
2896 * console support.
2897 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00002898 if (co->index >= nr_uarts)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002899 co->index = 0;
2900 port = &serial8250_ports[co->index].port;
2901 if (!port->iobase && !port->membase)
2902 return -ENODEV;
2903
2904 if (options)
2905 uart_parse_options(options, &baud, &parity, &bits, &flow);
2906
2907 return uart_set_options(port, co, baud, parity, bits, flow);
2908}
2909
Daniel Ritzb6b1d872007-08-03 16:07:43 +02002910static int serial8250_console_early_setup(void)
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002911{
2912 return serial8250_find_port_for_earlycon();
2913}
2914
Linus Torvalds1da177e2005-04-16 15:20:36 -07002915static struct console serial8250_console = {
2916 .name = "ttyS",
2917 .write = serial8250_console_write,
2918 .device = uart_console_device,
2919 .setup = serial8250_console_setup,
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002920 .early_setup = serial8250_console_early_setup,
Peter Zijlstraa80c49d2010-11-15 21:11:12 +01002921 .flags = CON_PRINTBUFFER | CON_ANYTIME,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002922 .index = -1,
2923 .data = &serial8250_reg,
2924};
2925
2926static int __init serial8250_console_init(void)
2927{
2928 serial8250_isa_init_ports();
2929 register_console(&serial8250_console);
2930 return 0;
2931}
2932console_initcall(serial8250_console_init);
2933
Yinghai Lu18a8bd92007-07-15 23:37:59 -07002934int serial8250_find_port(struct uart_port *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002935{
2936 int line;
2937 struct uart_port *port;
2938
Dave Jonesa61c2d72006-01-07 23:18:19 +00002939 for (line = 0; line < nr_uarts; line++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002940 port = &serial8250_ports[line].port;
Russell King50aec3b52006-01-04 18:13:03 +00002941 if (uart_match_port(p, port))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002942 return line;
2943 }
2944 return -ENODEV;
2945}
2946
Linus Torvalds1da177e2005-04-16 15:20:36 -07002947#define SERIAL8250_CONSOLE &serial8250_console
2948#else
2949#define SERIAL8250_CONSOLE NULL
2950#endif
2951
2952static struct uart_driver serial8250_reg = {
2953 .owner = THIS_MODULE,
2954 .driver_name = "serial",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002955 .dev_name = "ttyS",
2956 .major = TTY_MAJOR,
2957 .minor = 64,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002958 .cons = SERIAL8250_CONSOLE,
2959};
2960
Russell Kingd856c662006-02-23 10:22:13 +00002961/*
2962 * early_serial_setup - early registration for 8250 ports
2963 *
2964 * Setup an 8250 port structure prior to console initialisation. Use
2965 * after console initialisation will cause undefined behaviour.
2966 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002967int __init early_serial_setup(struct uart_port *port)
2968{
David Daneyb4304282009-01-02 13:49:41 +00002969 struct uart_port *p;
2970
Linus Torvalds1da177e2005-04-16 15:20:36 -07002971 if (port->line >= ARRAY_SIZE(serial8250_ports))
2972 return -ENODEV;
2973
2974 serial8250_isa_init_ports();
David Daneyb4304282009-01-02 13:49:41 +00002975 p = &serial8250_ports[port->line].port;
2976 p->iobase = port->iobase;
2977 p->membase = port->membase;
2978 p->irq = port->irq;
Vikram Pandita1c2f0492009-09-19 13:13:19 -07002979 p->irqflags = port->irqflags;
David Daneyb4304282009-01-02 13:49:41 +00002980 p->uartclk = port->uartclk;
2981 p->fifosize = port->fifosize;
2982 p->regshift = port->regshift;
2983 p->iotype = port->iotype;
2984 p->flags = port->flags;
2985 p->mapbase = port->mapbase;
2986 p->private_data = port->private_data;
Helge Deller125c97d2009-01-13 22:51:07 +01002987 p->type = port->type;
2988 p->line = port->line;
David Daney7d6a07d2009-01-02 13:49:47 +00002989
2990 set_io_from_upio(p);
2991 if (port->serial_in)
2992 p->serial_in = port->serial_in;
2993 if (port->serial_out)
2994 p->serial_out = port->serial_out;
Jamie Iles583d28e2011-08-15 10:17:52 +01002995 if (port->handle_irq)
2996 p->handle_irq = port->handle_irq;
2997 else
2998 p->handle_irq = serial8250_default_handle_irq;
David Daney7d6a07d2009-01-02 13:49:47 +00002999
Linus Torvalds1da177e2005-04-16 15:20:36 -07003000 return 0;
3001}
3002
3003/**
3004 * serial8250_suspend_port - suspend one serial port
3005 * @line: serial line number
Linus Torvalds1da177e2005-04-16 15:20:36 -07003006 *
3007 * Suspend one serial port.
3008 */
3009void serial8250_suspend_port(int line)
3010{
3011 uart_suspend_port(&serial8250_reg, &serial8250_ports[line].port);
3012}
3013
3014/**
3015 * serial8250_resume_port - resume one serial port
3016 * @line: serial line number
Linus Torvalds1da177e2005-04-16 15:20:36 -07003017 *
3018 * Resume one serial port.
3019 */
3020void serial8250_resume_port(int line)
3021{
David Woodhouseb5b82df2007-05-17 14:27:39 +08003022 struct uart_8250_port *up = &serial8250_ports[line];
Paul Gortmakerdfe42442012-03-08 19:12:11 -05003023 struct uart_port *port = &up->port;
David Woodhouseb5b82df2007-05-17 14:27:39 +08003024
3025 if (up->capabilities & UART_NATSEMI) {
David Woodhouseb5b82df2007-05-17 14:27:39 +08003026 /* Ensure it's still in high speed mode */
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05003027 serial_port_out(port, UART_LCR, 0xE0);
David Woodhouseb5b82df2007-05-17 14:27:39 +08003028
Yin Kangkai0d0389e2011-02-09 11:35:18 +08003029 ns16550a_goto_highspeed(up);
David Woodhouseb5b82df2007-05-17 14:27:39 +08003030
Paul Gortmaker4fd996a2012-03-08 19:12:13 -05003031 serial_port_out(port, UART_LCR, 0);
Paul Gortmakerdfe42442012-03-08 19:12:11 -05003032 port->uartclk = 921600*16;
David Woodhouseb5b82df2007-05-17 14:27:39 +08003033 }
Paul Gortmakerdfe42442012-03-08 19:12:11 -05003034 uart_resume_port(&serial8250_reg, port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003035}
3036
3037/*
3038 * Register a set of serial devices attached to a platform device. The
3039 * list is terminated with a zero flags entry, which means we expect
3040 * all entries to have at least UPF_BOOT_AUTOCONF set.
3041 */
Bill Pemberton9671f092012-11-19 13:21:50 -05003042static int serial8250_probe(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003043{
Russell King3ae5eae2005-11-09 22:32:44 +00003044 struct plat_serial8250_port *p = dev->dev.platform_data;
Alan Cox2655a2c2012-07-12 12:59:50 +01003045 struct uart_8250_port uart;
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02003046 int ret, i, irqflag = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003047
Alan Cox2655a2c2012-07-12 12:59:50 +01003048 memset(&uart, 0, sizeof(uart));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003049
André Goddard Rosa4c0ebb82009-10-25 12:01:34 -02003050 if (share_irqs)
3051 irqflag = IRQF_SHARED;
3052
Russell Kingec9f47c2005-06-27 11:12:54 +01003053 for (i = 0; p && p->flags != 0; p++, i++) {
Alan Cox2655a2c2012-07-12 12:59:50 +01003054 uart.port.iobase = p->iobase;
3055 uart.port.membase = p->membase;
3056 uart.port.irq = p->irq;
3057 uart.port.irqflags = p->irqflags;
3058 uart.port.uartclk = p->uartclk;
3059 uart.port.regshift = p->regshift;
3060 uart.port.iotype = p->iotype;
3061 uart.port.flags = p->flags;
3062 uart.port.mapbase = p->mapbase;
3063 uart.port.hub6 = p->hub6;
3064 uart.port.private_data = p->private_data;
3065 uart.port.type = p->type;
3066 uart.port.serial_in = p->serial_in;
3067 uart.port.serial_out = p->serial_out;
3068 uart.port.handle_irq = p->handle_irq;
3069 uart.port.handle_break = p->handle_break;
3070 uart.port.set_termios = p->set_termios;
3071 uart.port.pm = p->pm;
3072 uart.port.dev = &dev->dev;
3073 uart.port.irqflags |= irqflag;
3074 ret = serial8250_register_8250_port(&uart);
Russell Kingec9f47c2005-06-27 11:12:54 +01003075 if (ret < 0) {
Russell King3ae5eae2005-11-09 22:32:44 +00003076 dev_err(&dev->dev, "unable to register port at index %d "
Josh Boyer4f640ef2007-07-23 18:43:44 -07003077 "(IO%lx MEM%llx IRQ%d): %d\n", i,
3078 p->iobase, (unsigned long long)p->mapbase,
3079 p->irq, ret);
Russell Kingec9f47c2005-06-27 11:12:54 +01003080 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003081 }
3082 return 0;
3083}
3084
3085/*
3086 * Remove serial ports registered against a platform device.
3087 */
Bill Pembertonae8d8a12012-11-19 13:26:18 -05003088static int serial8250_remove(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003089{
3090 int i;
3091
Dave Jonesa61c2d72006-01-07 23:18:19 +00003092 for (i = 0; i < nr_uarts; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003093 struct uart_8250_port *up = &serial8250_ports[i];
3094
Russell King3ae5eae2005-11-09 22:32:44 +00003095 if (up->port.dev == &dev->dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003096 serial8250_unregister_port(i);
3097 }
3098 return 0;
3099}
3100
Russell King3ae5eae2005-11-09 22:32:44 +00003101static int serial8250_suspend(struct platform_device *dev, pm_message_t state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003102{
3103 int i;
3104
Linus Torvalds1da177e2005-04-16 15:20:36 -07003105 for (i = 0; i < UART_NR; i++) {
3106 struct uart_8250_port *up = &serial8250_ports[i];
3107
Russell King3ae5eae2005-11-09 22:32:44 +00003108 if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003109 uart_suspend_port(&serial8250_reg, &up->port);
3110 }
3111
3112 return 0;
3113}
3114
Russell King3ae5eae2005-11-09 22:32:44 +00003115static int serial8250_resume(struct platform_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003116{
3117 int i;
3118
Linus Torvalds1da177e2005-04-16 15:20:36 -07003119 for (i = 0; i < UART_NR; i++) {
3120 struct uart_8250_port *up = &serial8250_ports[i];
3121
Russell King3ae5eae2005-11-09 22:32:44 +00003122 if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
David Woodhouseb5b82df2007-05-17 14:27:39 +08003123 serial8250_resume_port(i);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003124 }
3125
3126 return 0;
3127}
3128
Russell King3ae5eae2005-11-09 22:32:44 +00003129static struct platform_driver serial8250_isa_driver = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003130 .probe = serial8250_probe,
Bill Pemberton2d47b712012-11-19 13:21:34 -05003131 .remove = serial8250_remove,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003132 .suspend = serial8250_suspend,
3133 .resume = serial8250_resume,
Russell King3ae5eae2005-11-09 22:32:44 +00003134 .driver = {
3135 .name = "serial8250",
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003136 .owner = THIS_MODULE,
Russell King3ae5eae2005-11-09 22:32:44 +00003137 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07003138};
3139
3140/*
3141 * This "device" covers _all_ ISA 8250-compatible serial devices listed
3142 * in the table in include/asm/serial.h
3143 */
3144static struct platform_device *serial8250_isa_devs;
3145
3146/*
Alan Cox2655a2c2012-07-12 12:59:50 +01003147 * serial8250_register_8250_port and serial8250_unregister_port allows for
Linus Torvalds1da177e2005-04-16 15:20:36 -07003148 * 16x50 serial ports to be configured at run-time, to support PCMCIA
3149 * modems and PCI multiport cards.
3150 */
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003151static DEFINE_MUTEX(serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003152
3153static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *port)
3154{
3155 int i;
3156
3157 /*
3158 * First, find a port entry which matches.
3159 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003160 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003161 if (uart_match_port(&serial8250_ports[i].port, port))
3162 return &serial8250_ports[i];
3163
3164 /*
3165 * We didn't find a matching entry, so look for the first
3166 * free entry. We look for one which hasn't been previously
3167 * used (indicated by zero iobase).
3168 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003169 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003170 if (serial8250_ports[i].port.type == PORT_UNKNOWN &&
3171 serial8250_ports[i].port.iobase == 0)
3172 return &serial8250_ports[i];
3173
3174 /*
3175 * That also failed. Last resort is to find any entry which
3176 * doesn't have a real port associated with it.
3177 */
Dave Jonesa61c2d72006-01-07 23:18:19 +00003178 for (i = 0; i < nr_uarts; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003179 if (serial8250_ports[i].port.type == PORT_UNKNOWN)
3180 return &serial8250_ports[i];
3181
3182 return NULL;
3183}
3184
3185/**
Magnus Dammf73fa052012-05-02 21:47:27 +09003186 * serial8250_register_8250_port - register a serial port
Randy Dunlap58bcd332012-06-08 18:51:23 -07003187 * @up: serial port template
Magnus Dammf73fa052012-05-02 21:47:27 +09003188 *
3189 * Configure the serial port specified by the request. If the
3190 * port exists and is in use, it is hung up and unregistered
3191 * first.
3192 *
3193 * The port is then probed and if necessary the IRQ is autodetected
3194 * If this fails an error is returned.
3195 *
3196 * On success the port is ready to use and the line number is returned.
3197 */
3198int serial8250_register_8250_port(struct uart_8250_port *up)
3199{
3200 struct uart_8250_port *uart;
3201 int ret = -ENOSPC;
3202
3203 if (up->port.uartclk == 0)
3204 return -EINVAL;
3205
3206 mutex_lock(&serial_mutex);
3207
3208 uart = serial8250_find_match_or_unused(&up->port);
Sean Young65ecc9c2012-09-07 19:06:24 +01003209 if (uart && uart->port.type != PORT_8250_CIR) {
Sean Young835d8442012-09-07 19:06:23 +01003210 if (uart->port.dev)
3211 uart_remove_one_port(&serial8250_reg, &uart->port);
Magnus Dammf73fa052012-05-02 21:47:27 +09003212
3213 uart->port.iobase = up->port.iobase;
3214 uart->port.membase = up->port.membase;
3215 uart->port.irq = up->port.irq;
3216 uart->port.irqflags = up->port.irqflags;
3217 uart->port.uartclk = up->port.uartclk;
3218 uart->port.fifosize = up->port.fifosize;
3219 uart->port.regshift = up->port.regshift;
3220 uart->port.iotype = up->port.iotype;
3221 uart->port.flags = up->port.flags | UPF_BOOT_AUTOCONF;
Alan Coxa2d33d82012-07-12 13:00:06 +01003222 uart->bugs = up->bugs;
Magnus Dammf73fa052012-05-02 21:47:27 +09003223 uart->port.mapbase = up->port.mapbase;
3224 uart->port.private_data = up->port.private_data;
Heikki Krogerus96604972013-01-10 11:25:05 +02003225 uart->port.fifosize = up->port.fifosize;
3226 uart->tx_loadsz = up->tx_loadsz;
3227 uart->capabilities = up->capabilities;
3228
Magnus Dammf73fa052012-05-02 21:47:27 +09003229 if (up->port.dev)
3230 uart->port.dev = up->port.dev;
3231
3232 if (up->port.flags & UPF_FIXED_TYPE)
3233 serial8250_init_fixed_type_port(uart, up->port.type);
3234
3235 set_io_from_upio(&uart->port);
3236 /* Possibly override default I/O functions. */
3237 if (up->port.serial_in)
3238 uart->port.serial_in = up->port.serial_in;
3239 if (up->port.serial_out)
3240 uart->port.serial_out = up->port.serial_out;
3241 if (up->port.handle_irq)
3242 uart->port.handle_irq = up->port.handle_irq;
3243 /* Possibly override set_termios call */
3244 if (up->port.set_termios)
3245 uart->port.set_termios = up->port.set_termios;
3246 if (up->port.pm)
3247 uart->port.pm = up->port.pm;
3248 if (up->port.handle_break)
3249 uart->port.handle_break = up->port.handle_break;
3250 if (up->dl_read)
3251 uart->dl_read = up->dl_read;
3252 if (up->dl_write)
3253 uart->dl_write = up->dl_write;
Heikki Krogerus9ee4b832013-01-10 11:25:11 +02003254 if (up->dma)
3255 uart->dma = up->dma;
Magnus Dammf73fa052012-05-02 21:47:27 +09003256
3257 if (serial8250_isa_config != NULL)
3258 serial8250_isa_config(0, &uart->port,
3259 &uart->capabilities);
3260
3261 ret = uart_add_one_port(&serial8250_reg, &uart->port);
3262 if (ret == 0)
3263 ret = uart->port.line;
3264 }
3265 mutex_unlock(&serial_mutex);
3266
3267 return ret;
3268}
3269EXPORT_SYMBOL(serial8250_register_8250_port);
3270
3271/**
Linus Torvalds1da177e2005-04-16 15:20:36 -07003272 * serial8250_unregister_port - remove a 16x50 serial port at runtime
3273 * @line: serial line number
3274 *
3275 * Remove one serial port. This may not be called from interrupt
3276 * context. We hand the port back to the our control.
3277 */
3278void serial8250_unregister_port(int line)
3279{
3280 struct uart_8250_port *uart = &serial8250_ports[line];
3281
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003282 mutex_lock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003283 uart_remove_one_port(&serial8250_reg, &uart->port);
3284 if (serial8250_isa_devs) {
3285 uart->port.flags &= ~UPF_BOOT_AUTOCONF;
3286 uart->port.type = PORT_UNKNOWN;
3287 uart->port.dev = &serial8250_isa_devs->dev;
leitao@linux.vnet.ibm.comcb01ece2011-05-26 11:18:39 -03003288 uart->capabilities = uart_config[uart->port.type].flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003289 uart_add_one_port(&serial8250_reg, &uart->port);
3290 } else {
3291 uart->port.dev = NULL;
3292 }
Arjan van de Venf392ecf2006-01-12 18:44:32 +00003293 mutex_unlock(&serial_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003294}
3295EXPORT_SYMBOL(serial8250_unregister_port);
3296
3297static int __init serial8250_init(void)
3298{
Alan Cox25db8ad2008-08-19 20:49:40 -07003299 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003300
Sean Young835d8442012-09-07 19:06:23 +01003301 serial8250_isa_init_ports();
Dave Jonesa61c2d72006-01-07 23:18:19 +00003302
Paul Bollef1fb9bb2008-12-30 14:06:43 +01003303 printk(KERN_INFO "Serial: 8250/16550 driver, "
Dave Jonesa61c2d72006-01-07 23:18:19 +00003304 "%d ports, IRQ sharing %sabled\n", nr_uarts,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003305 share_irqs ? "en" : "dis");
3306
David Millerb70ac772008-10-13 10:36:31 +01003307#ifdef CONFIG_SPARC
3308 ret = sunserial_register_minors(&serial8250_reg, UART_NR);
3309#else
3310 serial8250_reg.nr = UART_NR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003311 ret = uart_register_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003312#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003313 if (ret)
3314 goto out;
3315
Sean Young835d8442012-09-07 19:06:23 +01003316 ret = serial8250_pnp_init();
3317 if (ret)
3318 goto unreg_uart_drv;
3319
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003320 serial8250_isa_devs = platform_device_alloc("serial8250",
3321 PLAT8250_DEV_LEGACY);
3322 if (!serial8250_isa_devs) {
3323 ret = -ENOMEM;
Sean Young835d8442012-09-07 19:06:23 +01003324 goto unreg_pnp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003325 }
3326
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003327 ret = platform_device_add(serial8250_isa_devs);
3328 if (ret)
3329 goto put_dev;
3330
Linus Torvalds1da177e2005-04-16 15:20:36 -07003331 serial8250_register_ports(&serial8250_reg, &serial8250_isa_devs->dev);
3332
Russell Kingbc965a72006-01-18 09:54:29 +00003333 ret = platform_driver_register(&serial8250_isa_driver);
3334 if (ret == 0)
3335 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003336
Russell Kingbc965a72006-01-18 09:54:29 +00003337 platform_device_del(serial8250_isa_devs);
Alan Cox25db8ad2008-08-19 20:49:40 -07003338put_dev:
Dmitry Torokhov7493a312006-01-13 22:06:43 +00003339 platform_device_put(serial8250_isa_devs);
Sean Young835d8442012-09-07 19:06:23 +01003340unreg_pnp:
3341 serial8250_pnp_exit();
Alan Cox25db8ad2008-08-19 20:49:40 -07003342unreg_uart_drv:
David Millerb70ac772008-10-13 10:36:31 +01003343#ifdef CONFIG_SPARC
3344 sunserial_unregister_minors(&serial8250_reg, UART_NR);
3345#else
Linus Torvalds1da177e2005-04-16 15:20:36 -07003346 uart_unregister_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003347#endif
Alan Cox25db8ad2008-08-19 20:49:40 -07003348out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07003349 return ret;
3350}
3351
3352static void __exit serial8250_exit(void)
3353{
3354 struct platform_device *isa_dev = serial8250_isa_devs;
3355
3356 /*
3357 * This tells serial8250_unregister_port() not to re-register
3358 * the ports (thereby making serial8250_isa_driver permanently
3359 * in use.)
3360 */
3361 serial8250_isa_devs = NULL;
3362
Russell King3ae5eae2005-11-09 22:32:44 +00003363 platform_driver_unregister(&serial8250_isa_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003364 platform_device_unregister(isa_dev);
3365
Sean Young835d8442012-09-07 19:06:23 +01003366 serial8250_pnp_exit();
3367
David Millerb70ac772008-10-13 10:36:31 +01003368#ifdef CONFIG_SPARC
3369 sunserial_unregister_minors(&serial8250_reg, UART_NR);
3370#else
Linus Torvalds1da177e2005-04-16 15:20:36 -07003371 uart_unregister_driver(&serial8250_reg);
David Millerb70ac772008-10-13 10:36:31 +01003372#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003373}
3374
3375module_init(serial8250_init);
3376module_exit(serial8250_exit);
3377
3378EXPORT_SYMBOL(serial8250_suspend_port);
3379EXPORT_SYMBOL(serial8250_resume_port);
3380
3381MODULE_LICENSE("GPL");
Adrian Bunkd87a6d92008-07-16 21:53:31 +01003382MODULE_DESCRIPTION("Generic 8250/16x50 serial driver");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003383
3384module_param(share_irqs, uint, 0644);
3385MODULE_PARM_DESC(share_irqs, "Share IRQs with other non-8250/16x50 devices"
3386 " (unsafe)");
3387
Dave Jonesa61c2d72006-01-07 23:18:19 +00003388module_param(nr_uarts, uint, 0644);
3389MODULE_PARM_DESC(nr_uarts, "Maximum number of UARTs supported. (1-" __MODULE_STRING(CONFIG_SERIAL_8250_NR_UARTS) ")");
3390
Chuck Ebbertd41a4b52009-10-01 15:44:26 -07003391module_param(skip_txen_test, uint, 0644);
3392MODULE_PARM_DESC(skip_txen_test, "Skip checking for the TXEN bug at init time");
3393
Linus Torvalds1da177e2005-04-16 15:20:36 -07003394#ifdef CONFIG_SERIAL_8250_RSA
3395module_param_array(probe_rsa, ulong, &probe_rsa_count, 0444);
3396MODULE_PARM_DESC(probe_rsa, "Probe I/O ports for RSA");
3397#endif
3398MODULE_ALIAS_CHARDEV_MAJOR(TTY_MAJOR);