19196d8acSJiri Slaby /*
29196d8acSJiri Slaby  *  Driver for 8250/16550-type serial ports
39196d8acSJiri Slaby  *
49196d8acSJiri Slaby  *  Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
59196d8acSJiri Slaby  *
69196d8acSJiri Slaby  *  Copyright (C) 2001 Russell King.
79196d8acSJiri Slaby  *
89196d8acSJiri Slaby  * This program is free software; you can redistribute it and/or modify
99196d8acSJiri Slaby  * it under the terms of the GNU General Public License as published by
109196d8acSJiri Slaby  * the Free Software Foundation; either version 2 of the License, or
119196d8acSJiri Slaby  * (at your option) any later version.
129196d8acSJiri Slaby  *
139196d8acSJiri Slaby  * A note about mapbase / membase
149196d8acSJiri Slaby  *
159196d8acSJiri Slaby  *  mapbase is the physical address of the IO port.
169196d8acSJiri Slaby  *  membase is an 'ioremapped' cookie.
179196d8acSJiri Slaby  */
189196d8acSJiri Slaby 
199196d8acSJiri Slaby #if defined(CONFIG_SERIAL_8250_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
209196d8acSJiri Slaby #define SUPPORT_SYSRQ
219196d8acSJiri Slaby #endif
229196d8acSJiri Slaby 
239196d8acSJiri Slaby #include <linux/module.h>
249196d8acSJiri Slaby #include <linux/moduleparam.h>
259196d8acSJiri Slaby #include <linux/ioport.h>
269196d8acSJiri Slaby #include <linux/init.h>
279196d8acSJiri Slaby #include <linux/console.h>
289196d8acSJiri Slaby #include <linux/sysrq.h>
299196d8acSJiri Slaby #include <linux/delay.h>
309196d8acSJiri Slaby #include <linux/platform_device.h>
319196d8acSJiri Slaby #include <linux/tty.h>
329196d8acSJiri Slaby #include <linux/ratelimit.h>
339196d8acSJiri Slaby #include <linux/tty_flip.h>
349196d8acSJiri Slaby #include <linux/serial_core.h>
359196d8acSJiri Slaby #include <linux/serial.h>
369196d8acSJiri Slaby #include <linux/serial_8250.h>
379196d8acSJiri Slaby #include <linux/nmi.h>
389196d8acSJiri Slaby #include <linux/mutex.h>
399196d8acSJiri Slaby #include <linux/slab.h>
400b4af1d9SRicardo Ribalda Delgado #include <linux/uaccess.h>
41d74d5d1bSSebastian Andrzej Siewior #include <linux/pm_runtime.h>
429196d8acSJiri Slaby #ifdef CONFIG_SPARC
439196d8acSJiri Slaby #include <linux/sunserialcore.h>
449196d8acSJiri Slaby #endif
459196d8acSJiri Slaby 
469196d8acSJiri Slaby #include <asm/io.h>
479196d8acSJiri Slaby #include <asm/irq.h>
489196d8acSJiri Slaby 
499196d8acSJiri Slaby #include "8250.h"
509196d8acSJiri Slaby 
519196d8acSJiri Slaby /*
529196d8acSJiri Slaby  * Configuration:
539196d8acSJiri Slaby  *   share_irqs - whether we pass IRQF_SHARED to request_irq().  This option
549196d8acSJiri Slaby  *                is unsafe when used on edge-triggered interrupts.
559196d8acSJiri Slaby  */
569196d8acSJiri Slaby static unsigned int share_irqs = SERIAL8250_SHARE_IRQS;
579196d8acSJiri Slaby 
589196d8acSJiri Slaby static unsigned int nr_uarts = CONFIG_SERIAL_8250_RUNTIME_UARTS;
599196d8acSJiri Slaby 
609196d8acSJiri Slaby static struct uart_driver serial8250_reg;
619196d8acSJiri Slaby 
629196d8acSJiri Slaby static int serial_index(struct uart_port *port)
639196d8acSJiri Slaby {
649196d8acSJiri Slaby 	return (serial8250_reg.minor - 64) + port->line;
659196d8acSJiri Slaby }
669196d8acSJiri Slaby 
679196d8acSJiri Slaby static unsigned int skip_txen_test; /* force skip of txen test at init time */
689196d8acSJiri Slaby 
699196d8acSJiri Slaby /*
709196d8acSJiri Slaby  * Debugging.
719196d8acSJiri Slaby  */
729196d8acSJiri Slaby #if 0
739196d8acSJiri Slaby #define DEBUG_AUTOCONF(fmt...)	printk(fmt)
749196d8acSJiri Slaby #else
759196d8acSJiri Slaby #define DEBUG_AUTOCONF(fmt...)	do { } while (0)
769196d8acSJiri Slaby #endif
779196d8acSJiri Slaby 
789196d8acSJiri Slaby #if 0
799196d8acSJiri Slaby #define DEBUG_INTR(fmt...)	printk(fmt)
809196d8acSJiri Slaby #else
819196d8acSJiri Slaby #define DEBUG_INTR(fmt...)	do { } while (0)
829196d8acSJiri Slaby #endif
839196d8acSJiri Slaby 
849196d8acSJiri Slaby #define PASS_LIMIT	512
859196d8acSJiri Slaby 
869196d8acSJiri Slaby #define BOTH_EMPTY 	(UART_LSR_TEMT | UART_LSR_THRE)
879196d8acSJiri Slaby 
889196d8acSJiri Slaby 
899196d8acSJiri Slaby #ifdef CONFIG_SERIAL_8250_DETECT_IRQ
909196d8acSJiri Slaby #define CONFIG_SERIAL_DETECT_IRQ 1
919196d8acSJiri Slaby #endif
929196d8acSJiri Slaby #ifdef CONFIG_SERIAL_8250_MANY_PORTS
939196d8acSJiri Slaby #define CONFIG_SERIAL_MANY_PORTS 1
949196d8acSJiri Slaby #endif
959196d8acSJiri Slaby 
969196d8acSJiri Slaby /*
979196d8acSJiri Slaby  * HUB6 is always on.  This will be removed once the header
989196d8acSJiri Slaby  * files have been cleaned.
999196d8acSJiri Slaby  */
1009196d8acSJiri Slaby #define CONFIG_HUB6 1
1019196d8acSJiri Slaby 
1029196d8acSJiri Slaby #include <asm/serial.h>
1039196d8acSJiri Slaby /*
1049196d8acSJiri Slaby  * SERIAL_PORT_DFNS tells us about built-in ports that have no
1059196d8acSJiri Slaby  * standard enumeration mechanism.   Platforms that can find all
1069196d8acSJiri Slaby  * serial ports via mechanisms like ACPI or PCI need not supply it.
1079196d8acSJiri Slaby  */
1089196d8acSJiri Slaby #ifndef SERIAL_PORT_DFNS
1099196d8acSJiri Slaby #define SERIAL_PORT_DFNS
1109196d8acSJiri Slaby #endif
1119196d8acSJiri Slaby 
1129196d8acSJiri Slaby static const struct old_serial_port old_serial_port[] = {
1139196d8acSJiri Slaby 	SERIAL_PORT_DFNS /* defined in asm/serial.h */
1149196d8acSJiri Slaby };
1159196d8acSJiri Slaby 
1169196d8acSJiri Slaby #define UART_NR	CONFIG_SERIAL_8250_NR_UARTS
1179196d8acSJiri Slaby 
1189196d8acSJiri Slaby #ifdef CONFIG_SERIAL_8250_RSA
1199196d8acSJiri Slaby 
1209196d8acSJiri Slaby #define PORT_RSA_MAX 4
1219196d8acSJiri Slaby static unsigned long probe_rsa[PORT_RSA_MAX];
1229196d8acSJiri Slaby static unsigned int probe_rsa_count;
1239196d8acSJiri Slaby #endif /* CONFIG_SERIAL_8250_RSA  */
1249196d8acSJiri Slaby 
1259196d8acSJiri Slaby struct irq_info {
1269196d8acSJiri Slaby 	struct			hlist_node node;
1279196d8acSJiri Slaby 	int			irq;
1289196d8acSJiri Slaby 	spinlock_t		lock;	/* Protects list not the hash */
1299196d8acSJiri Slaby 	struct list_head	*head;
1309196d8acSJiri Slaby };
1319196d8acSJiri Slaby 
1329196d8acSJiri Slaby #define NR_IRQ_HASH		32	/* Can be adjusted later */
1339196d8acSJiri Slaby static struct hlist_head irq_lists[NR_IRQ_HASH];
1349196d8acSJiri Slaby static DEFINE_MUTEX(hash_mutex);	/* Used to walk the hash */
1359196d8acSJiri Slaby 
1369196d8acSJiri Slaby /*
1379196d8acSJiri Slaby  * Here we define the default xmit fifo size used for each type of UART.
1389196d8acSJiri Slaby  */
1399196d8acSJiri Slaby static const struct serial8250_config uart_config[] = {
1409196d8acSJiri Slaby 	[PORT_UNKNOWN] = {
1419196d8acSJiri Slaby 		.name		= "unknown",
1429196d8acSJiri Slaby 		.fifo_size	= 1,
1439196d8acSJiri Slaby 		.tx_loadsz	= 1,
1449196d8acSJiri Slaby 	},
1459196d8acSJiri Slaby 	[PORT_8250] = {
1469196d8acSJiri Slaby 		.name		= "8250",
1479196d8acSJiri Slaby 		.fifo_size	= 1,
1489196d8acSJiri Slaby 		.tx_loadsz	= 1,
1499196d8acSJiri Slaby 	},
1509196d8acSJiri Slaby 	[PORT_16450] = {
1519196d8acSJiri Slaby 		.name		= "16450",
1529196d8acSJiri Slaby 		.fifo_size	= 1,
1539196d8acSJiri Slaby 		.tx_loadsz	= 1,
1549196d8acSJiri Slaby 	},
1559196d8acSJiri Slaby 	[PORT_16550] = {
1569196d8acSJiri Slaby 		.name		= "16550",
1579196d8acSJiri Slaby 		.fifo_size	= 1,
1589196d8acSJiri Slaby 		.tx_loadsz	= 1,
1599196d8acSJiri Slaby 	},
1609196d8acSJiri Slaby 	[PORT_16550A] = {
1619196d8acSJiri Slaby 		.name		= "16550A",
1629196d8acSJiri Slaby 		.fifo_size	= 16,
1639196d8acSJiri Slaby 		.tx_loadsz	= 16,
1649196d8acSJiri Slaby 		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
165aef9a7bdSYoshihiro YUNOMAE 		.rxtrig_bytes	= {1, 4, 8, 14},
1669196d8acSJiri Slaby 		.flags		= UART_CAP_FIFO,
1679196d8acSJiri Slaby 	},
1689196d8acSJiri Slaby 	[PORT_CIRRUS] = {
1699196d8acSJiri Slaby 		.name		= "Cirrus",
1709196d8acSJiri Slaby 		.fifo_size	= 1,
1719196d8acSJiri Slaby 		.tx_loadsz	= 1,
1729196d8acSJiri Slaby 	},
1739196d8acSJiri Slaby 	[PORT_16650] = {
1749196d8acSJiri Slaby 		.name		= "ST16650",
1759196d8acSJiri Slaby 		.fifo_size	= 1,
1769196d8acSJiri Slaby 		.tx_loadsz	= 1,
1779196d8acSJiri Slaby 		.flags		= UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
1789196d8acSJiri Slaby 	},
1799196d8acSJiri Slaby 	[PORT_16650V2] = {
1809196d8acSJiri Slaby 		.name		= "ST16650V2",
1819196d8acSJiri Slaby 		.fifo_size	= 32,
1829196d8acSJiri Slaby 		.tx_loadsz	= 16,
1839196d8acSJiri Slaby 		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
1849196d8acSJiri Slaby 				  UART_FCR_T_TRIG_00,
185aef9a7bdSYoshihiro YUNOMAE 		.rxtrig_bytes	= {8, 16, 24, 28},
1869196d8acSJiri Slaby 		.flags		= UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
1879196d8acSJiri Slaby 	},
1889196d8acSJiri Slaby 	[PORT_16750] = {
1899196d8acSJiri Slaby 		.name		= "TI16750",
1909196d8acSJiri Slaby 		.fifo_size	= 64,
1919196d8acSJiri Slaby 		.tx_loadsz	= 64,
1929196d8acSJiri Slaby 		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 |
1939196d8acSJiri Slaby 				  UART_FCR7_64BYTE,
194aef9a7bdSYoshihiro YUNOMAE 		.rxtrig_bytes	= {1, 16, 32, 56},
1959196d8acSJiri Slaby 		.flags		= UART_CAP_FIFO | UART_CAP_SLEEP | UART_CAP_AFE,
1969196d8acSJiri Slaby 	},
1979196d8acSJiri Slaby 	[PORT_STARTECH] = {
1989196d8acSJiri Slaby 		.name		= "Startech",
1999196d8acSJiri Slaby 		.fifo_size	= 1,
2009196d8acSJiri Slaby 		.tx_loadsz	= 1,
2019196d8acSJiri Slaby 	},
2029196d8acSJiri Slaby 	[PORT_16C950] = {
2039196d8acSJiri Slaby 		.name		= "16C950/954",
2049196d8acSJiri Slaby 		.fifo_size	= 128,
2059196d8acSJiri Slaby 		.tx_loadsz	= 128,
2069196d8acSJiri Slaby 		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
2079196d8acSJiri Slaby 		/* UART_CAP_EFR breaks billionon CF bluetooth card. */
2089196d8acSJiri Slaby 		.flags		= UART_CAP_FIFO | UART_CAP_SLEEP,
2099196d8acSJiri Slaby 	},
2109196d8acSJiri Slaby 	[PORT_16654] = {
2119196d8acSJiri Slaby 		.name		= "ST16654",
2129196d8acSJiri Slaby 		.fifo_size	= 64,
2139196d8acSJiri Slaby 		.tx_loadsz	= 32,
2149196d8acSJiri Slaby 		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
2159196d8acSJiri Slaby 				  UART_FCR_T_TRIG_10,
216aef9a7bdSYoshihiro YUNOMAE 		.rxtrig_bytes	= {8, 16, 56, 60},
2179196d8acSJiri Slaby 		.flags		= UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
2189196d8acSJiri Slaby 	},
2199196d8acSJiri Slaby 	[PORT_16850] = {
2209196d8acSJiri Slaby 		.name		= "XR16850",
2219196d8acSJiri Slaby 		.fifo_size	= 128,
2229196d8acSJiri Slaby 		.tx_loadsz	= 128,
2239196d8acSJiri Slaby 		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
2249196d8acSJiri Slaby 		.flags		= UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
2259196d8acSJiri Slaby 	},
2269196d8acSJiri Slaby 	[PORT_RSA] = {
2279196d8acSJiri Slaby 		.name		= "RSA",
2289196d8acSJiri Slaby 		.fifo_size	= 2048,
2299196d8acSJiri Slaby 		.tx_loadsz	= 2048,
2309196d8acSJiri Slaby 		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_11,
2319196d8acSJiri Slaby 		.flags		= UART_CAP_FIFO,
2329196d8acSJiri Slaby 	},
2339196d8acSJiri Slaby 	[PORT_NS16550A] = {
2349196d8acSJiri Slaby 		.name		= "NS16550A",
2359196d8acSJiri Slaby 		.fifo_size	= 16,
2369196d8acSJiri Slaby 		.tx_loadsz	= 16,
2379196d8acSJiri Slaby 		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
2389196d8acSJiri Slaby 		.flags		= UART_CAP_FIFO | UART_NATSEMI,
2399196d8acSJiri Slaby 	},
2409196d8acSJiri Slaby 	[PORT_XSCALE] = {
2419196d8acSJiri Slaby 		.name		= "XScale",
2429196d8acSJiri Slaby 		.fifo_size	= 32,
2439196d8acSJiri Slaby 		.tx_loadsz	= 32,
2449196d8acSJiri Slaby 		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
2459196d8acSJiri Slaby 		.flags		= UART_CAP_FIFO | UART_CAP_UUE | UART_CAP_RTOIE,
2469196d8acSJiri Slaby 	},
2479196d8acSJiri Slaby 	[PORT_OCTEON] = {
2489196d8acSJiri Slaby 		.name		= "OCTEON",
2499196d8acSJiri Slaby 		.fifo_size	= 64,
2509196d8acSJiri Slaby 		.tx_loadsz	= 64,
2519196d8acSJiri Slaby 		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
2529196d8acSJiri Slaby 		.flags		= UART_CAP_FIFO,
2539196d8acSJiri Slaby 	},
2549196d8acSJiri Slaby 	[PORT_AR7] = {
2559196d8acSJiri Slaby 		.name		= "AR7",
2569196d8acSJiri Slaby 		.fifo_size	= 16,
2579196d8acSJiri Slaby 		.tx_loadsz	= 16,
2589196d8acSJiri Slaby 		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_00,
2599196d8acSJiri Slaby 		.flags		= UART_CAP_FIFO | UART_CAP_AFE,
2609196d8acSJiri Slaby 	},
2619196d8acSJiri Slaby 	[PORT_U6_16550A] = {
2629196d8acSJiri Slaby 		.name		= "U6_16550A",
2639196d8acSJiri Slaby 		.fifo_size	= 64,
2649196d8acSJiri Slaby 		.tx_loadsz	= 64,
2659196d8acSJiri Slaby 		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
2669196d8acSJiri Slaby 		.flags		= UART_CAP_FIFO | UART_CAP_AFE,
2679196d8acSJiri Slaby 	},
2689196d8acSJiri Slaby 	[PORT_TEGRA] = {
2699196d8acSJiri Slaby 		.name		= "Tegra",
2709196d8acSJiri Slaby 		.fifo_size	= 32,
2719196d8acSJiri Slaby 		.tx_loadsz	= 8,
2729196d8acSJiri Slaby 		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
2739196d8acSJiri Slaby 				  UART_FCR_T_TRIG_01,
274aef9a7bdSYoshihiro YUNOMAE 		.rxtrig_bytes	= {1, 4, 8, 14},
2759196d8acSJiri Slaby 		.flags		= UART_CAP_FIFO | UART_CAP_RTOIE,
2769196d8acSJiri Slaby 	},
2779196d8acSJiri Slaby 	[PORT_XR17D15X] = {
2789196d8acSJiri Slaby 		.name		= "XR17D15X",
2799196d8acSJiri Slaby 		.fifo_size	= 64,
2809196d8acSJiri Slaby 		.tx_loadsz	= 64,
2819196d8acSJiri Slaby 		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
2829196d8acSJiri Slaby 		.flags		= UART_CAP_FIFO | UART_CAP_AFE | UART_CAP_EFR |
2839196d8acSJiri Slaby 				  UART_CAP_SLEEP,
2849196d8acSJiri Slaby 	},
2859196d8acSJiri Slaby 	[PORT_XR17V35X] = {
2869196d8acSJiri Slaby 		.name		= "XR17V35X",
2879196d8acSJiri Slaby 		.fifo_size	= 256,
2889196d8acSJiri Slaby 		.tx_loadsz	= 256,
2899196d8acSJiri Slaby 		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_11 |
2909196d8acSJiri Slaby 				  UART_FCR_T_TRIG_11,
2919196d8acSJiri Slaby 		.flags		= UART_CAP_FIFO | UART_CAP_AFE | UART_CAP_EFR |
2929196d8acSJiri Slaby 				  UART_CAP_SLEEP,
2939196d8acSJiri Slaby 	},
2949196d8acSJiri Slaby 	[PORT_LPC3220] = {
2959196d8acSJiri Slaby 		.name		= "LPC3220",
2969196d8acSJiri Slaby 		.fifo_size	= 64,
2979196d8acSJiri Slaby 		.tx_loadsz	= 32,
2989196d8acSJiri Slaby 		.fcr		= UART_FCR_DMA_SELECT | UART_FCR_ENABLE_FIFO |
2999196d8acSJiri Slaby 				  UART_FCR_R_TRIG_00 | UART_FCR_T_TRIG_00,
3009196d8acSJiri Slaby 		.flags		= UART_CAP_FIFO,
3019196d8acSJiri Slaby 	},
3029196d8acSJiri Slaby 	[PORT_BRCM_TRUMANAGE] = {
3039196d8acSJiri Slaby 		.name		= "TruManage",
3049196d8acSJiri Slaby 		.fifo_size	= 1,
3059196d8acSJiri Slaby 		.tx_loadsz	= 1024,
3069196d8acSJiri Slaby 		.flags		= UART_CAP_HFIFO,
3079196d8acSJiri Slaby 	},
3089196d8acSJiri Slaby 	[PORT_8250_CIR] = {
3099196d8acSJiri Slaby 		.name		= "CIR port"
3109196d8acSJiri Slaby 	},
3119196d8acSJiri Slaby 	[PORT_ALTR_16550_F32] = {
3129196d8acSJiri Slaby 		.name		= "Altera 16550 FIFO32",
3139196d8acSJiri Slaby 		.fifo_size	= 32,
3149196d8acSJiri Slaby 		.tx_loadsz	= 32,
3159196d8acSJiri Slaby 		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
3169196d8acSJiri Slaby 		.flags		= UART_CAP_FIFO | UART_CAP_AFE,
3179196d8acSJiri Slaby 	},
3189196d8acSJiri Slaby 	[PORT_ALTR_16550_F64] = {
3199196d8acSJiri Slaby 		.name		= "Altera 16550 FIFO64",
3209196d8acSJiri Slaby 		.fifo_size	= 64,
3219196d8acSJiri Slaby 		.tx_loadsz	= 64,
3229196d8acSJiri Slaby 		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
3239196d8acSJiri Slaby 		.flags		= UART_CAP_FIFO | UART_CAP_AFE,
3249196d8acSJiri Slaby 	},
3259196d8acSJiri Slaby 	[PORT_ALTR_16550_F128] = {
3269196d8acSJiri Slaby 		.name		= "Altera 16550 FIFO128",
3279196d8acSJiri Slaby 		.fifo_size	= 128,
3289196d8acSJiri Slaby 		.tx_loadsz	= 128,
3299196d8acSJiri Slaby 		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
3309196d8acSJiri Slaby 		.flags		= UART_CAP_FIFO | UART_CAP_AFE,
3319196d8acSJiri Slaby 	},
3329196d8acSJiri Slaby };
3339196d8acSJiri Slaby 
3349196d8acSJiri Slaby /* Uart divisor latch read */
3359196d8acSJiri Slaby static int default_serial_dl_read(struct uart_8250_port *up)
3369196d8acSJiri Slaby {
3379196d8acSJiri Slaby 	return serial_in(up, UART_DLL) | serial_in(up, UART_DLM) << 8;
3389196d8acSJiri Slaby }
3399196d8acSJiri Slaby 
3409196d8acSJiri Slaby /* Uart divisor latch write */
3419196d8acSJiri Slaby static void default_serial_dl_write(struct uart_8250_port *up, int value)
3429196d8acSJiri Slaby {
3439196d8acSJiri Slaby 	serial_out(up, UART_DLL, value & 0xff);
3449196d8acSJiri Slaby 	serial_out(up, UART_DLM, value >> 8 & 0xff);
3459196d8acSJiri Slaby }
3469196d8acSJiri Slaby 
3479196d8acSJiri Slaby #if defined(CONFIG_MIPS_ALCHEMY) || defined(CONFIG_SERIAL_8250_RT288X)
3489196d8acSJiri Slaby 
3499196d8acSJiri Slaby /* Au1x00/RT288x UART hardware has a weird register layout */
3509196d8acSJiri Slaby static const u8 au_io_in_map[] = {
3519196d8acSJiri Slaby 	[UART_RX]  = 0,
3529196d8acSJiri Slaby 	[UART_IER] = 2,
3539196d8acSJiri Slaby 	[UART_IIR] = 3,
3549196d8acSJiri Slaby 	[UART_LCR] = 5,
3559196d8acSJiri Slaby 	[UART_MCR] = 6,
3569196d8acSJiri Slaby 	[UART_LSR] = 7,
3579196d8acSJiri Slaby 	[UART_MSR] = 8,
3589196d8acSJiri Slaby };
3599196d8acSJiri Slaby 
3609196d8acSJiri Slaby static const u8 au_io_out_map[] = {
3619196d8acSJiri Slaby 	[UART_TX]  = 1,
3629196d8acSJiri Slaby 	[UART_IER] = 2,
3639196d8acSJiri Slaby 	[UART_FCR] = 4,
3649196d8acSJiri Slaby 	[UART_LCR] = 5,
3659196d8acSJiri Slaby 	[UART_MCR] = 6,
3669196d8acSJiri Slaby };
3679196d8acSJiri Slaby 
3689196d8acSJiri Slaby static unsigned int au_serial_in(struct uart_port *p, int offset)
3699196d8acSJiri Slaby {
3709196d8acSJiri Slaby 	offset = au_io_in_map[offset] << p->regshift;
3719196d8acSJiri Slaby 	return __raw_readl(p->membase + offset);
3729196d8acSJiri Slaby }
3739196d8acSJiri Slaby 
3749196d8acSJiri Slaby static void au_serial_out(struct uart_port *p, int offset, int value)
3759196d8acSJiri Slaby {
3769196d8acSJiri Slaby 	offset = au_io_out_map[offset] << p->regshift;
3779196d8acSJiri Slaby 	__raw_writel(value, p->membase + offset);
3789196d8acSJiri Slaby }
3799196d8acSJiri Slaby 
3809196d8acSJiri Slaby /* Au1x00 haven't got a standard divisor latch */
3819196d8acSJiri Slaby static int au_serial_dl_read(struct uart_8250_port *up)
3829196d8acSJiri Slaby {
3839196d8acSJiri Slaby 	return __raw_readl(up->port.membase + 0x28);
3849196d8acSJiri Slaby }
3859196d8acSJiri Slaby 
3869196d8acSJiri Slaby static void au_serial_dl_write(struct uart_8250_port *up, int value)
3879196d8acSJiri Slaby {
3889196d8acSJiri Slaby 	__raw_writel(value, up->port.membase + 0x28);
3899196d8acSJiri Slaby }
3909196d8acSJiri Slaby 
3919196d8acSJiri Slaby #endif
3929196d8acSJiri Slaby 
3939196d8acSJiri Slaby static unsigned int hub6_serial_in(struct uart_port *p, int offset)
3949196d8acSJiri Slaby {
3959196d8acSJiri Slaby 	offset = offset << p->regshift;
3969196d8acSJiri Slaby 	outb(p->hub6 - 1 + offset, p->iobase);
3979196d8acSJiri Slaby 	return inb(p->iobase + 1);
3989196d8acSJiri Slaby }
3999196d8acSJiri Slaby 
4009196d8acSJiri Slaby static void hub6_serial_out(struct uart_port *p, int offset, int value)
4019196d8acSJiri Slaby {
4029196d8acSJiri Slaby 	offset = offset << p->regshift;
4039196d8acSJiri Slaby 	outb(p->hub6 - 1 + offset, p->iobase);
4049196d8acSJiri Slaby 	outb(value, p->iobase + 1);
4059196d8acSJiri Slaby }
4069196d8acSJiri Slaby 
4079196d8acSJiri Slaby static unsigned int mem_serial_in(struct uart_port *p, int offset)
4089196d8acSJiri Slaby {
4099196d8acSJiri Slaby 	offset = offset << p->regshift;
4109196d8acSJiri Slaby 	return readb(p->membase + offset);
4119196d8acSJiri Slaby }
4129196d8acSJiri Slaby 
4139196d8acSJiri Slaby static void mem_serial_out(struct uart_port *p, int offset, int value)
4149196d8acSJiri Slaby {
4159196d8acSJiri Slaby 	offset = offset << p->regshift;
4169196d8acSJiri Slaby 	writeb(value, p->membase + offset);
4179196d8acSJiri Slaby }
4189196d8acSJiri Slaby 
4199196d8acSJiri Slaby static void mem32_serial_out(struct uart_port *p, int offset, int value)
4209196d8acSJiri Slaby {
4219196d8acSJiri Slaby 	offset = offset << p->regshift;
4229196d8acSJiri Slaby 	writel(value, p->membase + offset);
4239196d8acSJiri Slaby }
4249196d8acSJiri Slaby 
4259196d8acSJiri Slaby static unsigned int mem32_serial_in(struct uart_port *p, int offset)
4269196d8acSJiri Slaby {
4279196d8acSJiri Slaby 	offset = offset << p->regshift;
4289196d8acSJiri Slaby 	return readl(p->membase + offset);
4299196d8acSJiri Slaby }
4309196d8acSJiri Slaby 
4319196d8acSJiri Slaby static unsigned int io_serial_in(struct uart_port *p, int offset)
4329196d8acSJiri Slaby {
4339196d8acSJiri Slaby 	offset = offset << p->regshift;
4349196d8acSJiri Slaby 	return inb(p->iobase + offset);
4359196d8acSJiri Slaby }
4369196d8acSJiri Slaby 
4379196d8acSJiri Slaby static void io_serial_out(struct uart_port *p, int offset, int value)
4389196d8acSJiri Slaby {
4399196d8acSJiri Slaby 	offset = offset << p->regshift;
4409196d8acSJiri Slaby 	outb(value, p->iobase + offset);
4419196d8acSJiri Slaby }
4429196d8acSJiri Slaby 
4439196d8acSJiri Slaby static int serial8250_default_handle_irq(struct uart_port *port);
4449196d8acSJiri Slaby static int exar_handle_irq(struct uart_port *port);
4459196d8acSJiri Slaby 
4469196d8acSJiri Slaby static void set_io_from_upio(struct uart_port *p)
4479196d8acSJiri Slaby {
448b1261c86SAndy Shevchenko 	struct uart_8250_port *up = up_to_u8250p(p);
4499196d8acSJiri Slaby 
4509196d8acSJiri Slaby 	up->dl_read = default_serial_dl_read;
4519196d8acSJiri Slaby 	up->dl_write = default_serial_dl_write;
4529196d8acSJiri Slaby 
4539196d8acSJiri Slaby 	switch (p->iotype) {
4549196d8acSJiri Slaby 	case UPIO_HUB6:
4559196d8acSJiri Slaby 		p->serial_in = hub6_serial_in;
4569196d8acSJiri Slaby 		p->serial_out = hub6_serial_out;
4579196d8acSJiri Slaby 		break;
4589196d8acSJiri Slaby 
4599196d8acSJiri Slaby 	case UPIO_MEM:
4609196d8acSJiri Slaby 		p->serial_in = mem_serial_in;
4619196d8acSJiri Slaby 		p->serial_out = mem_serial_out;
4629196d8acSJiri Slaby 		break;
4639196d8acSJiri Slaby 
4649196d8acSJiri Slaby 	case UPIO_MEM32:
4659196d8acSJiri Slaby 		p->serial_in = mem32_serial_in;
4669196d8acSJiri Slaby 		p->serial_out = mem32_serial_out;
4679196d8acSJiri Slaby 		break;
4689196d8acSJiri Slaby 
4699196d8acSJiri Slaby #if defined(CONFIG_MIPS_ALCHEMY) || defined(CONFIG_SERIAL_8250_RT288X)
4709196d8acSJiri Slaby 	case UPIO_AU:
4719196d8acSJiri Slaby 		p->serial_in = au_serial_in;
4729196d8acSJiri Slaby 		p->serial_out = au_serial_out;
4739196d8acSJiri Slaby 		up->dl_read = au_serial_dl_read;
4749196d8acSJiri Slaby 		up->dl_write = au_serial_dl_write;
4759196d8acSJiri Slaby 		break;
4769196d8acSJiri Slaby #endif
4779196d8acSJiri Slaby 
4789196d8acSJiri Slaby 	default:
4799196d8acSJiri Slaby 		p->serial_in = io_serial_in;
4809196d8acSJiri Slaby 		p->serial_out = io_serial_out;
4819196d8acSJiri Slaby 		break;
4829196d8acSJiri Slaby 	}
4839196d8acSJiri Slaby 	/* Remember loaded iotype */
4849196d8acSJiri Slaby 	up->cur_iotype = p->iotype;
4859196d8acSJiri Slaby 	p->handle_irq = serial8250_default_handle_irq;
4869196d8acSJiri Slaby }
4879196d8acSJiri Slaby 
4889196d8acSJiri Slaby static void
4899196d8acSJiri Slaby serial_port_out_sync(struct uart_port *p, int offset, int value)
4909196d8acSJiri Slaby {
4919196d8acSJiri Slaby 	switch (p->iotype) {
4929196d8acSJiri Slaby 	case UPIO_MEM:
4939196d8acSJiri Slaby 	case UPIO_MEM32:
4949196d8acSJiri Slaby 	case UPIO_AU:
4959196d8acSJiri Slaby 		p->serial_out(p, offset, value);
4969196d8acSJiri Slaby 		p->serial_in(p, UART_LCR);	/* safe, no side-effects */
4979196d8acSJiri Slaby 		break;
4989196d8acSJiri Slaby 	default:
4999196d8acSJiri Slaby 		p->serial_out(p, offset, value);
5009196d8acSJiri Slaby 	}
5019196d8acSJiri Slaby }
5029196d8acSJiri Slaby 
5039196d8acSJiri Slaby /*
5049196d8acSJiri Slaby  * For the 16C950
5059196d8acSJiri Slaby  */
5069196d8acSJiri Slaby static void serial_icr_write(struct uart_8250_port *up, int offset, int value)
5079196d8acSJiri Slaby {
5089196d8acSJiri Slaby 	serial_out(up, UART_SCR, offset);
5099196d8acSJiri Slaby 	serial_out(up, UART_ICR, value);
5109196d8acSJiri Slaby }
5119196d8acSJiri Slaby 
5129196d8acSJiri Slaby static unsigned int serial_icr_read(struct uart_8250_port *up, int offset)
5139196d8acSJiri Slaby {
5149196d8acSJiri Slaby 	unsigned int value;
5159196d8acSJiri Slaby 
5169196d8acSJiri Slaby 	serial_icr_write(up, UART_ACR, up->acr | UART_ACR_ICRRD);
5179196d8acSJiri Slaby 	serial_out(up, UART_SCR, offset);
5189196d8acSJiri Slaby 	value = serial_in(up, UART_ICR);
5199196d8acSJiri Slaby 	serial_icr_write(up, UART_ACR, up->acr);
5209196d8acSJiri Slaby 
5219196d8acSJiri Slaby 	return value;
5229196d8acSJiri Slaby }
5239196d8acSJiri Slaby 
5249196d8acSJiri Slaby /*
5259196d8acSJiri Slaby  * FIFO support.
5269196d8acSJiri Slaby  */
5279196d8acSJiri Slaby static void serial8250_clear_fifos(struct uart_8250_port *p)
5289196d8acSJiri Slaby {
5299196d8acSJiri Slaby 	if (p->capabilities & UART_CAP_FIFO) {
5309196d8acSJiri Slaby 		serial_out(p, UART_FCR, UART_FCR_ENABLE_FIFO);
5319196d8acSJiri Slaby 		serial_out(p, UART_FCR, UART_FCR_ENABLE_FIFO |
5329196d8acSJiri Slaby 			       UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
5339196d8acSJiri Slaby 		serial_out(p, UART_FCR, 0);
5349196d8acSJiri Slaby 	}
5359196d8acSJiri Slaby }
5369196d8acSJiri Slaby 
5379196d8acSJiri Slaby void serial8250_clear_and_reinit_fifos(struct uart_8250_port *p)
5389196d8acSJiri Slaby {
5399196d8acSJiri Slaby 	serial8250_clear_fifos(p);
540aef9a7bdSYoshihiro YUNOMAE 	serial_out(p, UART_FCR, p->fcr);
5419196d8acSJiri Slaby }
5429196d8acSJiri Slaby EXPORT_SYMBOL_GPL(serial8250_clear_and_reinit_fifos);
5439196d8acSJiri Slaby 
544d74d5d1bSSebastian Andrzej Siewior static void serial8250_rpm_get(struct uart_8250_port *p)
545d74d5d1bSSebastian Andrzej Siewior {
546d74d5d1bSSebastian Andrzej Siewior 	if (!(p->capabilities & UART_CAP_RPM))
547d74d5d1bSSebastian Andrzej Siewior 		return;
548d74d5d1bSSebastian Andrzej Siewior 	pm_runtime_get_sync(p->port.dev);
549d74d5d1bSSebastian Andrzej Siewior }
550d74d5d1bSSebastian Andrzej Siewior 
551d74d5d1bSSebastian Andrzej Siewior static void serial8250_rpm_put(struct uart_8250_port *p)
552d74d5d1bSSebastian Andrzej Siewior {
553d74d5d1bSSebastian Andrzej Siewior 	if (!(p->capabilities & UART_CAP_RPM))
554d74d5d1bSSebastian Andrzej Siewior 		return;
555d74d5d1bSSebastian Andrzej Siewior 	pm_runtime_mark_last_busy(p->port.dev);
556d74d5d1bSSebastian Andrzej Siewior 	pm_runtime_put_autosuspend(p->port.dev);
557d74d5d1bSSebastian Andrzej Siewior }
558d74d5d1bSSebastian Andrzej Siewior 
559d74d5d1bSSebastian Andrzej Siewior /*
560d74d5d1bSSebastian Andrzej Siewior  * This two wrapper ensure, that enable_runtime_pm_tx() can be called more than
561d74d5d1bSSebastian Andrzej Siewior  * once and disable_runtime_pm_tx() will still disable RPM because the fifo is
562d74d5d1bSSebastian Andrzej Siewior  * empty and the HW can idle again.
563d74d5d1bSSebastian Andrzej Siewior  */
564d74d5d1bSSebastian Andrzej Siewior static void serial8250_rpm_get_tx(struct uart_8250_port *p)
565d74d5d1bSSebastian Andrzej Siewior {
566d74d5d1bSSebastian Andrzej Siewior 	unsigned char rpm_active;
567d74d5d1bSSebastian Andrzej Siewior 
568d74d5d1bSSebastian Andrzej Siewior 	if (!(p->capabilities & UART_CAP_RPM))
569d74d5d1bSSebastian Andrzej Siewior 		return;
570d74d5d1bSSebastian Andrzej Siewior 
571d74d5d1bSSebastian Andrzej Siewior 	rpm_active = xchg(&p->rpm_tx_active, 1);
572d74d5d1bSSebastian Andrzej Siewior 	if (rpm_active)
573d74d5d1bSSebastian Andrzej Siewior 		return;
574d74d5d1bSSebastian Andrzej Siewior 	pm_runtime_get_sync(p->port.dev);
575d74d5d1bSSebastian Andrzej Siewior }
576d74d5d1bSSebastian Andrzej Siewior 
577d74d5d1bSSebastian Andrzej Siewior static void serial8250_rpm_put_tx(struct uart_8250_port *p)
578d74d5d1bSSebastian Andrzej Siewior {
579d74d5d1bSSebastian Andrzej Siewior 	unsigned char rpm_active;
580d74d5d1bSSebastian Andrzej Siewior 
581d74d5d1bSSebastian Andrzej Siewior 	if (!(p->capabilities & UART_CAP_RPM))
582d74d5d1bSSebastian Andrzej Siewior 		return;
583d74d5d1bSSebastian Andrzej Siewior 
584d74d5d1bSSebastian Andrzej Siewior 	rpm_active = xchg(&p->rpm_tx_active, 0);
585d74d5d1bSSebastian Andrzej Siewior 	if (!rpm_active)
586d74d5d1bSSebastian Andrzej Siewior 		return;
587d74d5d1bSSebastian Andrzej Siewior 	pm_runtime_mark_last_busy(p->port.dev);
588d74d5d1bSSebastian Andrzej Siewior 	pm_runtime_put_autosuspend(p->port.dev);
589d74d5d1bSSebastian Andrzej Siewior }
590d74d5d1bSSebastian Andrzej Siewior 
5919196d8acSJiri Slaby /*
5929196d8acSJiri Slaby  * IER sleep support.  UARTs which have EFRs need the "extended
5939196d8acSJiri Slaby  * capability" bit enabled.  Note that on XR16C850s, we need to
5949196d8acSJiri Slaby  * reset LCR to write to IER.
5959196d8acSJiri Slaby  */
5969196d8acSJiri Slaby static void serial8250_set_sleep(struct uart_8250_port *p, int sleep)
5979196d8acSJiri Slaby {
5989196d8acSJiri Slaby 	/*
5999196d8acSJiri Slaby 	 * Exar UARTs have a SLEEP register that enables or disables
6009196d8acSJiri Slaby 	 * each UART to enter sleep mode separately.  On the XR17V35x the
6019196d8acSJiri Slaby 	 * register is accessible to each UART at the UART_EXAR_SLEEP
6029196d8acSJiri Slaby 	 * offset but the UART channel may only write to the corresponding
6039196d8acSJiri Slaby 	 * bit.
6049196d8acSJiri Slaby 	 */
605d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_get(p);
6069196d8acSJiri Slaby 	if ((p->port.type == PORT_XR17V35X) ||
6079196d8acSJiri Slaby 	   (p->port.type == PORT_XR17D15X)) {
608b790f210SMichael Welling 		serial_out(p, UART_EXAR_SLEEP, sleep ? 0xff : 0);
609d74d5d1bSSebastian Andrzej Siewior 		goto out;
6109196d8acSJiri Slaby 	}
6119196d8acSJiri Slaby 
6129196d8acSJiri Slaby 	if (p->capabilities & UART_CAP_SLEEP) {
6139196d8acSJiri Slaby 		if (p->capabilities & UART_CAP_EFR) {
6149196d8acSJiri Slaby 			serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B);
6159196d8acSJiri Slaby 			serial_out(p, UART_EFR, UART_EFR_ECB);
6169196d8acSJiri Slaby 			serial_out(p, UART_LCR, 0);
6179196d8acSJiri Slaby 		}
6189196d8acSJiri Slaby 		serial_out(p, UART_IER, sleep ? UART_IERX_SLEEP : 0);
6199196d8acSJiri Slaby 		if (p->capabilities & UART_CAP_EFR) {
6209196d8acSJiri Slaby 			serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B);
6219196d8acSJiri Slaby 			serial_out(p, UART_EFR, 0);
6229196d8acSJiri Slaby 			serial_out(p, UART_LCR, 0);
6239196d8acSJiri Slaby 		}
6249196d8acSJiri Slaby 	}
625d74d5d1bSSebastian Andrzej Siewior out:
626d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_put(p);
6279196d8acSJiri Slaby }
6289196d8acSJiri Slaby 
6299196d8acSJiri Slaby #ifdef CONFIG_SERIAL_8250_RSA
6309196d8acSJiri Slaby /*
6319196d8acSJiri Slaby  * Attempts to turn on the RSA FIFO.  Returns zero on failure.
6329196d8acSJiri Slaby  * We set the port uart clock rate if we succeed.
6339196d8acSJiri Slaby  */
6349196d8acSJiri Slaby static int __enable_rsa(struct uart_8250_port *up)
6359196d8acSJiri Slaby {
6369196d8acSJiri Slaby 	unsigned char mode;
6379196d8acSJiri Slaby 	int result;
6389196d8acSJiri Slaby 
6399196d8acSJiri Slaby 	mode = serial_in(up, UART_RSA_MSR);
6409196d8acSJiri Slaby 	result = mode & UART_RSA_MSR_FIFO;
6419196d8acSJiri Slaby 
6429196d8acSJiri Slaby 	if (!result) {
6439196d8acSJiri Slaby 		serial_out(up, UART_RSA_MSR, mode | UART_RSA_MSR_FIFO);
6449196d8acSJiri Slaby 		mode = serial_in(up, UART_RSA_MSR);
6459196d8acSJiri Slaby 		result = mode & UART_RSA_MSR_FIFO;
6469196d8acSJiri Slaby 	}
6479196d8acSJiri Slaby 
6489196d8acSJiri Slaby 	if (result)
6499196d8acSJiri Slaby 		up->port.uartclk = SERIAL_RSA_BAUD_BASE * 16;
6509196d8acSJiri Slaby 
6519196d8acSJiri Slaby 	return result;
6529196d8acSJiri Slaby }
6539196d8acSJiri Slaby 
6549196d8acSJiri Slaby static void enable_rsa(struct uart_8250_port *up)
6559196d8acSJiri Slaby {
6569196d8acSJiri Slaby 	if (up->port.type == PORT_RSA) {
6579196d8acSJiri Slaby 		if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) {
6589196d8acSJiri Slaby 			spin_lock_irq(&up->port.lock);
6599196d8acSJiri Slaby 			__enable_rsa(up);
6609196d8acSJiri Slaby 			spin_unlock_irq(&up->port.lock);
6619196d8acSJiri Slaby 		}
6629196d8acSJiri Slaby 		if (up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16)
6639196d8acSJiri Slaby 			serial_out(up, UART_RSA_FRR, 0);
6649196d8acSJiri Slaby 	}
6659196d8acSJiri Slaby }
6669196d8acSJiri Slaby 
6679196d8acSJiri Slaby /*
6689196d8acSJiri Slaby  * Attempts to turn off the RSA FIFO.  Returns zero on failure.
6699196d8acSJiri Slaby  * It is unknown why interrupts were disabled in here.  However,
6709196d8acSJiri Slaby  * the caller is expected to preserve this behaviour by grabbing
6719196d8acSJiri Slaby  * the spinlock before calling this function.
6729196d8acSJiri Slaby  */
6739196d8acSJiri Slaby static void disable_rsa(struct uart_8250_port *up)
6749196d8acSJiri Slaby {
6759196d8acSJiri Slaby 	unsigned char mode;
6769196d8acSJiri Slaby 	int result;
6779196d8acSJiri Slaby 
6789196d8acSJiri Slaby 	if (up->port.type == PORT_RSA &&
6799196d8acSJiri Slaby 	    up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) {
6809196d8acSJiri Slaby 		spin_lock_irq(&up->port.lock);
6819196d8acSJiri Slaby 
6829196d8acSJiri Slaby 		mode = serial_in(up, UART_RSA_MSR);
6839196d8acSJiri Slaby 		result = !(mode & UART_RSA_MSR_FIFO);
6849196d8acSJiri Slaby 
6859196d8acSJiri Slaby 		if (!result) {
6869196d8acSJiri Slaby 			serial_out(up, UART_RSA_MSR, mode & ~UART_RSA_MSR_FIFO);
6879196d8acSJiri Slaby 			mode = serial_in(up, UART_RSA_MSR);
6889196d8acSJiri Slaby 			result = !(mode & UART_RSA_MSR_FIFO);
6899196d8acSJiri Slaby 		}
6909196d8acSJiri Slaby 
6919196d8acSJiri Slaby 		if (result)
6929196d8acSJiri Slaby 			up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16;
6939196d8acSJiri Slaby 		spin_unlock_irq(&up->port.lock);
6949196d8acSJiri Slaby 	}
6959196d8acSJiri Slaby }
6969196d8acSJiri Slaby #endif /* CONFIG_SERIAL_8250_RSA */
6979196d8acSJiri Slaby 
6989196d8acSJiri Slaby /*
6999196d8acSJiri Slaby  * This is a quickie test to see how big the FIFO is.
7009196d8acSJiri Slaby  * It doesn't work at all the time, more's the pity.
7019196d8acSJiri Slaby  */
7029196d8acSJiri Slaby static int size_fifo(struct uart_8250_port *up)
7039196d8acSJiri Slaby {
7049196d8acSJiri Slaby 	unsigned char old_fcr, old_mcr, old_lcr;
7059196d8acSJiri Slaby 	unsigned short old_dl;
7069196d8acSJiri Slaby 	int count;
7079196d8acSJiri Slaby 
7089196d8acSJiri Slaby 	old_lcr = serial_in(up, UART_LCR);
7099196d8acSJiri Slaby 	serial_out(up, UART_LCR, 0);
7109196d8acSJiri Slaby 	old_fcr = serial_in(up, UART_FCR);
7119196d8acSJiri Slaby 	old_mcr = serial_in(up, UART_MCR);
7129196d8acSJiri Slaby 	serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO |
7139196d8acSJiri Slaby 		    UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
7149196d8acSJiri Slaby 	serial_out(up, UART_MCR, UART_MCR_LOOP);
7159196d8acSJiri Slaby 	serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
7169196d8acSJiri Slaby 	old_dl = serial_dl_read(up);
7179196d8acSJiri Slaby 	serial_dl_write(up, 0x0001);
7189196d8acSJiri Slaby 	serial_out(up, UART_LCR, 0x03);
7199196d8acSJiri Slaby 	for (count = 0; count < 256; count++)
7209196d8acSJiri Slaby 		serial_out(up, UART_TX, count);
7219196d8acSJiri Slaby 	mdelay(20);/* FIXME - schedule_timeout */
7229196d8acSJiri Slaby 	for (count = 0; (serial_in(up, UART_LSR) & UART_LSR_DR) &&
7239196d8acSJiri Slaby 	     (count < 256); count++)
7249196d8acSJiri Slaby 		serial_in(up, UART_RX);
7259196d8acSJiri Slaby 	serial_out(up, UART_FCR, old_fcr);
7269196d8acSJiri Slaby 	serial_out(up, UART_MCR, old_mcr);
7279196d8acSJiri Slaby 	serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
7289196d8acSJiri Slaby 	serial_dl_write(up, old_dl);
7299196d8acSJiri Slaby 	serial_out(up, UART_LCR, old_lcr);
7309196d8acSJiri Slaby 
7319196d8acSJiri Slaby 	return count;
7329196d8acSJiri Slaby }
7339196d8acSJiri Slaby 
7349196d8acSJiri Slaby /*
7359196d8acSJiri Slaby  * Read UART ID using the divisor method - set DLL and DLM to zero
7369196d8acSJiri Slaby  * and the revision will be in DLL and device type in DLM.  We
7379196d8acSJiri Slaby  * preserve the device state across this.
7389196d8acSJiri Slaby  */
7399196d8acSJiri Slaby static unsigned int autoconfig_read_divisor_id(struct uart_8250_port *p)
7409196d8acSJiri Slaby {
7419196d8acSJiri Slaby 	unsigned char old_dll, old_dlm, old_lcr;
7429196d8acSJiri Slaby 	unsigned int id;
7439196d8acSJiri Slaby 
7449196d8acSJiri Slaby 	old_lcr = serial_in(p, UART_LCR);
7459196d8acSJiri Slaby 	serial_out(p, UART_LCR, UART_LCR_CONF_MODE_A);
7469196d8acSJiri Slaby 
7479196d8acSJiri Slaby 	old_dll = serial_in(p, UART_DLL);
7489196d8acSJiri Slaby 	old_dlm = serial_in(p, UART_DLM);
7499196d8acSJiri Slaby 
7509196d8acSJiri Slaby 	serial_out(p, UART_DLL, 0);
7519196d8acSJiri Slaby 	serial_out(p, UART_DLM, 0);
7529196d8acSJiri Slaby 
7539196d8acSJiri Slaby 	id = serial_in(p, UART_DLL) | serial_in(p, UART_DLM) << 8;
7549196d8acSJiri Slaby 
7559196d8acSJiri Slaby 	serial_out(p, UART_DLL, old_dll);
7569196d8acSJiri Slaby 	serial_out(p, UART_DLM, old_dlm);
7579196d8acSJiri Slaby 	serial_out(p, UART_LCR, old_lcr);
7589196d8acSJiri Slaby 
7599196d8acSJiri Slaby 	return id;
7609196d8acSJiri Slaby }
7619196d8acSJiri Slaby 
7629196d8acSJiri Slaby /*
7639196d8acSJiri Slaby  * This is a helper routine to autodetect StarTech/Exar/Oxsemi UART's.
7649196d8acSJiri Slaby  * When this function is called we know it is at least a StarTech
7659196d8acSJiri Slaby  * 16650 V2, but it might be one of several StarTech UARTs, or one of
7669196d8acSJiri Slaby  * its clones.  (We treat the broken original StarTech 16650 V1 as a
7679196d8acSJiri Slaby  * 16550, and why not?  Startech doesn't seem to even acknowledge its
7689196d8acSJiri Slaby  * existence.)
7699196d8acSJiri Slaby  *
7709196d8acSJiri Slaby  * What evil have men's minds wrought...
7719196d8acSJiri Slaby  */
7729196d8acSJiri Slaby static void autoconfig_has_efr(struct uart_8250_port *up)
7739196d8acSJiri Slaby {
7749196d8acSJiri Slaby 	unsigned int id1, id2, id3, rev;
7759196d8acSJiri Slaby 
7769196d8acSJiri Slaby 	/*
7779196d8acSJiri Slaby 	 * Everything with an EFR has SLEEP
7789196d8acSJiri Slaby 	 */
7799196d8acSJiri Slaby 	up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP;
7809196d8acSJiri Slaby 
7819196d8acSJiri Slaby 	/*
7829196d8acSJiri Slaby 	 * First we check to see if it's an Oxford Semiconductor UART.
7839196d8acSJiri Slaby 	 *
7849196d8acSJiri Slaby 	 * If we have to do this here because some non-National
7859196d8acSJiri Slaby 	 * Semiconductor clone chips lock up if you try writing to the
7869196d8acSJiri Slaby 	 * LSR register (which serial_icr_read does)
7879196d8acSJiri Slaby 	 */
7889196d8acSJiri Slaby 
7899196d8acSJiri Slaby 	/*
7909196d8acSJiri Slaby 	 * Check for Oxford Semiconductor 16C950.
7919196d8acSJiri Slaby 	 *
7929196d8acSJiri Slaby 	 * EFR [4] must be set else this test fails.
7939196d8acSJiri Slaby 	 *
7949196d8acSJiri Slaby 	 * This shouldn't be necessary, but Mike Hudson (Exoray@isys.ca)
7959196d8acSJiri Slaby 	 * claims that it's needed for 952 dual UART's (which are not
7969196d8acSJiri Slaby 	 * recommended for new designs).
7979196d8acSJiri Slaby 	 */
7989196d8acSJiri Slaby 	up->acr = 0;
7999196d8acSJiri Slaby 	serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
8009196d8acSJiri Slaby 	serial_out(up, UART_EFR, UART_EFR_ECB);
8019196d8acSJiri Slaby 	serial_out(up, UART_LCR, 0x00);
8029196d8acSJiri Slaby 	id1 = serial_icr_read(up, UART_ID1);
8039196d8acSJiri Slaby 	id2 = serial_icr_read(up, UART_ID2);
8049196d8acSJiri Slaby 	id3 = serial_icr_read(up, UART_ID3);
8059196d8acSJiri Slaby 	rev = serial_icr_read(up, UART_REV);
8069196d8acSJiri Slaby 
8079196d8acSJiri Slaby 	DEBUG_AUTOCONF("950id=%02x:%02x:%02x:%02x ", id1, id2, id3, rev);
8089196d8acSJiri Slaby 
8099196d8acSJiri Slaby 	if (id1 == 0x16 && id2 == 0xC9 &&
8109196d8acSJiri Slaby 	    (id3 == 0x50 || id3 == 0x52 || id3 == 0x54)) {
8119196d8acSJiri Slaby 		up->port.type = PORT_16C950;
8129196d8acSJiri Slaby 
8139196d8acSJiri Slaby 		/*
8149196d8acSJiri Slaby 		 * Enable work around for the Oxford Semiconductor 952 rev B
8159196d8acSJiri Slaby 		 * chip which causes it to seriously miscalculate baud rates
8169196d8acSJiri Slaby 		 * when DLL is 0.
8179196d8acSJiri Slaby 		 */
8189196d8acSJiri Slaby 		if (id3 == 0x52 && rev == 0x01)
8199196d8acSJiri Slaby 			up->bugs |= UART_BUG_QUOT;
8209196d8acSJiri Slaby 		return;
8219196d8acSJiri Slaby 	}
8229196d8acSJiri Slaby 
8239196d8acSJiri Slaby 	/*
8249196d8acSJiri Slaby 	 * We check for a XR16C850 by setting DLL and DLM to 0, and then
8259196d8acSJiri Slaby 	 * reading back DLL and DLM.  The chip type depends on the DLM
8269196d8acSJiri Slaby 	 * value read back:
8279196d8acSJiri Slaby 	 *  0x10 - XR16C850 and the DLL contains the chip revision.
8289196d8acSJiri Slaby 	 *  0x12 - XR16C2850.
8299196d8acSJiri Slaby 	 *  0x14 - XR16C854.
8309196d8acSJiri Slaby 	 */
8319196d8acSJiri Slaby 	id1 = autoconfig_read_divisor_id(up);
8329196d8acSJiri Slaby 	DEBUG_AUTOCONF("850id=%04x ", id1);
8339196d8acSJiri Slaby 
8349196d8acSJiri Slaby 	id2 = id1 >> 8;
8359196d8acSJiri Slaby 	if (id2 == 0x10 || id2 == 0x12 || id2 == 0x14) {
8369196d8acSJiri Slaby 		up->port.type = PORT_16850;
8379196d8acSJiri Slaby 		return;
8389196d8acSJiri Slaby 	}
8399196d8acSJiri Slaby 
8409196d8acSJiri Slaby 	/*
8419196d8acSJiri Slaby 	 * It wasn't an XR16C850.
8429196d8acSJiri Slaby 	 *
8439196d8acSJiri Slaby 	 * We distinguish between the '654 and the '650 by counting
8449196d8acSJiri Slaby 	 * how many bytes are in the FIFO.  I'm using this for now,
8459196d8acSJiri Slaby 	 * since that's the technique that was sent to me in the
8469196d8acSJiri Slaby 	 * serial driver update, but I'm not convinced this works.
8479196d8acSJiri Slaby 	 * I've had problems doing this in the past.  -TYT
8489196d8acSJiri Slaby 	 */
8499196d8acSJiri Slaby 	if (size_fifo(up) == 64)
8509196d8acSJiri Slaby 		up->port.type = PORT_16654;
8519196d8acSJiri Slaby 	else
8529196d8acSJiri Slaby 		up->port.type = PORT_16650V2;
8539196d8acSJiri Slaby }
8549196d8acSJiri Slaby 
8559196d8acSJiri Slaby /*
8569196d8acSJiri Slaby  * We detected a chip without a FIFO.  Only two fall into
8579196d8acSJiri Slaby  * this category - the original 8250 and the 16450.  The
8589196d8acSJiri Slaby  * 16450 has a scratch register (accessible with LCR=0)
8599196d8acSJiri Slaby  */
8609196d8acSJiri Slaby static void autoconfig_8250(struct uart_8250_port *up)
8619196d8acSJiri Slaby {
8629196d8acSJiri Slaby 	unsigned char scratch, status1, status2;
8639196d8acSJiri Slaby 
8649196d8acSJiri Slaby 	up->port.type = PORT_8250;
8659196d8acSJiri Slaby 
8669196d8acSJiri Slaby 	scratch = serial_in(up, UART_SCR);
8679196d8acSJiri Slaby 	serial_out(up, UART_SCR, 0xa5);
8689196d8acSJiri Slaby 	status1 = serial_in(up, UART_SCR);
8699196d8acSJiri Slaby 	serial_out(up, UART_SCR, 0x5a);
8709196d8acSJiri Slaby 	status2 = serial_in(up, UART_SCR);
8719196d8acSJiri Slaby 	serial_out(up, UART_SCR, scratch);
8729196d8acSJiri Slaby 
8739196d8acSJiri Slaby 	if (status1 == 0xa5 && status2 == 0x5a)
8749196d8acSJiri Slaby 		up->port.type = PORT_16450;
8759196d8acSJiri Slaby }
8769196d8acSJiri Slaby 
8779196d8acSJiri Slaby static int broken_efr(struct uart_8250_port *up)
8789196d8acSJiri Slaby {
8799196d8acSJiri Slaby 	/*
8809196d8acSJiri Slaby 	 * Exar ST16C2550 "A2" devices incorrectly detect as
8819196d8acSJiri Slaby 	 * having an EFR, and report an ID of 0x0201.  See
8829196d8acSJiri Slaby 	 * http://linux.derkeiler.com/Mailing-Lists/Kernel/2004-11/4812.html
8839196d8acSJiri Slaby 	 */
8849196d8acSJiri Slaby 	if (autoconfig_read_divisor_id(up) == 0x0201 && size_fifo(up) == 16)
8859196d8acSJiri Slaby 		return 1;
8869196d8acSJiri Slaby 
8879196d8acSJiri Slaby 	return 0;
8889196d8acSJiri Slaby }
8899196d8acSJiri Slaby 
8909196d8acSJiri Slaby static inline int ns16550a_goto_highspeed(struct uart_8250_port *up)
8919196d8acSJiri Slaby {
8929196d8acSJiri Slaby 	unsigned char status;
8939196d8acSJiri Slaby 
8949196d8acSJiri Slaby 	status = serial_in(up, 0x04); /* EXCR2 */
8959196d8acSJiri Slaby #define PRESL(x) ((x) & 0x30)
8969196d8acSJiri Slaby 	if (PRESL(status) == 0x10) {
8979196d8acSJiri Slaby 		/* already in high speed mode */
8989196d8acSJiri Slaby 		return 0;
8999196d8acSJiri Slaby 	} else {
9009196d8acSJiri Slaby 		status &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */
9019196d8acSJiri Slaby 		status |= 0x10;  /* 1.625 divisor for baud_base --> 921600 */
9029196d8acSJiri Slaby 		serial_out(up, 0x04, status);
9039196d8acSJiri Slaby 	}
9049196d8acSJiri Slaby 	return 1;
9059196d8acSJiri Slaby }
9069196d8acSJiri Slaby 
9079196d8acSJiri Slaby /*
9089196d8acSJiri Slaby  * We know that the chip has FIFOs.  Does it have an EFR?  The
9099196d8acSJiri Slaby  * EFR is located in the same register position as the IIR and
9109196d8acSJiri Slaby  * we know the top two bits of the IIR are currently set.  The
9119196d8acSJiri Slaby  * EFR should contain zero.  Try to read the EFR.
9129196d8acSJiri Slaby  */
9139196d8acSJiri Slaby static void autoconfig_16550a(struct uart_8250_port *up)
9149196d8acSJiri Slaby {
9159196d8acSJiri Slaby 	unsigned char status1, status2;
9169196d8acSJiri Slaby 	unsigned int iersave;
9179196d8acSJiri Slaby 
9189196d8acSJiri Slaby 	up->port.type = PORT_16550A;
9199196d8acSJiri Slaby 	up->capabilities |= UART_CAP_FIFO;
9209196d8acSJiri Slaby 
9219196d8acSJiri Slaby 	/*
9229196d8acSJiri Slaby 	 * XR17V35x UARTs have an extra divisor register, DLD
9239196d8acSJiri Slaby 	 * that gets enabled with when DLAB is set which will
9249196d8acSJiri Slaby 	 * cause the device to incorrectly match and assign
9259196d8acSJiri Slaby 	 * port type to PORT_16650.  The EFR for this UART is
9269196d8acSJiri Slaby 	 * found at offset 0x09. Instead check the Deice ID (DVID)
9279196d8acSJiri Slaby 	 * register for a 2, 4 or 8 port UART.
9289196d8acSJiri Slaby 	 */
9299196d8acSJiri Slaby 	if (up->port.flags & UPF_EXAR_EFR) {
9309196d8acSJiri Slaby 		status1 = serial_in(up, UART_EXAR_DVID);
9319196d8acSJiri Slaby 		if (status1 == 0x82 || status1 == 0x84 || status1 == 0x88) {
9329196d8acSJiri Slaby 			DEBUG_AUTOCONF("Exar XR17V35x ");
9339196d8acSJiri Slaby 			up->port.type = PORT_XR17V35X;
9349196d8acSJiri Slaby 			up->capabilities |= UART_CAP_AFE | UART_CAP_EFR |
9359196d8acSJiri Slaby 						UART_CAP_SLEEP;
9369196d8acSJiri Slaby 
9379196d8acSJiri Slaby 			return;
9389196d8acSJiri Slaby 		}
9399196d8acSJiri Slaby 
9409196d8acSJiri Slaby 	}
9419196d8acSJiri Slaby 
9429196d8acSJiri Slaby 	/*
9439196d8acSJiri Slaby 	 * Check for presence of the EFR when DLAB is set.
9449196d8acSJiri Slaby 	 * Only ST16C650V1 UARTs pass this test.
9459196d8acSJiri Slaby 	 */
9469196d8acSJiri Slaby 	serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
9479196d8acSJiri Slaby 	if (serial_in(up, UART_EFR) == 0) {
9489196d8acSJiri Slaby 		serial_out(up, UART_EFR, 0xA8);
9499196d8acSJiri Slaby 		if (serial_in(up, UART_EFR) != 0) {
9509196d8acSJiri Slaby 			DEBUG_AUTOCONF("EFRv1 ");
9519196d8acSJiri Slaby 			up->port.type = PORT_16650;
9529196d8acSJiri Slaby 			up->capabilities |= UART_CAP_EFR | UART_CAP_SLEEP;
9539196d8acSJiri Slaby 		} else {
9549196d8acSJiri Slaby 			DEBUG_AUTOCONF("Motorola 8xxx DUART ");
9559196d8acSJiri Slaby 		}
9569196d8acSJiri Slaby 		serial_out(up, UART_EFR, 0);
9579196d8acSJiri Slaby 		return;
9589196d8acSJiri Slaby 	}
9599196d8acSJiri Slaby 
9609196d8acSJiri Slaby 	/*
9619196d8acSJiri Slaby 	 * Maybe it requires 0xbf to be written to the LCR.
9629196d8acSJiri Slaby 	 * (other ST16C650V2 UARTs, TI16C752A, etc)
9639196d8acSJiri Slaby 	 */
9649196d8acSJiri Slaby 	serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
9659196d8acSJiri Slaby 	if (serial_in(up, UART_EFR) == 0 && !broken_efr(up)) {
9669196d8acSJiri Slaby 		DEBUG_AUTOCONF("EFRv2 ");
9679196d8acSJiri Slaby 		autoconfig_has_efr(up);
9689196d8acSJiri Slaby 		return;
9699196d8acSJiri Slaby 	}
9709196d8acSJiri Slaby 
9719196d8acSJiri Slaby 	/*
9729196d8acSJiri Slaby 	 * Check for a National Semiconductor SuperIO chip.
9739196d8acSJiri Slaby 	 * Attempt to switch to bank 2, read the value of the LOOP bit
9749196d8acSJiri Slaby 	 * from EXCR1. Switch back to bank 0, change it in MCR. Then
9759196d8acSJiri Slaby 	 * switch back to bank 2, read it from EXCR1 again and check
9769196d8acSJiri Slaby 	 * it's changed. If so, set baud_base in EXCR2 to 921600. -- dwmw2
9779196d8acSJiri Slaby 	 */
9789196d8acSJiri Slaby 	serial_out(up, UART_LCR, 0);
9799196d8acSJiri Slaby 	status1 = serial_in(up, UART_MCR);
9809196d8acSJiri Slaby 	serial_out(up, UART_LCR, 0xE0);
9819196d8acSJiri Slaby 	status2 = serial_in(up, 0x02); /* EXCR1 */
9829196d8acSJiri Slaby 
9839196d8acSJiri Slaby 	if (!((status2 ^ status1) & UART_MCR_LOOP)) {
9849196d8acSJiri Slaby 		serial_out(up, UART_LCR, 0);
9859196d8acSJiri Slaby 		serial_out(up, UART_MCR, status1 ^ UART_MCR_LOOP);
9869196d8acSJiri Slaby 		serial_out(up, UART_LCR, 0xE0);
9879196d8acSJiri Slaby 		status2 = serial_in(up, 0x02); /* EXCR1 */
9889196d8acSJiri Slaby 		serial_out(up, UART_LCR, 0);
9899196d8acSJiri Slaby 		serial_out(up, UART_MCR, status1);
9909196d8acSJiri Slaby 
9919196d8acSJiri Slaby 		if ((status2 ^ status1) & UART_MCR_LOOP) {
9929196d8acSJiri Slaby 			unsigned short quot;
9939196d8acSJiri Slaby 
9949196d8acSJiri Slaby 			serial_out(up, UART_LCR, 0xE0);
9959196d8acSJiri Slaby 
9969196d8acSJiri Slaby 			quot = serial_dl_read(up);
9979196d8acSJiri Slaby 			quot <<= 3;
9989196d8acSJiri Slaby 
9999196d8acSJiri Slaby 			if (ns16550a_goto_highspeed(up))
10009196d8acSJiri Slaby 				serial_dl_write(up, quot);
10019196d8acSJiri Slaby 
10029196d8acSJiri Slaby 			serial_out(up, UART_LCR, 0);
10039196d8acSJiri Slaby 
10049196d8acSJiri Slaby 			up->port.uartclk = 921600*16;
10059196d8acSJiri Slaby 			up->port.type = PORT_NS16550A;
10069196d8acSJiri Slaby 			up->capabilities |= UART_NATSEMI;
10079196d8acSJiri Slaby 			return;
10089196d8acSJiri Slaby 		}
10099196d8acSJiri Slaby 	}
10109196d8acSJiri Slaby 
10119196d8acSJiri Slaby 	/*
10129196d8acSJiri Slaby 	 * No EFR.  Try to detect a TI16750, which only sets bit 5 of
10139196d8acSJiri Slaby 	 * the IIR when 64 byte FIFO mode is enabled when DLAB is set.
10149196d8acSJiri Slaby 	 * Try setting it with and without DLAB set.  Cheap clones
10159196d8acSJiri Slaby 	 * set bit 5 without DLAB set.
10169196d8acSJiri Slaby 	 */
10179196d8acSJiri Slaby 	serial_out(up, UART_LCR, 0);
10189196d8acSJiri Slaby 	serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE);
10199196d8acSJiri Slaby 	status1 = serial_in(up, UART_IIR) >> 5;
10209196d8acSJiri Slaby 	serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
10219196d8acSJiri Slaby 	serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
10229196d8acSJiri Slaby 	serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE);
10239196d8acSJiri Slaby 	status2 = serial_in(up, UART_IIR) >> 5;
10249196d8acSJiri Slaby 	serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
10259196d8acSJiri Slaby 	serial_out(up, UART_LCR, 0);
10269196d8acSJiri Slaby 
10279196d8acSJiri Slaby 	DEBUG_AUTOCONF("iir1=%d iir2=%d ", status1, status2);
10289196d8acSJiri Slaby 
10299196d8acSJiri Slaby 	if (status1 == 6 && status2 == 7) {
10309196d8acSJiri Slaby 		up->port.type = PORT_16750;
10319196d8acSJiri Slaby 		up->capabilities |= UART_CAP_AFE | UART_CAP_SLEEP;
10329196d8acSJiri Slaby 		return;
10339196d8acSJiri Slaby 	}
10349196d8acSJiri Slaby 
10359196d8acSJiri Slaby 	/*
10369196d8acSJiri Slaby 	 * Try writing and reading the UART_IER_UUE bit (b6).
10379196d8acSJiri Slaby 	 * If it works, this is probably one of the Xscale platform's
10389196d8acSJiri Slaby 	 * internal UARTs.
10399196d8acSJiri Slaby 	 * We're going to explicitly set the UUE bit to 0 before
10409196d8acSJiri Slaby 	 * trying to write and read a 1 just to make sure it's not
10419196d8acSJiri Slaby 	 * already a 1 and maybe locked there before we even start start.
10429196d8acSJiri Slaby 	 */
10439196d8acSJiri Slaby 	iersave = serial_in(up, UART_IER);
10449196d8acSJiri Slaby 	serial_out(up, UART_IER, iersave & ~UART_IER_UUE);
10459196d8acSJiri Slaby 	if (!(serial_in(up, UART_IER) & UART_IER_UUE)) {
10469196d8acSJiri Slaby 		/*
10479196d8acSJiri Slaby 		 * OK it's in a known zero state, try writing and reading
10489196d8acSJiri Slaby 		 * without disturbing the current state of the other bits.
10499196d8acSJiri Slaby 		 */
10509196d8acSJiri Slaby 		serial_out(up, UART_IER, iersave | UART_IER_UUE);
10519196d8acSJiri Slaby 		if (serial_in(up, UART_IER) & UART_IER_UUE) {
10529196d8acSJiri Slaby 			/*
10539196d8acSJiri Slaby 			 * It's an Xscale.
10549196d8acSJiri Slaby 			 * We'll leave the UART_IER_UUE bit set to 1 (enabled).
10559196d8acSJiri Slaby 			 */
10569196d8acSJiri Slaby 			DEBUG_AUTOCONF("Xscale ");
10579196d8acSJiri Slaby 			up->port.type = PORT_XSCALE;
10589196d8acSJiri Slaby 			up->capabilities |= UART_CAP_UUE | UART_CAP_RTOIE;
10599196d8acSJiri Slaby 			return;
10609196d8acSJiri Slaby 		}
10619196d8acSJiri Slaby 	} else {
10629196d8acSJiri Slaby 		/*
10639196d8acSJiri Slaby 		 * If we got here we couldn't force the IER_UUE bit to 0.
10649196d8acSJiri Slaby 		 * Log it and continue.
10659196d8acSJiri Slaby 		 */
10669196d8acSJiri Slaby 		DEBUG_AUTOCONF("Couldn't force IER_UUE to 0 ");
10679196d8acSJiri Slaby 	}
10689196d8acSJiri Slaby 	serial_out(up, UART_IER, iersave);
10699196d8acSJiri Slaby 
10709196d8acSJiri Slaby 	/*
10719196d8acSJiri Slaby 	 * Exar uarts have EFR in a weird location
10729196d8acSJiri Slaby 	 */
10739196d8acSJiri Slaby 	if (up->port.flags & UPF_EXAR_EFR) {
10749196d8acSJiri Slaby 		DEBUG_AUTOCONF("Exar XR17D15x ");
10759196d8acSJiri Slaby 		up->port.type = PORT_XR17D15X;
10769196d8acSJiri Slaby 		up->capabilities |= UART_CAP_AFE | UART_CAP_EFR |
10779196d8acSJiri Slaby 				    UART_CAP_SLEEP;
10789196d8acSJiri Slaby 
10799196d8acSJiri Slaby 		return;
10809196d8acSJiri Slaby 	}
10819196d8acSJiri Slaby 
10829196d8acSJiri Slaby 	/*
10839196d8acSJiri Slaby 	 * We distinguish between 16550A and U6 16550A by counting
10849196d8acSJiri Slaby 	 * how many bytes are in the FIFO.
10859196d8acSJiri Slaby 	 */
10869196d8acSJiri Slaby 	if (up->port.type == PORT_16550A && size_fifo(up) == 64) {
10879196d8acSJiri Slaby 		up->port.type = PORT_U6_16550A;
10889196d8acSJiri Slaby 		up->capabilities |= UART_CAP_AFE;
10899196d8acSJiri Slaby 	}
10909196d8acSJiri Slaby }
10919196d8acSJiri Slaby 
10929196d8acSJiri Slaby /*
10939196d8acSJiri Slaby  * This routine is called by rs_init() to initialize a specific serial
10949196d8acSJiri Slaby  * port.  It determines what type of UART chip this serial port is
10959196d8acSJiri Slaby  * using: 8250, 16450, 16550, 16550A.  The important question is
10969196d8acSJiri Slaby  * whether or not this UART is a 16550A or not, since this will
10979196d8acSJiri Slaby  * determine whether or not we can use its FIFO features or not.
10989196d8acSJiri Slaby  */
10999196d8acSJiri Slaby static void autoconfig(struct uart_8250_port *up, unsigned int probeflags)
11009196d8acSJiri Slaby {
11019196d8acSJiri Slaby 	unsigned char status1, scratch, scratch2, scratch3;
11029196d8acSJiri Slaby 	unsigned char save_lcr, save_mcr;
11039196d8acSJiri Slaby 	struct uart_port *port = &up->port;
11049196d8acSJiri Slaby 	unsigned long flags;
11059196d8acSJiri Slaby 	unsigned int old_capabilities;
11069196d8acSJiri Slaby 
11079196d8acSJiri Slaby 	if (!port->iobase && !port->mapbase && !port->membase)
11089196d8acSJiri Slaby 		return;
11099196d8acSJiri Slaby 
11109196d8acSJiri Slaby 	DEBUG_AUTOCONF("ttyS%d: autoconf (0x%04lx, 0x%p): ",
11119196d8acSJiri Slaby 		       serial_index(port), port->iobase, port->membase);
11129196d8acSJiri Slaby 
11139196d8acSJiri Slaby 	/*
11149196d8acSJiri Slaby 	 * We really do need global IRQs disabled here - we're going to
11159196d8acSJiri Slaby 	 * be frobbing the chips IRQ enable register to see if it exists.
11169196d8acSJiri Slaby 	 */
11179196d8acSJiri Slaby 	spin_lock_irqsave(&port->lock, flags);
11189196d8acSJiri Slaby 
11199196d8acSJiri Slaby 	up->capabilities = 0;
11209196d8acSJiri Slaby 	up->bugs = 0;
11219196d8acSJiri Slaby 
11229196d8acSJiri Slaby 	if (!(port->flags & UPF_BUGGY_UART)) {
11239196d8acSJiri Slaby 		/*
11249196d8acSJiri Slaby 		 * Do a simple existence test first; if we fail this,
11259196d8acSJiri Slaby 		 * there's no point trying anything else.
11269196d8acSJiri Slaby 		 *
11279196d8acSJiri Slaby 		 * 0x80 is used as a nonsense port to prevent against
11289196d8acSJiri Slaby 		 * false positives due to ISA bus float.  The
11299196d8acSJiri Slaby 		 * assumption is that 0x80 is a non-existent port;
11309196d8acSJiri Slaby 		 * which should be safe since include/asm/io.h also
11319196d8acSJiri Slaby 		 * makes this assumption.
11329196d8acSJiri Slaby 		 *
11339196d8acSJiri Slaby 		 * Note: this is safe as long as MCR bit 4 is clear
11349196d8acSJiri Slaby 		 * and the device is in "PC" mode.
11359196d8acSJiri Slaby 		 */
11369196d8acSJiri Slaby 		scratch = serial_in(up, UART_IER);
11379196d8acSJiri Slaby 		serial_out(up, UART_IER, 0);
11389196d8acSJiri Slaby #ifdef __i386__
11399196d8acSJiri Slaby 		outb(0xff, 0x080);
11409196d8acSJiri Slaby #endif
11419196d8acSJiri Slaby 		/*
11429196d8acSJiri Slaby 		 * Mask out IER[7:4] bits for test as some UARTs (e.g. TL
11439196d8acSJiri Slaby 		 * 16C754B) allow only to modify them if an EFR bit is set.
11449196d8acSJiri Slaby 		 */
11459196d8acSJiri Slaby 		scratch2 = serial_in(up, UART_IER) & 0x0f;
11469196d8acSJiri Slaby 		serial_out(up, UART_IER, 0x0F);
11479196d8acSJiri Slaby #ifdef __i386__
11489196d8acSJiri Slaby 		outb(0, 0x080);
11499196d8acSJiri Slaby #endif
11509196d8acSJiri Slaby 		scratch3 = serial_in(up, UART_IER) & 0x0f;
11519196d8acSJiri Slaby 		serial_out(up, UART_IER, scratch);
11529196d8acSJiri Slaby 		if (scratch2 != 0 || scratch3 != 0x0F) {
11539196d8acSJiri Slaby 			/*
11549196d8acSJiri Slaby 			 * We failed; there's nothing here
11559196d8acSJiri Slaby 			 */
11569196d8acSJiri Slaby 			spin_unlock_irqrestore(&port->lock, flags);
11579196d8acSJiri Slaby 			DEBUG_AUTOCONF("IER test failed (%02x, %02x) ",
11589196d8acSJiri Slaby 				       scratch2, scratch3);
11599196d8acSJiri Slaby 			goto out;
11609196d8acSJiri Slaby 		}
11619196d8acSJiri Slaby 	}
11629196d8acSJiri Slaby 
11639196d8acSJiri Slaby 	save_mcr = serial_in(up, UART_MCR);
11649196d8acSJiri Slaby 	save_lcr = serial_in(up, UART_LCR);
11659196d8acSJiri Slaby 
11669196d8acSJiri Slaby 	/*
11679196d8acSJiri Slaby 	 * Check to see if a UART is really there.  Certain broken
11689196d8acSJiri Slaby 	 * internal modems based on the Rockwell chipset fail this
11699196d8acSJiri Slaby 	 * test, because they apparently don't implement the loopback
11709196d8acSJiri Slaby 	 * test mode.  So this test is skipped on the COM 1 through
11719196d8acSJiri Slaby 	 * COM 4 ports.  This *should* be safe, since no board
11729196d8acSJiri Slaby 	 * manufacturer would be stupid enough to design a board
11739196d8acSJiri Slaby 	 * that conflicts with COM 1-4 --- we hope!
11749196d8acSJiri Slaby 	 */
11759196d8acSJiri Slaby 	if (!(port->flags & UPF_SKIP_TEST)) {
11769196d8acSJiri Slaby 		serial_out(up, UART_MCR, UART_MCR_LOOP | 0x0A);
11779196d8acSJiri Slaby 		status1 = serial_in(up, UART_MSR) & 0xF0;
11789196d8acSJiri Slaby 		serial_out(up, UART_MCR, save_mcr);
11799196d8acSJiri Slaby 		if (status1 != 0x90) {
11809196d8acSJiri Slaby 			spin_unlock_irqrestore(&port->lock, flags);
11819196d8acSJiri Slaby 			DEBUG_AUTOCONF("LOOP test failed (%02x) ",
11829196d8acSJiri Slaby 				       status1);
11839196d8acSJiri Slaby 			goto out;
11849196d8acSJiri Slaby 		}
11859196d8acSJiri Slaby 	}
11869196d8acSJiri Slaby 
11879196d8acSJiri Slaby 	/*
11889196d8acSJiri Slaby 	 * We're pretty sure there's a port here.  Lets find out what
11899196d8acSJiri Slaby 	 * type of port it is.  The IIR top two bits allows us to find
11909196d8acSJiri Slaby 	 * out if it's 8250 or 16450, 16550, 16550A or later.  This
11919196d8acSJiri Slaby 	 * determines what we test for next.
11929196d8acSJiri Slaby 	 *
11939196d8acSJiri Slaby 	 * We also initialise the EFR (if any) to zero for later.  The
11949196d8acSJiri Slaby 	 * EFR occupies the same register location as the FCR and IIR.
11959196d8acSJiri Slaby 	 */
11969196d8acSJiri Slaby 	serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
11979196d8acSJiri Slaby 	serial_out(up, UART_EFR, 0);
11989196d8acSJiri Slaby 	serial_out(up, UART_LCR, 0);
11999196d8acSJiri Slaby 
12009196d8acSJiri Slaby 	serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
12019196d8acSJiri Slaby 	scratch = serial_in(up, UART_IIR) >> 6;
12029196d8acSJiri Slaby 
12039196d8acSJiri Slaby 	switch (scratch) {
12049196d8acSJiri Slaby 	case 0:
12059196d8acSJiri Slaby 		autoconfig_8250(up);
12069196d8acSJiri Slaby 		break;
12079196d8acSJiri Slaby 	case 1:
12089196d8acSJiri Slaby 		port->type = PORT_UNKNOWN;
12099196d8acSJiri Slaby 		break;
12109196d8acSJiri Slaby 	case 2:
12119196d8acSJiri Slaby 		port->type = PORT_16550;
12129196d8acSJiri Slaby 		break;
12139196d8acSJiri Slaby 	case 3:
12149196d8acSJiri Slaby 		autoconfig_16550a(up);
12159196d8acSJiri Slaby 		break;
12169196d8acSJiri Slaby 	}
12179196d8acSJiri Slaby 
12189196d8acSJiri Slaby #ifdef CONFIG_SERIAL_8250_RSA
12199196d8acSJiri Slaby 	/*
12209196d8acSJiri Slaby 	 * Only probe for RSA ports if we got the region.
12219196d8acSJiri Slaby 	 */
12229196d8acSJiri Slaby 	if (port->type == PORT_16550A && probeflags & PROBE_RSA) {
12239196d8acSJiri Slaby 		int i;
12249196d8acSJiri Slaby 
12259196d8acSJiri Slaby 		for (i = 0 ; i < probe_rsa_count; ++i) {
12269196d8acSJiri Slaby 			if (probe_rsa[i] == port->iobase && __enable_rsa(up)) {
12279196d8acSJiri Slaby 				port->type = PORT_RSA;
12289196d8acSJiri Slaby 				break;
12299196d8acSJiri Slaby 			}
12309196d8acSJiri Slaby 		}
12319196d8acSJiri Slaby 	}
12329196d8acSJiri Slaby #endif
12339196d8acSJiri Slaby 
12349196d8acSJiri Slaby 	serial_out(up, UART_LCR, save_lcr);
12359196d8acSJiri Slaby 
12369196d8acSJiri Slaby 	port->fifosize = uart_config[up->port.type].fifo_size;
12379196d8acSJiri Slaby 	old_capabilities = up->capabilities;
12389196d8acSJiri Slaby 	up->capabilities = uart_config[port->type].flags;
12399196d8acSJiri Slaby 	up->tx_loadsz = uart_config[port->type].tx_loadsz;
12409196d8acSJiri Slaby 
12419196d8acSJiri Slaby 	if (port->type == PORT_UNKNOWN)
12429196d8acSJiri Slaby 		goto out_lock;
12439196d8acSJiri Slaby 
12449196d8acSJiri Slaby 	/*
12459196d8acSJiri Slaby 	 * Reset the UART.
12469196d8acSJiri Slaby 	 */
12479196d8acSJiri Slaby #ifdef CONFIG_SERIAL_8250_RSA
12489196d8acSJiri Slaby 	if (port->type == PORT_RSA)
12499196d8acSJiri Slaby 		serial_out(up, UART_RSA_FRR, 0);
12509196d8acSJiri Slaby #endif
12519196d8acSJiri Slaby 	serial_out(up, UART_MCR, save_mcr);
12529196d8acSJiri Slaby 	serial8250_clear_fifos(up);
12539196d8acSJiri Slaby 	serial_in(up, UART_RX);
12549196d8acSJiri Slaby 	if (up->capabilities & UART_CAP_UUE)
12559196d8acSJiri Slaby 		serial_out(up, UART_IER, UART_IER_UUE);
12569196d8acSJiri Slaby 	else
12579196d8acSJiri Slaby 		serial_out(up, UART_IER, 0);
12589196d8acSJiri Slaby 
12599196d8acSJiri Slaby out_lock:
12609196d8acSJiri Slaby 	spin_unlock_irqrestore(&port->lock, flags);
12619196d8acSJiri Slaby 	if (up->capabilities != old_capabilities) {
12629196d8acSJiri Slaby 		printk(KERN_WARNING
12639196d8acSJiri Slaby 		       "ttyS%d: detected caps %08x should be %08x\n",
12649196d8acSJiri Slaby 		       serial_index(port), old_capabilities,
12659196d8acSJiri Slaby 		       up->capabilities);
12669196d8acSJiri Slaby 	}
12679196d8acSJiri Slaby out:
12689196d8acSJiri Slaby 	DEBUG_AUTOCONF("iir=%d ", scratch);
12699196d8acSJiri Slaby 	DEBUG_AUTOCONF("type=%s\n", uart_config[port->type].name);
12709196d8acSJiri Slaby }
12719196d8acSJiri Slaby 
12729196d8acSJiri Slaby static void autoconfig_irq(struct uart_8250_port *up)
12739196d8acSJiri Slaby {
12749196d8acSJiri Slaby 	struct uart_port *port = &up->port;
12759196d8acSJiri Slaby 	unsigned char save_mcr, save_ier;
12769196d8acSJiri Slaby 	unsigned char save_ICP = 0;
12779196d8acSJiri Slaby 	unsigned int ICP = 0;
12789196d8acSJiri Slaby 	unsigned long irqs;
12799196d8acSJiri Slaby 	int irq;
12809196d8acSJiri Slaby 
12819196d8acSJiri Slaby 	if (port->flags & UPF_FOURPORT) {
12829196d8acSJiri Slaby 		ICP = (port->iobase & 0xfe0) | 0x1f;
12839196d8acSJiri Slaby 		save_ICP = inb_p(ICP);
12849196d8acSJiri Slaby 		outb_p(0x80, ICP);
12859196d8acSJiri Slaby 		inb_p(ICP);
12869196d8acSJiri Slaby 	}
12879196d8acSJiri Slaby 
12889196d8acSJiri Slaby 	/* forget possible initially masked and pending IRQ */
12899196d8acSJiri Slaby 	probe_irq_off(probe_irq_on());
12909196d8acSJiri Slaby 	save_mcr = serial_in(up, UART_MCR);
12919196d8acSJiri Slaby 	save_ier = serial_in(up, UART_IER);
12929196d8acSJiri Slaby 	serial_out(up, UART_MCR, UART_MCR_OUT1 | UART_MCR_OUT2);
12939196d8acSJiri Slaby 
12949196d8acSJiri Slaby 	irqs = probe_irq_on();
12959196d8acSJiri Slaby 	serial_out(up, UART_MCR, 0);
12969196d8acSJiri Slaby 	udelay(10);
12979196d8acSJiri Slaby 	if (port->flags & UPF_FOURPORT) {
12989196d8acSJiri Slaby 		serial_out(up, UART_MCR,
12999196d8acSJiri Slaby 			    UART_MCR_DTR | UART_MCR_RTS);
13009196d8acSJiri Slaby 	} else {
13019196d8acSJiri Slaby 		serial_out(up, UART_MCR,
13029196d8acSJiri Slaby 			    UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2);
13039196d8acSJiri Slaby 	}
13049196d8acSJiri Slaby 	serial_out(up, UART_IER, 0x0f);	/* enable all intrs */
13059196d8acSJiri Slaby 	serial_in(up, UART_LSR);
13069196d8acSJiri Slaby 	serial_in(up, UART_RX);
13079196d8acSJiri Slaby 	serial_in(up, UART_IIR);
13089196d8acSJiri Slaby 	serial_in(up, UART_MSR);
13099196d8acSJiri Slaby 	serial_out(up, UART_TX, 0xFF);
13109196d8acSJiri Slaby 	udelay(20);
13119196d8acSJiri Slaby 	irq = probe_irq_off(irqs);
13129196d8acSJiri Slaby 
13139196d8acSJiri Slaby 	serial_out(up, UART_MCR, save_mcr);
13149196d8acSJiri Slaby 	serial_out(up, UART_IER, save_ier);
13159196d8acSJiri Slaby 
13169196d8acSJiri Slaby 	if (port->flags & UPF_FOURPORT)
13179196d8acSJiri Slaby 		outb_p(save_ICP, ICP);
13189196d8acSJiri Slaby 
13199196d8acSJiri Slaby 	port->irq = (irq > 0) ? irq : 0;
13209196d8acSJiri Slaby }
13219196d8acSJiri Slaby 
13229196d8acSJiri Slaby static inline void __stop_tx(struct uart_8250_port *p)
13239196d8acSJiri Slaby {
13249196d8acSJiri Slaby 	if (p->ier & UART_IER_THRI) {
13259196d8acSJiri Slaby 		p->ier &= ~UART_IER_THRI;
13269196d8acSJiri Slaby 		serial_out(p, UART_IER, p->ier);
1327d74d5d1bSSebastian Andrzej Siewior 		serial8250_rpm_put_tx(p);
13289196d8acSJiri Slaby 	}
13299196d8acSJiri Slaby }
13309196d8acSJiri Slaby 
13319196d8acSJiri Slaby static void serial8250_stop_tx(struct uart_port *port)
13329196d8acSJiri Slaby {
1333b1261c86SAndy Shevchenko 	struct uart_8250_port *up = up_to_u8250p(port);
13349196d8acSJiri Slaby 
1335d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_get(up);
13369196d8acSJiri Slaby 	__stop_tx(up);
13379196d8acSJiri Slaby 
13389196d8acSJiri Slaby 	/*
13399196d8acSJiri Slaby 	 * We really want to stop the transmitter from sending.
13409196d8acSJiri Slaby 	 */
13419196d8acSJiri Slaby 	if (port->type == PORT_16C950) {
13429196d8acSJiri Slaby 		up->acr |= UART_ACR_TXDIS;
13439196d8acSJiri Slaby 		serial_icr_write(up, UART_ACR, up->acr);
13449196d8acSJiri Slaby 	}
1345d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_put(up);
13469196d8acSJiri Slaby }
13479196d8acSJiri Slaby 
13489196d8acSJiri Slaby static void serial8250_start_tx(struct uart_port *port)
13499196d8acSJiri Slaby {
1350b1261c86SAndy Shevchenko 	struct uart_8250_port *up = up_to_u8250p(port);
13519196d8acSJiri Slaby 
1352d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_get_tx(up);
13539196d8acSJiri Slaby 	if (up->dma && !serial8250_tx_dma(up)) {
13549196d8acSJiri Slaby 		return;
13559196d8acSJiri Slaby 	} else if (!(up->ier & UART_IER_THRI)) {
13569196d8acSJiri Slaby 		up->ier |= UART_IER_THRI;
13579196d8acSJiri Slaby 		serial_port_out(port, UART_IER, up->ier);
13589196d8acSJiri Slaby 
13599196d8acSJiri Slaby 		if (up->bugs & UART_BUG_TXEN) {
13609196d8acSJiri Slaby 			unsigned char lsr;
13619196d8acSJiri Slaby 			lsr = serial_in(up, UART_LSR);
13629196d8acSJiri Slaby 			up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
13639196d8acSJiri Slaby 			if (lsr & UART_LSR_TEMT)
13649196d8acSJiri Slaby 				serial8250_tx_chars(up);
13659196d8acSJiri Slaby 		}
13669196d8acSJiri Slaby 	}
13679196d8acSJiri Slaby 
13689196d8acSJiri Slaby 	/*
13699196d8acSJiri Slaby 	 * Re-enable the transmitter if we disabled it.
13709196d8acSJiri Slaby 	 */
13719196d8acSJiri Slaby 	if (port->type == PORT_16C950 && up->acr & UART_ACR_TXDIS) {
13729196d8acSJiri Slaby 		up->acr &= ~UART_ACR_TXDIS;
13739196d8acSJiri Slaby 		serial_icr_write(up, UART_ACR, up->acr);
13749196d8acSJiri Slaby 	}
13759196d8acSJiri Slaby }
13769196d8acSJiri Slaby 
1377234abab1SSebastian Andrzej Siewior static void serial8250_throttle(struct uart_port *port)
1378234abab1SSebastian Andrzej Siewior {
1379234abab1SSebastian Andrzej Siewior 	port->throttle(port);
1380234abab1SSebastian Andrzej Siewior }
1381234abab1SSebastian Andrzej Siewior 
1382234abab1SSebastian Andrzej Siewior static void serial8250_unthrottle(struct uart_port *port)
1383234abab1SSebastian Andrzej Siewior {
1384234abab1SSebastian Andrzej Siewior 	port->unthrottle(port);
1385234abab1SSebastian Andrzej Siewior }
1386234abab1SSebastian Andrzej Siewior 
13879196d8acSJiri Slaby static void serial8250_stop_rx(struct uart_port *port)
13889196d8acSJiri Slaby {
1389b1261c86SAndy Shevchenko 	struct uart_8250_port *up = up_to_u8250p(port);
13909196d8acSJiri Slaby 
1391d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_get(up);
1392d74d5d1bSSebastian Andrzej Siewior 
13939137568eSSebastian Andrzej Siewior 	up->ier &= ~(UART_IER_RLSI | UART_IER_RDI);
13949196d8acSJiri Slaby 	up->port.read_status_mask &= ~UART_LSR_DR;
13959196d8acSJiri Slaby 	serial_port_out(port, UART_IER, up->ier);
1396d74d5d1bSSebastian Andrzej Siewior 
1397d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_put(up);
13989196d8acSJiri Slaby }
13999196d8acSJiri Slaby 
14009196d8acSJiri Slaby static void serial8250_enable_ms(struct uart_port *port)
14019196d8acSJiri Slaby {
1402b1261c86SAndy Shevchenko 	struct uart_8250_port *up = up_to_u8250p(port);
14039196d8acSJiri Slaby 
14049196d8acSJiri Slaby 	/* no MSR capabilities */
14059196d8acSJiri Slaby 	if (up->bugs & UART_BUG_NOMSR)
14069196d8acSJiri Slaby 		return;
14079196d8acSJiri Slaby 
14089196d8acSJiri Slaby 	up->ier |= UART_IER_MSI;
1409d74d5d1bSSebastian Andrzej Siewior 
1410d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_get(up);
14119196d8acSJiri Slaby 	serial_port_out(port, UART_IER, up->ier);
1412d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_put(up);
14139196d8acSJiri Slaby }
14149196d8acSJiri Slaby 
14159196d8acSJiri Slaby /*
14169196d8acSJiri Slaby  * serial8250_rx_chars: processes according to the passed in LSR
14179196d8acSJiri Slaby  * value, and returns the remaining LSR bits not handled
14189196d8acSJiri Slaby  * by this Rx routine.
14199196d8acSJiri Slaby  */
14209196d8acSJiri Slaby unsigned char
14219196d8acSJiri Slaby serial8250_rx_chars(struct uart_8250_port *up, unsigned char lsr)
14229196d8acSJiri Slaby {
14239196d8acSJiri Slaby 	struct uart_port *port = &up->port;
14249196d8acSJiri Slaby 	unsigned char ch;
14259196d8acSJiri Slaby 	int max_count = 256;
14269196d8acSJiri Slaby 	char flag;
14279196d8acSJiri Slaby 
14289196d8acSJiri Slaby 	do {
14299196d8acSJiri Slaby 		if (likely(lsr & UART_LSR_DR))
14309196d8acSJiri Slaby 			ch = serial_in(up, UART_RX);
14319196d8acSJiri Slaby 		else
14329196d8acSJiri Slaby 			/*
14339196d8acSJiri Slaby 			 * Intel 82571 has a Serial Over Lan device that will
14349196d8acSJiri Slaby 			 * set UART_LSR_BI without setting UART_LSR_DR when
14359196d8acSJiri Slaby 			 * it receives a break. To avoid reading from the
14369196d8acSJiri Slaby 			 * receive buffer without UART_LSR_DR bit set, we
14379196d8acSJiri Slaby 			 * just force the read character to be 0
14389196d8acSJiri Slaby 			 */
14399196d8acSJiri Slaby 			ch = 0;
14409196d8acSJiri Slaby 
14419196d8acSJiri Slaby 		flag = TTY_NORMAL;
14429196d8acSJiri Slaby 		port->icount.rx++;
14439196d8acSJiri Slaby 
14449196d8acSJiri Slaby 		lsr |= up->lsr_saved_flags;
14459196d8acSJiri Slaby 		up->lsr_saved_flags = 0;
14469196d8acSJiri Slaby 
14479196d8acSJiri Slaby 		if (unlikely(lsr & UART_LSR_BRK_ERROR_BITS)) {
14489196d8acSJiri Slaby 			if (lsr & UART_LSR_BI) {
14499196d8acSJiri Slaby 				lsr &= ~(UART_LSR_FE | UART_LSR_PE);
14509196d8acSJiri Slaby 				port->icount.brk++;
14519196d8acSJiri Slaby 				/*
14529196d8acSJiri Slaby 				 * We do the SysRQ and SAK checking
14539196d8acSJiri Slaby 				 * here because otherwise the break
14549196d8acSJiri Slaby 				 * may get masked by ignore_status_mask
14559196d8acSJiri Slaby 				 * or read_status_mask.
14569196d8acSJiri Slaby 				 */
14579196d8acSJiri Slaby 				if (uart_handle_break(port))
14589196d8acSJiri Slaby 					goto ignore_char;
14599196d8acSJiri Slaby 			} else if (lsr & UART_LSR_PE)
14609196d8acSJiri Slaby 				port->icount.parity++;
14619196d8acSJiri Slaby 			else if (lsr & UART_LSR_FE)
14629196d8acSJiri Slaby 				port->icount.frame++;
14639196d8acSJiri Slaby 			if (lsr & UART_LSR_OE)
14649196d8acSJiri Slaby 				port->icount.overrun++;
14659196d8acSJiri Slaby 
14669196d8acSJiri Slaby 			/*
14679196d8acSJiri Slaby 			 * Mask off conditions which should be ignored.
14689196d8acSJiri Slaby 			 */
14699196d8acSJiri Slaby 			lsr &= port->read_status_mask;
14709196d8acSJiri Slaby 
14719196d8acSJiri Slaby 			if (lsr & UART_LSR_BI) {
14729196d8acSJiri Slaby 				DEBUG_INTR("handling break....");
14739196d8acSJiri Slaby 				flag = TTY_BREAK;
14749196d8acSJiri Slaby 			} else if (lsr & UART_LSR_PE)
14759196d8acSJiri Slaby 				flag = TTY_PARITY;
14769196d8acSJiri Slaby 			else if (lsr & UART_LSR_FE)
14779196d8acSJiri Slaby 				flag = TTY_FRAME;
14789196d8acSJiri Slaby 		}
14799196d8acSJiri Slaby 		if (uart_handle_sysrq_char(port, ch))
14809196d8acSJiri Slaby 			goto ignore_char;
14819196d8acSJiri Slaby 
14829196d8acSJiri Slaby 		uart_insert_char(port, lsr, UART_LSR_OE, ch, flag);
14839196d8acSJiri Slaby 
14849196d8acSJiri Slaby ignore_char:
14859196d8acSJiri Slaby 		lsr = serial_in(up, UART_LSR);
14869196d8acSJiri Slaby 	} while ((lsr & (UART_LSR_DR | UART_LSR_BI)) && (max_count-- > 0));
14879196d8acSJiri Slaby 	spin_unlock(&port->lock);
14889196d8acSJiri Slaby 	tty_flip_buffer_push(&port->state->port);
14899196d8acSJiri Slaby 	spin_lock(&port->lock);
14909196d8acSJiri Slaby 	return lsr;
14919196d8acSJiri Slaby }
14929196d8acSJiri Slaby EXPORT_SYMBOL_GPL(serial8250_rx_chars);
14939196d8acSJiri Slaby 
14949196d8acSJiri Slaby void serial8250_tx_chars(struct uart_8250_port *up)
14959196d8acSJiri Slaby {
14969196d8acSJiri Slaby 	struct uart_port *port = &up->port;
14979196d8acSJiri Slaby 	struct circ_buf *xmit = &port->state->xmit;
14989196d8acSJiri Slaby 	int count;
14999196d8acSJiri Slaby 
15009196d8acSJiri Slaby 	if (port->x_char) {
15019196d8acSJiri Slaby 		serial_out(up, UART_TX, port->x_char);
15029196d8acSJiri Slaby 		port->icount.tx++;
15039196d8acSJiri Slaby 		port->x_char = 0;
15049196d8acSJiri Slaby 		return;
15059196d8acSJiri Slaby 	}
15069196d8acSJiri Slaby 	if (uart_tx_stopped(port)) {
15079196d8acSJiri Slaby 		serial8250_stop_tx(port);
15089196d8acSJiri Slaby 		return;
15099196d8acSJiri Slaby 	}
15109196d8acSJiri Slaby 	if (uart_circ_empty(xmit)) {
15119196d8acSJiri Slaby 		__stop_tx(up);
15129196d8acSJiri Slaby 		return;
15139196d8acSJiri Slaby 	}
15149196d8acSJiri Slaby 
15159196d8acSJiri Slaby 	count = up->tx_loadsz;
15169196d8acSJiri Slaby 	do {
15179196d8acSJiri Slaby 		serial_out(up, UART_TX, xmit->buf[xmit->tail]);
15189196d8acSJiri Slaby 		xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
15199196d8acSJiri Slaby 		port->icount.tx++;
15209196d8acSJiri Slaby 		if (uart_circ_empty(xmit))
15219196d8acSJiri Slaby 			break;
15229196d8acSJiri Slaby 		if (up->capabilities & UART_CAP_HFIFO) {
15239196d8acSJiri Slaby 			if ((serial_port_in(port, UART_LSR) & BOTH_EMPTY) !=
15249196d8acSJiri Slaby 			    BOTH_EMPTY)
15259196d8acSJiri Slaby 				break;
15269196d8acSJiri Slaby 		}
15279196d8acSJiri Slaby 	} while (--count > 0);
15289196d8acSJiri Slaby 
15299196d8acSJiri Slaby 	if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
15309196d8acSJiri Slaby 		uart_write_wakeup(port);
15319196d8acSJiri Slaby 
15329196d8acSJiri Slaby 	DEBUG_INTR("THRE...");
15339196d8acSJiri Slaby 
1534d74d5d1bSSebastian Andrzej Siewior 	/*
1535d74d5d1bSSebastian Andrzej Siewior 	 * With RPM enabled, we have to wait once the FIFO is empty before the
1536d74d5d1bSSebastian Andrzej Siewior 	 * HW can go idle. So we get here once again with empty FIFO and disable
1537d74d5d1bSSebastian Andrzej Siewior 	 * the interrupt and RPM in __stop_tx()
1538d74d5d1bSSebastian Andrzej Siewior 	 */
1539d74d5d1bSSebastian Andrzej Siewior 	if (uart_circ_empty(xmit) && !(up->capabilities & UART_CAP_RPM))
15409196d8acSJiri Slaby 		__stop_tx(up);
15419196d8acSJiri Slaby }
15429196d8acSJiri Slaby EXPORT_SYMBOL_GPL(serial8250_tx_chars);
15439196d8acSJiri Slaby 
15445435d20fSPeter Hurley /* Caller holds uart port lock */
15459196d8acSJiri Slaby unsigned int serial8250_modem_status(struct uart_8250_port *up)
15469196d8acSJiri Slaby {
15479196d8acSJiri Slaby 	struct uart_port *port = &up->port;
15489196d8acSJiri Slaby 	unsigned int status = serial_in(up, UART_MSR);
15499196d8acSJiri Slaby 
15509196d8acSJiri Slaby 	status |= up->msr_saved_flags;
15519196d8acSJiri Slaby 	up->msr_saved_flags = 0;
15529196d8acSJiri Slaby 	if (status & UART_MSR_ANY_DELTA && up->ier & UART_IER_MSI &&
15539196d8acSJiri Slaby 	    port->state != NULL) {
15549196d8acSJiri Slaby 		if (status & UART_MSR_TERI)
15559196d8acSJiri Slaby 			port->icount.rng++;
15569196d8acSJiri Slaby 		if (status & UART_MSR_DDSR)
15579196d8acSJiri Slaby 			port->icount.dsr++;
15589196d8acSJiri Slaby 		if (status & UART_MSR_DDCD)
15599196d8acSJiri Slaby 			uart_handle_dcd_change(port, status & UART_MSR_DCD);
15609196d8acSJiri Slaby 		if (status & UART_MSR_DCTS)
15619196d8acSJiri Slaby 			uart_handle_cts_change(port, status & UART_MSR_CTS);
15629196d8acSJiri Slaby 
15639196d8acSJiri Slaby 		wake_up_interruptible(&port->state->port.delta_msr_wait);
15649196d8acSJiri Slaby 	}
15659196d8acSJiri Slaby 
15669196d8acSJiri Slaby 	return status;
15679196d8acSJiri Slaby }
15689196d8acSJiri Slaby EXPORT_SYMBOL_GPL(serial8250_modem_status);
15699196d8acSJiri Slaby 
15709196d8acSJiri Slaby /*
15719196d8acSJiri Slaby  * This handles the interrupt from one port.
15729196d8acSJiri Slaby  */
15739196d8acSJiri Slaby int serial8250_handle_irq(struct uart_port *port, unsigned int iir)
15749196d8acSJiri Slaby {
15759196d8acSJiri Slaby 	unsigned char status;
15769196d8acSJiri Slaby 	unsigned long flags;
1577b1261c86SAndy Shevchenko 	struct uart_8250_port *up = up_to_u8250p(port);
15789196d8acSJiri Slaby 	int dma_err = 0;
15799196d8acSJiri Slaby 
15809196d8acSJiri Slaby 	if (iir & UART_IIR_NO_INT)
15819196d8acSJiri Slaby 		return 0;
15829196d8acSJiri Slaby 
15839196d8acSJiri Slaby 	spin_lock_irqsave(&port->lock, flags);
15849196d8acSJiri Slaby 
15859196d8acSJiri Slaby 	status = serial_port_in(port, UART_LSR);
15869196d8acSJiri Slaby 
15879196d8acSJiri Slaby 	DEBUG_INTR("status = %x...", status);
15889196d8acSJiri Slaby 
15899196d8acSJiri Slaby 	if (status & (UART_LSR_DR | UART_LSR_BI)) {
15909196d8acSJiri Slaby 		if (up->dma)
15919196d8acSJiri Slaby 			dma_err = serial8250_rx_dma(up, iir);
15929196d8acSJiri Slaby 
15939196d8acSJiri Slaby 		if (!up->dma || dma_err)
15949196d8acSJiri Slaby 			status = serial8250_rx_chars(up, status);
15959196d8acSJiri Slaby 	}
15969196d8acSJiri Slaby 	serial8250_modem_status(up);
1597b08c9c31SLoic Poulain 	if (!up->dma && (status & UART_LSR_THRE))
15989196d8acSJiri Slaby 		serial8250_tx_chars(up);
15999196d8acSJiri Slaby 
16009196d8acSJiri Slaby 	spin_unlock_irqrestore(&port->lock, flags);
16019196d8acSJiri Slaby 	return 1;
16029196d8acSJiri Slaby }
16039196d8acSJiri Slaby EXPORT_SYMBOL_GPL(serial8250_handle_irq);
16049196d8acSJiri Slaby 
16059196d8acSJiri Slaby static int serial8250_default_handle_irq(struct uart_port *port)
16069196d8acSJiri Slaby {
1607d74d5d1bSSebastian Andrzej Siewior 	struct uart_8250_port *up = up_to_u8250p(port);
1608d74d5d1bSSebastian Andrzej Siewior 	unsigned int iir;
1609d74d5d1bSSebastian Andrzej Siewior 	int ret;
16109196d8acSJiri Slaby 
1611d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_get(up);
1612d74d5d1bSSebastian Andrzej Siewior 
1613d74d5d1bSSebastian Andrzej Siewior 	iir = serial_port_in(port, UART_IIR);
1614d74d5d1bSSebastian Andrzej Siewior 	ret = serial8250_handle_irq(port, iir);
1615d74d5d1bSSebastian Andrzej Siewior 
1616d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_put(up);
1617d74d5d1bSSebastian Andrzej Siewior 	return ret;
16189196d8acSJiri Slaby }
16199196d8acSJiri Slaby 
16209196d8acSJiri Slaby /*
16219196d8acSJiri Slaby  * These Exar UARTs have an extra interrupt indicator that could
16229196d8acSJiri Slaby  * fire for a few unimplemented interrupts.  One of which is a
16239196d8acSJiri Slaby  * wakeup event when coming out of sleep.  Put this here just
16249196d8acSJiri Slaby  * to be on the safe side that these interrupts don't go unhandled.
16259196d8acSJiri Slaby  */
16269196d8acSJiri Slaby static int exar_handle_irq(struct uart_port *port)
16279196d8acSJiri Slaby {
16289196d8acSJiri Slaby 	unsigned char int0, int1, int2, int3;
16299196d8acSJiri Slaby 	unsigned int iir = serial_port_in(port, UART_IIR);
16309196d8acSJiri Slaby 	int ret;
16319196d8acSJiri Slaby 
16329196d8acSJiri Slaby 	ret = serial8250_handle_irq(port, iir);
16339196d8acSJiri Slaby 
16349196d8acSJiri Slaby 	if ((port->type == PORT_XR17V35X) ||
16359196d8acSJiri Slaby 	   (port->type == PORT_XR17D15X)) {
16369196d8acSJiri Slaby 		int0 = serial_port_in(port, 0x80);
16379196d8acSJiri Slaby 		int1 = serial_port_in(port, 0x81);
16389196d8acSJiri Slaby 		int2 = serial_port_in(port, 0x82);
16399196d8acSJiri Slaby 		int3 = serial_port_in(port, 0x83);
16409196d8acSJiri Slaby 	}
16419196d8acSJiri Slaby 
16429196d8acSJiri Slaby 	return ret;
16439196d8acSJiri Slaby }
16449196d8acSJiri Slaby 
16459196d8acSJiri Slaby /*
16469196d8acSJiri Slaby  * This is the serial driver's interrupt routine.
16479196d8acSJiri Slaby  *
16489196d8acSJiri Slaby  * Arjan thinks the old way was overly complex, so it got simplified.
16499196d8acSJiri Slaby  * Alan disagrees, saying that need the complexity to handle the weird
16509196d8acSJiri Slaby  * nature of ISA shared interrupts.  (This is a special exception.)
16519196d8acSJiri Slaby  *
16529196d8acSJiri Slaby  * In order to handle ISA shared interrupts properly, we need to check
16539196d8acSJiri Slaby  * that all ports have been serviced, and therefore the ISA interrupt
16549196d8acSJiri Slaby  * line has been de-asserted.
16559196d8acSJiri Slaby  *
16569196d8acSJiri Slaby  * This means we need to loop through all ports. checking that they
16579196d8acSJiri Slaby  * don't have an interrupt pending.
16589196d8acSJiri Slaby  */
16599196d8acSJiri Slaby static irqreturn_t serial8250_interrupt(int irq, void *dev_id)
16609196d8acSJiri Slaby {
16619196d8acSJiri Slaby 	struct irq_info *i = dev_id;
16629196d8acSJiri Slaby 	struct list_head *l, *end = NULL;
16639196d8acSJiri Slaby 	int pass_counter = 0, handled = 0;
16649196d8acSJiri Slaby 
16659196d8acSJiri Slaby 	DEBUG_INTR("serial8250_interrupt(%d)...", irq);
16669196d8acSJiri Slaby 
16679196d8acSJiri Slaby 	spin_lock(&i->lock);
16689196d8acSJiri Slaby 
16699196d8acSJiri Slaby 	l = i->head;
16709196d8acSJiri Slaby 	do {
16719196d8acSJiri Slaby 		struct uart_8250_port *up;
16729196d8acSJiri Slaby 		struct uart_port *port;
16739196d8acSJiri Slaby 
16749196d8acSJiri Slaby 		up = list_entry(l, struct uart_8250_port, list);
16759196d8acSJiri Slaby 		port = &up->port;
16769196d8acSJiri Slaby 
16779196d8acSJiri Slaby 		if (port->handle_irq(port)) {
16789196d8acSJiri Slaby 			handled = 1;
16799196d8acSJiri Slaby 			end = NULL;
16809196d8acSJiri Slaby 		} else if (end == NULL)
16819196d8acSJiri Slaby 			end = l;
16829196d8acSJiri Slaby 
16839196d8acSJiri Slaby 		l = l->next;
16849196d8acSJiri Slaby 
16859196d8acSJiri Slaby 		if (l == i->head && pass_counter++ > PASS_LIMIT) {
16869196d8acSJiri Slaby 			/* If we hit this, we're dead. */
16879196d8acSJiri Slaby 			printk_ratelimited(KERN_ERR
16889196d8acSJiri Slaby 				"serial8250: too much work for irq%d\n", irq);
16899196d8acSJiri Slaby 			break;
16909196d8acSJiri Slaby 		}
16919196d8acSJiri Slaby 	} while (l != end);
16929196d8acSJiri Slaby 
16939196d8acSJiri Slaby 	spin_unlock(&i->lock);
16949196d8acSJiri Slaby 
16959196d8acSJiri Slaby 	DEBUG_INTR("end.\n");
16969196d8acSJiri Slaby 
16979196d8acSJiri Slaby 	return IRQ_RETVAL(handled);
16989196d8acSJiri Slaby }
16999196d8acSJiri Slaby 
17009196d8acSJiri Slaby /*
17019196d8acSJiri Slaby  * To support ISA shared interrupts, we need to have one interrupt
17029196d8acSJiri Slaby  * handler that ensures that the IRQ line has been deasserted
17039196d8acSJiri Slaby  * before returning.  Failing to do this will result in the IRQ
17049196d8acSJiri Slaby  * line being stuck active, and, since ISA irqs are edge triggered,
17059196d8acSJiri Slaby  * no more IRQs will be seen.
17069196d8acSJiri Slaby  */
17079196d8acSJiri Slaby static void serial_do_unlink(struct irq_info *i, struct uart_8250_port *up)
17089196d8acSJiri Slaby {
17099196d8acSJiri Slaby 	spin_lock_irq(&i->lock);
17109196d8acSJiri Slaby 
17119196d8acSJiri Slaby 	if (!list_empty(i->head)) {
17129196d8acSJiri Slaby 		if (i->head == &up->list)
17139196d8acSJiri Slaby 			i->head = i->head->next;
17149196d8acSJiri Slaby 		list_del(&up->list);
17159196d8acSJiri Slaby 	} else {
17169196d8acSJiri Slaby 		BUG_ON(i->head != &up->list);
17179196d8acSJiri Slaby 		i->head = NULL;
17189196d8acSJiri Slaby 	}
17199196d8acSJiri Slaby 	spin_unlock_irq(&i->lock);
17209196d8acSJiri Slaby 	/* List empty so throw away the hash node */
17219196d8acSJiri Slaby 	if (i->head == NULL) {
17229196d8acSJiri Slaby 		hlist_del(&i->node);
17239196d8acSJiri Slaby 		kfree(i);
17249196d8acSJiri Slaby 	}
17259196d8acSJiri Slaby }
17269196d8acSJiri Slaby 
17279196d8acSJiri Slaby static int serial_link_irq_chain(struct uart_8250_port *up)
17289196d8acSJiri Slaby {
17299196d8acSJiri Slaby 	struct hlist_head *h;
17309196d8acSJiri Slaby 	struct hlist_node *n;
17319196d8acSJiri Slaby 	struct irq_info *i;
17329196d8acSJiri Slaby 	int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? IRQF_SHARED : 0;
17339196d8acSJiri Slaby 
17349196d8acSJiri Slaby 	mutex_lock(&hash_mutex);
17359196d8acSJiri Slaby 
17369196d8acSJiri Slaby 	h = &irq_lists[up->port.irq % NR_IRQ_HASH];
17379196d8acSJiri Slaby 
17389196d8acSJiri Slaby 	hlist_for_each(n, h) {
17399196d8acSJiri Slaby 		i = hlist_entry(n, struct irq_info, node);
17409196d8acSJiri Slaby 		if (i->irq == up->port.irq)
17419196d8acSJiri Slaby 			break;
17429196d8acSJiri Slaby 	}
17439196d8acSJiri Slaby 
17449196d8acSJiri Slaby 	if (n == NULL) {
17459196d8acSJiri Slaby 		i = kzalloc(sizeof(struct irq_info), GFP_KERNEL);
17469196d8acSJiri Slaby 		if (i == NULL) {
17479196d8acSJiri Slaby 			mutex_unlock(&hash_mutex);
17489196d8acSJiri Slaby 			return -ENOMEM;
17499196d8acSJiri Slaby 		}
17509196d8acSJiri Slaby 		spin_lock_init(&i->lock);
17519196d8acSJiri Slaby 		i->irq = up->port.irq;
17529196d8acSJiri Slaby 		hlist_add_head(&i->node, h);
17539196d8acSJiri Slaby 	}
17549196d8acSJiri Slaby 	mutex_unlock(&hash_mutex);
17559196d8acSJiri Slaby 
17569196d8acSJiri Slaby 	spin_lock_irq(&i->lock);
17579196d8acSJiri Slaby 
17589196d8acSJiri Slaby 	if (i->head) {
17599196d8acSJiri Slaby 		list_add(&up->list, i->head);
17609196d8acSJiri Slaby 		spin_unlock_irq(&i->lock);
17619196d8acSJiri Slaby 
17629196d8acSJiri Slaby 		ret = 0;
17639196d8acSJiri Slaby 	} else {
17649196d8acSJiri Slaby 		INIT_LIST_HEAD(&up->list);
17659196d8acSJiri Slaby 		i->head = &up->list;
17669196d8acSJiri Slaby 		spin_unlock_irq(&i->lock);
17679196d8acSJiri Slaby 		irq_flags |= up->port.irqflags;
17689196d8acSJiri Slaby 		ret = request_irq(up->port.irq, serial8250_interrupt,
17699196d8acSJiri Slaby 				  irq_flags, "serial", i);
17709196d8acSJiri Slaby 		if (ret < 0)
17719196d8acSJiri Slaby 			serial_do_unlink(i, up);
17729196d8acSJiri Slaby 	}
17739196d8acSJiri Slaby 
17749196d8acSJiri Slaby 	return ret;
17759196d8acSJiri Slaby }
17769196d8acSJiri Slaby 
17779196d8acSJiri Slaby static void serial_unlink_irq_chain(struct uart_8250_port *up)
17789196d8acSJiri Slaby {
1779bd2fe272SPaul Gortmaker 	/*
1780bd2fe272SPaul Gortmaker 	 * yes, some broken gcc emit "warning: 'i' may be used uninitialized"
1781bd2fe272SPaul Gortmaker 	 * but no, we are not going to take a patch that assigns NULL below.
1782bd2fe272SPaul Gortmaker 	 */
17839196d8acSJiri Slaby 	struct irq_info *i;
17849196d8acSJiri Slaby 	struct hlist_node *n;
17859196d8acSJiri Slaby 	struct hlist_head *h;
17869196d8acSJiri Slaby 
17879196d8acSJiri Slaby 	mutex_lock(&hash_mutex);
17889196d8acSJiri Slaby 
17899196d8acSJiri Slaby 	h = &irq_lists[up->port.irq % NR_IRQ_HASH];
17909196d8acSJiri Slaby 
17919196d8acSJiri Slaby 	hlist_for_each(n, h) {
17929196d8acSJiri Slaby 		i = hlist_entry(n, struct irq_info, node);
17939196d8acSJiri Slaby 		if (i->irq == up->port.irq)
17949196d8acSJiri Slaby 			break;
17959196d8acSJiri Slaby 	}
17969196d8acSJiri Slaby 
17979196d8acSJiri Slaby 	BUG_ON(n == NULL);
17989196d8acSJiri Slaby 	BUG_ON(i->head == NULL);
17999196d8acSJiri Slaby 
18009196d8acSJiri Slaby 	if (list_empty(i->head))
18019196d8acSJiri Slaby 		free_irq(up->port.irq, i);
18029196d8acSJiri Slaby 
18039196d8acSJiri Slaby 	serial_do_unlink(i, up);
18049196d8acSJiri Slaby 	mutex_unlock(&hash_mutex);
18059196d8acSJiri Slaby }
18069196d8acSJiri Slaby 
18079196d8acSJiri Slaby /*
18089196d8acSJiri Slaby  * This function is used to handle ports that do not have an
18099196d8acSJiri Slaby  * interrupt.  This doesn't work very well for 16450's, but gives
18109196d8acSJiri Slaby  * barely passable results for a 16550A.  (Although at the expense
18119196d8acSJiri Slaby  * of much CPU overhead).
18129196d8acSJiri Slaby  */
18139196d8acSJiri Slaby static void serial8250_timeout(unsigned long data)
18149196d8acSJiri Slaby {
18159196d8acSJiri Slaby 	struct uart_8250_port *up = (struct uart_8250_port *)data;
18169196d8acSJiri Slaby 
18179196d8acSJiri Slaby 	up->port.handle_irq(&up->port);
18189196d8acSJiri Slaby 	mod_timer(&up->timer, jiffies + uart_poll_timeout(&up->port));
18199196d8acSJiri Slaby }
18209196d8acSJiri Slaby 
18219196d8acSJiri Slaby static void serial8250_backup_timeout(unsigned long data)
18229196d8acSJiri Slaby {
18239196d8acSJiri Slaby 	struct uart_8250_port *up = (struct uart_8250_port *)data;
18249196d8acSJiri Slaby 	unsigned int iir, ier = 0, lsr;
18259196d8acSJiri Slaby 	unsigned long flags;
18269196d8acSJiri Slaby 
18279196d8acSJiri Slaby 	spin_lock_irqsave(&up->port.lock, flags);
18289196d8acSJiri Slaby 
18299196d8acSJiri Slaby 	/*
18309196d8acSJiri Slaby 	 * Must disable interrupts or else we risk racing with the interrupt
18319196d8acSJiri Slaby 	 * based handler.
18329196d8acSJiri Slaby 	 */
18339196d8acSJiri Slaby 	if (up->port.irq) {
18349196d8acSJiri Slaby 		ier = serial_in(up, UART_IER);
18359196d8acSJiri Slaby 		serial_out(up, UART_IER, 0);
18369196d8acSJiri Slaby 	}
18379196d8acSJiri Slaby 
18389196d8acSJiri Slaby 	iir = serial_in(up, UART_IIR);
18399196d8acSJiri Slaby 
18409196d8acSJiri Slaby 	/*
18419196d8acSJiri Slaby 	 * This should be a safe test for anyone who doesn't trust the
18429196d8acSJiri Slaby 	 * IIR bits on their UART, but it's specifically designed for
18439196d8acSJiri Slaby 	 * the "Diva" UART used on the management processor on many HP
18449196d8acSJiri Slaby 	 * ia64 and parisc boxes.
18459196d8acSJiri Slaby 	 */
18469196d8acSJiri Slaby 	lsr = serial_in(up, UART_LSR);
18479196d8acSJiri Slaby 	up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
18489196d8acSJiri Slaby 	if ((iir & UART_IIR_NO_INT) && (up->ier & UART_IER_THRI) &&
18499196d8acSJiri Slaby 	    (!uart_circ_empty(&up->port.state->xmit) || up->port.x_char) &&
18509196d8acSJiri Slaby 	    (lsr & UART_LSR_THRE)) {
18519196d8acSJiri Slaby 		iir &= ~(UART_IIR_ID | UART_IIR_NO_INT);
18529196d8acSJiri Slaby 		iir |= UART_IIR_THRI;
18539196d8acSJiri Slaby 	}
18549196d8acSJiri Slaby 
18559196d8acSJiri Slaby 	if (!(iir & UART_IIR_NO_INT))
18569196d8acSJiri Slaby 		serial8250_tx_chars(up);
18579196d8acSJiri Slaby 
18589196d8acSJiri Slaby 	if (up->port.irq)
18599196d8acSJiri Slaby 		serial_out(up, UART_IER, ier);
18609196d8acSJiri Slaby 
18619196d8acSJiri Slaby 	spin_unlock_irqrestore(&up->port.lock, flags);
18629196d8acSJiri Slaby 
18639196d8acSJiri Slaby 	/* Standard timer interval plus 0.2s to keep the port running */
18649196d8acSJiri Slaby 	mod_timer(&up->timer,
18659196d8acSJiri Slaby 		jiffies + uart_poll_timeout(&up->port) + HZ / 5);
18669196d8acSJiri Slaby }
18679196d8acSJiri Slaby 
18689196d8acSJiri Slaby static unsigned int serial8250_tx_empty(struct uart_port *port)
18699196d8acSJiri Slaby {
1870b1261c86SAndy Shevchenko 	struct uart_8250_port *up = up_to_u8250p(port);
18719196d8acSJiri Slaby 	unsigned long flags;
18729196d8acSJiri Slaby 	unsigned int lsr;
18739196d8acSJiri Slaby 
1874d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_get(up);
1875d74d5d1bSSebastian Andrzej Siewior 
18769196d8acSJiri Slaby 	spin_lock_irqsave(&port->lock, flags);
18779196d8acSJiri Slaby 	lsr = serial_port_in(port, UART_LSR);
18789196d8acSJiri Slaby 	up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
18799196d8acSJiri Slaby 	spin_unlock_irqrestore(&port->lock, flags);
18809196d8acSJiri Slaby 
1881d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_put(up);
1882d74d5d1bSSebastian Andrzej Siewior 
18839196d8acSJiri Slaby 	return (lsr & BOTH_EMPTY) == BOTH_EMPTY ? TIOCSER_TEMT : 0;
18849196d8acSJiri Slaby }
18859196d8acSJiri Slaby 
18869196d8acSJiri Slaby static unsigned int serial8250_get_mctrl(struct uart_port *port)
18879196d8acSJiri Slaby {
1888b1261c86SAndy Shevchenko 	struct uart_8250_port *up = up_to_u8250p(port);
18899196d8acSJiri Slaby 	unsigned int status;
18909196d8acSJiri Slaby 	unsigned int ret;
18919196d8acSJiri Slaby 
1892d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_get(up);
18939196d8acSJiri Slaby 	status = serial8250_modem_status(up);
1894d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_put(up);
18959196d8acSJiri Slaby 
18969196d8acSJiri Slaby 	ret = 0;
18979196d8acSJiri Slaby 	if (status & UART_MSR_DCD)
18989196d8acSJiri Slaby 		ret |= TIOCM_CAR;
18999196d8acSJiri Slaby 	if (status & UART_MSR_RI)
19009196d8acSJiri Slaby 		ret |= TIOCM_RNG;
19019196d8acSJiri Slaby 	if (status & UART_MSR_DSR)
19029196d8acSJiri Slaby 		ret |= TIOCM_DSR;
19039196d8acSJiri Slaby 	if (status & UART_MSR_CTS)
19049196d8acSJiri Slaby 		ret |= TIOCM_CTS;
19059196d8acSJiri Slaby 	return ret;
19069196d8acSJiri Slaby }
19079196d8acSJiri Slaby 
19089196d8acSJiri Slaby static void serial8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
19099196d8acSJiri Slaby {
1910b1261c86SAndy Shevchenko 	struct uart_8250_port *up = up_to_u8250p(port);
19119196d8acSJiri Slaby 	unsigned char mcr = 0;
19129196d8acSJiri Slaby 
19139196d8acSJiri Slaby 	if (mctrl & TIOCM_RTS)
19149196d8acSJiri Slaby 		mcr |= UART_MCR_RTS;
19159196d8acSJiri Slaby 	if (mctrl & TIOCM_DTR)
19169196d8acSJiri Slaby 		mcr |= UART_MCR_DTR;
19179196d8acSJiri Slaby 	if (mctrl & TIOCM_OUT1)
19189196d8acSJiri Slaby 		mcr |= UART_MCR_OUT1;
19199196d8acSJiri Slaby 	if (mctrl & TIOCM_OUT2)
19209196d8acSJiri Slaby 		mcr |= UART_MCR_OUT2;
19219196d8acSJiri Slaby 	if (mctrl & TIOCM_LOOP)
19229196d8acSJiri Slaby 		mcr |= UART_MCR_LOOP;
19239196d8acSJiri Slaby 
19249196d8acSJiri Slaby 	mcr = (mcr & up->mcr_mask) | up->mcr_force | up->mcr;
19259196d8acSJiri Slaby 
19269196d8acSJiri Slaby 	serial_port_out(port, UART_MCR, mcr);
19279196d8acSJiri Slaby }
19289196d8acSJiri Slaby 
19299196d8acSJiri Slaby static void serial8250_break_ctl(struct uart_port *port, int break_state)
19309196d8acSJiri Slaby {
1931b1261c86SAndy Shevchenko 	struct uart_8250_port *up = up_to_u8250p(port);
19329196d8acSJiri Slaby 	unsigned long flags;
19339196d8acSJiri Slaby 
1934d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_get(up);
19359196d8acSJiri Slaby 	spin_lock_irqsave(&port->lock, flags);
19369196d8acSJiri Slaby 	if (break_state == -1)
19379196d8acSJiri Slaby 		up->lcr |= UART_LCR_SBC;
19389196d8acSJiri Slaby 	else
19399196d8acSJiri Slaby 		up->lcr &= ~UART_LCR_SBC;
19409196d8acSJiri Slaby 	serial_port_out(port, UART_LCR, up->lcr);
19419196d8acSJiri Slaby 	spin_unlock_irqrestore(&port->lock, flags);
1942d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_put(up);
19439196d8acSJiri Slaby }
19449196d8acSJiri Slaby 
19459196d8acSJiri Slaby /*
19469196d8acSJiri Slaby  *	Wait for transmitter & holding register to empty
19479196d8acSJiri Slaby  */
19489196d8acSJiri Slaby static void wait_for_xmitr(struct uart_8250_port *up, int bits)
19499196d8acSJiri Slaby {
19509196d8acSJiri Slaby 	unsigned int status, tmout = 10000;
19519196d8acSJiri Slaby 
19529196d8acSJiri Slaby 	/* Wait up to 10ms for the character(s) to be sent. */
19539196d8acSJiri Slaby 	for (;;) {
19549196d8acSJiri Slaby 		status = serial_in(up, UART_LSR);
19559196d8acSJiri Slaby 
19569196d8acSJiri Slaby 		up->lsr_saved_flags |= status & LSR_SAVE_FLAGS;
19579196d8acSJiri Slaby 
19589196d8acSJiri Slaby 		if ((status & bits) == bits)
19599196d8acSJiri Slaby 			break;
19609196d8acSJiri Slaby 		if (--tmout == 0)
19619196d8acSJiri Slaby 			break;
19629196d8acSJiri Slaby 		udelay(1);
19639196d8acSJiri Slaby 	}
19649196d8acSJiri Slaby 
19659196d8acSJiri Slaby 	/* Wait up to 1s for flow control if necessary */
19669196d8acSJiri Slaby 	if (up->port.flags & UPF_CONS_FLOW) {
19679196d8acSJiri Slaby 		unsigned int tmout;
19689196d8acSJiri Slaby 		for (tmout = 1000000; tmout; tmout--) {
19699196d8acSJiri Slaby 			unsigned int msr = serial_in(up, UART_MSR);
19709196d8acSJiri Slaby 			up->msr_saved_flags |= msr & MSR_SAVE_FLAGS;
19719196d8acSJiri Slaby 			if (msr & UART_MSR_CTS)
19729196d8acSJiri Slaby 				break;
19739196d8acSJiri Slaby 			udelay(1);
19749196d8acSJiri Slaby 			touch_nmi_watchdog();
19759196d8acSJiri Slaby 		}
19769196d8acSJiri Slaby 	}
19779196d8acSJiri Slaby }
19789196d8acSJiri Slaby 
19799196d8acSJiri Slaby #ifdef CONFIG_CONSOLE_POLL
19809196d8acSJiri Slaby /*
19819196d8acSJiri Slaby  * Console polling routines for writing and reading from the uart while
19829196d8acSJiri Slaby  * in an interrupt or debug context.
19839196d8acSJiri Slaby  */
19849196d8acSJiri Slaby 
19859196d8acSJiri Slaby static int serial8250_get_poll_char(struct uart_port *port)
19869196d8acSJiri Slaby {
1987d74d5d1bSSebastian Andrzej Siewior 	struct uart_8250_port *up = up_to_u8250p(port);
1988d74d5d1bSSebastian Andrzej Siewior 	unsigned char lsr;
1989d74d5d1bSSebastian Andrzej Siewior 	int status;
19909196d8acSJiri Slaby 
1991d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_get(up);
19929196d8acSJiri Slaby 
1993d74d5d1bSSebastian Andrzej Siewior 	lsr = serial_port_in(port, UART_LSR);
1994d74d5d1bSSebastian Andrzej Siewior 
1995d74d5d1bSSebastian Andrzej Siewior 	if (!(lsr & UART_LSR_DR)) {
1996d74d5d1bSSebastian Andrzej Siewior 		status = NO_POLL_CHAR;
1997d74d5d1bSSebastian Andrzej Siewior 		goto out;
1998d74d5d1bSSebastian Andrzej Siewior 	}
1999d74d5d1bSSebastian Andrzej Siewior 
2000d74d5d1bSSebastian Andrzej Siewior 	status = serial_port_in(port, UART_RX);
2001d74d5d1bSSebastian Andrzej Siewior out:
2002d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_put(up);
2003d74d5d1bSSebastian Andrzej Siewior 	return status;
20049196d8acSJiri Slaby }
20059196d8acSJiri Slaby 
20069196d8acSJiri Slaby 
20079196d8acSJiri Slaby static void serial8250_put_poll_char(struct uart_port *port,
20089196d8acSJiri Slaby 			 unsigned char c)
20099196d8acSJiri Slaby {
20109196d8acSJiri Slaby 	unsigned int ier;
2011b1261c86SAndy Shevchenko 	struct uart_8250_port *up = up_to_u8250p(port);
20129196d8acSJiri Slaby 
2013d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_get(up);
20149196d8acSJiri Slaby 	/*
20159196d8acSJiri Slaby 	 *	First save the IER then disable the interrupts
20169196d8acSJiri Slaby 	 */
20179196d8acSJiri Slaby 	ier = serial_port_in(port, UART_IER);
20189196d8acSJiri Slaby 	if (up->capabilities & UART_CAP_UUE)
20199196d8acSJiri Slaby 		serial_port_out(port, UART_IER, UART_IER_UUE);
20209196d8acSJiri Slaby 	else
20219196d8acSJiri Slaby 		serial_port_out(port, UART_IER, 0);
20229196d8acSJiri Slaby 
20239196d8acSJiri Slaby 	wait_for_xmitr(up, BOTH_EMPTY);
20249196d8acSJiri Slaby 	/*
20259196d8acSJiri Slaby 	 *	Send the character out.
20269196d8acSJiri Slaby 	 */
20279196d8acSJiri Slaby 	serial_port_out(port, UART_TX, c);
20289196d8acSJiri Slaby 
20299196d8acSJiri Slaby 	/*
20309196d8acSJiri Slaby 	 *	Finally, wait for transmitter to become empty
20319196d8acSJiri Slaby 	 *	and restore the IER
20329196d8acSJiri Slaby 	 */
20339196d8acSJiri Slaby 	wait_for_xmitr(up, BOTH_EMPTY);
20349196d8acSJiri Slaby 	serial_port_out(port, UART_IER, ier);
2035d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_put(up);
20369196d8acSJiri Slaby }
20379196d8acSJiri Slaby 
20389196d8acSJiri Slaby #endif /* CONFIG_CONSOLE_POLL */
20399196d8acSJiri Slaby 
2040b99b121bSSebastian Andrzej Siewior int serial8250_do_startup(struct uart_port *port)
20419196d8acSJiri Slaby {
2042b1261c86SAndy Shevchenko 	struct uart_8250_port *up = up_to_u8250p(port);
20439196d8acSJiri Slaby 	unsigned long flags;
20449196d8acSJiri Slaby 	unsigned char lsr, iir;
20459196d8acSJiri Slaby 	int retval;
20469196d8acSJiri Slaby 
20479196d8acSJiri Slaby 	if (port->type == PORT_8250_CIR)
20489196d8acSJiri Slaby 		return -ENODEV;
20499196d8acSJiri Slaby 
20509196d8acSJiri Slaby 	if (!port->fifosize)
20519196d8acSJiri Slaby 		port->fifosize = uart_config[port->type].fifo_size;
20529196d8acSJiri Slaby 	if (!up->tx_loadsz)
20539196d8acSJiri Slaby 		up->tx_loadsz = uart_config[port->type].tx_loadsz;
20549196d8acSJiri Slaby 	if (!up->capabilities)
20559196d8acSJiri Slaby 		up->capabilities = uart_config[port->type].flags;
20569196d8acSJiri Slaby 	up->mcr = 0;
20579196d8acSJiri Slaby 
20589196d8acSJiri Slaby 	if (port->iotype != up->cur_iotype)
20599196d8acSJiri Slaby 		set_io_from_upio(port);
20609196d8acSJiri Slaby 
2061d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_get(up);
20629196d8acSJiri Slaby 	if (port->type == PORT_16C950) {
20639196d8acSJiri Slaby 		/* Wake up and initialize UART */
20649196d8acSJiri Slaby 		up->acr = 0;
20659196d8acSJiri Slaby 		serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B);
20669196d8acSJiri Slaby 		serial_port_out(port, UART_EFR, UART_EFR_ECB);
20679196d8acSJiri Slaby 		serial_port_out(port, UART_IER, 0);
20689196d8acSJiri Slaby 		serial_port_out(port, UART_LCR, 0);
20699196d8acSJiri Slaby 		serial_icr_write(up, UART_CSR, 0); /* Reset the UART */
20709196d8acSJiri Slaby 		serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B);
20719196d8acSJiri Slaby 		serial_port_out(port, UART_EFR, UART_EFR_ECB);
20729196d8acSJiri Slaby 		serial_port_out(port, UART_LCR, 0);
20739196d8acSJiri Slaby 	}
20749196d8acSJiri Slaby 
20759196d8acSJiri Slaby #ifdef CONFIG_SERIAL_8250_RSA
20769196d8acSJiri Slaby 	/*
20779196d8acSJiri Slaby 	 * If this is an RSA port, see if we can kick it up to the
20789196d8acSJiri Slaby 	 * higher speed clock.
20799196d8acSJiri Slaby 	 */
20809196d8acSJiri Slaby 	enable_rsa(up);
20819196d8acSJiri Slaby #endif
20829196d8acSJiri Slaby 	/*
20839196d8acSJiri Slaby 	 * Clear the FIFO buffers and disable them.
20849196d8acSJiri Slaby 	 * (they will be reenabled in set_termios())
20859196d8acSJiri Slaby 	 */
20869196d8acSJiri Slaby 	serial8250_clear_fifos(up);
20879196d8acSJiri Slaby 
20889196d8acSJiri Slaby 	/*
20899196d8acSJiri Slaby 	 * Clear the interrupt registers.
20909196d8acSJiri Slaby 	 */
20910aa525d1SSebastian Andrzej Siewior 	if (serial_port_in(port, UART_LSR) & UART_LSR_DR)
20929196d8acSJiri Slaby 		serial_port_in(port, UART_RX);
20939196d8acSJiri Slaby 	serial_port_in(port, UART_IIR);
20949196d8acSJiri Slaby 	serial_port_in(port, UART_MSR);
20959196d8acSJiri Slaby 
20969196d8acSJiri Slaby 	/*
20979196d8acSJiri Slaby 	 * At this point, there's no way the LSR could still be 0xff;
20989196d8acSJiri Slaby 	 * if it is, then bail out, because there's likely no UART
20999196d8acSJiri Slaby 	 * here.
21009196d8acSJiri Slaby 	 */
21019196d8acSJiri Slaby 	if (!(port->flags & UPF_BUGGY_UART) &&
21029196d8acSJiri Slaby 	    (serial_port_in(port, UART_LSR) == 0xff)) {
21039196d8acSJiri Slaby 		printk_ratelimited(KERN_INFO "ttyS%d: LSR safety check engaged!\n",
21049196d8acSJiri Slaby 				   serial_index(port));
2105d74d5d1bSSebastian Andrzej Siewior 		retval = -ENODEV;
2106d74d5d1bSSebastian Andrzej Siewior 		goto out;
21079196d8acSJiri Slaby 	}
21089196d8acSJiri Slaby 
21099196d8acSJiri Slaby 	/*
21109196d8acSJiri Slaby 	 * For a XR16C850, we need to set the trigger levels
21119196d8acSJiri Slaby 	 */
21129196d8acSJiri Slaby 	if (port->type == PORT_16850) {
21139196d8acSJiri Slaby 		unsigned char fctr;
21149196d8acSJiri Slaby 
21159196d8acSJiri Slaby 		serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
21169196d8acSJiri Slaby 
21179196d8acSJiri Slaby 		fctr = serial_in(up, UART_FCTR) & ~(UART_FCTR_RX|UART_FCTR_TX);
21189196d8acSJiri Slaby 		serial_port_out(port, UART_FCTR,
21199196d8acSJiri Slaby 				fctr | UART_FCTR_TRGD | UART_FCTR_RX);
21209196d8acSJiri Slaby 		serial_port_out(port, UART_TRG, UART_TRG_96);
21219196d8acSJiri Slaby 		serial_port_out(port, UART_FCTR,
21229196d8acSJiri Slaby 				fctr | UART_FCTR_TRGD | UART_FCTR_TX);
21239196d8acSJiri Slaby 		serial_port_out(port, UART_TRG, UART_TRG_96);
21249196d8acSJiri Slaby 
21259196d8acSJiri Slaby 		serial_port_out(port, UART_LCR, 0);
21269196d8acSJiri Slaby 	}
21279196d8acSJiri Slaby 
21289196d8acSJiri Slaby 	if (port->irq) {
21299196d8acSJiri Slaby 		unsigned char iir1;
21309196d8acSJiri Slaby 		/*
21319196d8acSJiri Slaby 		 * Test for UARTs that do not reassert THRE when the
21329196d8acSJiri Slaby 		 * transmitter is idle and the interrupt has already
21339196d8acSJiri Slaby 		 * been cleared.  Real 16550s should always reassert
21349196d8acSJiri Slaby 		 * this interrupt whenever the transmitter is idle and
21359196d8acSJiri Slaby 		 * the interrupt is enabled.  Delays are necessary to
21369196d8acSJiri Slaby 		 * allow register changes to become visible.
21379196d8acSJiri Slaby 		 */
21389196d8acSJiri Slaby 		spin_lock_irqsave(&port->lock, flags);
21399196d8acSJiri Slaby 		if (up->port.irqflags & IRQF_SHARED)
21409196d8acSJiri Slaby 			disable_irq_nosync(port->irq);
21419196d8acSJiri Slaby 
21429196d8acSJiri Slaby 		wait_for_xmitr(up, UART_LSR_THRE);
21439196d8acSJiri Slaby 		serial_port_out_sync(port, UART_IER, UART_IER_THRI);
21449196d8acSJiri Slaby 		udelay(1); /* allow THRE to set */
21459196d8acSJiri Slaby 		iir1 = serial_port_in(port, UART_IIR);
21469196d8acSJiri Slaby 		serial_port_out(port, UART_IER, 0);
21479196d8acSJiri Slaby 		serial_port_out_sync(port, UART_IER, UART_IER_THRI);
21489196d8acSJiri Slaby 		udelay(1); /* allow a working UART time to re-assert THRE */
21499196d8acSJiri Slaby 		iir = serial_port_in(port, UART_IIR);
21509196d8acSJiri Slaby 		serial_port_out(port, UART_IER, 0);
21519196d8acSJiri Slaby 
21529196d8acSJiri Slaby 		if (port->irqflags & IRQF_SHARED)
21539196d8acSJiri Slaby 			enable_irq(port->irq);
21549196d8acSJiri Slaby 		spin_unlock_irqrestore(&port->lock, flags);
21559196d8acSJiri Slaby 
21569196d8acSJiri Slaby 		/*
21579196d8acSJiri Slaby 		 * If the interrupt is not reasserted, or we otherwise
21589196d8acSJiri Slaby 		 * don't trust the iir, setup a timer to kick the UART
21599196d8acSJiri Slaby 		 * on a regular basis.
21609196d8acSJiri Slaby 		 */
21619196d8acSJiri Slaby 		if ((!(iir1 & UART_IIR_NO_INT) && (iir & UART_IIR_NO_INT)) ||
21629196d8acSJiri Slaby 		    up->port.flags & UPF_BUG_THRE) {
21639196d8acSJiri Slaby 			up->bugs |= UART_BUG_THRE;
21649196d8acSJiri Slaby 			pr_debug("ttyS%d - using backup timer\n",
21659196d8acSJiri Slaby 				 serial_index(port));
21669196d8acSJiri Slaby 		}
21679196d8acSJiri Slaby 	}
21689196d8acSJiri Slaby 
21699196d8acSJiri Slaby 	/*
21709196d8acSJiri Slaby 	 * The above check will only give an accurate result the first time
21719196d8acSJiri Slaby 	 * the port is opened so this value needs to be preserved.
21729196d8acSJiri Slaby 	 */
21739196d8acSJiri Slaby 	if (up->bugs & UART_BUG_THRE) {
21749196d8acSJiri Slaby 		up->timer.function = serial8250_backup_timeout;
21759196d8acSJiri Slaby 		up->timer.data = (unsigned long)up;
21769196d8acSJiri Slaby 		mod_timer(&up->timer, jiffies +
21779196d8acSJiri Slaby 			uart_poll_timeout(port) + HZ / 5);
21789196d8acSJiri Slaby 	}
21799196d8acSJiri Slaby 
21809196d8acSJiri Slaby 	/*
21819196d8acSJiri Slaby 	 * If the "interrupt" for this port doesn't correspond with any
21829196d8acSJiri Slaby 	 * hardware interrupt, we use a timer-based system.  The original
21839196d8acSJiri Slaby 	 * driver used to do this with IRQ0.
21849196d8acSJiri Slaby 	 */
21859196d8acSJiri Slaby 	if (!port->irq) {
21869196d8acSJiri Slaby 		up->timer.data = (unsigned long)up;
21879196d8acSJiri Slaby 		mod_timer(&up->timer, jiffies + uart_poll_timeout(port));
21889196d8acSJiri Slaby 	} else {
21899196d8acSJiri Slaby 		retval = serial_link_irq_chain(up);
21909196d8acSJiri Slaby 		if (retval)
2191d74d5d1bSSebastian Andrzej Siewior 			goto out;
21929196d8acSJiri Slaby 	}
21939196d8acSJiri Slaby 
21949196d8acSJiri Slaby 	/*
21959196d8acSJiri Slaby 	 * Now, initialize the UART
21969196d8acSJiri Slaby 	 */
21979196d8acSJiri Slaby 	serial_port_out(port, UART_LCR, UART_LCR_WLEN8);
21989196d8acSJiri Slaby 
21999196d8acSJiri Slaby 	spin_lock_irqsave(&port->lock, flags);
22009196d8acSJiri Slaby 	if (up->port.flags & UPF_FOURPORT) {
22019196d8acSJiri Slaby 		if (!up->port.irq)
22029196d8acSJiri Slaby 			up->port.mctrl |= TIOCM_OUT1;
22039196d8acSJiri Slaby 	} else
22049196d8acSJiri Slaby 		/*
22059196d8acSJiri Slaby 		 * Most PC uarts need OUT2 raised to enable interrupts.
22069196d8acSJiri Slaby 		 */
22079196d8acSJiri Slaby 		if (port->irq)
22089196d8acSJiri Slaby 			up->port.mctrl |= TIOCM_OUT2;
22099196d8acSJiri Slaby 
22109196d8acSJiri Slaby 	serial8250_set_mctrl(port, port->mctrl);
22119196d8acSJiri Slaby 
22129196d8acSJiri Slaby 	/* Serial over Lan (SoL) hack:
22139196d8acSJiri Slaby 	   Intel 8257x Gigabit ethernet chips have a
22149196d8acSJiri Slaby 	   16550 emulation, to be used for Serial Over Lan.
22159196d8acSJiri Slaby 	   Those chips take a longer time than a normal
22169196d8acSJiri Slaby 	   serial device to signalize that a transmission
22179196d8acSJiri Slaby 	   data was queued. Due to that, the above test generally
22189196d8acSJiri Slaby 	   fails. One solution would be to delay the reading of
22199196d8acSJiri Slaby 	   iir. However, this is not reliable, since the timeout
22209196d8acSJiri Slaby 	   is variable. So, let's just don't test if we receive
22219196d8acSJiri Slaby 	   TX irq. This way, we'll never enable UART_BUG_TXEN.
22229196d8acSJiri Slaby 	 */
22239196d8acSJiri Slaby 	if (skip_txen_test || up->port.flags & UPF_NO_TXEN_TEST)
22249196d8acSJiri Slaby 		goto dont_test_tx_en;
22259196d8acSJiri Slaby 
22269196d8acSJiri Slaby 	/*
22279196d8acSJiri Slaby 	 * Do a quick test to see if we receive an
22289196d8acSJiri Slaby 	 * interrupt when we enable the TX irq.
22299196d8acSJiri Slaby 	 */
22309196d8acSJiri Slaby 	serial_port_out(port, UART_IER, UART_IER_THRI);
22319196d8acSJiri Slaby 	lsr = serial_port_in(port, UART_LSR);
22329196d8acSJiri Slaby 	iir = serial_port_in(port, UART_IIR);
22339196d8acSJiri Slaby 	serial_port_out(port, UART_IER, 0);
22349196d8acSJiri Slaby 
22359196d8acSJiri Slaby 	if (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT) {
22369196d8acSJiri Slaby 		if (!(up->bugs & UART_BUG_TXEN)) {
22379196d8acSJiri Slaby 			up->bugs |= UART_BUG_TXEN;
22389196d8acSJiri Slaby 			pr_debug("ttyS%d - enabling bad tx status workarounds\n",
22399196d8acSJiri Slaby 				 serial_index(port));
22409196d8acSJiri Slaby 		}
22419196d8acSJiri Slaby 	} else {
22429196d8acSJiri Slaby 		up->bugs &= ~UART_BUG_TXEN;
22439196d8acSJiri Slaby 	}
22449196d8acSJiri Slaby 
22459196d8acSJiri Slaby dont_test_tx_en:
22469196d8acSJiri Slaby 	spin_unlock_irqrestore(&port->lock, flags);
22479196d8acSJiri Slaby 
22489196d8acSJiri Slaby 	/*
22499196d8acSJiri Slaby 	 * Clear the interrupt registers again for luck, and clear the
22509196d8acSJiri Slaby 	 * saved flags to avoid getting false values from polling
22519196d8acSJiri Slaby 	 * routines or the previous session.
22529196d8acSJiri Slaby 	 */
22530aa525d1SSebastian Andrzej Siewior 	if (serial_port_in(port, UART_LSR) & UART_LSR_DR)
22549196d8acSJiri Slaby 		serial_port_in(port, UART_RX);
22559196d8acSJiri Slaby 	serial_port_in(port, UART_IIR);
22569196d8acSJiri Slaby 	serial_port_in(port, UART_MSR);
22579196d8acSJiri Slaby 	up->lsr_saved_flags = 0;
22589196d8acSJiri Slaby 	up->msr_saved_flags = 0;
22599196d8acSJiri Slaby 
22609196d8acSJiri Slaby 	/*
22619196d8acSJiri Slaby 	 * Request DMA channels for both RX and TX.
22629196d8acSJiri Slaby 	 */
22639196d8acSJiri Slaby 	if (up->dma) {
22649196d8acSJiri Slaby 		retval = serial8250_request_dma(up);
22659196d8acSJiri Slaby 		if (retval) {
22669196d8acSJiri Slaby 			pr_warn_ratelimited("ttyS%d - failed to request DMA\n",
22679196d8acSJiri Slaby 					    serial_index(port));
22689196d8acSJiri Slaby 			up->dma = NULL;
22699196d8acSJiri Slaby 		}
22709196d8acSJiri Slaby 	}
22719196d8acSJiri Slaby 
22729196d8acSJiri Slaby 	/*
22739196d8acSJiri Slaby 	 * Finally, enable interrupts.  Note: Modem status interrupts
22749196d8acSJiri Slaby 	 * are set via set_termios(), which will be occurring imminently
22759196d8acSJiri Slaby 	 * anyway, so we don't enable them here.
22769196d8acSJiri Slaby 	 */
22779196d8acSJiri Slaby 	up->ier = UART_IER_RLSI | UART_IER_RDI;
22789196d8acSJiri Slaby 	serial_port_out(port, UART_IER, up->ier);
22799196d8acSJiri Slaby 
22809196d8acSJiri Slaby 	if (port->flags & UPF_FOURPORT) {
22819196d8acSJiri Slaby 		unsigned int icp;
22829196d8acSJiri Slaby 		/*
22839196d8acSJiri Slaby 		 * Enable interrupts on the AST Fourport board
22849196d8acSJiri Slaby 		 */
22859196d8acSJiri Slaby 		icp = (port->iobase & 0xfe0) | 0x01f;
22869196d8acSJiri Slaby 		outb_p(0x80, icp);
22879196d8acSJiri Slaby 		inb_p(icp);
22889196d8acSJiri Slaby 	}
2289d74d5d1bSSebastian Andrzej Siewior 	retval = 0;
2290d74d5d1bSSebastian Andrzej Siewior out:
2291d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_put(up);
2292d74d5d1bSSebastian Andrzej Siewior 	return retval;
22939196d8acSJiri Slaby }
2294b99b121bSSebastian Andrzej Siewior EXPORT_SYMBOL_GPL(serial8250_do_startup);
22959196d8acSJiri Slaby 
2296b99b121bSSebastian Andrzej Siewior static int serial8250_startup(struct uart_port *port)
2297b99b121bSSebastian Andrzej Siewior {
2298b99b121bSSebastian Andrzej Siewior 	if (port->startup)
2299b99b121bSSebastian Andrzej Siewior 		return port->startup(port);
2300b99b121bSSebastian Andrzej Siewior 	return serial8250_do_startup(port);
2301b99b121bSSebastian Andrzej Siewior }
2302b99b121bSSebastian Andrzej Siewior 
2303b99b121bSSebastian Andrzej Siewior void serial8250_do_shutdown(struct uart_port *port)
23049196d8acSJiri Slaby {
2305b1261c86SAndy Shevchenko 	struct uart_8250_port *up = up_to_u8250p(port);
23069196d8acSJiri Slaby 	unsigned long flags;
23079196d8acSJiri Slaby 
2308d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_get(up);
23099196d8acSJiri Slaby 	/*
23109196d8acSJiri Slaby 	 * Disable interrupts from this port
23119196d8acSJiri Slaby 	 */
23129196d8acSJiri Slaby 	up->ier = 0;
23139196d8acSJiri Slaby 	serial_port_out(port, UART_IER, 0);
23149196d8acSJiri Slaby 
23159196d8acSJiri Slaby 	if (up->dma)
23169196d8acSJiri Slaby 		serial8250_release_dma(up);
23179196d8acSJiri Slaby 
23189196d8acSJiri Slaby 	spin_lock_irqsave(&port->lock, flags);
23199196d8acSJiri Slaby 	if (port->flags & UPF_FOURPORT) {
23209196d8acSJiri Slaby 		/* reset interrupts on the AST Fourport board */
23219196d8acSJiri Slaby 		inb((port->iobase & 0xfe0) | 0x1f);
23229196d8acSJiri Slaby 		port->mctrl |= TIOCM_OUT1;
23239196d8acSJiri Slaby 	} else
23249196d8acSJiri Slaby 		port->mctrl &= ~TIOCM_OUT2;
23259196d8acSJiri Slaby 
23269196d8acSJiri Slaby 	serial8250_set_mctrl(port, port->mctrl);
23279196d8acSJiri Slaby 	spin_unlock_irqrestore(&port->lock, flags);
23289196d8acSJiri Slaby 
23299196d8acSJiri Slaby 	/*
23309196d8acSJiri Slaby 	 * Disable break condition and FIFOs
23319196d8acSJiri Slaby 	 */
23329196d8acSJiri Slaby 	serial_port_out(port, UART_LCR,
23339196d8acSJiri Slaby 			serial_port_in(port, UART_LCR) & ~UART_LCR_SBC);
23349196d8acSJiri Slaby 	serial8250_clear_fifos(up);
23359196d8acSJiri Slaby 
23369196d8acSJiri Slaby #ifdef CONFIG_SERIAL_8250_RSA
23379196d8acSJiri Slaby 	/*
23389196d8acSJiri Slaby 	 * Reset the RSA board back to 115kbps compat mode.
23399196d8acSJiri Slaby 	 */
23409196d8acSJiri Slaby 	disable_rsa(up);
23419196d8acSJiri Slaby #endif
23429196d8acSJiri Slaby 
23439196d8acSJiri Slaby 	/*
23449196d8acSJiri Slaby 	 * Read data port to reset things, and then unlink from
23459196d8acSJiri Slaby 	 * the IRQ chain.
23469196d8acSJiri Slaby 	 */
23470aa525d1SSebastian Andrzej Siewior 	if (serial_port_in(port, UART_LSR) & UART_LSR_DR)
23489196d8acSJiri Slaby 		serial_port_in(port, UART_RX);
2349d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_put(up);
23509196d8acSJiri Slaby 
23519196d8acSJiri Slaby 	del_timer_sync(&up->timer);
23529196d8acSJiri Slaby 	up->timer.function = serial8250_timeout;
23539196d8acSJiri Slaby 	if (port->irq)
23549196d8acSJiri Slaby 		serial_unlink_irq_chain(up);
23559196d8acSJiri Slaby }
2356b99b121bSSebastian Andrzej Siewior EXPORT_SYMBOL_GPL(serial8250_do_shutdown);
2357b99b121bSSebastian Andrzej Siewior 
2358b99b121bSSebastian Andrzej Siewior static void serial8250_shutdown(struct uart_port *port)
2359b99b121bSSebastian Andrzej Siewior {
2360b99b121bSSebastian Andrzej Siewior 	if (port->shutdown)
2361b99b121bSSebastian Andrzej Siewior 		port->shutdown(port);
2362b99b121bSSebastian Andrzej Siewior 	else
2363b99b121bSSebastian Andrzej Siewior 		serial8250_do_shutdown(port);
2364b99b121bSSebastian Andrzej Siewior }
23659196d8acSJiri Slaby 
23669196d8acSJiri Slaby static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud)
23679196d8acSJiri Slaby {
23689196d8acSJiri Slaby 	unsigned int quot;
23699196d8acSJiri Slaby 
23709196d8acSJiri Slaby 	/*
23719196d8acSJiri Slaby 	 * Handle magic divisors for baud rates above baud_base on
23729196d8acSJiri Slaby 	 * SMSC SuperIO chips.
23739196d8acSJiri Slaby 	 */
23749196d8acSJiri Slaby 	if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
23759196d8acSJiri Slaby 	    baud == (port->uartclk/4))
23769196d8acSJiri Slaby 		quot = 0x8001;
23779196d8acSJiri Slaby 	else if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
23789196d8acSJiri Slaby 		 baud == (port->uartclk/8))
23799196d8acSJiri Slaby 		quot = 0x8002;
23809196d8acSJiri Slaby 	else
23819196d8acSJiri Slaby 		quot = uart_get_divisor(port, baud);
23829196d8acSJiri Slaby 
23839196d8acSJiri Slaby 	return quot;
23849196d8acSJiri Slaby }
23859196d8acSJiri Slaby 
23869196d8acSJiri Slaby void
23879196d8acSJiri Slaby serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
23889196d8acSJiri Slaby 		          struct ktermios *old)
23899196d8acSJiri Slaby {
2390b1261c86SAndy Shevchenko 	struct uart_8250_port *up = up_to_u8250p(port);
2391aef9a7bdSYoshihiro YUNOMAE 	unsigned char cval;
23929196d8acSJiri Slaby 	unsigned long flags;
23939196d8acSJiri Slaby 	unsigned int baud, quot;
23949196d8acSJiri Slaby 
23959196d8acSJiri Slaby 	switch (termios->c_cflag & CSIZE) {
23969196d8acSJiri Slaby 	case CS5:
23979196d8acSJiri Slaby 		cval = UART_LCR_WLEN5;
23989196d8acSJiri Slaby 		break;
23999196d8acSJiri Slaby 	case CS6:
24009196d8acSJiri Slaby 		cval = UART_LCR_WLEN6;
24019196d8acSJiri Slaby 		break;
24029196d8acSJiri Slaby 	case CS7:
24039196d8acSJiri Slaby 		cval = UART_LCR_WLEN7;
24049196d8acSJiri Slaby 		break;
24059196d8acSJiri Slaby 	default:
24069196d8acSJiri Slaby 	case CS8:
24079196d8acSJiri Slaby 		cval = UART_LCR_WLEN8;
24089196d8acSJiri Slaby 		break;
24099196d8acSJiri Slaby 	}
24109196d8acSJiri Slaby 
24119196d8acSJiri Slaby 	if (termios->c_cflag & CSTOPB)
24129196d8acSJiri Slaby 		cval |= UART_LCR_STOP;
24139196d8acSJiri Slaby 	if (termios->c_cflag & PARENB) {
24149196d8acSJiri Slaby 		cval |= UART_LCR_PARITY;
24159196d8acSJiri Slaby 		if (up->bugs & UART_BUG_PARITY)
2416aef9a7bdSYoshihiro YUNOMAE 			up->fifo_bug = true;
24179196d8acSJiri Slaby 	}
24189196d8acSJiri Slaby 	if (!(termios->c_cflag & PARODD))
24199196d8acSJiri Slaby 		cval |= UART_LCR_EPAR;
24209196d8acSJiri Slaby #ifdef CMSPAR
24219196d8acSJiri Slaby 	if (termios->c_cflag & CMSPAR)
24229196d8acSJiri Slaby 		cval |= UART_LCR_SPAR;
24239196d8acSJiri Slaby #endif
24249196d8acSJiri Slaby 
24259196d8acSJiri Slaby 	/*
24269196d8acSJiri Slaby 	 * Ask the core to calculate the divisor for us.
24279196d8acSJiri Slaby 	 */
24289196d8acSJiri Slaby 	baud = uart_get_baud_rate(port, termios, old,
24299196d8acSJiri Slaby 				  port->uartclk / 16 / 0xffff,
24309196d8acSJiri Slaby 				  port->uartclk / 16);
24319196d8acSJiri Slaby 	quot = serial8250_get_divisor(port, baud);
24329196d8acSJiri Slaby 
24339196d8acSJiri Slaby 	/*
24349196d8acSJiri Slaby 	 * Oxford Semi 952 rev B workaround
24359196d8acSJiri Slaby 	 */
24369196d8acSJiri Slaby 	if (up->bugs & UART_BUG_QUOT && (quot & 0xff) == 0)
24379196d8acSJiri Slaby 		quot++;
24389196d8acSJiri Slaby 
24399196d8acSJiri Slaby 	if (up->capabilities & UART_CAP_FIFO && port->fifosize > 1) {
2440aef9a7bdSYoshihiro YUNOMAE 		/* NOTE: If fifo_bug is not set, a user can set RX_trigger. */
2441aef9a7bdSYoshihiro YUNOMAE 		if ((baud < 2400 && !up->dma) || up->fifo_bug) {
2442aef9a7bdSYoshihiro YUNOMAE 			up->fcr &= ~UART_FCR_TRIGGER_MASK;
2443aef9a7bdSYoshihiro YUNOMAE 			up->fcr |= UART_FCR_TRIGGER_1;
24449196d8acSJiri Slaby 		}
24459196d8acSJiri Slaby 	}
24469196d8acSJiri Slaby 
24479196d8acSJiri Slaby 	/*
24489196d8acSJiri Slaby 	 * MCR-based auto flow control.  When AFE is enabled, RTS will be
24499196d8acSJiri Slaby 	 * deasserted when the receive FIFO contains more characters than
24509196d8acSJiri Slaby 	 * the trigger, or the MCR RTS bit is cleared.  In the case where
24519196d8acSJiri Slaby 	 * the remote UART is not using CTS auto flow control, we must
24529196d8acSJiri Slaby 	 * have sufficient FIFO entries for the latency of the remote
2453a6eec92eSPeter Hurley 	 * UART to respond.  IOW, at least 32 bytes of FIFO.
24549196d8acSJiri Slaby 	 */
2455a6eec92eSPeter Hurley 	if (up->capabilities & UART_CAP_AFE && port->fifosize >= 32) {
24569196d8acSJiri Slaby 		up->mcr &= ~UART_MCR_AFE;
24579196d8acSJiri Slaby 		if (termios->c_cflag & CRTSCTS)
24589196d8acSJiri Slaby 			up->mcr |= UART_MCR_AFE;
24599196d8acSJiri Slaby 	}
24609196d8acSJiri Slaby 
24619196d8acSJiri Slaby 	/*
24629196d8acSJiri Slaby 	 * Ok, we're now changing the port state.  Do it with
24639196d8acSJiri Slaby 	 * interrupts disabled.
24649196d8acSJiri Slaby 	 */
2465d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_get(up);
24669196d8acSJiri Slaby 	spin_lock_irqsave(&port->lock, flags);
24679196d8acSJiri Slaby 
24689196d8acSJiri Slaby 	/*
24699196d8acSJiri Slaby 	 * Update the per-port timeout.
24709196d8acSJiri Slaby 	 */
24719196d8acSJiri Slaby 	uart_update_timeout(port, termios->c_cflag, baud);
24729196d8acSJiri Slaby 
24739196d8acSJiri Slaby 	port->read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR;
24749196d8acSJiri Slaby 	if (termios->c_iflag & INPCK)
24759196d8acSJiri Slaby 		port->read_status_mask |= UART_LSR_FE | UART_LSR_PE;
2476ef8b9ddcSPeter Hurley 	if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
24779196d8acSJiri Slaby 		port->read_status_mask |= UART_LSR_BI;
24789196d8acSJiri Slaby 
24799196d8acSJiri Slaby 	/*
24809196d8acSJiri Slaby 	 * Characteres to ignore
24819196d8acSJiri Slaby 	 */
24829196d8acSJiri Slaby 	port->ignore_status_mask = 0;
24839196d8acSJiri Slaby 	if (termios->c_iflag & IGNPAR)
24849196d8acSJiri Slaby 		port->ignore_status_mask |= UART_LSR_PE | UART_LSR_FE;
24859196d8acSJiri Slaby 	if (termios->c_iflag & IGNBRK) {
24869196d8acSJiri Slaby 		port->ignore_status_mask |= UART_LSR_BI;
24879196d8acSJiri Slaby 		/*
24889196d8acSJiri Slaby 		 * If we're ignoring parity and break indicators,
24899196d8acSJiri Slaby 		 * ignore overruns too (for real raw support).
24909196d8acSJiri Slaby 		 */
24919196d8acSJiri Slaby 		if (termios->c_iflag & IGNPAR)
24929196d8acSJiri Slaby 			port->ignore_status_mask |= UART_LSR_OE;
24939196d8acSJiri Slaby 	}
24949196d8acSJiri Slaby 
24959196d8acSJiri Slaby 	/*
24969196d8acSJiri Slaby 	 * ignore all characters if CREAD is not set
24979196d8acSJiri Slaby 	 */
24989196d8acSJiri Slaby 	if ((termios->c_cflag & CREAD) == 0)
24999196d8acSJiri Slaby 		port->ignore_status_mask |= UART_LSR_DR;
25009196d8acSJiri Slaby 
25019196d8acSJiri Slaby 	/*
25029196d8acSJiri Slaby 	 * CTS flow control flag and modem status interrupts
25039196d8acSJiri Slaby 	 */
25049196d8acSJiri Slaby 	up->ier &= ~UART_IER_MSI;
25059196d8acSJiri Slaby 	if (!(up->bugs & UART_BUG_NOMSR) &&
25069196d8acSJiri Slaby 			UART_ENABLE_MS(&up->port, termios->c_cflag))
25079196d8acSJiri Slaby 		up->ier |= UART_IER_MSI;
25089196d8acSJiri Slaby 	if (up->capabilities & UART_CAP_UUE)
25099196d8acSJiri Slaby 		up->ier |= UART_IER_UUE;
25109196d8acSJiri Slaby 	if (up->capabilities & UART_CAP_RTOIE)
25119196d8acSJiri Slaby 		up->ier |= UART_IER_RTOIE;
25129196d8acSJiri Slaby 
25139196d8acSJiri Slaby 	serial_port_out(port, UART_IER, up->ier);
25149196d8acSJiri Slaby 
25159196d8acSJiri Slaby 	if (up->capabilities & UART_CAP_EFR) {
25169196d8acSJiri Slaby 		unsigned char efr = 0;
25179196d8acSJiri Slaby 		/*
25189196d8acSJiri Slaby 		 * TI16C752/Startech hardware flow control.  FIXME:
25199196d8acSJiri Slaby 		 * - TI16C752 requires control thresholds to be set.
25209196d8acSJiri Slaby 		 * - UART_MCR_RTS is ineffective if auto-RTS mode is enabled.
25219196d8acSJiri Slaby 		 */
25229196d8acSJiri Slaby 		if (termios->c_cflag & CRTSCTS)
25239196d8acSJiri Slaby 			efr |= UART_EFR_CTS;
25249196d8acSJiri Slaby 
25259196d8acSJiri Slaby 		serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B);
25269196d8acSJiri Slaby 		if (port->flags & UPF_EXAR_EFR)
25279196d8acSJiri Slaby 			serial_port_out(port, UART_XR_EFR, efr);
25289196d8acSJiri Slaby 		else
25299196d8acSJiri Slaby 			serial_port_out(port, UART_EFR, efr);
25309196d8acSJiri Slaby 	}
25319196d8acSJiri Slaby 
25329196d8acSJiri Slaby 	/* Workaround to enable 115200 baud on OMAP1510 internal ports */
25339196d8acSJiri Slaby 	if (is_omap1510_8250(up)) {
25349196d8acSJiri Slaby 		if (baud == 115200) {
25359196d8acSJiri Slaby 			quot = 1;
25369196d8acSJiri Slaby 			serial_port_out(port, UART_OMAP_OSC_12M_SEL, 1);
25379196d8acSJiri Slaby 		} else
25389196d8acSJiri Slaby 			serial_port_out(port, UART_OMAP_OSC_12M_SEL, 0);
25399196d8acSJiri Slaby 	}
25409196d8acSJiri Slaby 
25419196d8acSJiri Slaby 	/*
25429196d8acSJiri Slaby 	 * For NatSemi, switch to bank 2 not bank 1, to avoid resetting EXCR2,
25439196d8acSJiri Slaby 	 * otherwise just set DLAB
25449196d8acSJiri Slaby 	 */
25459196d8acSJiri Slaby 	if (up->capabilities & UART_NATSEMI)
25469196d8acSJiri Slaby 		serial_port_out(port, UART_LCR, 0xe0);
25479196d8acSJiri Slaby 	else
25489196d8acSJiri Slaby 		serial_port_out(port, UART_LCR, cval | UART_LCR_DLAB);
25499196d8acSJiri Slaby 
25509196d8acSJiri Slaby 	serial_dl_write(up, quot);
25519196d8acSJiri Slaby 
25529196d8acSJiri Slaby 	/*
255345a7bd63SJoe Schultz 	 * XR17V35x UARTs have an extra fractional divisor register (DLD)
255445a7bd63SJoe Schultz 	 *
255545a7bd63SJoe Schultz 	 * We need to recalculate all of the registers, because DLM and DLL
255645a7bd63SJoe Schultz 	 * are already rounded to a whole integer.
255745a7bd63SJoe Schultz 	 *
255845a7bd63SJoe Schultz 	 * When recalculating we use a 32x clock instead of a 16x clock to
255945a7bd63SJoe Schultz 	 * allow 1-bit for rounding in the fractional part.
256045a7bd63SJoe Schultz 	 */
256145a7bd63SJoe Schultz 	if (up->port.type == PORT_XR17V35X) {
256245a7bd63SJoe Schultz 		unsigned int baud_x32 = (port->uartclk * 2) / baud;
256345a7bd63SJoe Schultz 		u16 quot = baud_x32 / 32;
256445a7bd63SJoe Schultz 		u8 quot_frac = DIV_ROUND_CLOSEST(baud_x32 % 32, 2);
256545a7bd63SJoe Schultz 
256645a7bd63SJoe Schultz 		serial_dl_write(up, quot);
256745a7bd63SJoe Schultz 		serial_port_out(port, 0x2, quot_frac & 0xf);
256845a7bd63SJoe Schultz 	}
256945a7bd63SJoe Schultz 
257045a7bd63SJoe Schultz 	/*
25719196d8acSJiri Slaby 	 * LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR
25729196d8acSJiri Slaby 	 * is written without DLAB set, this mode will be disabled.
25739196d8acSJiri Slaby 	 */
25749196d8acSJiri Slaby 	if (port->type == PORT_16750)
2575aef9a7bdSYoshihiro YUNOMAE 		serial_port_out(port, UART_FCR, up->fcr);
25769196d8acSJiri Slaby 
25779196d8acSJiri Slaby 	serial_port_out(port, UART_LCR, cval);		/* reset DLAB */
25789196d8acSJiri Slaby 	up->lcr = cval;					/* Save LCR */
25799196d8acSJiri Slaby 	if (port->type != PORT_16750) {
25809196d8acSJiri Slaby 		/* emulated UARTs (Lucent Venus 167x) need two steps */
2581aef9a7bdSYoshihiro YUNOMAE 		if (up->fcr & UART_FCR_ENABLE_FIFO)
25829196d8acSJiri Slaby 			serial_port_out(port, UART_FCR, UART_FCR_ENABLE_FIFO);
2583aef9a7bdSYoshihiro YUNOMAE 		serial_port_out(port, UART_FCR, up->fcr);	/* set fcr */
25849196d8acSJiri Slaby 	}
25859196d8acSJiri Slaby 	serial8250_set_mctrl(port, port->mctrl);
25869196d8acSJiri Slaby 	spin_unlock_irqrestore(&port->lock, flags);
2587d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_put(up);
2588d74d5d1bSSebastian Andrzej Siewior 
25899196d8acSJiri Slaby 	/* Don't rewrite B0 */
25909196d8acSJiri Slaby 	if (tty_termios_baud_rate(termios))
25919196d8acSJiri Slaby 		tty_termios_encode_baud_rate(termios, baud, baud);
25929196d8acSJiri Slaby }
25939196d8acSJiri Slaby EXPORT_SYMBOL(serial8250_do_set_termios);
25949196d8acSJiri Slaby 
25959196d8acSJiri Slaby static void
25969196d8acSJiri Slaby serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
25979196d8acSJiri Slaby 		       struct ktermios *old)
25989196d8acSJiri Slaby {
25999196d8acSJiri Slaby 	if (port->set_termios)
26009196d8acSJiri Slaby 		port->set_termios(port, termios, old);
26019196d8acSJiri Slaby 	else
26029196d8acSJiri Slaby 		serial8250_do_set_termios(port, termios, old);
26039196d8acSJiri Slaby }
26049196d8acSJiri Slaby 
26059196d8acSJiri Slaby static void
26069196d8acSJiri Slaby serial8250_set_ldisc(struct uart_port *port, int new)
26079196d8acSJiri Slaby {
26089196d8acSJiri Slaby 	if (new == N_PPS) {
26099196d8acSJiri Slaby 		port->flags |= UPF_HARDPPS_CD;
26109196d8acSJiri Slaby 		serial8250_enable_ms(port);
26119196d8acSJiri Slaby 	} else
26129196d8acSJiri Slaby 		port->flags &= ~UPF_HARDPPS_CD;
26139196d8acSJiri Slaby }
26149196d8acSJiri Slaby 
26159196d8acSJiri Slaby 
26169196d8acSJiri Slaby void serial8250_do_pm(struct uart_port *port, unsigned int state,
26179196d8acSJiri Slaby 		      unsigned int oldstate)
26189196d8acSJiri Slaby {
2619b1261c86SAndy Shevchenko 	struct uart_8250_port *p = up_to_u8250p(port);
26209196d8acSJiri Slaby 
26219196d8acSJiri Slaby 	serial8250_set_sleep(p, state != 0);
26229196d8acSJiri Slaby }
26239196d8acSJiri Slaby EXPORT_SYMBOL(serial8250_do_pm);
26249196d8acSJiri Slaby 
26259196d8acSJiri Slaby static void
26269196d8acSJiri Slaby serial8250_pm(struct uart_port *port, unsigned int state,
26279196d8acSJiri Slaby 	      unsigned int oldstate)
26289196d8acSJiri Slaby {
26299196d8acSJiri Slaby 	if (port->pm)
26309196d8acSJiri Slaby 		port->pm(port, state, oldstate);
26319196d8acSJiri Slaby 	else
26329196d8acSJiri Slaby 		serial8250_do_pm(port, state, oldstate);
26339196d8acSJiri Slaby }
26349196d8acSJiri Slaby 
26359196d8acSJiri Slaby static unsigned int serial8250_port_size(struct uart_8250_port *pt)
26369196d8acSJiri Slaby {
26379196d8acSJiri Slaby 	if (pt->port.iotype == UPIO_AU)
26389196d8acSJiri Slaby 		return 0x1000;
26399196d8acSJiri Slaby 	if (is_omap1_8250(pt))
26409196d8acSJiri Slaby 		return 0x16 << pt->port.regshift;
26419196d8acSJiri Slaby 
26429196d8acSJiri Slaby 	return 8 << pt->port.regshift;
26439196d8acSJiri Slaby }
26449196d8acSJiri Slaby 
26459196d8acSJiri Slaby /*
26469196d8acSJiri Slaby  * Resource handling.
26479196d8acSJiri Slaby  */
26489196d8acSJiri Slaby static int serial8250_request_std_resource(struct uart_8250_port *up)
26499196d8acSJiri Slaby {
26509196d8acSJiri Slaby 	unsigned int size = serial8250_port_size(up);
26519196d8acSJiri Slaby 	struct uart_port *port = &up->port;
26529196d8acSJiri Slaby 	int ret = 0;
26539196d8acSJiri Slaby 
26549196d8acSJiri Slaby 	switch (port->iotype) {
26559196d8acSJiri Slaby 	case UPIO_AU:
26569196d8acSJiri Slaby 	case UPIO_TSI:
26579196d8acSJiri Slaby 	case UPIO_MEM32:
26589196d8acSJiri Slaby 	case UPIO_MEM:
26599196d8acSJiri Slaby 		if (!port->mapbase)
26609196d8acSJiri Slaby 			break;
26619196d8acSJiri Slaby 
26629196d8acSJiri Slaby 		if (!request_mem_region(port->mapbase, size, "serial")) {
26639196d8acSJiri Slaby 			ret = -EBUSY;
26649196d8acSJiri Slaby 			break;
26659196d8acSJiri Slaby 		}
26669196d8acSJiri Slaby 
26679196d8acSJiri Slaby 		if (port->flags & UPF_IOREMAP) {
26689196d8acSJiri Slaby 			port->membase = ioremap_nocache(port->mapbase, size);
26699196d8acSJiri Slaby 			if (!port->membase) {
26709196d8acSJiri Slaby 				release_mem_region(port->mapbase, size);
26719196d8acSJiri Slaby 				ret = -ENOMEM;
26729196d8acSJiri Slaby 			}
26739196d8acSJiri Slaby 		}
26749196d8acSJiri Slaby 		break;
26759196d8acSJiri Slaby 
26769196d8acSJiri Slaby 	case UPIO_HUB6:
26779196d8acSJiri Slaby 	case UPIO_PORT:
26789196d8acSJiri Slaby 		if (!request_region(port->iobase, size, "serial"))
26799196d8acSJiri Slaby 			ret = -EBUSY;
26809196d8acSJiri Slaby 		break;
26819196d8acSJiri Slaby 	}
26829196d8acSJiri Slaby 	return ret;
26839196d8acSJiri Slaby }
26849196d8acSJiri Slaby 
26859196d8acSJiri Slaby static void serial8250_release_std_resource(struct uart_8250_port *up)
26869196d8acSJiri Slaby {
26879196d8acSJiri Slaby 	unsigned int size = serial8250_port_size(up);
26889196d8acSJiri Slaby 	struct uart_port *port = &up->port;
26899196d8acSJiri Slaby 
26909196d8acSJiri Slaby 	switch (port->iotype) {
26919196d8acSJiri Slaby 	case UPIO_AU:
26929196d8acSJiri Slaby 	case UPIO_TSI:
26939196d8acSJiri Slaby 	case UPIO_MEM32:
26949196d8acSJiri Slaby 	case UPIO_MEM:
26959196d8acSJiri Slaby 		if (!port->mapbase)
26969196d8acSJiri Slaby 			break;
26979196d8acSJiri Slaby 
26989196d8acSJiri Slaby 		if (port->flags & UPF_IOREMAP) {
26999196d8acSJiri Slaby 			iounmap(port->membase);
27009196d8acSJiri Slaby 			port->membase = NULL;
27019196d8acSJiri Slaby 		}
27029196d8acSJiri Slaby 
27039196d8acSJiri Slaby 		release_mem_region(port->mapbase, size);
27049196d8acSJiri Slaby 		break;
27059196d8acSJiri Slaby 
27069196d8acSJiri Slaby 	case UPIO_HUB6:
27079196d8acSJiri Slaby 	case UPIO_PORT:
27089196d8acSJiri Slaby 		release_region(port->iobase, size);
27099196d8acSJiri Slaby 		break;
27109196d8acSJiri Slaby 	}
27119196d8acSJiri Slaby }
27129196d8acSJiri Slaby 
27139196d8acSJiri Slaby static int serial8250_request_rsa_resource(struct uart_8250_port *up)
27149196d8acSJiri Slaby {
27159196d8acSJiri Slaby 	unsigned long start = UART_RSA_BASE << up->port.regshift;
27169196d8acSJiri Slaby 	unsigned int size = 8 << up->port.regshift;
27179196d8acSJiri Slaby 	struct uart_port *port = &up->port;
27189196d8acSJiri Slaby 	int ret = -EINVAL;
27199196d8acSJiri Slaby 
27209196d8acSJiri Slaby 	switch (port->iotype) {
27219196d8acSJiri Slaby 	case UPIO_HUB6:
27229196d8acSJiri Slaby 	case UPIO_PORT:
27239196d8acSJiri Slaby 		start += port->iobase;
27249196d8acSJiri Slaby 		if (request_region(start, size, "serial-rsa"))
27259196d8acSJiri Slaby 			ret = 0;
27269196d8acSJiri Slaby 		else
27279196d8acSJiri Slaby 			ret = -EBUSY;
27289196d8acSJiri Slaby 		break;
27299196d8acSJiri Slaby 	}
27309196d8acSJiri Slaby 
27319196d8acSJiri Slaby 	return ret;
27329196d8acSJiri Slaby }
27339196d8acSJiri Slaby 
27349196d8acSJiri Slaby static void serial8250_release_rsa_resource(struct uart_8250_port *up)
27359196d8acSJiri Slaby {
27369196d8acSJiri Slaby 	unsigned long offset = UART_RSA_BASE << up->port.regshift;
27379196d8acSJiri Slaby 	unsigned int size = 8 << up->port.regshift;
27389196d8acSJiri Slaby 	struct uart_port *port = &up->port;
27399196d8acSJiri Slaby 
27409196d8acSJiri Slaby 	switch (port->iotype) {
27419196d8acSJiri Slaby 	case UPIO_HUB6:
27429196d8acSJiri Slaby 	case UPIO_PORT:
27439196d8acSJiri Slaby 		release_region(port->iobase + offset, size);
27449196d8acSJiri Slaby 		break;
27459196d8acSJiri Slaby 	}
27469196d8acSJiri Slaby }
27479196d8acSJiri Slaby 
27489196d8acSJiri Slaby static void serial8250_release_port(struct uart_port *port)
27499196d8acSJiri Slaby {
2750b1261c86SAndy Shevchenko 	struct uart_8250_port *up = up_to_u8250p(port);
27519196d8acSJiri Slaby 
27529196d8acSJiri Slaby 	serial8250_release_std_resource(up);
27539196d8acSJiri Slaby 	if (port->type == PORT_RSA)
27549196d8acSJiri Slaby 		serial8250_release_rsa_resource(up);
27559196d8acSJiri Slaby }
27569196d8acSJiri Slaby 
27579196d8acSJiri Slaby static int serial8250_request_port(struct uart_port *port)
27589196d8acSJiri Slaby {
2759b1261c86SAndy Shevchenko 	struct uart_8250_port *up = up_to_u8250p(port);
27609196d8acSJiri Slaby 	int ret;
27619196d8acSJiri Slaby 
27629196d8acSJiri Slaby 	if (port->type == PORT_8250_CIR)
27639196d8acSJiri Slaby 		return -ENODEV;
27649196d8acSJiri Slaby 
27659196d8acSJiri Slaby 	ret = serial8250_request_std_resource(up);
27669196d8acSJiri Slaby 	if (ret == 0 && port->type == PORT_RSA) {
27679196d8acSJiri Slaby 		ret = serial8250_request_rsa_resource(up);
27689196d8acSJiri Slaby 		if (ret < 0)
27699196d8acSJiri Slaby 			serial8250_release_std_resource(up);
27709196d8acSJiri Slaby 	}
27719196d8acSJiri Slaby 
27729196d8acSJiri Slaby 	return ret;
27739196d8acSJiri Slaby }
27749196d8acSJiri Slaby 
2775aef9a7bdSYoshihiro YUNOMAE static int fcr_get_rxtrig_bytes(struct uart_8250_port *up)
2776aef9a7bdSYoshihiro YUNOMAE {
2777aef9a7bdSYoshihiro YUNOMAE 	const struct serial8250_config *conf_type = &uart_config[up->port.type];
2778aef9a7bdSYoshihiro YUNOMAE 	unsigned char bytes;
2779aef9a7bdSYoshihiro YUNOMAE 
2780aef9a7bdSYoshihiro YUNOMAE 	bytes = conf_type->rxtrig_bytes[UART_FCR_R_TRIG_BITS(up->fcr)];
2781aef9a7bdSYoshihiro YUNOMAE 
2782aef9a7bdSYoshihiro YUNOMAE 	return bytes ? bytes : -EOPNOTSUPP;
2783aef9a7bdSYoshihiro YUNOMAE }
2784aef9a7bdSYoshihiro YUNOMAE 
2785aef9a7bdSYoshihiro YUNOMAE static int bytes_to_fcr_rxtrig(struct uart_8250_port *up, unsigned char bytes)
2786aef9a7bdSYoshihiro YUNOMAE {
2787aef9a7bdSYoshihiro YUNOMAE 	const struct serial8250_config *conf_type = &uart_config[up->port.type];
2788aef9a7bdSYoshihiro YUNOMAE 	int i;
2789aef9a7bdSYoshihiro YUNOMAE 
2790aef9a7bdSYoshihiro YUNOMAE 	if (!conf_type->rxtrig_bytes[UART_FCR_R_TRIG_BITS(UART_FCR_R_TRIG_00)])
2791aef9a7bdSYoshihiro YUNOMAE 		return -EOPNOTSUPP;
2792aef9a7bdSYoshihiro YUNOMAE 
2793aef9a7bdSYoshihiro YUNOMAE 	for (i = 1; i < UART_FCR_R_TRIG_MAX_STATE; i++) {
2794aef9a7bdSYoshihiro YUNOMAE 		if (bytes < conf_type->rxtrig_bytes[i])
2795aef9a7bdSYoshihiro YUNOMAE 			/* Use the nearest lower value */
2796aef9a7bdSYoshihiro YUNOMAE 			return (--i) << UART_FCR_R_TRIG_SHIFT;
2797aef9a7bdSYoshihiro YUNOMAE 	}
2798aef9a7bdSYoshihiro YUNOMAE 
2799aef9a7bdSYoshihiro YUNOMAE 	return UART_FCR_R_TRIG_11;
2800aef9a7bdSYoshihiro YUNOMAE }
2801aef9a7bdSYoshihiro YUNOMAE 
2802aef9a7bdSYoshihiro YUNOMAE static int do_get_rxtrig(struct tty_port *port)
2803aef9a7bdSYoshihiro YUNOMAE {
2804aef9a7bdSYoshihiro YUNOMAE 	struct uart_state *state = container_of(port, struct uart_state, port);
2805aef9a7bdSYoshihiro YUNOMAE 	struct uart_port *uport = state->uart_port;
2806aef9a7bdSYoshihiro YUNOMAE 	struct uart_8250_port *up =
2807aef9a7bdSYoshihiro YUNOMAE 		container_of(uport, struct uart_8250_port, port);
2808aef9a7bdSYoshihiro YUNOMAE 
2809aef9a7bdSYoshihiro YUNOMAE 	if (!(up->capabilities & UART_CAP_FIFO) || uport->fifosize <= 1)
2810aef9a7bdSYoshihiro YUNOMAE 		return -EINVAL;
2811aef9a7bdSYoshihiro YUNOMAE 
2812aef9a7bdSYoshihiro YUNOMAE 	return fcr_get_rxtrig_bytes(up);
2813aef9a7bdSYoshihiro YUNOMAE }
2814aef9a7bdSYoshihiro YUNOMAE 
2815aef9a7bdSYoshihiro YUNOMAE static int do_serial8250_get_rxtrig(struct tty_port *port)
2816aef9a7bdSYoshihiro YUNOMAE {
2817aef9a7bdSYoshihiro YUNOMAE 	int rxtrig_bytes;
2818aef9a7bdSYoshihiro YUNOMAE 
2819aef9a7bdSYoshihiro YUNOMAE 	mutex_lock(&port->mutex);
2820aef9a7bdSYoshihiro YUNOMAE 	rxtrig_bytes = do_get_rxtrig(port);
2821aef9a7bdSYoshihiro YUNOMAE 	mutex_unlock(&port->mutex);
2822aef9a7bdSYoshihiro YUNOMAE 
2823aef9a7bdSYoshihiro YUNOMAE 	return rxtrig_bytes;
2824aef9a7bdSYoshihiro YUNOMAE }
2825aef9a7bdSYoshihiro YUNOMAE 
2826aef9a7bdSYoshihiro YUNOMAE static ssize_t serial8250_get_attr_rx_trig_bytes(struct device *dev,
2827aef9a7bdSYoshihiro YUNOMAE 	struct device_attribute *attr, char *buf)
2828aef9a7bdSYoshihiro YUNOMAE {
2829aef9a7bdSYoshihiro YUNOMAE 	struct tty_port *port = dev_get_drvdata(dev);
2830aef9a7bdSYoshihiro YUNOMAE 	int rxtrig_bytes;
2831aef9a7bdSYoshihiro YUNOMAE 
2832aef9a7bdSYoshihiro YUNOMAE 	rxtrig_bytes = do_serial8250_get_rxtrig(port);
2833aef9a7bdSYoshihiro YUNOMAE 	if (rxtrig_bytes < 0)
2834aef9a7bdSYoshihiro YUNOMAE 		return rxtrig_bytes;
2835aef9a7bdSYoshihiro YUNOMAE 
2836aef9a7bdSYoshihiro YUNOMAE 	return snprintf(buf, PAGE_SIZE, "%d\n", rxtrig_bytes);
2837aef9a7bdSYoshihiro YUNOMAE }
2838aef9a7bdSYoshihiro YUNOMAE 
2839aef9a7bdSYoshihiro YUNOMAE static int do_set_rxtrig(struct tty_port *port, unsigned char bytes)
2840aef9a7bdSYoshihiro YUNOMAE {
2841aef9a7bdSYoshihiro YUNOMAE 	struct uart_state *state = container_of(port, struct uart_state, port);
2842aef9a7bdSYoshihiro YUNOMAE 	struct uart_port *uport = state->uart_port;
2843aef9a7bdSYoshihiro YUNOMAE 	struct uart_8250_port *up =
2844aef9a7bdSYoshihiro YUNOMAE 		container_of(uport, struct uart_8250_port, port);
2845aef9a7bdSYoshihiro YUNOMAE 	int rxtrig;
2846aef9a7bdSYoshihiro YUNOMAE 
2847aef9a7bdSYoshihiro YUNOMAE 	if (!(up->capabilities & UART_CAP_FIFO) || uport->fifosize <= 1 ||
2848aef9a7bdSYoshihiro YUNOMAE 	    up->fifo_bug)
2849aef9a7bdSYoshihiro YUNOMAE 		return -EINVAL;
2850aef9a7bdSYoshihiro YUNOMAE 
2851aef9a7bdSYoshihiro YUNOMAE 	rxtrig = bytes_to_fcr_rxtrig(up, bytes);
2852aef9a7bdSYoshihiro YUNOMAE 	if (rxtrig < 0)
2853aef9a7bdSYoshihiro YUNOMAE 		return rxtrig;
2854aef9a7bdSYoshihiro YUNOMAE 
2855aef9a7bdSYoshihiro YUNOMAE 	serial8250_clear_fifos(up);
2856aef9a7bdSYoshihiro YUNOMAE 	up->fcr &= ~UART_FCR_TRIGGER_MASK;
2857aef9a7bdSYoshihiro YUNOMAE 	up->fcr |= (unsigned char)rxtrig;
2858aef9a7bdSYoshihiro YUNOMAE 	serial_out(up, UART_FCR, up->fcr);
2859aef9a7bdSYoshihiro YUNOMAE 	return 0;
2860aef9a7bdSYoshihiro YUNOMAE }
2861aef9a7bdSYoshihiro YUNOMAE 
2862aef9a7bdSYoshihiro YUNOMAE static int do_serial8250_set_rxtrig(struct tty_port *port, unsigned char bytes)
2863aef9a7bdSYoshihiro YUNOMAE {
2864aef9a7bdSYoshihiro YUNOMAE 	int ret;
2865aef9a7bdSYoshihiro YUNOMAE 
2866aef9a7bdSYoshihiro YUNOMAE 	mutex_lock(&port->mutex);
2867aef9a7bdSYoshihiro YUNOMAE 	ret = do_set_rxtrig(port, bytes);
2868aef9a7bdSYoshihiro YUNOMAE 	mutex_unlock(&port->mutex);
2869aef9a7bdSYoshihiro YUNOMAE 
2870aef9a7bdSYoshihiro YUNOMAE 	return ret;
2871aef9a7bdSYoshihiro YUNOMAE }
2872aef9a7bdSYoshihiro YUNOMAE 
2873aef9a7bdSYoshihiro YUNOMAE static ssize_t serial8250_set_attr_rx_trig_bytes(struct device *dev,
2874aef9a7bdSYoshihiro YUNOMAE 	struct device_attribute *attr, const char *buf, size_t count)
2875aef9a7bdSYoshihiro YUNOMAE {
2876aef9a7bdSYoshihiro YUNOMAE 	struct tty_port *port = dev_get_drvdata(dev);
2877aef9a7bdSYoshihiro YUNOMAE 	unsigned char bytes;
2878aef9a7bdSYoshihiro YUNOMAE 	int ret;
2879aef9a7bdSYoshihiro YUNOMAE 
2880aef9a7bdSYoshihiro YUNOMAE 	if (!count)
2881aef9a7bdSYoshihiro YUNOMAE 		return -EINVAL;
2882aef9a7bdSYoshihiro YUNOMAE 
2883aef9a7bdSYoshihiro YUNOMAE 	ret = kstrtou8(buf, 10, &bytes);
2884aef9a7bdSYoshihiro YUNOMAE 	if (ret < 0)
2885aef9a7bdSYoshihiro YUNOMAE 		return ret;
2886aef9a7bdSYoshihiro YUNOMAE 
2887aef9a7bdSYoshihiro YUNOMAE 	ret = do_serial8250_set_rxtrig(port, bytes);
2888aef9a7bdSYoshihiro YUNOMAE 	if (ret < 0)
2889aef9a7bdSYoshihiro YUNOMAE 		return ret;
2890aef9a7bdSYoshihiro YUNOMAE 
2891aef9a7bdSYoshihiro YUNOMAE 	return count;
2892aef9a7bdSYoshihiro YUNOMAE }
2893aef9a7bdSYoshihiro YUNOMAE 
2894aef9a7bdSYoshihiro YUNOMAE static DEVICE_ATTR(rx_trig_bytes, S_IRUSR | S_IWUSR | S_IRGRP,
2895aef9a7bdSYoshihiro YUNOMAE 		   serial8250_get_attr_rx_trig_bytes,
2896aef9a7bdSYoshihiro YUNOMAE 		   serial8250_set_attr_rx_trig_bytes);
2897aef9a7bdSYoshihiro YUNOMAE 
2898aef9a7bdSYoshihiro YUNOMAE static struct attribute *serial8250_dev_attrs[] = {
2899aef9a7bdSYoshihiro YUNOMAE 	&dev_attr_rx_trig_bytes.attr,
2900aef9a7bdSYoshihiro YUNOMAE 	NULL,
2901aef9a7bdSYoshihiro YUNOMAE 	};
2902aef9a7bdSYoshihiro YUNOMAE 
2903aef9a7bdSYoshihiro YUNOMAE static struct attribute_group serial8250_dev_attr_group = {
2904aef9a7bdSYoshihiro YUNOMAE 	.attrs = serial8250_dev_attrs,
2905aef9a7bdSYoshihiro YUNOMAE 	};
2906aef9a7bdSYoshihiro YUNOMAE 
2907aef9a7bdSYoshihiro YUNOMAE static void register_dev_spec_attr_grp(struct uart_8250_port *up)
2908aef9a7bdSYoshihiro YUNOMAE {
2909aef9a7bdSYoshihiro YUNOMAE 	const struct serial8250_config *conf_type = &uart_config[up->port.type];
2910aef9a7bdSYoshihiro YUNOMAE 
2911aef9a7bdSYoshihiro YUNOMAE 	if (conf_type->rxtrig_bytes[0])
2912aef9a7bdSYoshihiro YUNOMAE 		up->port.attr_group = &serial8250_dev_attr_group;
2913aef9a7bdSYoshihiro YUNOMAE }
2914aef9a7bdSYoshihiro YUNOMAE 
29159196d8acSJiri Slaby static void serial8250_config_port(struct uart_port *port, int flags)
29169196d8acSJiri Slaby {
2917b1261c86SAndy Shevchenko 	struct uart_8250_port *up = up_to_u8250p(port);
29189196d8acSJiri Slaby 	int probeflags = PROBE_ANY;
29199196d8acSJiri Slaby 	int ret;
29209196d8acSJiri Slaby 
29219196d8acSJiri Slaby 	if (port->type == PORT_8250_CIR)
29229196d8acSJiri Slaby 		return;
29239196d8acSJiri Slaby 
29249196d8acSJiri Slaby 	/*
29259196d8acSJiri Slaby 	 * Find the region that we can probe for.  This in turn
29269196d8acSJiri Slaby 	 * tells us whether we can probe for the type of port.
29279196d8acSJiri Slaby 	 */
29289196d8acSJiri Slaby 	ret = serial8250_request_std_resource(up);
29299196d8acSJiri Slaby 	if (ret < 0)
29309196d8acSJiri Slaby 		return;
29319196d8acSJiri Slaby 
29329196d8acSJiri Slaby 	ret = serial8250_request_rsa_resource(up);
29339196d8acSJiri Slaby 	if (ret < 0)
29349196d8acSJiri Slaby 		probeflags &= ~PROBE_RSA;
29359196d8acSJiri Slaby 
29369196d8acSJiri Slaby 	if (port->iotype != up->cur_iotype)
29379196d8acSJiri Slaby 		set_io_from_upio(port);
29389196d8acSJiri Slaby 
29399196d8acSJiri Slaby 	if (flags & UART_CONFIG_TYPE)
29409196d8acSJiri Slaby 		autoconfig(up, probeflags);
29419196d8acSJiri Slaby 
29429196d8acSJiri Slaby 	/* if access method is AU, it is a 16550 with a quirk */
29439196d8acSJiri Slaby 	if (port->type == PORT_16550A && port->iotype == UPIO_AU)
29449196d8acSJiri Slaby 		up->bugs |= UART_BUG_NOMSR;
29459196d8acSJiri Slaby 
29463685f19eSStephen Warren 	/* HW bugs may trigger IRQ while IIR == NO_INT */
29473685f19eSStephen Warren 	if (port->type == PORT_TEGRA)
29483685f19eSStephen Warren 		up->bugs |= UART_BUG_NOMSR;
29493685f19eSStephen Warren 
29509196d8acSJiri Slaby 	if (port->type != PORT_UNKNOWN && flags & UART_CONFIG_IRQ)
29519196d8acSJiri Slaby 		autoconfig_irq(up);
29529196d8acSJiri Slaby 
29539196d8acSJiri Slaby 	if (port->type != PORT_RSA && probeflags & PROBE_RSA)
29549196d8acSJiri Slaby 		serial8250_release_rsa_resource(up);
29559196d8acSJiri Slaby 	if (port->type == PORT_UNKNOWN)
29569196d8acSJiri Slaby 		serial8250_release_std_resource(up);
29579196d8acSJiri Slaby 
29589196d8acSJiri Slaby 	/* Fixme: probably not the best place for this */
29599196d8acSJiri Slaby 	if ((port->type == PORT_XR17V35X) ||
29609196d8acSJiri Slaby 	   (port->type == PORT_XR17D15X))
29619196d8acSJiri Slaby 		port->handle_irq = exar_handle_irq;
2962aef9a7bdSYoshihiro YUNOMAE 
2963aef9a7bdSYoshihiro YUNOMAE 	register_dev_spec_attr_grp(up);
2964aef9a7bdSYoshihiro YUNOMAE 	up->fcr = uart_config[up->port.type].fcr;
29659196d8acSJiri Slaby }
29669196d8acSJiri Slaby 
29679196d8acSJiri Slaby static int
29689196d8acSJiri Slaby serial8250_verify_port(struct uart_port *port, struct serial_struct *ser)
29699196d8acSJiri Slaby {
29709196d8acSJiri Slaby 	if (ser->irq >= nr_irqs || ser->irq < 0 ||
29719196d8acSJiri Slaby 	    ser->baud_base < 9600 || ser->type < PORT_UNKNOWN ||
29729196d8acSJiri Slaby 	    ser->type >= ARRAY_SIZE(uart_config) || ser->type == PORT_CIRRUS ||
29739196d8acSJiri Slaby 	    ser->type == PORT_STARTECH)
29749196d8acSJiri Slaby 		return -EINVAL;
29759196d8acSJiri Slaby 	return 0;
29769196d8acSJiri Slaby }
29779196d8acSJiri Slaby 
2978e676253bSRicardo Ribalda Delgado static int serial8250_ioctl(struct uart_port *port, unsigned int cmd,
2979e676253bSRicardo Ribalda Delgado 			   unsigned long arg)
2980e676253bSRicardo Ribalda Delgado {
2981e676253bSRicardo Ribalda Delgado 	struct uart_8250_port *up =
2982e676253bSRicardo Ribalda Delgado 		container_of(port, struct uart_8250_port, port);
2983e676253bSRicardo Ribalda Delgado 	int ret;
2984e676253bSRicardo Ribalda Delgado 	struct serial_rs485 rs485_config;
2985e676253bSRicardo Ribalda Delgado 
2986e676253bSRicardo Ribalda Delgado 	if (!up->rs485_config)
2987e676253bSRicardo Ribalda Delgado 		return -ENOIOCTLCMD;
2988e676253bSRicardo Ribalda Delgado 
2989e676253bSRicardo Ribalda Delgado 	switch (cmd) {
2990e676253bSRicardo Ribalda Delgado 	case TIOCSRS485:
2991e676253bSRicardo Ribalda Delgado 		if (copy_from_user(&rs485_config, (void __user *)arg,
2992e676253bSRicardo Ribalda Delgado 				   sizeof(rs485_config)))
2993e676253bSRicardo Ribalda Delgado 			return -EFAULT;
2994e676253bSRicardo Ribalda Delgado 
2995e676253bSRicardo Ribalda Delgado 		ret = up->rs485_config(up, &rs485_config);
2996e676253bSRicardo Ribalda Delgado 		if (ret)
2997e676253bSRicardo Ribalda Delgado 			return ret;
2998e676253bSRicardo Ribalda Delgado 
2999e676253bSRicardo Ribalda Delgado 		memcpy(&up->rs485, &rs485_config, sizeof(rs485_config));
3000e676253bSRicardo Ribalda Delgado 
3001e676253bSRicardo Ribalda Delgado 		return 0;
3002e676253bSRicardo Ribalda Delgado 	case TIOCGRS485:
3003e676253bSRicardo Ribalda Delgado 		if (copy_to_user((void __user *)arg, &up->rs485,
3004e676253bSRicardo Ribalda Delgado 				 sizeof(up->rs485)))
3005e676253bSRicardo Ribalda Delgado 			return -EFAULT;
3006e676253bSRicardo Ribalda Delgado 		return 0;
3007e676253bSRicardo Ribalda Delgado 	default:
3008e676253bSRicardo Ribalda Delgado 		break;
3009e676253bSRicardo Ribalda Delgado 	}
3010e676253bSRicardo Ribalda Delgado 
3011e676253bSRicardo Ribalda Delgado 	return -ENOIOCTLCMD;
3012e676253bSRicardo Ribalda Delgado }
3013e676253bSRicardo Ribalda Delgado 
30149196d8acSJiri Slaby static const char *
30159196d8acSJiri Slaby serial8250_type(struct uart_port *port)
30169196d8acSJiri Slaby {
30179196d8acSJiri Slaby 	int type = port->type;
30189196d8acSJiri Slaby 
30199196d8acSJiri Slaby 	if (type >= ARRAY_SIZE(uart_config))
30209196d8acSJiri Slaby 		type = 0;
30219196d8acSJiri Slaby 	return uart_config[type].name;
30229196d8acSJiri Slaby }
30239196d8acSJiri Slaby 
30249196d8acSJiri Slaby static struct uart_ops serial8250_pops = {
30259196d8acSJiri Slaby 	.tx_empty	= serial8250_tx_empty,
30269196d8acSJiri Slaby 	.set_mctrl	= serial8250_set_mctrl,
30279196d8acSJiri Slaby 	.get_mctrl	= serial8250_get_mctrl,
30289196d8acSJiri Slaby 	.stop_tx	= serial8250_stop_tx,
30299196d8acSJiri Slaby 	.start_tx	= serial8250_start_tx,
3030234abab1SSebastian Andrzej Siewior 	.throttle	= serial8250_throttle,
3031234abab1SSebastian Andrzej Siewior 	.unthrottle	= serial8250_unthrottle,
30329196d8acSJiri Slaby 	.stop_rx	= serial8250_stop_rx,
30339196d8acSJiri Slaby 	.enable_ms	= serial8250_enable_ms,
30349196d8acSJiri Slaby 	.break_ctl	= serial8250_break_ctl,
30359196d8acSJiri Slaby 	.startup	= serial8250_startup,
30369196d8acSJiri Slaby 	.shutdown	= serial8250_shutdown,
30379196d8acSJiri Slaby 	.set_termios	= serial8250_set_termios,
30389196d8acSJiri Slaby 	.set_ldisc	= serial8250_set_ldisc,
30399196d8acSJiri Slaby 	.pm		= serial8250_pm,
30409196d8acSJiri Slaby 	.type		= serial8250_type,
30419196d8acSJiri Slaby 	.release_port	= serial8250_release_port,
30429196d8acSJiri Slaby 	.request_port	= serial8250_request_port,
30439196d8acSJiri Slaby 	.config_port	= serial8250_config_port,
30449196d8acSJiri Slaby 	.verify_port	= serial8250_verify_port,
3045e676253bSRicardo Ribalda Delgado 	.ioctl		= serial8250_ioctl,
30469196d8acSJiri Slaby #ifdef CONFIG_CONSOLE_POLL
30479196d8acSJiri Slaby 	.poll_get_char = serial8250_get_poll_char,
30489196d8acSJiri Slaby 	.poll_put_char = serial8250_put_poll_char,
30499196d8acSJiri Slaby #endif
30509196d8acSJiri Slaby };
30519196d8acSJiri Slaby 
30529196d8acSJiri Slaby static struct uart_8250_port serial8250_ports[UART_NR];
30539196d8acSJiri Slaby 
3054ae14a795SSebastian Andrzej Siewior /**
3055ae14a795SSebastian Andrzej Siewior  * serial8250_get_port - retrieve struct uart_8250_port
3056ae14a795SSebastian Andrzej Siewior  * @line: serial line number
3057ae14a795SSebastian Andrzej Siewior  *
3058ae14a795SSebastian Andrzej Siewior  * This function retrieves struct uart_8250_port for the specific line.
3059ae14a795SSebastian Andrzej Siewior  * This struct *must* *not* be used to perform a 8250 or serial core operation
3060ae14a795SSebastian Andrzej Siewior  * which is not accessible otherwise. Its only purpose is to make the struct
3061ae14a795SSebastian Andrzej Siewior  * accessible to the runtime-pm callbacks for context suspend/restore.
3062ae14a795SSebastian Andrzej Siewior  * The lock assumption made here is none because runtime-pm suspend/resume
3063ae14a795SSebastian Andrzej Siewior  * callbacks should not be invoked if there is any operation performed on the
3064ae14a795SSebastian Andrzej Siewior  * port.
3065ae14a795SSebastian Andrzej Siewior  */
3066ae14a795SSebastian Andrzej Siewior struct uart_8250_port *serial8250_get_port(int line)
3067ae14a795SSebastian Andrzej Siewior {
3068ae14a795SSebastian Andrzej Siewior 	return &serial8250_ports[line];
3069ae14a795SSebastian Andrzej Siewior }
3070ae14a795SSebastian Andrzej Siewior EXPORT_SYMBOL_GPL(serial8250_get_port);
3071ae14a795SSebastian Andrzej Siewior 
30729196d8acSJiri Slaby static void (*serial8250_isa_config)(int port, struct uart_port *up,
30739196d8acSJiri Slaby 	unsigned short *capabilities);
30749196d8acSJiri Slaby 
30759196d8acSJiri Slaby void serial8250_set_isa_configurator(
30769196d8acSJiri Slaby 	void (*v)(int port, struct uart_port *up, unsigned short *capabilities))
30779196d8acSJiri Slaby {
30789196d8acSJiri Slaby 	serial8250_isa_config = v;
30799196d8acSJiri Slaby }
30809196d8acSJiri Slaby EXPORT_SYMBOL(serial8250_set_isa_configurator);
30819196d8acSJiri Slaby 
30829196d8acSJiri Slaby static void __init serial8250_isa_init_ports(void)
30839196d8acSJiri Slaby {
30849196d8acSJiri Slaby 	struct uart_8250_port *up;
30859196d8acSJiri Slaby 	static int first = 1;
30869196d8acSJiri Slaby 	int i, irqflag = 0;
30879196d8acSJiri Slaby 
30889196d8acSJiri Slaby 	if (!first)
30899196d8acSJiri Slaby 		return;
30909196d8acSJiri Slaby 	first = 0;
30919196d8acSJiri Slaby 
30929196d8acSJiri Slaby 	if (nr_uarts > UART_NR)
30939196d8acSJiri Slaby 		nr_uarts = UART_NR;
30949196d8acSJiri Slaby 
3095317a6842SKyle McMartin 	for (i = 0; i < nr_uarts; i++) {
30969196d8acSJiri Slaby 		struct uart_8250_port *up = &serial8250_ports[i];
30979196d8acSJiri Slaby 		struct uart_port *port = &up->port;
30989196d8acSJiri Slaby 
30999196d8acSJiri Slaby 		port->line = i;
31009196d8acSJiri Slaby 		spin_lock_init(&port->lock);
31019196d8acSJiri Slaby 
31029196d8acSJiri Slaby 		init_timer(&up->timer);
31039196d8acSJiri Slaby 		up->timer.function = serial8250_timeout;
31049196d8acSJiri Slaby 		up->cur_iotype = 0xFF;
31059196d8acSJiri Slaby 
31069196d8acSJiri Slaby 		/*
31079196d8acSJiri Slaby 		 * ALPHA_KLUDGE_MCR needs to be killed.
31089196d8acSJiri Slaby 		 */
31099196d8acSJiri Slaby 		up->mcr_mask = ~ALPHA_KLUDGE_MCR;
31109196d8acSJiri Slaby 		up->mcr_force = ALPHA_KLUDGE_MCR;
31119196d8acSJiri Slaby 
31129196d8acSJiri Slaby 		port->ops = &serial8250_pops;
31139196d8acSJiri Slaby 	}
31149196d8acSJiri Slaby 
31159196d8acSJiri Slaby 	if (share_irqs)
31169196d8acSJiri Slaby 		irqflag = IRQF_SHARED;
31179196d8acSJiri Slaby 
31189196d8acSJiri Slaby 	for (i = 0, up = serial8250_ports;
31199196d8acSJiri Slaby 	     i < ARRAY_SIZE(old_serial_port) && i < nr_uarts;
31209196d8acSJiri Slaby 	     i++, up++) {
31219196d8acSJiri Slaby 		struct uart_port *port = &up->port;
31229196d8acSJiri Slaby 
31239196d8acSJiri Slaby 		port->iobase   = old_serial_port[i].port;
31249196d8acSJiri Slaby 		port->irq      = irq_canonicalize(old_serial_port[i].irq);
31259196d8acSJiri Slaby 		port->irqflags = old_serial_port[i].irqflags;
31269196d8acSJiri Slaby 		port->uartclk  = old_serial_port[i].baud_base * 16;
31279196d8acSJiri Slaby 		port->flags    = old_serial_port[i].flags;
31289196d8acSJiri Slaby 		port->hub6     = old_serial_port[i].hub6;
31299196d8acSJiri Slaby 		port->membase  = old_serial_port[i].iomem_base;
31309196d8acSJiri Slaby 		port->iotype   = old_serial_port[i].io_type;
31319196d8acSJiri Slaby 		port->regshift = old_serial_port[i].iomem_reg_shift;
31329196d8acSJiri Slaby 		set_io_from_upio(port);
31339196d8acSJiri Slaby 		port->irqflags |= irqflag;
31349196d8acSJiri Slaby 		if (serial8250_isa_config != NULL)
31359196d8acSJiri Slaby 			serial8250_isa_config(i, &up->port, &up->capabilities);
31369196d8acSJiri Slaby 
31379196d8acSJiri Slaby 	}
31389196d8acSJiri Slaby }
31399196d8acSJiri Slaby 
31409196d8acSJiri Slaby static void
31419196d8acSJiri Slaby serial8250_init_fixed_type_port(struct uart_8250_port *up, unsigned int type)
31429196d8acSJiri Slaby {
31439196d8acSJiri Slaby 	up->port.type = type;
31449196d8acSJiri Slaby 	if (!up->port.fifosize)
31459196d8acSJiri Slaby 		up->port.fifosize = uart_config[type].fifo_size;
31469196d8acSJiri Slaby 	if (!up->tx_loadsz)
31479196d8acSJiri Slaby 		up->tx_loadsz = uart_config[type].tx_loadsz;
31489196d8acSJiri Slaby 	if (!up->capabilities)
31499196d8acSJiri Slaby 		up->capabilities = uart_config[type].flags;
31509196d8acSJiri Slaby }
31519196d8acSJiri Slaby 
31529196d8acSJiri Slaby static void __init
31539196d8acSJiri Slaby serial8250_register_ports(struct uart_driver *drv, struct device *dev)
31549196d8acSJiri Slaby {
31559196d8acSJiri Slaby 	int i;
31569196d8acSJiri Slaby 
31579196d8acSJiri Slaby 	for (i = 0; i < nr_uarts; i++) {
31589196d8acSJiri Slaby 		struct uart_8250_port *up = &serial8250_ports[i];
31599196d8acSJiri Slaby 
31609196d8acSJiri Slaby 		if (up->port.dev)
31619196d8acSJiri Slaby 			continue;
31629196d8acSJiri Slaby 
31639196d8acSJiri Slaby 		up->port.dev = dev;
31649196d8acSJiri Slaby 
31659196d8acSJiri Slaby 		if (up->port.flags & UPF_FIXED_TYPE)
31669196d8acSJiri Slaby 			serial8250_init_fixed_type_port(up, up->port.type);
31679196d8acSJiri Slaby 
31689196d8acSJiri Slaby 		uart_add_one_port(drv, &up->port);
31699196d8acSJiri Slaby 	}
31709196d8acSJiri Slaby }
31719196d8acSJiri Slaby 
31729196d8acSJiri Slaby #ifdef CONFIG_SERIAL_8250_CONSOLE
31739196d8acSJiri Slaby 
31749196d8acSJiri Slaby static void serial8250_console_putchar(struct uart_port *port, int ch)
31759196d8acSJiri Slaby {
3176b1261c86SAndy Shevchenko 	struct uart_8250_port *up = up_to_u8250p(port);
31779196d8acSJiri Slaby 
31789196d8acSJiri Slaby 	wait_for_xmitr(up, UART_LSR_THRE);
31799196d8acSJiri Slaby 	serial_port_out(port, UART_TX, ch);
31809196d8acSJiri Slaby }
31819196d8acSJiri Slaby 
31829196d8acSJiri Slaby /*
31839196d8acSJiri Slaby  *	Print a string to the serial port trying not to disturb
31849196d8acSJiri Slaby  *	any possible real use of the port...
31859196d8acSJiri Slaby  *
31869196d8acSJiri Slaby  *	The console_lock must be held when we get here.
31879196d8acSJiri Slaby  */
31889196d8acSJiri Slaby static void
31899196d8acSJiri Slaby serial8250_console_write(struct console *co, const char *s, unsigned int count)
31909196d8acSJiri Slaby {
31919196d8acSJiri Slaby 	struct uart_8250_port *up = &serial8250_ports[co->index];
31929196d8acSJiri Slaby 	struct uart_port *port = &up->port;
31939196d8acSJiri Slaby 	unsigned long flags;
31949196d8acSJiri Slaby 	unsigned int ier;
31959196d8acSJiri Slaby 	int locked = 1;
31969196d8acSJiri Slaby 
31979196d8acSJiri Slaby 	touch_nmi_watchdog();
31989196d8acSJiri Slaby 
3199d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_get(up);
3200d74d5d1bSSebastian Andrzej Siewior 
3201ebade5e8SIngo Molnar 	if (port->sysrq || oops_in_progress)
3202ebade5e8SIngo Molnar 		locked = spin_trylock_irqsave(&port->lock, flags);
3203ebade5e8SIngo Molnar 	else
3204ebade5e8SIngo Molnar 		spin_lock_irqsave(&port->lock, flags);
32059196d8acSJiri Slaby 
32069196d8acSJiri Slaby 	/*
32079196d8acSJiri Slaby 	 *	First save the IER then disable the interrupts
32089196d8acSJiri Slaby 	 */
32099196d8acSJiri Slaby 	ier = serial_port_in(port, UART_IER);
32109196d8acSJiri Slaby 
32119196d8acSJiri Slaby 	if (up->capabilities & UART_CAP_UUE)
32129196d8acSJiri Slaby 		serial_port_out(port, UART_IER, UART_IER_UUE);
32139196d8acSJiri Slaby 	else
32149196d8acSJiri Slaby 		serial_port_out(port, UART_IER, 0);
32159196d8acSJiri Slaby 
32169196d8acSJiri Slaby 	uart_console_write(port, s, count, serial8250_console_putchar);
32179196d8acSJiri Slaby 
32189196d8acSJiri Slaby 	/*
32199196d8acSJiri Slaby 	 *	Finally, wait for transmitter to become empty
32209196d8acSJiri Slaby 	 *	and restore the IER
32219196d8acSJiri Slaby 	 */
32229196d8acSJiri Slaby 	wait_for_xmitr(up, BOTH_EMPTY);
32239196d8acSJiri Slaby 	serial_port_out(port, UART_IER, ier);
32249196d8acSJiri Slaby 
32259196d8acSJiri Slaby 	/*
32269196d8acSJiri Slaby 	 *	The receive handling will happen properly because the
32279196d8acSJiri Slaby 	 *	receive ready bit will still be set; it is not cleared
32289196d8acSJiri Slaby 	 *	on read.  However, modem control will not, we must
32299196d8acSJiri Slaby 	 *	call it if we have saved something in the saved flags
32309196d8acSJiri Slaby 	 *	while processing with interrupts off.
32319196d8acSJiri Slaby 	 */
32329196d8acSJiri Slaby 	if (up->msr_saved_flags)
32339196d8acSJiri Slaby 		serial8250_modem_status(up);
32349196d8acSJiri Slaby 
32359196d8acSJiri Slaby 	if (locked)
3236ebade5e8SIngo Molnar 		spin_unlock_irqrestore(&port->lock, flags);
3237d74d5d1bSSebastian Andrzej Siewior 	serial8250_rpm_put(up);
32389196d8acSJiri Slaby }
32399196d8acSJiri Slaby 
32409196d8acSJiri Slaby static int __init serial8250_console_setup(struct console *co, char *options)
32419196d8acSJiri Slaby {
32429196d8acSJiri Slaby 	struct uart_port *port;
32439196d8acSJiri Slaby 	int baud = 9600;
32449196d8acSJiri Slaby 	int bits = 8;
32459196d8acSJiri Slaby 	int parity = 'n';
32469196d8acSJiri Slaby 	int flow = 'n';
32479196d8acSJiri Slaby 
32489196d8acSJiri Slaby 	/*
32499196d8acSJiri Slaby 	 * Check whether an invalid uart number has been specified, and
32509196d8acSJiri Slaby 	 * if so, search for the first available port that does have
32519196d8acSJiri Slaby 	 * console support.
32529196d8acSJiri Slaby 	 */
3253317a6842SKyle McMartin 	if (co->index >= nr_uarts)
32549196d8acSJiri Slaby 		co->index = 0;
32559196d8acSJiri Slaby 	port = &serial8250_ports[co->index].port;
32569196d8acSJiri Slaby 	if (!port->iobase && !port->membase)
32579196d8acSJiri Slaby 		return -ENODEV;
32589196d8acSJiri Slaby 
32599196d8acSJiri Slaby 	if (options)
32609196d8acSJiri Slaby 		uart_parse_options(options, &baud, &parity, &bits, &flow);
32619196d8acSJiri Slaby 
32629196d8acSJiri Slaby 	return uart_set_options(port, co, baud, parity, bits, flow);
32639196d8acSJiri Slaby }
32649196d8acSJiri Slaby 
32659196d8acSJiri Slaby static int serial8250_console_early_setup(void)
32669196d8acSJiri Slaby {
32679196d8acSJiri Slaby 	return serial8250_find_port_for_earlycon();
32689196d8acSJiri Slaby }
32699196d8acSJiri Slaby 
32709196d8acSJiri Slaby static struct console serial8250_console = {
32719196d8acSJiri Slaby 	.name		= "ttyS",
32729196d8acSJiri Slaby 	.write		= serial8250_console_write,
32739196d8acSJiri Slaby 	.device		= uart_console_device,
32749196d8acSJiri Slaby 	.setup		= serial8250_console_setup,
32759196d8acSJiri Slaby 	.early_setup	= serial8250_console_early_setup,
32769196d8acSJiri Slaby 	.flags		= CON_PRINTBUFFER | CON_ANYTIME,
32779196d8acSJiri Slaby 	.index		= -1,
32789196d8acSJiri Slaby 	.data		= &serial8250_reg,
32799196d8acSJiri Slaby };
32809196d8acSJiri Slaby 
32819196d8acSJiri Slaby static int __init serial8250_console_init(void)
32829196d8acSJiri Slaby {
32839196d8acSJiri Slaby 	serial8250_isa_init_ports();
32849196d8acSJiri Slaby 	register_console(&serial8250_console);
32859196d8acSJiri Slaby 	return 0;
32869196d8acSJiri Slaby }
32879196d8acSJiri Slaby console_initcall(serial8250_console_init);
32889196d8acSJiri Slaby 
32899196d8acSJiri Slaby int serial8250_find_port(struct uart_port *p)
32909196d8acSJiri Slaby {
32919196d8acSJiri Slaby 	int line;
32929196d8acSJiri Slaby 	struct uart_port *port;
32939196d8acSJiri Slaby 
3294317a6842SKyle McMartin 	for (line = 0; line < nr_uarts; line++) {
32959196d8acSJiri Slaby 		port = &serial8250_ports[line].port;
32969196d8acSJiri Slaby 		if (uart_match_port(p, port))
32979196d8acSJiri Slaby 			return line;
32989196d8acSJiri Slaby 	}
32999196d8acSJiri Slaby 	return -ENODEV;
33009196d8acSJiri Slaby }
33019196d8acSJiri Slaby 
33029196d8acSJiri Slaby #define SERIAL8250_CONSOLE	&serial8250_console
33039196d8acSJiri Slaby #else
33049196d8acSJiri Slaby #define SERIAL8250_CONSOLE	NULL
33059196d8acSJiri Slaby #endif
33069196d8acSJiri Slaby 
33079196d8acSJiri Slaby static struct uart_driver serial8250_reg = {
33089196d8acSJiri Slaby 	.owner			= THIS_MODULE,
33099196d8acSJiri Slaby 	.driver_name		= "serial",
33109196d8acSJiri Slaby 	.dev_name		= "ttyS",
33119196d8acSJiri Slaby 	.major			= TTY_MAJOR,
33129196d8acSJiri Slaby 	.minor			= 64,
33139196d8acSJiri Slaby 	.cons			= SERIAL8250_CONSOLE,
33149196d8acSJiri Slaby };
33159196d8acSJiri Slaby 
33169196d8acSJiri Slaby /*
33179196d8acSJiri Slaby  * early_serial_setup - early registration for 8250 ports
33189196d8acSJiri Slaby  *
33199196d8acSJiri Slaby  * Setup an 8250 port structure prior to console initialisation.  Use
33209196d8acSJiri Slaby  * after console initialisation will cause undefined behaviour.
33219196d8acSJiri Slaby  */
33229196d8acSJiri Slaby int __init early_serial_setup(struct uart_port *port)
33239196d8acSJiri Slaby {
33249196d8acSJiri Slaby 	struct uart_port *p;
33259196d8acSJiri Slaby 
33269196d8acSJiri Slaby 	if (port->line >= ARRAY_SIZE(serial8250_ports))
33279196d8acSJiri Slaby 		return -ENODEV;
33289196d8acSJiri Slaby 
33299196d8acSJiri Slaby 	serial8250_isa_init_ports();
33309196d8acSJiri Slaby 	p = &serial8250_ports[port->line].port;
33319196d8acSJiri Slaby 	p->iobase       = port->iobase;
33329196d8acSJiri Slaby 	p->membase      = port->membase;
33339196d8acSJiri Slaby 	p->irq          = port->irq;
33349196d8acSJiri Slaby 	p->irqflags     = port->irqflags;
33359196d8acSJiri Slaby 	p->uartclk      = port->uartclk;
33369196d8acSJiri Slaby 	p->fifosize     = port->fifosize;
33379196d8acSJiri Slaby 	p->regshift     = port->regshift;
33389196d8acSJiri Slaby 	p->iotype       = port->iotype;
33399196d8acSJiri Slaby 	p->flags        = port->flags;
33409196d8acSJiri Slaby 	p->mapbase      = port->mapbase;
33419196d8acSJiri Slaby 	p->private_data = port->private_data;
33429196d8acSJiri Slaby 	p->type		= port->type;
33439196d8acSJiri Slaby 	p->line		= port->line;
33449196d8acSJiri Slaby 
33459196d8acSJiri Slaby 	set_io_from_upio(p);
33469196d8acSJiri Slaby 	if (port->serial_in)
33479196d8acSJiri Slaby 		p->serial_in = port->serial_in;
33489196d8acSJiri Slaby 	if (port->serial_out)
33499196d8acSJiri Slaby 		p->serial_out = port->serial_out;
33509196d8acSJiri Slaby 	if (port->handle_irq)
33519196d8acSJiri Slaby 		p->handle_irq = port->handle_irq;
33529196d8acSJiri Slaby 	else
33539196d8acSJiri Slaby 		p->handle_irq = serial8250_default_handle_irq;
33549196d8acSJiri Slaby 
33559196d8acSJiri Slaby 	return 0;
33569196d8acSJiri Slaby }
33579196d8acSJiri Slaby 
33589196d8acSJiri Slaby /**
33599196d8acSJiri Slaby  *	serial8250_suspend_port - suspend one serial port
33609196d8acSJiri Slaby  *	@line:  serial line number
33619196d8acSJiri Slaby  *
33629196d8acSJiri Slaby  *	Suspend one serial port.
33639196d8acSJiri Slaby  */
33649196d8acSJiri Slaby void serial8250_suspend_port(int line)
33659196d8acSJiri Slaby {
33669196d8acSJiri Slaby 	uart_suspend_port(&serial8250_reg, &serial8250_ports[line].port);
33679196d8acSJiri Slaby }
33689196d8acSJiri Slaby 
33699196d8acSJiri Slaby /**
33709196d8acSJiri Slaby  *	serial8250_resume_port - resume one serial port
33719196d8acSJiri Slaby  *	@line:  serial line number
33729196d8acSJiri Slaby  *
33739196d8acSJiri Slaby  *	Resume one serial port.
33749196d8acSJiri Slaby  */
33759196d8acSJiri Slaby void serial8250_resume_port(int line)
33769196d8acSJiri Slaby {
33779196d8acSJiri Slaby 	struct uart_8250_port *up = &serial8250_ports[line];
33789196d8acSJiri Slaby 	struct uart_port *port = &up->port;
33799196d8acSJiri Slaby 
33809196d8acSJiri Slaby 	if (up->capabilities & UART_NATSEMI) {
33819196d8acSJiri Slaby 		/* Ensure it's still in high speed mode */
33829196d8acSJiri Slaby 		serial_port_out(port, UART_LCR, 0xE0);
33839196d8acSJiri Slaby 
33849196d8acSJiri Slaby 		ns16550a_goto_highspeed(up);
33859196d8acSJiri Slaby 
33869196d8acSJiri Slaby 		serial_port_out(port, UART_LCR, 0);
33879196d8acSJiri Slaby 		port->uartclk = 921600*16;
33889196d8acSJiri Slaby 	}
33899196d8acSJiri Slaby 	uart_resume_port(&serial8250_reg, port);
33909196d8acSJiri Slaby }
33919196d8acSJiri Slaby 
33929196d8acSJiri Slaby /*
33939196d8acSJiri Slaby  * Register a set of serial devices attached to a platform device.  The
33949196d8acSJiri Slaby  * list is terminated with a zero flags entry, which means we expect
33959196d8acSJiri Slaby  * all entries to have at least UPF_BOOT_AUTOCONF set.
33969196d8acSJiri Slaby  */
33979196d8acSJiri Slaby static int serial8250_probe(struct platform_device *dev)
33989196d8acSJiri Slaby {
3399574de559SJingoo Han 	struct plat_serial8250_port *p = dev_get_platdata(&dev->dev);
34009196d8acSJiri Slaby 	struct uart_8250_port uart;
34019196d8acSJiri Slaby 	int ret, i, irqflag = 0;
34029196d8acSJiri Slaby 
34039196d8acSJiri Slaby 	memset(&uart, 0, sizeof(uart));
34049196d8acSJiri Slaby 
34059196d8acSJiri Slaby 	if (share_irqs)
34069196d8acSJiri Slaby 		irqflag = IRQF_SHARED;
34079196d8acSJiri Slaby 
34089196d8acSJiri Slaby 	for (i = 0; p && p->flags != 0; p++, i++) {
34099196d8acSJiri Slaby 		uart.port.iobase	= p->iobase;
34109196d8acSJiri Slaby 		uart.port.membase	= p->membase;
34119196d8acSJiri Slaby 		uart.port.irq		= p->irq;
34129196d8acSJiri Slaby 		uart.port.irqflags	= p->irqflags;
34139196d8acSJiri Slaby 		uart.port.uartclk	= p->uartclk;
34149196d8acSJiri Slaby 		uart.port.regshift	= p->regshift;
34159196d8acSJiri Slaby 		uart.port.iotype	= p->iotype;
34169196d8acSJiri Slaby 		uart.port.flags		= p->flags;
34179196d8acSJiri Slaby 		uart.port.mapbase	= p->mapbase;
34189196d8acSJiri Slaby 		uart.port.hub6		= p->hub6;
34199196d8acSJiri Slaby 		uart.port.private_data	= p->private_data;
34209196d8acSJiri Slaby 		uart.port.type		= p->type;
34219196d8acSJiri Slaby 		uart.port.serial_in	= p->serial_in;
34229196d8acSJiri Slaby 		uart.port.serial_out	= p->serial_out;
34239196d8acSJiri Slaby 		uart.port.handle_irq	= p->handle_irq;
34249196d8acSJiri Slaby 		uart.port.handle_break	= p->handle_break;
34259196d8acSJiri Slaby 		uart.port.set_termios	= p->set_termios;
34269196d8acSJiri Slaby 		uart.port.pm		= p->pm;
34279196d8acSJiri Slaby 		uart.port.dev		= &dev->dev;
34289196d8acSJiri Slaby 		uart.port.irqflags	|= irqflag;
34299196d8acSJiri Slaby 		ret = serial8250_register_8250_port(&uart);
34309196d8acSJiri Slaby 		if (ret < 0) {
34319196d8acSJiri Slaby 			dev_err(&dev->dev, "unable to register port at index %d "
34329196d8acSJiri Slaby 				"(IO%lx MEM%llx IRQ%d): %d\n", i,
34339196d8acSJiri Slaby 				p->iobase, (unsigned long long)p->mapbase,
34349196d8acSJiri Slaby 				p->irq, ret);
34359196d8acSJiri Slaby 		}
34369196d8acSJiri Slaby 	}
34379196d8acSJiri Slaby 	return 0;
34389196d8acSJiri Slaby }
34399196d8acSJiri Slaby 
34409196d8acSJiri Slaby /*
34419196d8acSJiri Slaby  * Remove serial ports registered against a platform device.
34429196d8acSJiri Slaby  */
34439196d8acSJiri Slaby static int serial8250_remove(struct platform_device *dev)
34449196d8acSJiri Slaby {
34459196d8acSJiri Slaby 	int i;
34469196d8acSJiri Slaby 
3447317a6842SKyle McMartin 	for (i = 0; i < nr_uarts; i++) {
34489196d8acSJiri Slaby 		struct uart_8250_port *up = &serial8250_ports[i];
34499196d8acSJiri Slaby 
34509196d8acSJiri Slaby 		if (up->port.dev == &dev->dev)
34519196d8acSJiri Slaby 			serial8250_unregister_port(i);
34529196d8acSJiri Slaby 	}
34539196d8acSJiri Slaby 	return 0;
34549196d8acSJiri Slaby }
34559196d8acSJiri Slaby 
34569196d8acSJiri Slaby static int serial8250_suspend(struct platform_device *dev, pm_message_t state)
34579196d8acSJiri Slaby {
34589196d8acSJiri Slaby 	int i;
34599196d8acSJiri Slaby 
34609196d8acSJiri Slaby 	for (i = 0; i < UART_NR; i++) {
34619196d8acSJiri Slaby 		struct uart_8250_port *up = &serial8250_ports[i];
34629196d8acSJiri Slaby 
34639196d8acSJiri Slaby 		if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
34649196d8acSJiri Slaby 			uart_suspend_port(&serial8250_reg, &up->port);
34659196d8acSJiri Slaby 	}
34669196d8acSJiri Slaby 
34679196d8acSJiri Slaby 	return 0;
34689196d8acSJiri Slaby }
34699196d8acSJiri Slaby 
34709196d8acSJiri Slaby static int serial8250_resume(struct platform_device *dev)
34719196d8acSJiri Slaby {
34729196d8acSJiri Slaby 	int i;
34739196d8acSJiri Slaby 
34749196d8acSJiri Slaby 	for (i = 0; i < UART_NR; i++) {
34759196d8acSJiri Slaby 		struct uart_8250_port *up = &serial8250_ports[i];
34769196d8acSJiri Slaby 
34779196d8acSJiri Slaby 		if (up->port.type != PORT_UNKNOWN && up->port.dev == &dev->dev)
34789196d8acSJiri Slaby 			serial8250_resume_port(i);
34799196d8acSJiri Slaby 	}
34809196d8acSJiri Slaby 
34819196d8acSJiri Slaby 	return 0;
34829196d8acSJiri Slaby }
34839196d8acSJiri Slaby 
34849196d8acSJiri Slaby static struct platform_driver serial8250_isa_driver = {
34859196d8acSJiri Slaby 	.probe		= serial8250_probe,
34869196d8acSJiri Slaby 	.remove		= serial8250_remove,
34879196d8acSJiri Slaby 	.suspend	= serial8250_suspend,
34889196d8acSJiri Slaby 	.resume		= serial8250_resume,
34899196d8acSJiri Slaby 	.driver		= {
34909196d8acSJiri Slaby 		.name	= "serial8250",
34919196d8acSJiri Slaby 		.owner	= THIS_MODULE,
34929196d8acSJiri Slaby 	},
34939196d8acSJiri Slaby };
34949196d8acSJiri Slaby 
34959196d8acSJiri Slaby /*
34969196d8acSJiri Slaby  * This "device" covers _all_ ISA 8250-compatible serial devices listed
34979196d8acSJiri Slaby  * in the table in include/asm/serial.h
34989196d8acSJiri Slaby  */
34999196d8acSJiri Slaby static struct platform_device *serial8250_isa_devs;
35009196d8acSJiri Slaby 
35019196d8acSJiri Slaby /*
35029196d8acSJiri Slaby  * serial8250_register_8250_port and serial8250_unregister_port allows for
35039196d8acSJiri Slaby  * 16x50 serial ports to be configured at run-time, to support PCMCIA
35049196d8acSJiri Slaby  * modems and PCI multiport cards.
35059196d8acSJiri Slaby  */
35069196d8acSJiri Slaby static DEFINE_MUTEX(serial_mutex);
35079196d8acSJiri Slaby 
35089196d8acSJiri Slaby static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *port)
35099196d8acSJiri Slaby {
35109196d8acSJiri Slaby 	int i;
35119196d8acSJiri Slaby 
35129196d8acSJiri Slaby 	/*
35139196d8acSJiri Slaby 	 * First, find a port entry which matches.
35149196d8acSJiri Slaby 	 */
3515317a6842SKyle McMartin 	for (i = 0; i < nr_uarts; i++)
35169196d8acSJiri Slaby 		if (uart_match_port(&serial8250_ports[i].port, port))
35179196d8acSJiri Slaby 			return &serial8250_ports[i];
35189196d8acSJiri Slaby 
351959b3e898SSebastian Andrzej Siewior 	/* try line number first if still available */
352059b3e898SSebastian Andrzej Siewior 	i = port->line;
352159b3e898SSebastian Andrzej Siewior 	if (i < nr_uarts && serial8250_ports[i].port.type == PORT_UNKNOWN &&
352259b3e898SSebastian Andrzej Siewior 			serial8250_ports[i].port.iobase == 0)
352359b3e898SSebastian Andrzej Siewior 		return &serial8250_ports[i];
35249196d8acSJiri Slaby 	/*
35259196d8acSJiri Slaby 	 * We didn't find a matching entry, so look for the first
35269196d8acSJiri Slaby 	 * free entry.  We look for one which hasn't been previously
35279196d8acSJiri Slaby 	 * used (indicated by zero iobase).
35289196d8acSJiri Slaby 	 */
3529317a6842SKyle McMartin 	for (i = 0; i < nr_uarts; i++)
35309196d8acSJiri Slaby 		if (serial8250_ports[i].port.type == PORT_UNKNOWN &&
35319196d8acSJiri Slaby 		    serial8250_ports[i].port.iobase == 0)
35329196d8acSJiri Slaby 			return &serial8250_ports[i];
35339196d8acSJiri Slaby 
35349196d8acSJiri Slaby 	/*
35359196d8acSJiri Slaby 	 * That also failed.  Last resort is to find any entry which
35369196d8acSJiri Slaby 	 * doesn't have a real port associated with it.
35379196d8acSJiri Slaby 	 */
3538317a6842SKyle McMartin 	for (i = 0; i < nr_uarts; i++)
35399196d8acSJiri Slaby 		if (serial8250_ports[i].port.type == PORT_UNKNOWN)
35409196d8acSJiri Slaby 			return &serial8250_ports[i];
35419196d8acSJiri Slaby 
35429196d8acSJiri Slaby 	return NULL;
35439196d8acSJiri Slaby }
35449196d8acSJiri Slaby 
35459196d8acSJiri Slaby /**
35469196d8acSJiri Slaby  *	serial8250_register_8250_port - register a serial port
35479196d8acSJiri Slaby  *	@up: serial port template
35489196d8acSJiri Slaby  *
35499196d8acSJiri Slaby  *	Configure the serial port specified by the request. If the
35509196d8acSJiri Slaby  *	port exists and is in use, it is hung up and unregistered
35519196d8acSJiri Slaby  *	first.
35529196d8acSJiri Slaby  *
35539196d8acSJiri Slaby  *	The port is then probed and if necessary the IRQ is autodetected
35549196d8acSJiri Slaby  *	If this fails an error is returned.
35559196d8acSJiri Slaby  *
35569196d8acSJiri Slaby  *	On success the port is ready to use and the line number is returned.
35579196d8acSJiri Slaby  */
35589196d8acSJiri Slaby int serial8250_register_8250_port(struct uart_8250_port *up)
35599196d8acSJiri Slaby {
35609196d8acSJiri Slaby 	struct uart_8250_port *uart;
35619196d8acSJiri Slaby 	int ret = -ENOSPC;
35629196d8acSJiri Slaby 
35639196d8acSJiri Slaby 	if (up->port.uartclk == 0)
35649196d8acSJiri Slaby 		return -EINVAL;
35659196d8acSJiri Slaby 
35669196d8acSJiri Slaby 	mutex_lock(&serial_mutex);
35679196d8acSJiri Slaby 
35689196d8acSJiri Slaby 	uart = serial8250_find_match_or_unused(&up->port);
35699196d8acSJiri Slaby 	if (uart && uart->port.type != PORT_8250_CIR) {
35709196d8acSJiri Slaby 		if (uart->port.dev)
35719196d8acSJiri Slaby 			uart_remove_one_port(&serial8250_reg, &uart->port);
35729196d8acSJiri Slaby 
35739196d8acSJiri Slaby 		uart->port.iobase       = up->port.iobase;
35749196d8acSJiri Slaby 		uart->port.membase      = up->port.membase;
35759196d8acSJiri Slaby 		uart->port.irq          = up->port.irq;
35769196d8acSJiri Slaby 		uart->port.irqflags     = up->port.irqflags;
35779196d8acSJiri Slaby 		uart->port.uartclk      = up->port.uartclk;
35789196d8acSJiri Slaby 		uart->port.fifosize     = up->port.fifosize;
35799196d8acSJiri Slaby 		uart->port.regshift     = up->port.regshift;
35809196d8acSJiri Slaby 		uart->port.iotype       = up->port.iotype;
35819196d8acSJiri Slaby 		uart->port.flags        = up->port.flags | UPF_BOOT_AUTOCONF;
35829196d8acSJiri Slaby 		uart->bugs		= up->bugs;
35839196d8acSJiri Slaby 		uart->port.mapbase      = up->port.mapbase;
35849196d8acSJiri Slaby 		uart->port.private_data = up->port.private_data;
35859196d8acSJiri Slaby 		uart->port.fifosize	= up->port.fifosize;
35869196d8acSJiri Slaby 		uart->tx_loadsz		= up->tx_loadsz;
35879196d8acSJiri Slaby 		uart->capabilities	= up->capabilities;
3588e676253bSRicardo Ribalda Delgado 		uart->rs485_config	= up->rs485_config;
3589e676253bSRicardo Ribalda Delgado 		uart->rs485		= up->rs485;
3590234abab1SSebastian Andrzej Siewior 		uart->port.throttle	= up->port.throttle;
3591234abab1SSebastian Andrzej Siewior 		uart->port.unthrottle	= up->port.unthrottle;
35929196d8acSJiri Slaby 
3593ef99f3aeSGreg Kroah-Hartman 		/* Take tx_loadsz from fifosize if it wasn't set separately */
3594ef99f3aeSGreg Kroah-Hartman 		if (uart->port.fifosize && !uart->tx_loadsz)
3595ef99f3aeSGreg Kroah-Hartman 			uart->tx_loadsz = uart->port.fifosize;
3596ef99f3aeSGreg Kroah-Hartman 
35979196d8acSJiri Slaby 		if (up->port.dev)
35989196d8acSJiri Slaby 			uart->port.dev = up->port.dev;
35999196d8acSJiri Slaby 
36009196d8acSJiri Slaby 		if (up->port.flags & UPF_FIXED_TYPE)
36019196d8acSJiri Slaby 			serial8250_init_fixed_type_port(uart, up->port.type);
36029196d8acSJiri Slaby 
36039196d8acSJiri Slaby 		set_io_from_upio(&uart->port);
36049196d8acSJiri Slaby 		/* Possibly override default I/O functions.  */
36059196d8acSJiri Slaby 		if (up->port.serial_in)
36069196d8acSJiri Slaby 			uart->port.serial_in = up->port.serial_in;
36079196d8acSJiri Slaby 		if (up->port.serial_out)
36089196d8acSJiri Slaby 			uart->port.serial_out = up->port.serial_out;
36099196d8acSJiri Slaby 		if (up->port.handle_irq)
36109196d8acSJiri Slaby 			uart->port.handle_irq = up->port.handle_irq;
36119196d8acSJiri Slaby 		/*  Possibly override set_termios call */
36129196d8acSJiri Slaby 		if (up->port.set_termios)
36139196d8acSJiri Slaby 			uart->port.set_termios = up->port.set_termios;
3614b99b121bSSebastian Andrzej Siewior 		if (up->port.startup)
3615b99b121bSSebastian Andrzej Siewior 			uart->port.startup = up->port.startup;
3616b99b121bSSebastian Andrzej Siewior 		if (up->port.shutdown)
3617b99b121bSSebastian Andrzej Siewior 			uart->port.shutdown = up->port.shutdown;
36189196d8acSJiri Slaby 		if (up->port.pm)
36199196d8acSJiri Slaby 			uart->port.pm = up->port.pm;
36209196d8acSJiri Slaby 		if (up->port.handle_break)
36219196d8acSJiri Slaby 			uart->port.handle_break = up->port.handle_break;
36229196d8acSJiri Slaby 		if (up->dl_read)
36239196d8acSJiri Slaby 			uart->dl_read = up->dl_read;
36249196d8acSJiri Slaby 		if (up->dl_write)
36259196d8acSJiri Slaby 			uart->dl_write = up->dl_write;
36269196d8acSJiri Slaby 		if (up->dma)
36279196d8acSJiri Slaby 			uart->dma = up->dma;
36289196d8acSJiri Slaby 
36299196d8acSJiri Slaby 		if (serial8250_isa_config != NULL)
36309196d8acSJiri Slaby 			serial8250_isa_config(0, &uart->port,
36319196d8acSJiri Slaby 					&uart->capabilities);
36329196d8acSJiri Slaby 
36339196d8acSJiri Slaby 		ret = uart_add_one_port(&serial8250_reg, &uart->port);
36349196d8acSJiri Slaby 		if (ret == 0)
36359196d8acSJiri Slaby 			ret = uart->port.line;
36369196d8acSJiri Slaby 	}
36379196d8acSJiri Slaby 	mutex_unlock(&serial_mutex);
36389196d8acSJiri Slaby 
36399196d8acSJiri Slaby 	return ret;
36409196d8acSJiri Slaby }
36419196d8acSJiri Slaby EXPORT_SYMBOL(serial8250_register_8250_port);
36429196d8acSJiri Slaby 
36439196d8acSJiri Slaby /**
36449196d8acSJiri Slaby  *	serial8250_unregister_port - remove a 16x50 serial port at runtime
36459196d8acSJiri Slaby  *	@line: serial line number
36469196d8acSJiri Slaby  *
36479196d8acSJiri Slaby  *	Remove one serial port.  This may not be called from interrupt
36489196d8acSJiri Slaby  *	context.  We hand the port back to the our control.
36499196d8acSJiri Slaby  */
36509196d8acSJiri Slaby void serial8250_unregister_port(int line)
36519196d8acSJiri Slaby {
36529196d8acSJiri Slaby 	struct uart_8250_port *uart = &serial8250_ports[line];
36539196d8acSJiri Slaby 
36549196d8acSJiri Slaby 	mutex_lock(&serial_mutex);
36559196d8acSJiri Slaby 	uart_remove_one_port(&serial8250_reg, &uart->port);
36569196d8acSJiri Slaby 	if (serial8250_isa_devs) {
36579196d8acSJiri Slaby 		uart->port.flags &= ~UPF_BOOT_AUTOCONF;
36589196d8acSJiri Slaby 		uart->port.type = PORT_UNKNOWN;
36599196d8acSJiri Slaby 		uart->port.dev = &serial8250_isa_devs->dev;
36609196d8acSJiri Slaby 		uart->capabilities = uart_config[uart->port.type].flags;
36619196d8acSJiri Slaby 		uart_add_one_port(&serial8250_reg, &uart->port);
36629196d8acSJiri Slaby 	} else {
36639196d8acSJiri Slaby 		uart->port.dev = NULL;
36649196d8acSJiri Slaby 	}
36659196d8acSJiri Slaby 	mutex_unlock(&serial_mutex);
36669196d8acSJiri Slaby }
36679196d8acSJiri Slaby EXPORT_SYMBOL(serial8250_unregister_port);
36689196d8acSJiri Slaby 
36699196d8acSJiri Slaby static int __init serial8250_init(void)
36709196d8acSJiri Slaby {
36719196d8acSJiri Slaby 	int ret;
36729196d8acSJiri Slaby 
36739196d8acSJiri Slaby 	serial8250_isa_init_ports();
36749196d8acSJiri Slaby 
36759196d8acSJiri Slaby 	printk(KERN_INFO "Serial: 8250/16550 driver, "
36769196d8acSJiri Slaby 		"%d ports, IRQ sharing %sabled\n", nr_uarts,
36779196d8acSJiri Slaby 		share_irqs ? "en" : "dis");
36789196d8acSJiri Slaby 
36799196d8acSJiri Slaby #ifdef CONFIG_SPARC
36809196d8acSJiri Slaby 	ret = sunserial_register_minors(&serial8250_reg, UART_NR);
36819196d8acSJiri Slaby #else
36829196d8acSJiri Slaby 	serial8250_reg.nr = UART_NR;
36839196d8acSJiri Slaby 	ret = uart_register_driver(&serial8250_reg);
36849196d8acSJiri Slaby #endif
36859196d8acSJiri Slaby 	if (ret)
36869196d8acSJiri Slaby 		goto out;
36879196d8acSJiri Slaby 
36889196d8acSJiri Slaby 	ret = serial8250_pnp_init();
36899196d8acSJiri Slaby 	if (ret)
36909196d8acSJiri Slaby 		goto unreg_uart_drv;
36919196d8acSJiri Slaby 
36929196d8acSJiri Slaby 	serial8250_isa_devs = platform_device_alloc("serial8250",
36939196d8acSJiri Slaby 						    PLAT8250_DEV_LEGACY);
36949196d8acSJiri Slaby 	if (!serial8250_isa_devs) {
36959196d8acSJiri Slaby 		ret = -ENOMEM;
36969196d8acSJiri Slaby 		goto unreg_pnp;
36979196d8acSJiri Slaby 	}
36989196d8acSJiri Slaby 
36999196d8acSJiri Slaby 	ret = platform_device_add(serial8250_isa_devs);
37009196d8acSJiri Slaby 	if (ret)
37019196d8acSJiri Slaby 		goto put_dev;
37029196d8acSJiri Slaby 
37039196d8acSJiri Slaby 	serial8250_register_ports(&serial8250_reg, &serial8250_isa_devs->dev);
37049196d8acSJiri Slaby 
37059196d8acSJiri Slaby 	ret = platform_driver_register(&serial8250_isa_driver);
37069196d8acSJiri Slaby 	if (ret == 0)
37079196d8acSJiri Slaby 		goto out;
37089196d8acSJiri Slaby 
37099196d8acSJiri Slaby 	platform_device_del(serial8250_isa_devs);
37109196d8acSJiri Slaby put_dev:
37119196d8acSJiri Slaby 	platform_device_put(serial8250_isa_devs);
37129196d8acSJiri Slaby unreg_pnp:
37139196d8acSJiri Slaby 	serial8250_pnp_exit();
37149196d8acSJiri Slaby unreg_uart_drv:
37159196d8acSJiri Slaby #ifdef CONFIG_SPARC
37169196d8acSJiri Slaby 	sunserial_unregister_minors(&serial8250_reg, UART_NR);
37179196d8acSJiri Slaby #else
37189196d8acSJiri Slaby 	uart_unregister_driver(&serial8250_reg);
37199196d8acSJiri Slaby #endif
37209196d8acSJiri Slaby out:
37219196d8acSJiri Slaby 	return ret;
37229196d8acSJiri Slaby }
37239196d8acSJiri Slaby 
37249196d8acSJiri Slaby static void __exit serial8250_exit(void)
37259196d8acSJiri Slaby {
37269196d8acSJiri Slaby 	struct platform_device *isa_dev = serial8250_isa_devs;
37279196d8acSJiri Slaby 
37289196d8acSJiri Slaby 	/*
37299196d8acSJiri Slaby 	 * This tells serial8250_unregister_port() not to re-register
37309196d8acSJiri Slaby 	 * the ports (thereby making serial8250_isa_driver permanently
37319196d8acSJiri Slaby 	 * in use.)
37329196d8acSJiri Slaby 	 */
37339196d8acSJiri Slaby 	serial8250_isa_devs = NULL;
37349196d8acSJiri Slaby 
37359196d8acSJiri Slaby 	platform_driver_unregister(&serial8250_isa_driver);
37369196d8acSJiri Slaby 	platform_device_unregister(isa_dev);
37379196d8acSJiri Slaby 
37389196d8acSJiri Slaby 	serial8250_pnp_exit();
37399196d8acSJiri Slaby 
37409196d8acSJiri Slaby #ifdef CONFIG_SPARC
37419196d8acSJiri Slaby 	sunserial_unregister_minors(&serial8250_reg, UART_NR);
37429196d8acSJiri Slaby #else
37439196d8acSJiri Slaby 	uart_unregister_driver(&serial8250_reg);
37449196d8acSJiri Slaby #endif
37459196d8acSJiri Slaby }
37469196d8acSJiri Slaby 
37479196d8acSJiri Slaby module_init(serial8250_init);
37489196d8acSJiri Slaby module_exit(serial8250_exit);
37499196d8acSJiri Slaby 
37509196d8acSJiri Slaby EXPORT_SYMBOL(serial8250_suspend_port);
37519196d8acSJiri Slaby EXPORT_SYMBOL(serial8250_resume_port);
37529196d8acSJiri Slaby 
37539196d8acSJiri Slaby MODULE_LICENSE("GPL");
37549196d8acSJiri Slaby MODULE_DESCRIPTION("Generic 8250/16x50 serial driver");
37559196d8acSJiri Slaby 
37569196d8acSJiri Slaby module_param(share_irqs, uint, 0644);
37579196d8acSJiri Slaby MODULE_PARM_DESC(share_irqs, "Share IRQs with other non-8250/16x50 devices"
37589196d8acSJiri Slaby 	" (unsafe)");
37599196d8acSJiri Slaby 
37609196d8acSJiri Slaby module_param(nr_uarts, uint, 0644);
37619196d8acSJiri Slaby MODULE_PARM_DESC(nr_uarts, "Maximum number of UARTs supported. (1-" __MODULE_STRING(CONFIG_SERIAL_8250_NR_UARTS) ")");
37629196d8acSJiri Slaby 
37639196d8acSJiri Slaby module_param(skip_txen_test, uint, 0644);
37649196d8acSJiri Slaby MODULE_PARM_DESC(skip_txen_test, "Skip checking for the TXEN bug at init time");
37659196d8acSJiri Slaby 
37669196d8acSJiri Slaby #ifdef CONFIG_SERIAL_8250_RSA
37679196d8acSJiri Slaby module_param_array(probe_rsa, ulong, &probe_rsa_count, 0444);
37689196d8acSJiri Slaby MODULE_PARM_DESC(probe_rsa, "Probe I/O ports for RSA");
37699196d8acSJiri Slaby #endif
37709196d8acSJiri Slaby MODULE_ALIAS_CHARDEV_MAJOR(TTY_MAJOR);
37719196d8acSJiri Slaby 
37729326b047SJiri Slaby #ifdef CONFIG_SERIAL_8250_DEPRECATED_OPTIONS
37739196d8acSJiri Slaby #ifndef MODULE
37749196d8acSJiri Slaby /* This module was renamed to 8250_core in 3.7.  Keep the old "8250" name
37759196d8acSJiri Slaby  * working as well for the module options so we don't break people.  We
37769196d8acSJiri Slaby  * need to keep the names identical and the convenient macros will happily
37779196d8acSJiri Slaby  * refuse to let us do that by failing the build with redefinition errors
37789196d8acSJiri Slaby  * of global variables.  So we stick them inside a dummy function to avoid
37799196d8acSJiri Slaby  * those conflicts.  The options still get parsed, and the redefined
37809196d8acSJiri Slaby  * MODULE_PARAM_PREFIX lets us keep the "8250." syntax alive.
37819196d8acSJiri Slaby  *
37829196d8acSJiri Slaby  * This is hacky.  I'm sorry.
37839196d8acSJiri Slaby  */
37849196d8acSJiri Slaby static void __used s8250_options(void)
37859196d8acSJiri Slaby {
37869196d8acSJiri Slaby #undef MODULE_PARAM_PREFIX
37879196d8acSJiri Slaby #define MODULE_PARAM_PREFIX "8250_core."
37889196d8acSJiri Slaby 
37899196d8acSJiri Slaby 	module_param_cb(share_irqs, &param_ops_uint, &share_irqs, 0644);
37909196d8acSJiri Slaby 	module_param_cb(nr_uarts, &param_ops_uint, &nr_uarts, 0644);
37919196d8acSJiri Slaby 	module_param_cb(skip_txen_test, &param_ops_uint, &skip_txen_test, 0644);
37929196d8acSJiri Slaby #ifdef CONFIG_SERIAL_8250_RSA
37939196d8acSJiri Slaby 	__module_param_call(MODULE_PARAM_PREFIX, probe_rsa,
37949196d8acSJiri Slaby 		&param_array_ops, .arr = &__param_arr_probe_rsa,
37959196d8acSJiri Slaby 		0444, -1);
37969196d8acSJiri Slaby #endif
37979196d8acSJiri Slaby }
37989196d8acSJiri Slaby #else
37999196d8acSJiri Slaby MODULE_ALIAS("8250_core");
38009196d8acSJiri Slaby #endif
38019326b047SJiri Slaby #endif
3802