Commit 2bb785169e9709d41220e5c18b0270883a82f85c
Committed by
Greg Kroah-Hartman
1 parent
c4e6dcfa00
Exists in
ti-lsk-linux-4.1.y
and in
10 other branches
serial: core: Fix iotype userspace breakage
commit 3ffb1a8193bea ("serial: core: Add big-endian iotype") re-numbered userspace-dependent values; ioctl(TIOCSSERIAL) can assign the port iotype (which is expected to match the selected i/o accessors), so iotype values must not be changed. Cc: Kevin Cernekee <cernekee@gmail.com> Cc: <stable@vger.kernel.org> # 3.19+ Signed-off-by: Peter Hurley <peter@hurleysoftware.com> Reviewed-by: Kevin Cernekee <cernekee@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Showing 1 changed file with 3 additions and 3 deletions Inline Diff
include/linux/serial_core.h
1 | /* | 1 | /* |
2 | * linux/drivers/char/serial_core.h | 2 | * linux/drivers/char/serial_core.h |
3 | * | 3 | * |
4 | * Copyright (C) 2000 Deep Blue Solutions Ltd. | 4 | * Copyright (C) 2000 Deep Blue Solutions Ltd. |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
8 | * the Free Software Foundation; either version 2 of the License, or | 8 | * the Free Software Foundation; either version 2 of the License, or |
9 | * (at your option) any later version. | 9 | * (at your option) any later version. |
10 | * | 10 | * |
11 | * This program is distributed in the hope that it will be useful, | 11 | * This program is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | * GNU General Public License for more details. | 14 | * GNU General Public License for more details. |
15 | * | 15 | * |
16 | * You should have received a copy of the GNU General Public License | 16 | * You should have received a copy of the GNU General Public License |
17 | * along with this program; if not, write to the Free Software | 17 | * along with this program; if not, write to the Free Software |
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
19 | */ | 19 | */ |
20 | #ifndef LINUX_SERIAL_CORE_H | 20 | #ifndef LINUX_SERIAL_CORE_H |
21 | #define LINUX_SERIAL_CORE_H | 21 | #define LINUX_SERIAL_CORE_H |
22 | 22 | ||
23 | 23 | ||
24 | #include <linux/compiler.h> | 24 | #include <linux/compiler.h> |
25 | #include <linux/interrupt.h> | 25 | #include <linux/interrupt.h> |
26 | #include <linux/circ_buf.h> | 26 | #include <linux/circ_buf.h> |
27 | #include <linux/spinlock.h> | 27 | #include <linux/spinlock.h> |
28 | #include <linux/sched.h> | 28 | #include <linux/sched.h> |
29 | #include <linux/tty.h> | 29 | #include <linux/tty.h> |
30 | #include <linux/mutex.h> | 30 | #include <linux/mutex.h> |
31 | #include <linux/sysrq.h> | 31 | #include <linux/sysrq.h> |
32 | #include <uapi/linux/serial_core.h> | 32 | #include <uapi/linux/serial_core.h> |
33 | 33 | ||
34 | #ifdef CONFIG_SERIAL_CORE_CONSOLE | 34 | #ifdef CONFIG_SERIAL_CORE_CONSOLE |
35 | #define uart_console(port) \ | 35 | #define uart_console(port) \ |
36 | ((port)->cons && (port)->cons->index == (port)->line) | 36 | ((port)->cons && (port)->cons->index == (port)->line) |
37 | #else | 37 | #else |
38 | #define uart_console(port) (0) | 38 | #define uart_console(port) (0) |
39 | #endif | 39 | #endif |
40 | 40 | ||
41 | struct uart_port; | 41 | struct uart_port; |
42 | struct serial_struct; | 42 | struct serial_struct; |
43 | struct device; | 43 | struct device; |
44 | 44 | ||
45 | /* | 45 | /* |
46 | * This structure describes all the operations that can be done on the | 46 | * This structure describes all the operations that can be done on the |
47 | * physical hardware. See Documentation/serial/driver for details. | 47 | * physical hardware. See Documentation/serial/driver for details. |
48 | */ | 48 | */ |
49 | struct uart_ops { | 49 | struct uart_ops { |
50 | unsigned int (*tx_empty)(struct uart_port *); | 50 | unsigned int (*tx_empty)(struct uart_port *); |
51 | void (*set_mctrl)(struct uart_port *, unsigned int mctrl); | 51 | void (*set_mctrl)(struct uart_port *, unsigned int mctrl); |
52 | unsigned int (*get_mctrl)(struct uart_port *); | 52 | unsigned int (*get_mctrl)(struct uart_port *); |
53 | void (*stop_tx)(struct uart_port *); | 53 | void (*stop_tx)(struct uart_port *); |
54 | void (*start_tx)(struct uart_port *); | 54 | void (*start_tx)(struct uart_port *); |
55 | void (*throttle)(struct uart_port *); | 55 | void (*throttle)(struct uart_port *); |
56 | void (*unthrottle)(struct uart_port *); | 56 | void (*unthrottle)(struct uart_port *); |
57 | void (*send_xchar)(struct uart_port *, char ch); | 57 | void (*send_xchar)(struct uart_port *, char ch); |
58 | void (*stop_rx)(struct uart_port *); | 58 | void (*stop_rx)(struct uart_port *); |
59 | void (*enable_ms)(struct uart_port *); | 59 | void (*enable_ms)(struct uart_port *); |
60 | void (*break_ctl)(struct uart_port *, int ctl); | 60 | void (*break_ctl)(struct uart_port *, int ctl); |
61 | int (*startup)(struct uart_port *); | 61 | int (*startup)(struct uart_port *); |
62 | void (*shutdown)(struct uart_port *); | 62 | void (*shutdown)(struct uart_port *); |
63 | void (*flush_buffer)(struct uart_port *); | 63 | void (*flush_buffer)(struct uart_port *); |
64 | void (*set_termios)(struct uart_port *, struct ktermios *new, | 64 | void (*set_termios)(struct uart_port *, struct ktermios *new, |
65 | struct ktermios *old); | 65 | struct ktermios *old); |
66 | void (*set_ldisc)(struct uart_port *, struct ktermios *); | 66 | void (*set_ldisc)(struct uart_port *, struct ktermios *); |
67 | void (*pm)(struct uart_port *, unsigned int state, | 67 | void (*pm)(struct uart_port *, unsigned int state, |
68 | unsigned int oldstate); | 68 | unsigned int oldstate); |
69 | 69 | ||
70 | /* | 70 | /* |
71 | * Return a string describing the type of the port | 71 | * Return a string describing the type of the port |
72 | */ | 72 | */ |
73 | const char *(*type)(struct uart_port *); | 73 | const char *(*type)(struct uart_port *); |
74 | 74 | ||
75 | /* | 75 | /* |
76 | * Release IO and memory resources used by the port. | 76 | * Release IO and memory resources used by the port. |
77 | * This includes iounmap if necessary. | 77 | * This includes iounmap if necessary. |
78 | */ | 78 | */ |
79 | void (*release_port)(struct uart_port *); | 79 | void (*release_port)(struct uart_port *); |
80 | 80 | ||
81 | /* | 81 | /* |
82 | * Request IO and memory resources used by the port. | 82 | * Request IO and memory resources used by the port. |
83 | * This includes iomapping the port if necessary. | 83 | * This includes iomapping the port if necessary. |
84 | */ | 84 | */ |
85 | int (*request_port)(struct uart_port *); | 85 | int (*request_port)(struct uart_port *); |
86 | void (*config_port)(struct uart_port *, int); | 86 | void (*config_port)(struct uart_port *, int); |
87 | int (*verify_port)(struct uart_port *, struct serial_struct *); | 87 | int (*verify_port)(struct uart_port *, struct serial_struct *); |
88 | int (*ioctl)(struct uart_port *, unsigned int, unsigned long); | 88 | int (*ioctl)(struct uart_port *, unsigned int, unsigned long); |
89 | #ifdef CONFIG_CONSOLE_POLL | 89 | #ifdef CONFIG_CONSOLE_POLL |
90 | int (*poll_init)(struct uart_port *); | 90 | int (*poll_init)(struct uart_port *); |
91 | void (*poll_put_char)(struct uart_port *, unsigned char); | 91 | void (*poll_put_char)(struct uart_port *, unsigned char); |
92 | int (*poll_get_char)(struct uart_port *); | 92 | int (*poll_get_char)(struct uart_port *); |
93 | #endif | 93 | #endif |
94 | }; | 94 | }; |
95 | 95 | ||
96 | #define NO_POLL_CHAR 0x00ff0000 | 96 | #define NO_POLL_CHAR 0x00ff0000 |
97 | #define UART_CONFIG_TYPE (1 << 0) | 97 | #define UART_CONFIG_TYPE (1 << 0) |
98 | #define UART_CONFIG_IRQ (1 << 1) | 98 | #define UART_CONFIG_IRQ (1 << 1) |
99 | 99 | ||
100 | struct uart_icount { | 100 | struct uart_icount { |
101 | __u32 cts; | 101 | __u32 cts; |
102 | __u32 dsr; | 102 | __u32 dsr; |
103 | __u32 rng; | 103 | __u32 rng; |
104 | __u32 dcd; | 104 | __u32 dcd; |
105 | __u32 rx; | 105 | __u32 rx; |
106 | __u32 tx; | 106 | __u32 tx; |
107 | __u32 frame; | 107 | __u32 frame; |
108 | __u32 overrun; | 108 | __u32 overrun; |
109 | __u32 parity; | 109 | __u32 parity; |
110 | __u32 brk; | 110 | __u32 brk; |
111 | __u32 buf_overrun; | 111 | __u32 buf_overrun; |
112 | }; | 112 | }; |
113 | 113 | ||
114 | typedef unsigned int __bitwise__ upf_t; | 114 | typedef unsigned int __bitwise__ upf_t; |
115 | typedef unsigned int __bitwise__ upstat_t; | 115 | typedef unsigned int __bitwise__ upstat_t; |
116 | 116 | ||
117 | struct uart_port { | 117 | struct uart_port { |
118 | spinlock_t lock; /* port lock */ | 118 | spinlock_t lock; /* port lock */ |
119 | unsigned long iobase; /* in/out[bwl] */ | 119 | unsigned long iobase; /* in/out[bwl] */ |
120 | unsigned char __iomem *membase; /* read/write[bwl] */ | 120 | unsigned char __iomem *membase; /* read/write[bwl] */ |
121 | unsigned int (*serial_in)(struct uart_port *, int); | 121 | unsigned int (*serial_in)(struct uart_port *, int); |
122 | void (*serial_out)(struct uart_port *, int, int); | 122 | void (*serial_out)(struct uart_port *, int, int); |
123 | void (*set_termios)(struct uart_port *, | 123 | void (*set_termios)(struct uart_port *, |
124 | struct ktermios *new, | 124 | struct ktermios *new, |
125 | struct ktermios *old); | 125 | struct ktermios *old); |
126 | void (*set_mctrl)(struct uart_port *, unsigned int); | 126 | void (*set_mctrl)(struct uart_port *, unsigned int); |
127 | int (*startup)(struct uart_port *port); | 127 | int (*startup)(struct uart_port *port); |
128 | void (*shutdown)(struct uart_port *port); | 128 | void (*shutdown)(struct uart_port *port); |
129 | void (*throttle)(struct uart_port *port); | 129 | void (*throttle)(struct uart_port *port); |
130 | void (*unthrottle)(struct uart_port *port); | 130 | void (*unthrottle)(struct uart_port *port); |
131 | int (*handle_irq)(struct uart_port *); | 131 | int (*handle_irq)(struct uart_port *); |
132 | void (*pm)(struct uart_port *, unsigned int state, | 132 | void (*pm)(struct uart_port *, unsigned int state, |
133 | unsigned int old); | 133 | unsigned int old); |
134 | void (*handle_break)(struct uart_port *); | 134 | void (*handle_break)(struct uart_port *); |
135 | int (*rs485_config)(struct uart_port *, | 135 | int (*rs485_config)(struct uart_port *, |
136 | struct serial_rs485 *rs485); | 136 | struct serial_rs485 *rs485); |
137 | unsigned int irq; /* irq number */ | 137 | unsigned int irq; /* irq number */ |
138 | unsigned long irqflags; /* irq flags */ | 138 | unsigned long irqflags; /* irq flags */ |
139 | unsigned int uartclk; /* base uart clock */ | 139 | unsigned int uartclk; /* base uart clock */ |
140 | unsigned int fifosize; /* tx fifo size */ | 140 | unsigned int fifosize; /* tx fifo size */ |
141 | unsigned char x_char; /* xon/xoff char */ | 141 | unsigned char x_char; /* xon/xoff char */ |
142 | unsigned char regshift; /* reg offset shift */ | 142 | unsigned char regshift; /* reg offset shift */ |
143 | unsigned char iotype; /* io access style */ | 143 | unsigned char iotype; /* io access style */ |
144 | unsigned char unused1; | 144 | unsigned char unused1; |
145 | 145 | ||
146 | #define UPIO_PORT (0) /* 8b I/O port access */ | 146 | #define UPIO_PORT (0) /* 8b I/O port access */ |
147 | #define UPIO_HUB6 (1) /* Hub6 ISA card */ | 147 | #define UPIO_HUB6 (1) /* Hub6 ISA card */ |
148 | #define UPIO_MEM (2) /* 8b MMIO access */ | 148 | #define UPIO_MEM (2) /* 8b MMIO access */ |
149 | #define UPIO_MEM32 (3) /* 32b little endian */ | 149 | #define UPIO_MEM32 (3) /* 32b little endian */ |
150 | #define UPIO_MEM32BE (4) /* 32b big endian */ | 150 | #define UPIO_AU (4) /* Au1x00 and RT288x type IO */ |
151 | #define UPIO_AU (5) /* Au1x00 and RT288x type IO */ | 151 | #define UPIO_TSI (5) /* Tsi108/109 type IO */ |
152 | #define UPIO_TSI (6) /* Tsi108/109 type IO */ | 152 | #define UPIO_MEM32BE (6) /* 32b big endian */ |
153 | 153 | ||
154 | unsigned int read_status_mask; /* driver specific */ | 154 | unsigned int read_status_mask; /* driver specific */ |
155 | unsigned int ignore_status_mask; /* driver specific */ | 155 | unsigned int ignore_status_mask; /* driver specific */ |
156 | struct uart_state *state; /* pointer to parent state */ | 156 | struct uart_state *state; /* pointer to parent state */ |
157 | struct uart_icount icount; /* statistics */ | 157 | struct uart_icount icount; /* statistics */ |
158 | 158 | ||
159 | struct console *cons; /* struct console, if any */ | 159 | struct console *cons; /* struct console, if any */ |
160 | #if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(SUPPORT_SYSRQ) | 160 | #if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(SUPPORT_SYSRQ) |
161 | unsigned long sysrq; /* sysrq timeout */ | 161 | unsigned long sysrq; /* sysrq timeout */ |
162 | #endif | 162 | #endif |
163 | 163 | ||
164 | /* flags must be updated while holding port mutex */ | 164 | /* flags must be updated while holding port mutex */ |
165 | upf_t flags; | 165 | upf_t flags; |
166 | 166 | ||
167 | /* | 167 | /* |
168 | * These flags must be equivalent to the flags defined in | 168 | * These flags must be equivalent to the flags defined in |
169 | * include/uapi/linux/tty_flags.h which are the userspace definitions | 169 | * include/uapi/linux/tty_flags.h which are the userspace definitions |
170 | * assigned from the serial_struct flags in uart_set_info() | 170 | * assigned from the serial_struct flags in uart_set_info() |
171 | * [for bit definitions in the UPF_CHANGE_MASK] | 171 | * [for bit definitions in the UPF_CHANGE_MASK] |
172 | * | 172 | * |
173 | * Bits [0..UPF_LAST_USER] are userspace defined/visible/changeable | 173 | * Bits [0..UPF_LAST_USER] are userspace defined/visible/changeable |
174 | * except bit 15 (UPF_NO_TXEN_TEST) which is masked off. | 174 | * except bit 15 (UPF_NO_TXEN_TEST) which is masked off. |
175 | * The remaining bits are serial-core specific and not modifiable by | 175 | * The remaining bits are serial-core specific and not modifiable by |
176 | * userspace. | 176 | * userspace. |
177 | */ | 177 | */ |
178 | #define UPF_FOURPORT ((__force upf_t) ASYNC_FOURPORT /* 1 */ ) | 178 | #define UPF_FOURPORT ((__force upf_t) ASYNC_FOURPORT /* 1 */ ) |
179 | #define UPF_SAK ((__force upf_t) ASYNC_SAK /* 2 */ ) | 179 | #define UPF_SAK ((__force upf_t) ASYNC_SAK /* 2 */ ) |
180 | #define UPF_SPD_HI ((__force upf_t) ASYNC_SPD_HI /* 4 */ ) | 180 | #define UPF_SPD_HI ((__force upf_t) ASYNC_SPD_HI /* 4 */ ) |
181 | #define UPF_SPD_VHI ((__force upf_t) ASYNC_SPD_VHI /* 5 */ ) | 181 | #define UPF_SPD_VHI ((__force upf_t) ASYNC_SPD_VHI /* 5 */ ) |
182 | #define UPF_SPD_CUST ((__force upf_t) ASYNC_SPD_CUST /* 0x0030 */ ) | 182 | #define UPF_SPD_CUST ((__force upf_t) ASYNC_SPD_CUST /* 0x0030 */ ) |
183 | #define UPF_SPD_WARP ((__force upf_t) ASYNC_SPD_WARP /* 0x1010 */ ) | 183 | #define UPF_SPD_WARP ((__force upf_t) ASYNC_SPD_WARP /* 0x1010 */ ) |
184 | #define UPF_SPD_MASK ((__force upf_t) ASYNC_SPD_MASK /* 0x1030 */ ) | 184 | #define UPF_SPD_MASK ((__force upf_t) ASYNC_SPD_MASK /* 0x1030 */ ) |
185 | #define UPF_SKIP_TEST ((__force upf_t) ASYNC_SKIP_TEST /* 6 */ ) | 185 | #define UPF_SKIP_TEST ((__force upf_t) ASYNC_SKIP_TEST /* 6 */ ) |
186 | #define UPF_AUTO_IRQ ((__force upf_t) ASYNC_AUTO_IRQ /* 7 */ ) | 186 | #define UPF_AUTO_IRQ ((__force upf_t) ASYNC_AUTO_IRQ /* 7 */ ) |
187 | #define UPF_HARDPPS_CD ((__force upf_t) ASYNC_HARDPPS_CD /* 11 */ ) | 187 | #define UPF_HARDPPS_CD ((__force upf_t) ASYNC_HARDPPS_CD /* 11 */ ) |
188 | #define UPF_SPD_SHI ((__force upf_t) ASYNC_SPD_SHI /* 12 */ ) | 188 | #define UPF_SPD_SHI ((__force upf_t) ASYNC_SPD_SHI /* 12 */ ) |
189 | #define UPF_LOW_LATENCY ((__force upf_t) ASYNC_LOW_LATENCY /* 13 */ ) | 189 | #define UPF_LOW_LATENCY ((__force upf_t) ASYNC_LOW_LATENCY /* 13 */ ) |
190 | #define UPF_BUGGY_UART ((__force upf_t) ASYNC_BUGGY_UART /* 14 */ ) | 190 | #define UPF_BUGGY_UART ((__force upf_t) ASYNC_BUGGY_UART /* 14 */ ) |
191 | #define UPF_NO_TXEN_TEST ((__force upf_t) (1 << 15)) | 191 | #define UPF_NO_TXEN_TEST ((__force upf_t) (1 << 15)) |
192 | #define UPF_MAGIC_MULTIPLIER ((__force upf_t) ASYNC_MAGIC_MULTIPLIER /* 16 */ ) | 192 | #define UPF_MAGIC_MULTIPLIER ((__force upf_t) ASYNC_MAGIC_MULTIPLIER /* 16 */ ) |
193 | 193 | ||
194 | /* Port has hardware-assisted h/w flow control */ | 194 | /* Port has hardware-assisted h/w flow control */ |
195 | #define UPF_AUTO_CTS ((__force upf_t) (1 << 20)) | 195 | #define UPF_AUTO_CTS ((__force upf_t) (1 << 20)) |
196 | #define UPF_AUTO_RTS ((__force upf_t) (1 << 21)) | 196 | #define UPF_AUTO_RTS ((__force upf_t) (1 << 21)) |
197 | #define UPF_HARD_FLOW ((__force upf_t) (UPF_AUTO_CTS | UPF_AUTO_RTS)) | 197 | #define UPF_HARD_FLOW ((__force upf_t) (UPF_AUTO_CTS | UPF_AUTO_RTS)) |
198 | /* Port has hardware-assisted s/w flow control */ | 198 | /* Port has hardware-assisted s/w flow control */ |
199 | #define UPF_SOFT_FLOW ((__force upf_t) (1 << 22)) | 199 | #define UPF_SOFT_FLOW ((__force upf_t) (1 << 22)) |
200 | #define UPF_CONS_FLOW ((__force upf_t) (1 << 23)) | 200 | #define UPF_CONS_FLOW ((__force upf_t) (1 << 23)) |
201 | #define UPF_SHARE_IRQ ((__force upf_t) (1 << 24)) | 201 | #define UPF_SHARE_IRQ ((__force upf_t) (1 << 24)) |
202 | #define UPF_EXAR_EFR ((__force upf_t) (1 << 25)) | 202 | #define UPF_EXAR_EFR ((__force upf_t) (1 << 25)) |
203 | #define UPF_BUG_THRE ((__force upf_t) (1 << 26)) | 203 | #define UPF_BUG_THRE ((__force upf_t) (1 << 26)) |
204 | /* The exact UART type is known and should not be probed. */ | 204 | /* The exact UART type is known and should not be probed. */ |
205 | #define UPF_FIXED_TYPE ((__force upf_t) (1 << 27)) | 205 | #define UPF_FIXED_TYPE ((__force upf_t) (1 << 27)) |
206 | #define UPF_BOOT_AUTOCONF ((__force upf_t) (1 << 28)) | 206 | #define UPF_BOOT_AUTOCONF ((__force upf_t) (1 << 28)) |
207 | #define UPF_FIXED_PORT ((__force upf_t) (1 << 29)) | 207 | #define UPF_FIXED_PORT ((__force upf_t) (1 << 29)) |
208 | #define UPF_DEAD ((__force upf_t) (1 << 30)) | 208 | #define UPF_DEAD ((__force upf_t) (1 << 30)) |
209 | #define UPF_IOREMAP ((__force upf_t) (1 << 31)) | 209 | #define UPF_IOREMAP ((__force upf_t) (1 << 31)) |
210 | 210 | ||
211 | #define __UPF_CHANGE_MASK 0x17fff | 211 | #define __UPF_CHANGE_MASK 0x17fff |
212 | #define UPF_CHANGE_MASK ((__force upf_t) __UPF_CHANGE_MASK) | 212 | #define UPF_CHANGE_MASK ((__force upf_t) __UPF_CHANGE_MASK) |
213 | #define UPF_USR_MASK ((__force upf_t) (UPF_SPD_MASK|UPF_LOW_LATENCY)) | 213 | #define UPF_USR_MASK ((__force upf_t) (UPF_SPD_MASK|UPF_LOW_LATENCY)) |
214 | 214 | ||
215 | #if __UPF_CHANGE_MASK > ASYNC_FLAGS | 215 | #if __UPF_CHANGE_MASK > ASYNC_FLAGS |
216 | #error Change mask not equivalent to userspace-visible bit defines | 216 | #error Change mask not equivalent to userspace-visible bit defines |
217 | #endif | 217 | #endif |
218 | 218 | ||
219 | /* | 219 | /* |
220 | * Must hold termios_rwsem, port mutex and port lock to change; | 220 | * Must hold termios_rwsem, port mutex and port lock to change; |
221 | * can hold any one lock to read. | 221 | * can hold any one lock to read. |
222 | */ | 222 | */ |
223 | upstat_t status; | 223 | upstat_t status; |
224 | 224 | ||
225 | #define UPSTAT_CTS_ENABLE ((__force upstat_t) (1 << 0)) | 225 | #define UPSTAT_CTS_ENABLE ((__force upstat_t) (1 << 0)) |
226 | #define UPSTAT_DCD_ENABLE ((__force upstat_t) (1 << 1)) | 226 | #define UPSTAT_DCD_ENABLE ((__force upstat_t) (1 << 1)) |
227 | #define UPSTAT_AUTORTS ((__force upstat_t) (1 << 2)) | 227 | #define UPSTAT_AUTORTS ((__force upstat_t) (1 << 2)) |
228 | #define UPSTAT_AUTOCTS ((__force upstat_t) (1 << 3)) | 228 | #define UPSTAT_AUTOCTS ((__force upstat_t) (1 << 3)) |
229 | #define UPSTAT_AUTOXOFF ((__force upstat_t) (1 << 4)) | 229 | #define UPSTAT_AUTOXOFF ((__force upstat_t) (1 << 4)) |
230 | 230 | ||
231 | int hw_stopped; /* sw-assisted CTS flow state */ | 231 | int hw_stopped; /* sw-assisted CTS flow state */ |
232 | unsigned int mctrl; /* current modem ctrl settings */ | 232 | unsigned int mctrl; /* current modem ctrl settings */ |
233 | unsigned int timeout; /* character-based timeout */ | 233 | unsigned int timeout; /* character-based timeout */ |
234 | unsigned int type; /* port type */ | 234 | unsigned int type; /* port type */ |
235 | const struct uart_ops *ops; | 235 | const struct uart_ops *ops; |
236 | unsigned int custom_divisor; | 236 | unsigned int custom_divisor; |
237 | unsigned int line; /* port index */ | 237 | unsigned int line; /* port index */ |
238 | resource_size_t mapbase; /* for ioremap */ | 238 | resource_size_t mapbase; /* for ioremap */ |
239 | struct device *dev; /* parent device */ | 239 | struct device *dev; /* parent device */ |
240 | unsigned char hub6; /* this should be in the 8250 driver */ | 240 | unsigned char hub6; /* this should be in the 8250 driver */ |
241 | unsigned char suspended; | 241 | unsigned char suspended; |
242 | unsigned char irq_wake; | 242 | unsigned char irq_wake; |
243 | unsigned char unused[2]; | 243 | unsigned char unused[2]; |
244 | struct attribute_group *attr_group; /* port specific attributes */ | 244 | struct attribute_group *attr_group; /* port specific attributes */ |
245 | const struct attribute_group **tty_groups; /* all attributes (serial core use only) */ | 245 | const struct attribute_group **tty_groups; /* all attributes (serial core use only) */ |
246 | struct serial_rs485 rs485; | 246 | struct serial_rs485 rs485; |
247 | void *private_data; /* generic platform data pointer */ | 247 | void *private_data; /* generic platform data pointer */ |
248 | }; | 248 | }; |
249 | 249 | ||
250 | static inline int serial_port_in(struct uart_port *up, int offset) | 250 | static inline int serial_port_in(struct uart_port *up, int offset) |
251 | { | 251 | { |
252 | return up->serial_in(up, offset); | 252 | return up->serial_in(up, offset); |
253 | } | 253 | } |
254 | 254 | ||
255 | static inline void serial_port_out(struct uart_port *up, int offset, int value) | 255 | static inline void serial_port_out(struct uart_port *up, int offset, int value) |
256 | { | 256 | { |
257 | up->serial_out(up, offset, value); | 257 | up->serial_out(up, offset, value); |
258 | } | 258 | } |
259 | 259 | ||
260 | /** | 260 | /** |
261 | * enum uart_pm_state - power states for UARTs | 261 | * enum uart_pm_state - power states for UARTs |
262 | * @UART_PM_STATE_ON: UART is powered, up and operational | 262 | * @UART_PM_STATE_ON: UART is powered, up and operational |
263 | * @UART_PM_STATE_OFF: UART is powered off | 263 | * @UART_PM_STATE_OFF: UART is powered off |
264 | * @UART_PM_STATE_UNDEFINED: sentinel | 264 | * @UART_PM_STATE_UNDEFINED: sentinel |
265 | */ | 265 | */ |
266 | enum uart_pm_state { | 266 | enum uart_pm_state { |
267 | UART_PM_STATE_ON = 0, | 267 | UART_PM_STATE_ON = 0, |
268 | UART_PM_STATE_OFF = 3, /* number taken from ACPI */ | 268 | UART_PM_STATE_OFF = 3, /* number taken from ACPI */ |
269 | UART_PM_STATE_UNDEFINED, | 269 | UART_PM_STATE_UNDEFINED, |
270 | }; | 270 | }; |
271 | 271 | ||
272 | /* | 272 | /* |
273 | * This is the state information which is persistent across opens. | 273 | * This is the state information which is persistent across opens. |
274 | */ | 274 | */ |
275 | struct uart_state { | 275 | struct uart_state { |
276 | struct tty_port port; | 276 | struct tty_port port; |
277 | 277 | ||
278 | enum uart_pm_state pm_state; | 278 | enum uart_pm_state pm_state; |
279 | struct circ_buf xmit; | 279 | struct circ_buf xmit; |
280 | 280 | ||
281 | struct uart_port *uart_port; | 281 | struct uart_port *uart_port; |
282 | }; | 282 | }; |
283 | 283 | ||
284 | #define UART_XMIT_SIZE PAGE_SIZE | 284 | #define UART_XMIT_SIZE PAGE_SIZE |
285 | 285 | ||
286 | 286 | ||
287 | /* number of characters left in xmit buffer before we ask for more */ | 287 | /* number of characters left in xmit buffer before we ask for more */ |
288 | #define WAKEUP_CHARS 256 | 288 | #define WAKEUP_CHARS 256 |
289 | 289 | ||
290 | struct module; | 290 | struct module; |
291 | struct tty_driver; | 291 | struct tty_driver; |
292 | 292 | ||
293 | struct uart_driver { | 293 | struct uart_driver { |
294 | struct module *owner; | 294 | struct module *owner; |
295 | const char *driver_name; | 295 | const char *driver_name; |
296 | const char *dev_name; | 296 | const char *dev_name; |
297 | int major; | 297 | int major; |
298 | int minor; | 298 | int minor; |
299 | int nr; | 299 | int nr; |
300 | struct console *cons; | 300 | struct console *cons; |
301 | 301 | ||
302 | /* | 302 | /* |
303 | * these are private; the low level driver should not | 303 | * these are private; the low level driver should not |
304 | * touch these; they should be initialised to NULL | 304 | * touch these; they should be initialised to NULL |
305 | */ | 305 | */ |
306 | struct uart_state *state; | 306 | struct uart_state *state; |
307 | struct tty_driver *tty_driver; | 307 | struct tty_driver *tty_driver; |
308 | }; | 308 | }; |
309 | 309 | ||
310 | void uart_write_wakeup(struct uart_port *port); | 310 | void uart_write_wakeup(struct uart_port *port); |
311 | 311 | ||
312 | /* | 312 | /* |
313 | * Baud rate helpers. | 313 | * Baud rate helpers. |
314 | */ | 314 | */ |
315 | void uart_update_timeout(struct uart_port *port, unsigned int cflag, | 315 | void uart_update_timeout(struct uart_port *port, unsigned int cflag, |
316 | unsigned int baud); | 316 | unsigned int baud); |
317 | unsigned int uart_get_baud_rate(struct uart_port *port, struct ktermios *termios, | 317 | unsigned int uart_get_baud_rate(struct uart_port *port, struct ktermios *termios, |
318 | struct ktermios *old, unsigned int min, | 318 | struct ktermios *old, unsigned int min, |
319 | unsigned int max); | 319 | unsigned int max); |
320 | unsigned int uart_get_divisor(struct uart_port *port, unsigned int baud); | 320 | unsigned int uart_get_divisor(struct uart_port *port, unsigned int baud); |
321 | 321 | ||
322 | /* Base timer interval for polling */ | 322 | /* Base timer interval for polling */ |
323 | static inline int uart_poll_timeout(struct uart_port *port) | 323 | static inline int uart_poll_timeout(struct uart_port *port) |
324 | { | 324 | { |
325 | int timeout = port->timeout; | 325 | int timeout = port->timeout; |
326 | 326 | ||
327 | return timeout > 6 ? (timeout / 2 - 2) : 1; | 327 | return timeout > 6 ? (timeout / 2 - 2) : 1; |
328 | } | 328 | } |
329 | 329 | ||
330 | /* | 330 | /* |
331 | * Console helpers. | 331 | * Console helpers. |
332 | */ | 332 | */ |
333 | struct earlycon_device { | 333 | struct earlycon_device { |
334 | struct console *con; | 334 | struct console *con; |
335 | struct uart_port port; | 335 | struct uart_port port; |
336 | char options[16]; /* e.g., 115200n8 */ | 336 | char options[16]; /* e.g., 115200n8 */ |
337 | unsigned int baud; | 337 | unsigned int baud; |
338 | }; | 338 | }; |
339 | int setup_earlycon(char *buf, const char *match, | 339 | int setup_earlycon(char *buf, const char *match, |
340 | int (*setup)(struct earlycon_device *, const char *)); | 340 | int (*setup)(struct earlycon_device *, const char *)); |
341 | 341 | ||
342 | extern int of_setup_earlycon(unsigned long addr, | 342 | extern int of_setup_earlycon(unsigned long addr, |
343 | int (*setup)(struct earlycon_device *, const char *)); | 343 | int (*setup)(struct earlycon_device *, const char *)); |
344 | 344 | ||
345 | #define EARLYCON_DECLARE(name, func) \ | 345 | #define EARLYCON_DECLARE(name, func) \ |
346 | static int __init name ## _setup_earlycon(char *buf) \ | 346 | static int __init name ## _setup_earlycon(char *buf) \ |
347 | { \ | 347 | { \ |
348 | return setup_earlycon(buf, __stringify(name), func); \ | 348 | return setup_earlycon(buf, __stringify(name), func); \ |
349 | } \ | 349 | } \ |
350 | early_param("earlycon", name ## _setup_earlycon); | 350 | early_param("earlycon", name ## _setup_earlycon); |
351 | 351 | ||
352 | #define OF_EARLYCON_DECLARE(name, compat, fn) \ | 352 | #define OF_EARLYCON_DECLARE(name, compat, fn) \ |
353 | _OF_DECLARE(earlycon, name, compat, fn, void *) | 353 | _OF_DECLARE(earlycon, name, compat, fn, void *) |
354 | 354 | ||
355 | struct uart_port *uart_get_console(struct uart_port *ports, int nr, | 355 | struct uart_port *uart_get_console(struct uart_port *ports, int nr, |
356 | struct console *c); | 356 | struct console *c); |
357 | void uart_parse_options(char *options, int *baud, int *parity, int *bits, | 357 | void uart_parse_options(char *options, int *baud, int *parity, int *bits, |
358 | int *flow); | 358 | int *flow); |
359 | int uart_set_options(struct uart_port *port, struct console *co, int baud, | 359 | int uart_set_options(struct uart_port *port, struct console *co, int baud, |
360 | int parity, int bits, int flow); | 360 | int parity, int bits, int flow); |
361 | struct tty_driver *uart_console_device(struct console *co, int *index); | 361 | struct tty_driver *uart_console_device(struct console *co, int *index); |
362 | void uart_console_write(struct uart_port *port, const char *s, | 362 | void uart_console_write(struct uart_port *port, const char *s, |
363 | unsigned int count, | 363 | unsigned int count, |
364 | void (*putchar)(struct uart_port *, int)); | 364 | void (*putchar)(struct uart_port *, int)); |
365 | 365 | ||
366 | /* | 366 | /* |
367 | * Port/driver registration/removal | 367 | * Port/driver registration/removal |
368 | */ | 368 | */ |
369 | int uart_register_driver(struct uart_driver *uart); | 369 | int uart_register_driver(struct uart_driver *uart); |
370 | void uart_unregister_driver(struct uart_driver *uart); | 370 | void uart_unregister_driver(struct uart_driver *uart); |
371 | int uart_add_one_port(struct uart_driver *reg, struct uart_port *port); | 371 | int uart_add_one_port(struct uart_driver *reg, struct uart_port *port); |
372 | int uart_remove_one_port(struct uart_driver *reg, struct uart_port *port); | 372 | int uart_remove_one_port(struct uart_driver *reg, struct uart_port *port); |
373 | int uart_match_port(struct uart_port *port1, struct uart_port *port2); | 373 | int uart_match_port(struct uart_port *port1, struct uart_port *port2); |
374 | 374 | ||
375 | /* | 375 | /* |
376 | * Power Management | 376 | * Power Management |
377 | */ | 377 | */ |
378 | int uart_suspend_port(struct uart_driver *reg, struct uart_port *port); | 378 | int uart_suspend_port(struct uart_driver *reg, struct uart_port *port); |
379 | int uart_resume_port(struct uart_driver *reg, struct uart_port *port); | 379 | int uart_resume_port(struct uart_driver *reg, struct uart_port *port); |
380 | 380 | ||
381 | #define uart_circ_empty(circ) ((circ)->head == (circ)->tail) | 381 | #define uart_circ_empty(circ) ((circ)->head == (circ)->tail) |
382 | #define uart_circ_clear(circ) ((circ)->head = (circ)->tail = 0) | 382 | #define uart_circ_clear(circ) ((circ)->head = (circ)->tail = 0) |
383 | 383 | ||
384 | #define uart_circ_chars_pending(circ) \ | 384 | #define uart_circ_chars_pending(circ) \ |
385 | (CIRC_CNT((circ)->head, (circ)->tail, UART_XMIT_SIZE)) | 385 | (CIRC_CNT((circ)->head, (circ)->tail, UART_XMIT_SIZE)) |
386 | 386 | ||
387 | #define uart_circ_chars_free(circ) \ | 387 | #define uart_circ_chars_free(circ) \ |
388 | (CIRC_SPACE((circ)->head, (circ)->tail, UART_XMIT_SIZE)) | 388 | (CIRC_SPACE((circ)->head, (circ)->tail, UART_XMIT_SIZE)) |
389 | 389 | ||
390 | static inline int uart_tx_stopped(struct uart_port *port) | 390 | static inline int uart_tx_stopped(struct uart_port *port) |
391 | { | 391 | { |
392 | struct tty_struct *tty = port->state->port.tty; | 392 | struct tty_struct *tty = port->state->port.tty; |
393 | if (tty->stopped || port->hw_stopped) | 393 | if (tty->stopped || port->hw_stopped) |
394 | return 1; | 394 | return 1; |
395 | return 0; | 395 | return 0; |
396 | } | 396 | } |
397 | 397 | ||
398 | static inline bool uart_cts_enabled(struct uart_port *uport) | 398 | static inline bool uart_cts_enabled(struct uart_port *uport) |
399 | { | 399 | { |
400 | return !!(uport->status & UPSTAT_CTS_ENABLE); | 400 | return !!(uport->status & UPSTAT_CTS_ENABLE); |
401 | } | 401 | } |
402 | 402 | ||
403 | static inline bool uart_softcts_mode(struct uart_port *uport) | 403 | static inline bool uart_softcts_mode(struct uart_port *uport) |
404 | { | 404 | { |
405 | upstat_t mask = UPSTAT_CTS_ENABLE | UPSTAT_AUTOCTS; | 405 | upstat_t mask = UPSTAT_CTS_ENABLE | UPSTAT_AUTOCTS; |
406 | 406 | ||
407 | return ((uport->status & mask) == UPSTAT_CTS_ENABLE); | 407 | return ((uport->status & mask) == UPSTAT_CTS_ENABLE); |
408 | } | 408 | } |
409 | 409 | ||
410 | /* | 410 | /* |
411 | * The following are helper functions for the low level drivers. | 411 | * The following are helper functions for the low level drivers. |
412 | */ | 412 | */ |
413 | 413 | ||
414 | extern void uart_handle_dcd_change(struct uart_port *uport, | 414 | extern void uart_handle_dcd_change(struct uart_port *uport, |
415 | unsigned int status); | 415 | unsigned int status); |
416 | extern void uart_handle_cts_change(struct uart_port *uport, | 416 | extern void uart_handle_cts_change(struct uart_port *uport, |
417 | unsigned int status); | 417 | unsigned int status); |
418 | 418 | ||
419 | extern void uart_insert_char(struct uart_port *port, unsigned int status, | 419 | extern void uart_insert_char(struct uart_port *port, unsigned int status, |
420 | unsigned int overrun, unsigned int ch, unsigned int flag); | 420 | unsigned int overrun, unsigned int ch, unsigned int flag); |
421 | 421 | ||
422 | #ifdef SUPPORT_SYSRQ | 422 | #ifdef SUPPORT_SYSRQ |
423 | static inline int | 423 | static inline int |
424 | uart_handle_sysrq_char(struct uart_port *port, unsigned int ch) | 424 | uart_handle_sysrq_char(struct uart_port *port, unsigned int ch) |
425 | { | 425 | { |
426 | if (port->sysrq) { | 426 | if (port->sysrq) { |
427 | if (ch && time_before(jiffies, port->sysrq)) { | 427 | if (ch && time_before(jiffies, port->sysrq)) { |
428 | handle_sysrq(ch); | 428 | handle_sysrq(ch); |
429 | port->sysrq = 0; | 429 | port->sysrq = 0; |
430 | return 1; | 430 | return 1; |
431 | } | 431 | } |
432 | port->sysrq = 0; | 432 | port->sysrq = 0; |
433 | } | 433 | } |
434 | return 0; | 434 | return 0; |
435 | } | 435 | } |
436 | #else | 436 | #else |
437 | #define uart_handle_sysrq_char(port,ch) ({ (void)port; 0; }) | 437 | #define uart_handle_sysrq_char(port,ch) ({ (void)port; 0; }) |
438 | #endif | 438 | #endif |
439 | 439 | ||
440 | /* | 440 | /* |
441 | * We do the SysRQ and SAK checking like this... | 441 | * We do the SysRQ and SAK checking like this... |
442 | */ | 442 | */ |
443 | static inline int uart_handle_break(struct uart_port *port) | 443 | static inline int uart_handle_break(struct uart_port *port) |
444 | { | 444 | { |
445 | struct uart_state *state = port->state; | 445 | struct uart_state *state = port->state; |
446 | 446 | ||
447 | if (port->handle_break) | 447 | if (port->handle_break) |
448 | port->handle_break(port); | 448 | port->handle_break(port); |
449 | 449 | ||
450 | #ifdef SUPPORT_SYSRQ | 450 | #ifdef SUPPORT_SYSRQ |
451 | if (port->cons && port->cons->index == port->line) { | 451 | if (port->cons && port->cons->index == port->line) { |
452 | if (!port->sysrq) { | 452 | if (!port->sysrq) { |
453 | port->sysrq = jiffies + HZ*5; | 453 | port->sysrq = jiffies + HZ*5; |
454 | return 1; | 454 | return 1; |
455 | } | 455 | } |
456 | port->sysrq = 0; | 456 | port->sysrq = 0; |
457 | } | 457 | } |
458 | #endif | 458 | #endif |
459 | if (port->flags & UPF_SAK) | 459 | if (port->flags & UPF_SAK) |
460 | do_SAK(state->port.tty); | 460 | do_SAK(state->port.tty); |
461 | return 0; | 461 | return 0; |
462 | } | 462 | } |
463 | 463 | ||
464 | /* | 464 | /* |
465 | * UART_ENABLE_MS - determine if port should enable modem status irqs | 465 | * UART_ENABLE_MS - determine if port should enable modem status irqs |
466 | */ | 466 | */ |
467 | #define UART_ENABLE_MS(port,cflag) ((port)->flags & UPF_HARDPPS_CD || \ | 467 | #define UART_ENABLE_MS(port,cflag) ((port)->flags & UPF_HARDPPS_CD || \ |
468 | (cflag) & CRTSCTS || \ | 468 | (cflag) & CRTSCTS || \ |
469 | !((cflag) & CLOCAL)) | 469 | !((cflag) & CLOCAL)) |
470 | 470 | ||
471 | #endif /* LINUX_SERIAL_CORE_H */ | 471 | #endif /* LINUX_SERIAL_CORE_H */ |
472 | 472 |