blob: ccf99889ebd01f53d2aae02a7f31d28bf50735d7 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 * Driver core for serial ports
3 *
4 * Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
5 *
6 * Copyright 1999 ARM Limited
7 * Copyright (C) 2000-2001 Deep Blue Solutions Ltd.
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 */
Linus Torvalds1da177e2005-04-16 15:20:36 -070023#include <linux/module.h>
24#include <linux/tty.h>
Jiri Slaby027d7da2011-11-09 21:33:43 +010025#include <linux/tty_flip.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070026#include <linux/slab.h>
27#include <linux/init.h>
28#include <linux/console.h>
Grant Likelya208ffd2014-03-27 18:29:46 -070029#include <linux/of.h>
Alexey Dobriyand196a942009-03-31 15:19:21 -070030#include <linux/proc_fs.h>
31#include <linux/seq_file.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070032#include <linux/device.h>
33#include <linux/serial.h> /* for serial_state and serial_icounter_struct */
Alan Coxccce6de2009-09-19 13:13:30 -070034#include <linux/serial_core.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070035#include <linux/delay.h>
Arjan van de Venf392ecf2006-01-12 18:44:32 +000036#include <linux/mutex.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070037
38#include <asm/irq.h>
39#include <asm/uaccess.h>
40
Linus Torvalds1da177e2005-04-16 15:20:36 -070041/*
42 * This is used to lock changes in serial line configuration.
43 */
Arjan van de Venf392ecf2006-01-12 18:44:32 +000044static DEFINE_MUTEX(port_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -070045
Ingo Molnar13e83592006-07-03 00:25:03 -070046/*
47 * lockdep: port->lock is initialized in two places, but we
48 * want only one lock-class:
49 */
50static struct lock_class_key port_lock_key;
51
Linus Torvalds1da177e2005-04-16 15:20:36 -070052#define HIGH_BITS_OFFSET ((sizeof(long)-sizeof(int))*8)
53
Alan Cox19225132010-06-01 22:52:51 +020054static void uart_change_speed(struct tty_struct *tty, struct uart_state *state,
Alan Coxa46c9992008-02-08 04:18:53 -080055 struct ktermios *old_termios);
Jiri Slaby1f33a512011-07-14 14:35:10 +020056static void uart_wait_until_sent(struct tty_struct *tty, int timeout);
Linus Walleij6f538fe2012-12-07 11:36:08 +010057static void uart_change_pm(struct uart_state *state,
58 enum uart_pm_state pm_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -070059
Jiri Slabyb922e192011-11-09 21:33:51 +010060static void uart_port_shutdown(struct tty_port *port);
61
Peter Hurley299245a2014-09-10 15:06:24 -040062static int uart_dcd_enabled(struct uart_port *uport)
63{
Peter Hurleyd4260b52014-10-16 14:19:47 -040064 return !!(uport->status & UPSTAT_DCD_ENABLE);
Peter Hurley299245a2014-09-10 15:06:24 -040065}
66
Peter Hurley9ed19422016-04-09 18:56:34 -070067static inline struct uart_port *uart_port_ref(struct uart_state *state)
68{
69 if (atomic_add_unless(&state->refcount, 1, 0))
70 return state->uart_port;
71 return NULL;
72}
73
74static inline void uart_port_deref(struct uart_port *uport)
75{
76 if (uport && atomic_dec_and_test(&uport->state->refcount))
77 wake_up(&uport->state->remove_wait);
78}
79
80#define uart_port_lock(state, flags) \
81 ({ \
82 struct uart_port *__uport = uart_port_ref(state); \
83 if (__uport) \
84 spin_lock_irqsave(&__uport->lock, flags); \
85 __uport; \
86 })
87
88#define uart_port_unlock(uport, flags) \
89 ({ \
90 struct uart_port *__uport = uport; \
91 if (__uport) \
92 spin_unlock_irqrestore(&__uport->lock, flags); \
93 uart_port_deref(__uport); \
94 })
95
Peter Hurley4047b372016-04-09 18:56:33 -070096static inline struct uart_port *uart_port_check(struct uart_state *state)
97{
Peter Hurley7da4b8b2016-05-03 14:01:51 -070098 lockdep_assert_held(&state->port.mutex);
Peter Hurley4047b372016-04-09 18:56:33 -070099 return state->uart_port;
100}
101
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102/*
103 * This routine is used by the interrupt handler to schedule processing in
104 * the software interrupt portion of the driver.
105 */
106void uart_write_wakeup(struct uart_port *port)
107{
Alan Coxebd2c8f2009-09-19 13:13:28 -0700108 struct uart_state *state = port->state;
Pavel Machekd5f735e2006-03-07 21:55:20 -0800109 /*
110 * This means you called this function _after_ the port was
111 * closed. No cookie for you.
112 */
Alan Coxebd2c8f2009-09-19 13:13:28 -0700113 BUG_ON(!state);
Rob Herringd0f4bce2016-10-28 07:07:48 -0500114 tty_port_tty_wakeup(&state->port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700115}
116
117static void uart_stop(struct tty_struct *tty)
118{
119 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700120 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700121 unsigned long flags;
122
Peter Hurley9ed19422016-04-09 18:56:34 -0700123 port = uart_port_lock(state, flags);
124 if (port)
125 port->ops->stop_tx(port);
126 uart_port_unlock(port, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700127}
128
129static void __uart_start(struct tty_struct *tty)
130{
131 struct uart_state *state = tty->driver_data;
Alan Coxebd2c8f2009-09-19 13:13:28 -0700132 struct uart_port *port = state->uart_port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700133
San Mehat47f5e052009-07-29 20:21:28 -0700134 if (port && port->ops->wake_peer)
135 port->ops->wake_peer(port);
136
Peter Hurley9ed19422016-04-09 18:56:34 -0700137 if (port && !uart_tx_stopped(port))
Russell Kingb129a8c2005-08-31 10:12:14 +0100138 port->ops->start_tx(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700139}
140
141static void uart_start(struct tty_struct *tty)
142{
143 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700144 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700145 unsigned long flags;
146
Peter Hurley9ed19422016-04-09 18:56:34 -0700147 port = uart_port_lock(state, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700148 __uart_start(tty);
Peter Hurley9ed19422016-04-09 18:56:34 -0700149 uart_port_unlock(port, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700150}
151
Denys Vlasenkof4581ca2015-10-27 17:40:01 +0100152static void
Linus Torvalds1da177e2005-04-16 15:20:36 -0700153uart_update_mctrl(struct uart_port *port, unsigned int set, unsigned int clear)
154{
155 unsigned long flags;
156 unsigned int old;
157
158 spin_lock_irqsave(&port->lock, flags);
159 old = port->mctrl;
160 port->mctrl = (old & ~clear) | set;
161 if (old != port->mctrl)
162 port->ops->set_mctrl(port, port->mctrl);
163 spin_unlock_irqrestore(&port->lock, flags);
164}
165
Alan Coxa46c9992008-02-08 04:18:53 -0800166#define uart_set_mctrl(port, set) uart_update_mctrl(port, set, 0)
167#define uart_clear_mctrl(port, clear) uart_update_mctrl(port, 0, clear)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700168
169/*
170 * Startup the port. This will be called once per open. All calls
Alan Coxdf4f4dd2008-07-16 21:53:50 +0100171 * will be serialised by the per-port mutex.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700172 */
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100173static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
174 int init_hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700175{
Peter Hurley4047b372016-04-09 18:56:33 -0700176 struct uart_port *uport = uart_port_check(state);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700177 unsigned long page;
Tycho Andersene5147bb2018-07-06 10:24:57 -0600178 unsigned long flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700179 int retval = 0;
180
Alan Cox46d57a42009-09-19 13:13:29 -0700181 if (uport->type == PORT_UNKNOWN)
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100182 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700183
184 /*
Thomas Pfaff7deb39e2014-04-23 12:33:22 +0200185 * Make sure the device is in D0 state.
186 */
187 uart_change_pm(state, UART_PM_STATE_ON);
188
189 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700190 * Initialise and allocate the transmit and temporary
191 * buffer.
192 */
Tycho Andersene5147bb2018-07-06 10:24:57 -0600193 page = get_zeroed_page(GFP_KERNEL);
194 if (!page)
195 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700196
Tycho Andersene5147bb2018-07-06 10:24:57 -0600197 uart_port_lock(state, flags);
198 if (!state->xmit.buf) {
Alan Coxebd2c8f2009-09-19 13:13:28 -0700199 state->xmit.buf = (unsigned char *) page;
200 uart_circ_clear(&state->xmit);
Sergey Senozhatsky80c8e522018-12-13 13:58:39 +0900201 uart_port_unlock(uport, flags);
Tycho Andersene5147bb2018-07-06 10:24:57 -0600202 } else {
Sergey Senozhatsky80c8e522018-12-13 13:58:39 +0900203 uart_port_unlock(uport, flags);
204 /*
205 * Do not free() the page under the port lock, see
206 * uart_shutdown().
207 */
Tycho Andersene5147bb2018-07-06 10:24:57 -0600208 free_page(page);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700209 }
210
Alan Cox46d57a42009-09-19 13:13:29 -0700211 retval = uport->ops->startup(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700212 if (retval == 0) {
Jiri Slabyc7d7abf2011-03-30 00:10:55 +0200213 if (uart_console(uport) && uport->cons->cflag) {
Alan Coxadc8d742012-07-14 15:31:47 +0100214 tty->termios.c_cflag = uport->cons->cflag;
Jiri Slabyc7d7abf2011-03-30 00:10:55 +0200215 uport->cons->cflag = 0;
216 }
217 /*
218 * Initialise the hardware port settings.
219 */
220 uart_change_speed(tty, state, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700221
Peter Hurley9db276f2016-01-10 20:36:15 -0800222 /*
223 * Setup the RTS and DTR signals once the
224 * port is open and ready to respond.
225 */
226 if (init_hw && C_BAUD(tty))
227 uart_set_mctrl(uport, TIOCM_RTS | TIOCM_DTR);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700228 }
229
Jiri Slaby00551972011-08-17 13:48:15 +0200230 /*
231 * This is to allow setserial on this port. People may want to set
232 * port/irq/type and then reconfigure the port properly if it failed
233 * now.
234 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700235 if (retval && capable(CAP_SYS_ADMIN))
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100236 return 1;
237
238 return retval;
239}
240
241static int uart_startup(struct tty_struct *tty, struct uart_state *state,
242 int init_hw)
243{
244 struct tty_port *port = &state->port;
245 int retval;
246
Peter Hurleyd41861c2016-04-09 17:53:25 -0700247 if (tty_port_initialized(port))
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100248 return 0;
249
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100250 retval = uart_port_startup(tty, state, init_hw);
Rob Herringb3b57642016-08-22 17:39:09 -0500251 if (retval)
252 set_bit(TTY_IO_ERROR, &tty->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700253
254 return retval;
255}
256
257/*
258 * This routine will shutdown a serial port; interrupts are disabled, and
259 * DTR is dropped if the hangup on close termio flag is on. Calls to
260 * uart_shutdown are serialised by the per-port semaphore.
Peter Hurleyaf224ca2016-04-09 18:56:35 -0700261 *
262 * uport == NULL if uart_port has already been removed
Linus Torvalds1da177e2005-04-16 15:20:36 -0700263 */
Alan Cox19225132010-06-01 22:52:51 +0200264static void uart_shutdown(struct tty_struct *tty, struct uart_state *state)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700265{
Peter Hurley4047b372016-04-09 18:56:33 -0700266 struct uart_port *uport = uart_port_check(state);
Alan Coxbdc04e32009-09-19 13:13:31 -0700267 struct tty_port *port = &state->port;
Tycho Andersene5147bb2018-07-06 10:24:57 -0600268 unsigned long flags = 0;
Sergey Senozhatsky80c8e522018-12-13 13:58:39 +0900269 char *xmit_buf = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700270
Russell Kingee31b332005-11-13 15:28:51 +0000271 /*
272 * Set the TTY IO error marker
273 */
Alan Coxf7519282009-01-02 13:49:21 +0000274 if (tty)
275 set_bit(TTY_IO_ERROR, &tty->flags);
Russell Kingee31b332005-11-13 15:28:51 +0000276
Peter Hurleyd41861c2016-04-09 17:53:25 -0700277 if (tty_port_initialized(port)) {
278 tty_port_set_initialized(port, 0);
279
Russell Kingee31b332005-11-13 15:28:51 +0000280 /*
281 * Turn off DTR and RTS early.
282 */
Peter Hurleyaf224ca2016-04-09 18:56:35 -0700283 if (uport && uart_console(uport) && tty)
Peter Hurleyae84db92014-07-09 09:21:14 -0400284 uport->cons->cflag = tty->termios.c_cflag;
285
Peter Hurley9db276f2016-01-10 20:36:15 -0800286 if (!tty || C_HUPCL(tty))
Alan Coxccce6de2009-09-19 13:13:30 -0700287 uart_clear_mctrl(uport, TIOCM_DTR | TIOCM_RTS);
Russell Kingee31b332005-11-13 15:28:51 +0000288
Jiri Slabyb922e192011-11-09 21:33:51 +0100289 uart_port_shutdown(port);
Russell Kingee31b332005-11-13 15:28:51 +0000290 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700291
292 /*
Doug Andersond208a3b2011-10-19 11:52:01 -0700293 * It's possible for shutdown to be called after suspend if we get
294 * a DCD drop (hangup) at just the right time. Clear suspended bit so
295 * we don't try to resume a port that has been shutdown.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700296 */
Peter Hurley80f02d52016-04-09 17:53:24 -0700297 tty_port_set_suspended(port, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700298
299 /*
Sergey Senozhatsky80c8e522018-12-13 13:58:39 +0900300 * Do not free() the transmit buffer page under the port lock since
301 * this can create various circular locking scenarios. For instance,
302 * console driver may need to allocate/free a debug object, which
303 * can endup in printk() recursion.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700304 */
Tycho Andersene5147bb2018-07-06 10:24:57 -0600305 uart_port_lock(state, flags);
Sergey Senozhatsky80c8e522018-12-13 13:58:39 +0900306 xmit_buf = state->xmit.buf;
307 state->xmit.buf = NULL;
Tycho Andersene5147bb2018-07-06 10:24:57 -0600308 uart_port_unlock(uport, flags);
Sergey Senozhatsky80c8e522018-12-13 13:58:39 +0900309
310 if (xmit_buf)
311 free_page((unsigned long)xmit_buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700312}
313
314/**
315 * uart_update_timeout - update per-port FIFO timeout.
316 * @port: uart_port structure describing the port
317 * @cflag: termios cflag value
318 * @baud: speed of the port
319 *
320 * Set the port FIFO timeout value. The @cflag value should
321 * reflect the actual hardware settings.
322 */
323void
324uart_update_timeout(struct uart_port *port, unsigned int cflag,
325 unsigned int baud)
326{
327 unsigned int bits;
328
329 /* byte size and parity */
330 switch (cflag & CSIZE) {
331 case CS5:
332 bits = 7;
333 break;
334 case CS6:
335 bits = 8;
336 break;
337 case CS7:
338 bits = 9;
339 break;
340 default:
341 bits = 10;
Alan Coxa46c9992008-02-08 04:18:53 -0800342 break; /* CS8 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700343 }
344
345 if (cflag & CSTOPB)
346 bits++;
347 if (cflag & PARENB)
348 bits++;
349
350 /*
351 * The total number of bits to be transmitted in the fifo.
352 */
353 bits = bits * port->fifosize;
354
355 /*
356 * Figure the timeout to send the above number of bits.
357 * Add .02 seconds of slop
358 */
359 port->timeout = (HZ * bits) / baud + HZ/50;
360}
361
362EXPORT_SYMBOL(uart_update_timeout);
363
364/**
365 * uart_get_baud_rate - return baud rate for a particular port
366 * @port: uart_port structure describing the port in question.
367 * @termios: desired termios settings.
368 * @old: old termios (or NULL)
369 * @min: minimum acceptable baud rate
370 * @max: maximum acceptable baud rate
371 *
372 * Decode the termios structure into a numeric baud rate,
373 * taking account of the magic 38400 baud rate (with spd_*
374 * flags), and mapping the %B0 rate to 9600 baud.
375 *
376 * If the new baud rate is invalid, try the old termios setting.
377 * If it's still invalid, we try 9600 baud.
378 *
379 * Update the @termios structure to reflect the baud rate
Alan Coxeb424fd2008-04-28 02:14:07 -0700380 * we're actually going to be using. Don't do this for the case
381 * where B0 is requested ("hang up").
Linus Torvalds1da177e2005-04-16 15:20:36 -0700382 */
383unsigned int
Alan Cox606d0992006-12-08 02:38:45 -0800384uart_get_baud_rate(struct uart_port *port, struct ktermios *termios,
385 struct ktermios *old, unsigned int min, unsigned int max)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700386{
Joakim Nordellf10a2232015-06-08 14:56:51 +0200387 unsigned int try;
388 unsigned int baud;
389 unsigned int altbaud;
Alan Coxeb424fd2008-04-28 02:14:07 -0700390 int hung_up = 0;
Russell King0077d452006-01-21 23:03:28 +0000391 upf_t flags = port->flags & UPF_SPD_MASK;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700392
Joakim Nordellf10a2232015-06-08 14:56:51 +0200393 switch (flags) {
394 case UPF_SPD_HI:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700395 altbaud = 57600;
Joakim Nordellf10a2232015-06-08 14:56:51 +0200396 break;
397 case UPF_SPD_VHI:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700398 altbaud = 115200;
Joakim Nordellf10a2232015-06-08 14:56:51 +0200399 break;
400 case UPF_SPD_SHI:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700401 altbaud = 230400;
Joakim Nordellf10a2232015-06-08 14:56:51 +0200402 break;
403 case UPF_SPD_WARP:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700404 altbaud = 460800;
Joakim Nordellf10a2232015-06-08 14:56:51 +0200405 break;
406 default:
407 altbaud = 38400;
408 break;
409 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700410
411 for (try = 0; try < 2; try++) {
412 baud = tty_termios_baud_rate(termios);
413
414 /*
415 * The spd_hi, spd_vhi, spd_shi, spd_warp kludge...
416 * Die! Die! Die!
417 */
Peter Hurley547039e2014-10-16 13:46:38 -0400418 if (try == 0 && baud == 38400)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700419 baud = altbaud;
420
421 /*
422 * Special case: B0 rate.
423 */
Alan Coxeb424fd2008-04-28 02:14:07 -0700424 if (baud == 0) {
425 hung_up = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700426 baud = 9600;
Alan Coxeb424fd2008-04-28 02:14:07 -0700427 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700428
429 if (baud >= min && baud <= max)
430 return baud;
431
432 /*
433 * Oops, the quotient was zero. Try again with
434 * the old baud rate if possible.
435 */
436 termios->c_cflag &= ~CBAUD;
437 if (old) {
Alan Cox6d4d67b2008-02-04 22:27:53 -0800438 baud = tty_termios_baud_rate(old);
Alan Coxeb424fd2008-04-28 02:14:07 -0700439 if (!hung_up)
440 tty_termios_encode_baud_rate(termios,
441 baud, baud);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700442 old = NULL;
443 continue;
444 }
445
446 /*
Alan Cox16ae2a82010-01-04 16:26:21 +0000447 * As a last resort, if the range cannot be met then clip to
448 * the nearest chip supported rate.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700449 */
Alan Cox16ae2a82010-01-04 16:26:21 +0000450 if (!hung_up) {
451 if (baud <= min)
452 tty_termios_encode_baud_rate(termios,
453 min + 1, min + 1);
454 else
455 tty_termios_encode_baud_rate(termios,
456 max - 1, max - 1);
457 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700458 }
Alan Cox16ae2a82010-01-04 16:26:21 +0000459 /* Should never happen */
460 WARN_ON(1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700461 return 0;
462}
463
464EXPORT_SYMBOL(uart_get_baud_rate);
465
466/**
467 * uart_get_divisor - return uart clock divisor
468 * @port: uart_port structure describing the port.
469 * @baud: desired baud rate
470 *
471 * Calculate the uart clock divisor for the port.
472 */
473unsigned int
474uart_get_divisor(struct uart_port *port, unsigned int baud)
475{
476 unsigned int quot;
477
478 /*
479 * Old custom speed handling.
480 */
481 if (baud == 38400 && (port->flags & UPF_SPD_MASK) == UPF_SPD_CUST)
482 quot = port->custom_divisor;
483 else
Uwe Kleine-König97d24632011-12-20 11:47:44 +0100484 quot = DIV_ROUND_CLOSEST(port->uartclk, 16 * baud);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700485
486 return quot;
487}
488
489EXPORT_SYMBOL(uart_get_divisor);
490
Peter Hurley7c8ab962014-10-16 16:54:20 -0400491/* Caller holds port mutex */
Alan Cox19225132010-06-01 22:52:51 +0200492static void uart_change_speed(struct tty_struct *tty, struct uart_state *state,
493 struct ktermios *old_termios)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700494{
Peter Hurley4047b372016-04-09 18:56:33 -0700495 struct uart_port *uport = uart_port_check(state);
Alan Cox606d0992006-12-08 02:38:45 -0800496 struct ktermios *termios;
Peter Hurley391f93f2015-01-25 14:44:51 -0500497 int hw_stopped;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700498
499 /*
500 * If we have no tty, termios, or the port does not exist,
501 * then we can't set the parameters for this port.
502 */
Alan Coxadc8d742012-07-14 15:31:47 +0100503 if (!tty || uport->type == PORT_UNKNOWN)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700504 return;
505
Alan Coxadc8d742012-07-14 15:31:47 +0100506 termios = &tty->termios;
Peter Hurleyc18b55f2014-06-16 09:17:09 -0400507 uport->ops->set_termios(uport, termios, old_termios);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700508
509 /*
Peter Hurley299245a2014-09-10 15:06:24 -0400510 * Set modem status enables based on termios cflag
Linus Torvalds1da177e2005-04-16 15:20:36 -0700511 */
Peter Hurley299245a2014-09-10 15:06:24 -0400512 spin_lock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700513 if (termios->c_cflag & CRTSCTS)
Peter Hurley299245a2014-09-10 15:06:24 -0400514 uport->status |= UPSTAT_CTS_ENABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700515 else
Peter Hurley299245a2014-09-10 15:06:24 -0400516 uport->status &= ~UPSTAT_CTS_ENABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700517
518 if (termios->c_cflag & CLOCAL)
Peter Hurley299245a2014-09-10 15:06:24 -0400519 uport->status &= ~UPSTAT_DCD_ENABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700520 else
Peter Hurley299245a2014-09-10 15:06:24 -0400521 uport->status |= UPSTAT_DCD_ENABLE;
Peter Hurley391f93f2015-01-25 14:44:51 -0500522
523 /* reset sw-assisted CTS flow control based on (possibly) new mode */
524 hw_stopped = uport->hw_stopped;
525 uport->hw_stopped = uart_softcts_mode(uport) &&
526 !(uport->ops->get_mctrl(uport) & TIOCM_CTS);
527 if (uport->hw_stopped) {
528 if (!hw_stopped)
529 uport->ops->stop_tx(uport);
530 } else {
531 if (hw_stopped)
532 __uart_start(tty);
533 }
Peter Hurley299245a2014-09-10 15:06:24 -0400534 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700535}
536
Peter Hurleyf5291ec2016-01-10 20:23:55 -0800537static int uart_put_char(struct tty_struct *tty, unsigned char c)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700538{
Peter Hurleyf5291ec2016-01-10 20:23:55 -0800539 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700540 struct uart_port *port;
Peter Hurleyf5291ec2016-01-10 20:23:55 -0800541 struct circ_buf *circ;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700542 unsigned long flags;
Alan Cox23d22ce2008-04-30 00:54:11 -0700543 int ret = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700544
Peter Hurleyf5291ec2016-01-10 20:23:55 -0800545 circ = &state->xmit;
Peter Hurley9ed19422016-04-09 18:56:34 -0700546 port = uart_port_lock(state, flags);
Samir Virmanib7bd4a22019-01-16 10:28:07 -0800547 if (!circ->buf) {
548 uart_port_unlock(port, flags);
549 return 0;
550 }
551
Peter Hurley9ed19422016-04-09 18:56:34 -0700552 if (port && uart_circ_chars_free(circ) != 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700553 circ->buf[circ->head] = c;
554 circ->head = (circ->head + 1) & (UART_XMIT_SIZE - 1);
Alan Cox23d22ce2008-04-30 00:54:11 -0700555 ret = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700556 }
Peter Hurley9ed19422016-04-09 18:56:34 -0700557 uart_port_unlock(port, flags);
Alan Cox23d22ce2008-04-30 00:54:11 -0700558 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700559}
560
Linus Torvalds1da177e2005-04-16 15:20:36 -0700561static void uart_flush_chars(struct tty_struct *tty)
562{
563 uart_start(tty);
564}
565
Alan Cox19225132010-06-01 22:52:51 +0200566static int uart_write(struct tty_struct *tty,
567 const unsigned char *buf, int count)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700568{
569 struct uart_state *state = tty->driver_data;
Pavel Machekd5f735e2006-03-07 21:55:20 -0800570 struct uart_port *port;
571 struct circ_buf *circ;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700572 unsigned long flags;
573 int c, ret = 0;
574
Pavel Machekd5f735e2006-03-07 21:55:20 -0800575 /*
576 * This means you called this function _after_ the port was
577 * closed. No cookie for you.
578 */
Alan Coxf7519282009-01-02 13:49:21 +0000579 if (!state) {
Pavel Machekd5f735e2006-03-07 21:55:20 -0800580 WARN_ON(1);
581 return -EL3HLT;
582 }
583
Peter Hurley9ed19422016-04-09 18:56:34 -0700584 port = uart_port_lock(state, flags);
Samir Virmanib7bd4a22019-01-16 10:28:07 -0800585 circ = &state->xmit;
586 if (!circ->buf) {
587 uart_port_unlock(port, flags);
588 return 0;
589 }
590
Peter Hurley9ed19422016-04-09 18:56:34 -0700591 while (port) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700592 c = CIRC_SPACE_TO_END(circ->head, circ->tail, UART_XMIT_SIZE);
593 if (count < c)
594 c = count;
595 if (c <= 0)
596 break;
597 memcpy(circ->buf + circ->head, buf, c);
598 circ->head = (circ->head + c) & (UART_XMIT_SIZE - 1);
599 buf += c;
600 count -= c;
601 ret += c;
602 }
Peter Hurley64dbee32014-10-16 16:54:26 -0400603
604 __uart_start(tty);
Peter Hurley9ed19422016-04-09 18:56:34 -0700605 uart_port_unlock(port, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700606 return ret;
607}
608
609static int uart_write_room(struct tty_struct *tty)
610{
611 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700612 struct uart_port *port;
Alan Coxf34d7a52008-04-30 00:54:13 -0700613 unsigned long flags;
614 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700615
Peter Hurley9ed19422016-04-09 18:56:34 -0700616 port = uart_port_lock(state, flags);
Alan Coxebd2c8f2009-09-19 13:13:28 -0700617 ret = uart_circ_chars_free(&state->xmit);
Peter Hurley9ed19422016-04-09 18:56:34 -0700618 uart_port_unlock(port, flags);
Alan Coxf34d7a52008-04-30 00:54:13 -0700619 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700620}
621
622static int uart_chars_in_buffer(struct tty_struct *tty)
623{
624 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700625 struct uart_port *port;
Alan Coxf34d7a52008-04-30 00:54:13 -0700626 unsigned long flags;
627 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700628
Peter Hurley9ed19422016-04-09 18:56:34 -0700629 port = uart_port_lock(state, flags);
Alan Coxebd2c8f2009-09-19 13:13:28 -0700630 ret = uart_circ_chars_pending(&state->xmit);
Peter Hurley9ed19422016-04-09 18:56:34 -0700631 uart_port_unlock(port, flags);
Alan Coxf34d7a52008-04-30 00:54:13 -0700632 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700633}
634
635static void uart_flush_buffer(struct tty_struct *tty)
636{
637 struct uart_state *state = tty->driver_data;
Tetsuo Handa55d7b682008-05-06 20:42:27 -0700638 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700639 unsigned long flags;
640
Pavel Machekd5f735e2006-03-07 21:55:20 -0800641 /*
642 * This means you called this function _after_ the port was
643 * closed. No cookie for you.
644 */
Alan Coxf7519282009-01-02 13:49:21 +0000645 if (!state) {
Pavel Machekd5f735e2006-03-07 21:55:20 -0800646 WARN_ON(1);
647 return;
648 }
649
Jiri Slabyeb3a1e12007-05-06 14:48:52 -0700650 pr_debug("uart_flush_buffer(%d) called\n", tty->index);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700651
Peter Hurley9ed19422016-04-09 18:56:34 -0700652 port = uart_port_lock(state, flags);
653 if (!port)
654 return;
Alan Coxebd2c8f2009-09-19 13:13:28 -0700655 uart_circ_clear(&state->xmit);
Haavard Skinnemoen6bb0e3a2008-07-16 21:52:36 +0100656 if (port->ops->flush_buffer)
657 port->ops->flush_buffer(port);
Peter Hurley9ed19422016-04-09 18:56:34 -0700658 uart_port_unlock(port, flags);
Rob Herringd0f4bce2016-10-28 07:07:48 -0500659 tty_port_tty_wakeup(&state->port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700660}
661
662/*
663 * This function is used to send a high-priority XON/XOFF character to
664 * the device
665 */
666static void uart_send_xchar(struct tty_struct *tty, char ch)
667{
668 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700669 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700670 unsigned long flags;
671
Peter Hurley9ed19422016-04-09 18:56:34 -0700672 port = uart_port_ref(state);
673 if (!port)
674 return;
675
Linus Torvalds1da177e2005-04-16 15:20:36 -0700676 if (port->ops->send_xchar)
677 port->ops->send_xchar(port, ch);
678 else {
Peter Hurleyc235ccc2014-09-02 17:39:13 -0400679 spin_lock_irqsave(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700680 port->x_char = ch;
Peter Hurleyc235ccc2014-09-02 17:39:13 -0400681 if (ch)
Russell Kingb129a8c2005-08-31 10:12:14 +0100682 port->ops->start_tx(port);
Peter Hurleyc235ccc2014-09-02 17:39:13 -0400683 spin_unlock_irqrestore(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700684 }
Peter Hurley9ed19422016-04-09 18:56:34 -0700685 uart_port_deref(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700686}
687
688static void uart_throttle(struct tty_struct *tty)
689{
690 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700691 struct uart_port *port;
Peter Hurley391f93f2015-01-25 14:44:51 -0500692 upstat_t mask = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700693
Peter Hurley9ed19422016-04-09 18:56:34 -0700694 port = uart_port_ref(state);
695 if (!port)
696 return;
697
Linus Torvalds1da177e2005-04-16 15:20:36 -0700698 if (I_IXOFF(tty))
Peter Hurley391f93f2015-01-25 14:44:51 -0500699 mask |= UPSTAT_AUTOXOFF;
Peter Hurley9db276f2016-01-10 20:36:15 -0800700 if (C_CRTSCTS(tty))
Peter Hurley391f93f2015-01-25 14:44:51 -0500701 mask |= UPSTAT_AUTORTS;
Russell King9aba8d5b2012-04-17 17:23:14 +0100702
Peter Hurley391f93f2015-01-25 14:44:51 -0500703 if (port->status & mask) {
Russell King9aba8d5b2012-04-17 17:23:14 +0100704 port->ops->throttle(port);
Peter Hurley391f93f2015-01-25 14:44:51 -0500705 mask &= ~port->status;
Russell King9aba8d5b2012-04-17 17:23:14 +0100706 }
707
Peter Hurley391f93f2015-01-25 14:44:51 -0500708 if (mask & UPSTAT_AUTORTS)
Russell King9aba8d5b2012-04-17 17:23:14 +0100709 uart_clear_mctrl(port, TIOCM_RTS);
Peter Hurleyb4749b92016-01-10 20:24:02 -0800710
711 if (mask & UPSTAT_AUTOXOFF)
712 uart_send_xchar(tty, STOP_CHAR(tty));
Peter Hurley9ed19422016-04-09 18:56:34 -0700713
714 uart_port_deref(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700715}
716
717static void uart_unthrottle(struct tty_struct *tty)
718{
719 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700720 struct uart_port *port;
Peter Hurley391f93f2015-01-25 14:44:51 -0500721 upstat_t mask = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700722
Greg Kroah-Hartmand13ed612019-01-31 17:43:16 +0800723 if (!state)
724 return;
725
Peter Hurley9ed19422016-04-09 18:56:34 -0700726 port = uart_port_ref(state);
727 if (!port)
728 return;
729
Russell King9aba8d5b2012-04-17 17:23:14 +0100730 if (I_IXOFF(tty))
Peter Hurley391f93f2015-01-25 14:44:51 -0500731 mask |= UPSTAT_AUTOXOFF;
Peter Hurley9db276f2016-01-10 20:36:15 -0800732 if (C_CRTSCTS(tty))
Peter Hurley391f93f2015-01-25 14:44:51 -0500733 mask |= UPSTAT_AUTORTS;
Russell King9aba8d5b2012-04-17 17:23:14 +0100734
Peter Hurley391f93f2015-01-25 14:44:51 -0500735 if (port->status & mask) {
Russell King9aba8d5b2012-04-17 17:23:14 +0100736 port->ops->unthrottle(port);
Peter Hurley391f93f2015-01-25 14:44:51 -0500737 mask &= ~port->status;
Russell King9aba8d5b2012-04-17 17:23:14 +0100738 }
739
Peter Hurley391f93f2015-01-25 14:44:51 -0500740 if (mask & UPSTAT_AUTORTS)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700741 uart_set_mctrl(port, TIOCM_RTS);
Peter Hurleyb4749b92016-01-10 20:24:02 -0800742
743 if (mask & UPSTAT_AUTOXOFF)
744 uart_send_xchar(tty, START_CHAR(tty));
Peter Hurley9ed19422016-04-09 18:56:34 -0700745
746 uart_port_deref(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700747}
748
Peter Hurley4047b372016-04-09 18:56:33 -0700749static int uart_get_info(struct tty_port *port, struct serial_struct *retinfo)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700750{
Alan Cox9f109692012-10-29 15:20:25 +0000751 struct uart_state *state = container_of(port, struct uart_state, port);
Peter Hurley4047b372016-04-09 18:56:33 -0700752 struct uart_port *uport;
753 int ret = -ENODEV;
Alan Cox7ba2e762012-09-04 16:34:45 +0100754
Fengguang Wu37cd0c92012-09-06 10:27:51 +0800755 memset(retinfo, 0, sizeof(*retinfo));
Alan Cox7ba2e762012-09-04 16:34:45 +0100756
Peter Hurley3abe8c72016-01-10 20:23:56 -0800757 /*
758 * Ensure the state we copy is consistent and no hardware changes
759 * occur as we go
760 */
761 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -0700762 uport = uart_port_check(state);
763 if (!uport)
764 goto out;
765
Alan Cox7ba2e762012-09-04 16:34:45 +0100766 retinfo->type = uport->type;
767 retinfo->line = uport->line;
768 retinfo->port = uport->iobase;
769 if (HIGH_BITS_OFFSET)
770 retinfo->port_high = (long) uport->iobase >> HIGH_BITS_OFFSET;
771 retinfo->irq = uport->irq;
772 retinfo->flags = uport->flags;
773 retinfo->xmit_fifo_size = uport->fifosize;
774 retinfo->baud_base = uport->uartclk / 16;
775 retinfo->close_delay = jiffies_to_msecs(port->close_delay) / 10;
776 retinfo->closing_wait = port->closing_wait == ASYNC_CLOSING_WAIT_NONE ?
777 ASYNC_CLOSING_WAIT_NONE :
778 jiffies_to_msecs(port->closing_wait) / 10;
779 retinfo->custom_divisor = uport->custom_divisor;
780 retinfo->hub6 = uport->hub6;
781 retinfo->io_type = uport->iotype;
782 retinfo->iomem_reg_shift = uport->regshift;
783 retinfo->iomem_base = (void *)(unsigned long)uport->mapbase;
Peter Hurley4047b372016-04-09 18:56:33 -0700784
785 ret = 0;
786out:
Alan Coxa2bceae2009-09-19 13:13:31 -0700787 mutex_unlock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -0700788 return ret;
Alan Cox9f109692012-10-29 15:20:25 +0000789}
790
791static int uart_get_info_user(struct tty_port *port,
792 struct serial_struct __user *retinfo)
793{
794 struct serial_struct tmp;
Peter Hurley3abe8c72016-01-10 20:23:56 -0800795
Peter Hurley4047b372016-04-09 18:56:33 -0700796 if (uart_get_info(port, &tmp) < 0)
797 return -EIO;
Alan Coxf34d7a52008-04-30 00:54:13 -0700798
Linus Torvalds1da177e2005-04-16 15:20:36 -0700799 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
800 return -EFAULT;
801 return 0;
802}
803
Alan Cox7ba2e762012-09-04 16:34:45 +0100804static int uart_set_info(struct tty_struct *tty, struct tty_port *port,
805 struct uart_state *state,
806 struct serial_struct *new_info)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700807{
Peter Hurley4047b372016-04-09 18:56:33 -0700808 struct uart_port *uport = uart_port_check(state);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700809 unsigned long new_port;
Russell King0077d452006-01-21 23:03:28 +0000810 unsigned int change_irq, change_port, closing_wait;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700811 unsigned int old_custom_divisor, close_delay;
Russell King0077d452006-01-21 23:03:28 +0000812 upf_t old_flags, new_flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700813 int retval = 0;
814
Peter Hurley4047b372016-04-09 18:56:33 -0700815 if (!uport)
816 return -EIO;
817
Alan Cox7ba2e762012-09-04 16:34:45 +0100818 new_port = new_info->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700819 if (HIGH_BITS_OFFSET)
Alan Cox7ba2e762012-09-04 16:34:45 +0100820 new_port += (unsigned long) new_info->port_high << HIGH_BITS_OFFSET;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700821
Alan Cox7ba2e762012-09-04 16:34:45 +0100822 new_info->irq = irq_canonicalize(new_info->irq);
823 close_delay = msecs_to_jiffies(new_info->close_delay * 10);
824 closing_wait = new_info->closing_wait == ASYNC_CLOSING_WAIT_NONE ?
Jiri Slaby4cb0fbf2011-11-09 21:33:45 +0100825 ASYNC_CLOSING_WAIT_NONE :
Alan Cox7ba2e762012-09-04 16:34:45 +0100826 msecs_to_jiffies(new_info->closing_wait * 10);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700827
Linus Torvalds1da177e2005-04-16 15:20:36 -0700828
Alan Cox46d57a42009-09-19 13:13:29 -0700829 change_irq = !(uport->flags & UPF_FIXED_PORT)
Alan Cox7ba2e762012-09-04 16:34:45 +0100830 && new_info->irq != uport->irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700831
832 /*
833 * Since changing the 'type' of the port changes its resource
834 * allocations, we should treat type changes the same as
835 * IO port changes.
836 */
Alan Cox46d57a42009-09-19 13:13:29 -0700837 change_port = !(uport->flags & UPF_FIXED_PORT)
838 && (new_port != uport->iobase ||
Alan Cox7ba2e762012-09-04 16:34:45 +0100839 (unsigned long)new_info->iomem_base != uport->mapbase ||
840 new_info->hub6 != uport->hub6 ||
841 new_info->io_type != uport->iotype ||
842 new_info->iomem_reg_shift != uport->regshift ||
843 new_info->type != uport->type);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700844
Alan Cox46d57a42009-09-19 13:13:29 -0700845 old_flags = uport->flags;
Alan Cox7ba2e762012-09-04 16:34:45 +0100846 new_flags = new_info->flags;
Alan Cox46d57a42009-09-19 13:13:29 -0700847 old_custom_divisor = uport->custom_divisor;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700848
849 if (!capable(CAP_SYS_ADMIN)) {
850 retval = -EPERM;
851 if (change_irq || change_port ||
Alan Cox7ba2e762012-09-04 16:34:45 +0100852 (new_info->baud_base != uport->uartclk / 16) ||
Alan Cox46d57a42009-09-19 13:13:29 -0700853 (close_delay != port->close_delay) ||
854 (closing_wait != port->closing_wait) ||
Alan Cox7ba2e762012-09-04 16:34:45 +0100855 (new_info->xmit_fifo_size &&
856 new_info->xmit_fifo_size != uport->fifosize) ||
Russell King0077d452006-01-21 23:03:28 +0000857 (((new_flags ^ old_flags) & ~UPF_USR_MASK) != 0))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700858 goto exit;
Alan Cox46d57a42009-09-19 13:13:29 -0700859 uport->flags = ((uport->flags & ~UPF_USR_MASK) |
Russell King0077d452006-01-21 23:03:28 +0000860 (new_flags & UPF_USR_MASK));
Alan Cox7ba2e762012-09-04 16:34:45 +0100861 uport->custom_divisor = new_info->custom_divisor;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700862 goto check_and_exit;
863 }
864
865 /*
866 * Ask the low level driver to verify the settings.
867 */
Alan Cox46d57a42009-09-19 13:13:29 -0700868 if (uport->ops->verify_port)
Alan Cox7ba2e762012-09-04 16:34:45 +0100869 retval = uport->ops->verify_port(uport, new_info);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700870
Alan Cox7ba2e762012-09-04 16:34:45 +0100871 if ((new_info->irq >= nr_irqs) || (new_info->irq < 0) ||
872 (new_info->baud_base < 9600))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700873 retval = -EINVAL;
874
875 if (retval)
876 goto exit;
877
878 if (change_port || change_irq) {
879 retval = -EBUSY;
880
881 /*
882 * Make sure that we are the sole user of this port.
883 */
Alan Coxb58d13a2009-09-19 13:13:32 -0700884 if (tty_port_users(port) > 1)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700885 goto exit;
886
887 /*
888 * We need to shutdown the serial port at the old
889 * port/type/irq combination.
890 */
Alan Cox19225132010-06-01 22:52:51 +0200891 uart_shutdown(tty, state);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700892 }
893
894 if (change_port) {
895 unsigned long old_iobase, old_mapbase;
896 unsigned int old_type, old_iotype, old_hub6, old_shift;
897
Alan Cox46d57a42009-09-19 13:13:29 -0700898 old_iobase = uport->iobase;
899 old_mapbase = uport->mapbase;
900 old_type = uport->type;
901 old_hub6 = uport->hub6;
902 old_iotype = uport->iotype;
903 old_shift = uport->regshift;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700904
905 /*
906 * Free and release old regions
907 */
Fabio Estevama7cfaf12016-05-20 01:59:54 -0300908 if (old_type != PORT_UNKNOWN && uport->ops->release_port)
Alan Cox46d57a42009-09-19 13:13:29 -0700909 uport->ops->release_port(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700910
Alan Cox46d57a42009-09-19 13:13:29 -0700911 uport->iobase = new_port;
Alan Cox7ba2e762012-09-04 16:34:45 +0100912 uport->type = new_info->type;
913 uport->hub6 = new_info->hub6;
914 uport->iotype = new_info->io_type;
915 uport->regshift = new_info->iomem_reg_shift;
916 uport->mapbase = (unsigned long)new_info->iomem_base;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700917
918 /*
919 * Claim and map the new regions
920 */
Fabio Estevama7cfaf12016-05-20 01:59:54 -0300921 if (uport->type != PORT_UNKNOWN && uport->ops->request_port) {
Alan Cox46d57a42009-09-19 13:13:29 -0700922 retval = uport->ops->request_port(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700923 } else {
924 /* Always success - Jean II */
925 retval = 0;
926 }
927
928 /*
929 * If we fail to request resources for the
930 * new port, try to restore the old settings.
931 */
Thomas Pfaff7deb39e2014-04-23 12:33:22 +0200932 if (retval) {
Alan Cox46d57a42009-09-19 13:13:29 -0700933 uport->iobase = old_iobase;
934 uport->type = old_type;
935 uport->hub6 = old_hub6;
936 uport->iotype = old_iotype;
937 uport->regshift = old_shift;
938 uport->mapbase = old_mapbase;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700939
Thomas Pfaff7deb39e2014-04-23 12:33:22 +0200940 if (old_type != PORT_UNKNOWN) {
941 retval = uport->ops->request_port(uport);
942 /*
943 * If we failed to restore the old settings,
944 * we fail like this.
945 */
946 if (retval)
947 uport->type = PORT_UNKNOWN;
948
949 /*
950 * We failed anyway.
951 */
952 retval = -EBUSY;
953 }
954
Alan Coxa46c9992008-02-08 04:18:53 -0800955 /* Added to return the correct error -Ram Gupta */
956 goto exit;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700957 }
958 }
959
David Gibsonabb4a232007-05-06 14:48:49 -0700960 if (change_irq)
Alan Cox7ba2e762012-09-04 16:34:45 +0100961 uport->irq = new_info->irq;
Alan Cox46d57a42009-09-19 13:13:29 -0700962 if (!(uport->flags & UPF_FIXED_PORT))
Alan Cox7ba2e762012-09-04 16:34:45 +0100963 uport->uartclk = new_info->baud_base * 16;
Alan Cox46d57a42009-09-19 13:13:29 -0700964 uport->flags = (uport->flags & ~UPF_CHANGE_MASK) |
Russell King0077d452006-01-21 23:03:28 +0000965 (new_flags & UPF_CHANGE_MASK);
Alan Cox7ba2e762012-09-04 16:34:45 +0100966 uport->custom_divisor = new_info->custom_divisor;
Alan Cox46d57a42009-09-19 13:13:29 -0700967 port->close_delay = close_delay;
968 port->closing_wait = closing_wait;
Alan Cox7ba2e762012-09-04 16:34:45 +0100969 if (new_info->xmit_fifo_size)
970 uport->fifosize = new_info->xmit_fifo_size;
Jiri Slabyd6c53c02013-01-03 15:53:05 +0100971 port->low_latency = (uport->flags & UPF_LOW_LATENCY) ? 1 : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700972
973 check_and_exit:
974 retval = 0;
Alan Cox46d57a42009-09-19 13:13:29 -0700975 if (uport->type == PORT_UNKNOWN)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700976 goto exit;
Peter Hurleyd41861c2016-04-09 17:53:25 -0700977 if (tty_port_initialized(port)) {
Alan Cox46d57a42009-09-19 13:13:29 -0700978 if (((old_flags ^ uport->flags) & UPF_SPD_MASK) ||
979 old_custom_divisor != uport->custom_divisor) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700980 /*
981 * If they're setting up a custom divisor or speed,
982 * instead of clearing it, then bitch about it. No
983 * need to rate-limit; it's CAP_SYS_ADMIN only.
984 */
Alan Cox46d57a42009-09-19 13:13:29 -0700985 if (uport->flags & UPF_SPD_MASK) {
Sudip Mukherjee2f2dafe2014-09-01 20:49:43 +0530986 dev_notice(uport->dev,
987 "%s sets custom speed on %s. This is deprecated.\n",
988 current->comm,
Rasmus Villemoes429b4742015-03-31 15:55:59 +0200989 tty_name(port->tty));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700990 }
Alan Cox19225132010-06-01 22:52:51 +0200991 uart_change_speed(tty, state, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700992 }
Rob Herringb3b57642016-08-22 17:39:09 -0500993 } else {
Alan Cox19225132010-06-01 22:52:51 +0200994 retval = uart_startup(tty, state, 1);
Sebastian Andrzej Siewiorffcf1672018-01-11 18:57:26 +0100995 if (retval == 0)
996 tty_port_set_initialized(port, true);
Rob Herringb3b57642016-08-22 17:39:09 -0500997 if (retval > 0)
998 retval = 0;
999 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001000 exit:
Alan Cox7ba2e762012-09-04 16:34:45 +01001001 return retval;
1002}
1003
1004static int uart_set_info_user(struct tty_struct *tty, struct uart_state *state,
1005 struct serial_struct __user *newinfo)
1006{
1007 struct serial_struct new_serial;
1008 struct tty_port *port = &state->port;
1009 int retval;
1010
1011 if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
1012 return -EFAULT;
1013
1014 /*
1015 * This semaphore protects port->count. It is also
1016 * very useful to prevent opens. Also, take the
1017 * port configuration semaphore to make sure that a
1018 * module insertion/removal doesn't change anything
1019 * under us.
1020 */
1021 mutex_lock(&port->mutex);
1022 retval = uart_set_info(tty, port, state, &new_serial);
Alan Coxa2bceae2009-09-19 13:13:31 -07001023 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001024 return retval;
1025}
1026
Alan Cox19225132010-06-01 22:52:51 +02001027/**
1028 * uart_get_lsr_info - get line status register info
1029 * @tty: tty associated with the UART
1030 * @state: UART being queried
1031 * @value: returned modem value
Linus Torvalds1da177e2005-04-16 15:20:36 -07001032 */
Alan Cox19225132010-06-01 22:52:51 +02001033static int uart_get_lsr_info(struct tty_struct *tty,
1034 struct uart_state *state, unsigned int __user *value)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001035{
Peter Hurley4047b372016-04-09 18:56:33 -07001036 struct uart_port *uport = uart_port_check(state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001037 unsigned int result;
1038
Alan Cox46d57a42009-09-19 13:13:29 -07001039 result = uport->ops->tx_empty(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001040
1041 /*
1042 * If we're about to load something into the transmit
1043 * register, we'll pretend the transmitter isn't empty to
1044 * avoid a race condition (depending on when the transmit
1045 * interrupt happens).
1046 */
Alan Cox46d57a42009-09-19 13:13:29 -07001047 if (uport->x_char ||
Alan Coxebd2c8f2009-09-19 13:13:28 -07001048 ((uart_circ_chars_pending(&state->xmit) > 0) &&
Peter Hurleyd01f4d12014-09-10 15:06:26 -04001049 !uart_tx_stopped(uport)))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001050 result &= ~TIOCSER_TEMT;
Alan Coxa46c9992008-02-08 04:18:53 -08001051
Linus Torvalds1da177e2005-04-16 15:20:36 -07001052 return put_user(result, value);
1053}
1054
Alan Cox60b33c12011-02-14 16:26:14 +00001055static int uart_tiocmget(struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001056{
1057 struct uart_state *state = tty->driver_data;
Alan Coxa2bceae2009-09-19 13:13:31 -07001058 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001059 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001060 int result = -EIO;
1061
Alan Coxa2bceae2009-09-19 13:13:31 -07001062 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001063 uport = uart_port_check(state);
1064 if (!uport)
1065 goto out;
1066
Peter Hurley18900ca2016-04-09 17:06:48 -07001067 if (!tty_io_error(tty)) {
Alan Cox46d57a42009-09-19 13:13:29 -07001068 result = uport->mctrl;
Alan Cox46d57a42009-09-19 13:13:29 -07001069 spin_lock_irq(&uport->lock);
1070 result |= uport->ops->get_mctrl(uport);
1071 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001072 }
Peter Hurley4047b372016-04-09 18:56:33 -07001073out:
Alan Coxa2bceae2009-09-19 13:13:31 -07001074 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001075 return result;
1076}
1077
1078static int
Alan Cox20b9d172011-02-14 16:26:50 +00001079uart_tiocmset(struct tty_struct *tty, unsigned int set, unsigned int clear)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001080{
1081 struct uart_state *state = tty->driver_data;
Alan Coxa2bceae2009-09-19 13:13:31 -07001082 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001083 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001084 int ret = -EIO;
1085
Alan Coxa2bceae2009-09-19 13:13:31 -07001086 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001087 uport = uart_port_check(state);
1088 if (!uport)
1089 goto out;
1090
Peter Hurley18900ca2016-04-09 17:06:48 -07001091 if (!tty_io_error(tty)) {
Alan Cox46d57a42009-09-19 13:13:29 -07001092 uart_update_mctrl(uport, set, clear);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001093 ret = 0;
1094 }
Peter Hurley4047b372016-04-09 18:56:33 -07001095out:
Alan Coxa2bceae2009-09-19 13:13:31 -07001096 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001097 return ret;
1098}
1099
Alan Cox9e989662008-07-22 11:18:03 +01001100static int uart_break_ctl(struct tty_struct *tty, int break_state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001101{
1102 struct uart_state *state = tty->driver_data;
Alan Coxa2bceae2009-09-19 13:13:31 -07001103 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001104 struct uart_port *uport;
1105 int ret = -EIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001106
Alan Coxa2bceae2009-09-19 13:13:31 -07001107 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001108 uport = uart_port_check(state);
1109 if (!uport)
1110 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001111
Alan Cox46d57a42009-09-19 13:13:29 -07001112 if (uport->type != PORT_UNKNOWN)
1113 uport->ops->break_ctl(uport, break_state);
Peter Hurley4047b372016-04-09 18:56:33 -07001114 ret = 0;
1115out:
Alan Coxa2bceae2009-09-19 13:13:31 -07001116 mutex_unlock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001117 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001118}
1119
Alan Cox19225132010-06-01 22:52:51 +02001120static int uart_do_autoconfig(struct tty_struct *tty,struct uart_state *state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001121{
Alan Coxa2bceae2009-09-19 13:13:31 -07001122 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001123 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001124 int flags, ret;
1125
1126 if (!capable(CAP_SYS_ADMIN))
1127 return -EPERM;
1128
1129 /*
1130 * Take the per-port semaphore. This prevents count from
1131 * changing, and hence any extra opens of the port while
1132 * we're auto-configuring.
1133 */
Alan Coxa2bceae2009-09-19 13:13:31 -07001134 if (mutex_lock_interruptible(&port->mutex))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001135 return -ERESTARTSYS;
1136
Peter Hurley4047b372016-04-09 18:56:33 -07001137 uport = uart_port_check(state);
1138 if (!uport) {
1139 ret = -EIO;
1140 goto out;
1141 }
1142
Linus Torvalds1da177e2005-04-16 15:20:36 -07001143 ret = -EBUSY;
Alan Coxb58d13a2009-09-19 13:13:32 -07001144 if (tty_port_users(port) == 1) {
Alan Cox19225132010-06-01 22:52:51 +02001145 uart_shutdown(tty, state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001146
1147 /*
1148 * If we already have a port type configured,
1149 * we must release its resources.
1150 */
Fabio Estevama7cfaf12016-05-20 01:59:54 -03001151 if (uport->type != PORT_UNKNOWN && uport->ops->release_port)
Alan Cox46d57a42009-09-19 13:13:29 -07001152 uport->ops->release_port(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001153
1154 flags = UART_CONFIG_TYPE;
Alan Cox46d57a42009-09-19 13:13:29 -07001155 if (uport->flags & UPF_AUTO_IRQ)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001156 flags |= UART_CONFIG_IRQ;
1157
1158 /*
1159 * This will claim the ports resources if
1160 * a port is found.
1161 */
Alan Cox46d57a42009-09-19 13:13:29 -07001162 uport->ops->config_port(uport, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163
Alan Cox19225132010-06-01 22:52:51 +02001164 ret = uart_startup(tty, state, 1);
Sebastian Andrzej Siewiorfbe1ad92018-02-03 12:27:23 +01001165 if (ret == 0)
1166 tty_port_set_initialized(port, true);
Rob Herringb3b57642016-08-22 17:39:09 -05001167 if (ret > 0)
1168 ret = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001169 }
Peter Hurley4047b372016-04-09 18:56:33 -07001170out:
Alan Coxa2bceae2009-09-19 13:13:31 -07001171 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001172 return ret;
1173}
1174
Alexander Shiyan1fdc3102014-06-03 18:54:43 +04001175static void uart_enable_ms(struct uart_port *uport)
1176{
1177 /*
1178 * Force modem status interrupts on
1179 */
1180 if (uport->ops->enable_ms)
1181 uport->ops->enable_ms(uport);
1182}
1183
Linus Torvalds1da177e2005-04-16 15:20:36 -07001184/*
1185 * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
1186 * - mask passed in arg for lines of interest
1187 * (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
1188 * Caller should use TIOCGICOUNT to see which one it was
Alan Coxbdc04e32009-09-19 13:13:31 -07001189 *
1190 * FIXME: This wants extracting into a common all driver implementation
1191 * of TIOCMWAIT using tty_port.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001192 */
Peter Hurley9ed19422016-04-09 18:56:34 -07001193static int uart_wait_modem_status(struct uart_state *state, unsigned long arg)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001194{
Peter Hurley9ed19422016-04-09 18:56:34 -07001195 struct uart_port *uport;
Alan Coxbdc04e32009-09-19 13:13:31 -07001196 struct tty_port *port = &state->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001197 DECLARE_WAITQUEUE(wait, current);
1198 struct uart_icount cprev, cnow;
1199 int ret;
1200
1201 /*
1202 * note the counters on entry
1203 */
Peter Hurley9ed19422016-04-09 18:56:34 -07001204 uport = uart_port_ref(state);
1205 if (!uport)
1206 return -EIO;
Alan Cox46d57a42009-09-19 13:13:29 -07001207 spin_lock_irq(&uport->lock);
1208 memcpy(&cprev, &uport->icount, sizeof(struct uart_icount));
Alexander Shiyan1fdc3102014-06-03 18:54:43 +04001209 uart_enable_ms(uport);
Alan Cox46d57a42009-09-19 13:13:29 -07001210 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001211
Alan Coxbdc04e32009-09-19 13:13:31 -07001212 add_wait_queue(&port->delta_msr_wait, &wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001213 for (;;) {
Alan Cox46d57a42009-09-19 13:13:29 -07001214 spin_lock_irq(&uport->lock);
1215 memcpy(&cnow, &uport->icount, sizeof(struct uart_icount));
1216 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001217
1218 set_current_state(TASK_INTERRUPTIBLE);
1219
1220 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
1221 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
1222 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
1223 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts))) {
Alan Coxa46c9992008-02-08 04:18:53 -08001224 ret = 0;
1225 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001226 }
1227
1228 schedule();
1229
1230 /* see if a signal did it */
1231 if (signal_pending(current)) {
1232 ret = -ERESTARTSYS;
1233 break;
1234 }
1235
1236 cprev = cnow;
1237 }
Fabian Frederick97f9f702015-02-20 19:12:57 +01001238 __set_current_state(TASK_RUNNING);
Alan Coxbdc04e32009-09-19 13:13:31 -07001239 remove_wait_queue(&port->delta_msr_wait, &wait);
Peter Hurley9ed19422016-04-09 18:56:34 -07001240 uart_port_deref(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001241
1242 return ret;
1243}
1244
1245/*
1246 * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
1247 * Return: write counters to the user passed counter struct
1248 * NB: both 1->0 and 0->1 transitions are counted except for
1249 * RI where only 0->1 is counted.
1250 */
Alan Coxd281da72010-09-16 18:21:24 +01001251static int uart_get_icount(struct tty_struct *tty,
1252 struct serial_icounter_struct *icount)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001253{
Alan Coxd281da72010-09-16 18:21:24 +01001254 struct uart_state *state = tty->driver_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001255 struct uart_icount cnow;
Peter Hurley9ed19422016-04-09 18:56:34 -07001256 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001257
Peter Hurley9ed19422016-04-09 18:56:34 -07001258 uport = uart_port_ref(state);
1259 if (!uport)
1260 return -EIO;
Alan Cox46d57a42009-09-19 13:13:29 -07001261 spin_lock_irq(&uport->lock);
1262 memcpy(&cnow, &uport->icount, sizeof(struct uart_icount));
1263 spin_unlock_irq(&uport->lock);
Peter Hurley9ed19422016-04-09 18:56:34 -07001264 uart_port_deref(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001265
Alan Coxd281da72010-09-16 18:21:24 +01001266 icount->cts = cnow.cts;
1267 icount->dsr = cnow.dsr;
1268 icount->rng = cnow.rng;
1269 icount->dcd = cnow.dcd;
1270 icount->rx = cnow.rx;
1271 icount->tx = cnow.tx;
1272 icount->frame = cnow.frame;
1273 icount->overrun = cnow.overrun;
1274 icount->parity = cnow.parity;
1275 icount->brk = cnow.brk;
1276 icount->buf_overrun = cnow.buf_overrun;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001277
Alan Coxd281da72010-09-16 18:21:24 +01001278 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001279}
1280
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001281static int uart_get_rs485_config(struct uart_port *port,
1282 struct serial_rs485 __user *rs485)
1283{
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001284 unsigned long flags;
1285 struct serial_rs485 aux;
1286
1287 spin_lock_irqsave(&port->lock, flags);
1288 aux = port->rs485;
1289 spin_unlock_irqrestore(&port->lock, flags);
1290
1291 if (copy_to_user(rs485, &aux, sizeof(aux)))
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001292 return -EFAULT;
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001293
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001294 return 0;
1295}
1296
1297static int uart_set_rs485_config(struct uart_port *port,
1298 struct serial_rs485 __user *rs485_user)
1299{
1300 struct serial_rs485 rs485;
1301 int ret;
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001302 unsigned long flags;
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001303
1304 if (!port->rs485_config)
1305 return -ENOIOCTLCMD;
1306
1307 if (copy_from_user(&rs485, rs485_user, sizeof(*rs485_user)))
1308 return -EFAULT;
1309
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001310 spin_lock_irqsave(&port->lock, flags);
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001311 ret = port->rs485_config(port, &rs485);
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001312 spin_unlock_irqrestore(&port->lock, flags);
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001313 if (ret)
1314 return ret;
1315
1316 if (copy_to_user(rs485_user, &port->rs485, sizeof(port->rs485)))
1317 return -EFAULT;
1318
1319 return 0;
1320}
1321
Linus Torvalds1da177e2005-04-16 15:20:36 -07001322/*
Alan Coxe5238442008-04-30 00:53:28 -07001323 * Called via sys_ioctl. We can use spin_lock_irq() here.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001324 */
1325static int
Peter Hurley4047b372016-04-09 18:56:33 -07001326uart_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001327{
1328 struct uart_state *state = tty->driver_data;
Alan Coxa2bceae2009-09-19 13:13:31 -07001329 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001330 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001331 void __user *uarg = (void __user *)arg;
1332 int ret = -ENOIOCTLCMD;
1333
Linus Torvalds1da177e2005-04-16 15:20:36 -07001334
1335 /*
1336 * These ioctls don't rely on the hardware to be present.
1337 */
1338 switch (cmd) {
1339 case TIOCGSERIAL:
Alan Cox9f109692012-10-29 15:20:25 +00001340 ret = uart_get_info_user(port, uarg);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001341 break;
1342
1343 case TIOCSSERIAL:
Peter Hurley7c8ab962014-10-16 16:54:20 -04001344 down_write(&tty->termios_rwsem);
Alan Cox7ba2e762012-09-04 16:34:45 +01001345 ret = uart_set_info_user(tty, state, uarg);
Peter Hurley7c8ab962014-10-16 16:54:20 -04001346 up_write(&tty->termios_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001347 break;
1348
1349 case TIOCSERCONFIG:
Peter Hurley7c8ab962014-10-16 16:54:20 -04001350 down_write(&tty->termios_rwsem);
Alan Cox19225132010-06-01 22:52:51 +02001351 ret = uart_do_autoconfig(tty, state);
Peter Hurley7c8ab962014-10-16 16:54:20 -04001352 up_write(&tty->termios_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001353 break;
1354
1355 case TIOCSERGWILD: /* obsolete */
1356 case TIOCSERSWILD: /* obsolete */
1357 ret = 0;
1358 break;
1359 }
1360
1361 if (ret != -ENOIOCTLCMD)
1362 goto out;
1363
Peter Hurley18900ca2016-04-09 17:06:48 -07001364 if (tty_io_error(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001365 ret = -EIO;
1366 goto out;
1367 }
1368
1369 /*
1370 * The following should only be used when hardware is present.
1371 */
1372 switch (cmd) {
1373 case TIOCMIWAIT:
1374 ret = uart_wait_modem_status(state, arg);
1375 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001376 }
1377
1378 if (ret != -ENOIOCTLCMD)
1379 goto out;
1380
Alan Coxa2bceae2009-09-19 13:13:31 -07001381 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001382 uport = uart_port_check(state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001383
Peter Hurley4047b372016-04-09 18:56:33 -07001384 if (!uport || tty_io_error(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001385 ret = -EIO;
1386 goto out_up;
1387 }
1388
1389 /*
1390 * All these rely on hardware being present and need to be
1391 * protected against the tty being hung up.
1392 */
Ricardo Ribalda Delgadoa9c20a92014-11-06 09:22:59 +01001393
Linus Torvalds1da177e2005-04-16 15:20:36 -07001394 switch (cmd) {
Ricardo Ribalda Delgadoa9c20a92014-11-06 09:22:59 +01001395 case TIOCSERGETLSR: /* Get line status register */
1396 ret = uart_get_lsr_info(tty, state, uarg);
1397 break;
1398
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001399 case TIOCGRS485:
Peter Hurley4047b372016-04-09 18:56:33 -07001400 ret = uart_get_rs485_config(uport, uarg);
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001401 break;
1402
1403 case TIOCSRS485:
Peter Hurley4047b372016-04-09 18:56:33 -07001404 ret = uart_set_rs485_config(uport, uarg);
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001405 break;
Peter Hurley4047b372016-04-09 18:56:33 -07001406 default:
Alan Cox46d57a42009-09-19 13:13:29 -07001407 if (uport->ops->ioctl)
1408 ret = uport->ops->ioctl(uport, cmd, arg);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001409 break;
1410 }
Alan Coxf34d7a52008-04-30 00:54:13 -07001411out_up:
Alan Coxa2bceae2009-09-19 13:13:31 -07001412 mutex_unlock(&port->mutex);
Alan Coxf34d7a52008-04-30 00:54:13 -07001413out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001414 return ret;
1415}
1416
Linus Torvaldsedeb2802008-06-04 10:35:03 -07001417static void uart_set_ldisc(struct tty_struct *tty)
Alan Cox64e91592008-06-03 15:18:54 +01001418{
1419 struct uart_state *state = tty->driver_data;
Peter Hurley4047b372016-04-09 18:56:33 -07001420 struct uart_port *uport;
Alan Cox64e91592008-06-03 15:18:54 +01001421
Peter Hurley4047b372016-04-09 18:56:33 -07001422 mutex_lock(&state->port.mutex);
1423 uport = uart_port_check(state);
1424 if (uport && uport->ops->set_ldisc)
Peter Hurley732a84a2014-11-05 13:11:43 -05001425 uport->ops->set_ldisc(uport, &tty->termios);
Peter Hurley4047b372016-04-09 18:56:33 -07001426 mutex_unlock(&state->port.mutex);
Alan Cox64e91592008-06-03 15:18:54 +01001427}
1428
Alan Coxa46c9992008-02-08 04:18:53 -08001429static void uart_set_termios(struct tty_struct *tty,
1430 struct ktermios *old_termios)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001431{
1432 struct uart_state *state = tty->driver_data;
Peter Hurley4047b372016-04-09 18:56:33 -07001433 struct uart_port *uport;
Alan Coxadc8d742012-07-14 15:31:47 +01001434 unsigned int cflag = tty->termios.c_cflag;
Russell King2cbacaf2012-04-17 16:34:13 +01001435 unsigned int iflag_mask = IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK;
1436 bool sw_changed = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001437
Peter Hurley4047b372016-04-09 18:56:33 -07001438 mutex_lock(&state->port.mutex);
1439 uport = uart_port_check(state);
1440 if (!uport)
1441 goto out;
1442
Russell King2cbacaf2012-04-17 16:34:13 +01001443 /*
1444 * Drivers doing software flow control also need to know
1445 * about changes to these input settings.
1446 */
1447 if (uport->flags & UPF_SOFT_FLOW) {
1448 iflag_mask |= IXANY|IXON|IXOFF;
1449 sw_changed =
1450 tty->termios.c_cc[VSTART] != old_termios->c_cc[VSTART] ||
1451 tty->termios.c_cc[VSTOP] != old_termios->c_cc[VSTOP];
1452 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001453
1454 /*
1455 * These are the bits that are used to setup various
David Woodhouse20620d62007-08-22 14:01:11 -07001456 * flags in the low level driver. We can ignore the Bfoo
1457 * bits in c_cflag; c_[io]speed will always be set
1458 * appropriately by set_termios() in tty_ioctl.c
Linus Torvalds1da177e2005-04-16 15:20:36 -07001459 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001460 if ((cflag ^ old_termios->c_cflag) == 0 &&
Alan Coxadc8d742012-07-14 15:31:47 +01001461 tty->termios.c_ospeed == old_termios->c_ospeed &&
1462 tty->termios.c_ispeed == old_termios->c_ispeed &&
Russell King2cbacaf2012-04-17 16:34:13 +01001463 ((tty->termios.c_iflag ^ old_termios->c_iflag) & iflag_mask) == 0 &&
1464 !sw_changed) {
Peter Hurley4047b372016-04-09 18:56:33 -07001465 goto out;
Alan Coxe5238442008-04-30 00:53:28 -07001466 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001467
Alan Cox19225132010-06-01 22:52:51 +02001468 uart_change_speed(tty, state, old_termios);
Peter Hurleyc18b55f2014-06-16 09:17:09 -04001469 /* reload cflag from termios; port driver may have overriden flags */
1470 cflag = tty->termios.c_cflag;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001471
1472 /* Handle transition to B0 status */
1473 if ((old_termios->c_cflag & CBAUD) && !(cflag & CBAUD))
Russell Kingdec94e72012-09-24 11:13:15 +01001474 uart_clear_mctrl(uport, TIOCM_RTS | TIOCM_DTR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001475 /* Handle transition away from B0 status */
André Goddard Rosa82cb7ba2009-10-25 11:18:26 -02001476 else if (!(old_termios->c_cflag & CBAUD) && (cflag & CBAUD)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001477 unsigned int mask = TIOCM_DTR;
Peter Hurley97ef38b2016-04-09 17:11:36 -07001478 if (!(cflag & CRTSCTS) || !tty_throttled(tty))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001479 mask |= TIOCM_RTS;
Russell Kingdec94e72012-09-24 11:13:15 +01001480 uart_set_mctrl(uport, mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001481 }
Peter Hurley4047b372016-04-09 18:56:33 -07001482out:
1483 mutex_unlock(&state->port.mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001484}
1485
1486/*
Kevin Cernekeeef4f5272012-12-26 20:43:41 -08001487 * Calls to uart_close() are serialised via the tty_lock in
1488 * drivers/tty/tty_io.c:tty_release()
1489 * drivers/tty/tty_io.c:do_tty_hangup()
Linus Torvalds1da177e2005-04-16 15:20:36 -07001490 */
1491static void uart_close(struct tty_struct *tty, struct file *filp)
1492{
1493 struct uart_state *state = tty->driver_data;
Alan Cox46d57a42009-09-19 13:13:29 -07001494 struct tty_port *port;
Alan Coxa46c9992008-02-08 04:18:53 -08001495
Peter Hurley91b32f52014-10-16 16:54:27 -04001496 if (!state) {
1497 struct uart_driver *drv = tty->driver->driver_state;
1498
1499 state = drv->state + tty->index;
1500 port = &state->port;
1501 spin_lock_irq(&port->lock);
1502 --port->count;
1503 spin_unlock_irq(&port->lock);
Linus Torvaldseea7e172009-10-12 19:13:54 +02001504 return;
Peter Hurley91b32f52014-10-16 16:54:27 -04001505 }
Linus Torvaldseea7e172009-10-12 19:13:54 +02001506
Alan Cox46d57a42009-09-19 13:13:29 -07001507 port = &state->port;
Peter Hurley39b3d892016-01-10 20:23:57 -08001508 pr_debug("uart_close(%d) called\n", tty->index);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001509
Rob Herring761ed4a2016-08-22 17:39:10 -05001510 tty_port_close(tty->port, tty, filp);
1511}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001512
Rob Herring761ed4a2016-08-22 17:39:10 -05001513static void uart_tty_port_shutdown(struct tty_port *port)
1514{
1515 struct uart_state *state = container_of(port, struct uart_state, port);
1516 struct uart_port *uport = uart_port_check(state);
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001517
Linus Torvalds1da177e2005-04-16 15:20:36 -07001518 /*
1519 * At this point, we stop accepting input. To do this, we
1520 * disable the receive line status interrupts.
1521 */
Andy Shevchenkoa5a2b132016-09-13 00:23:42 +03001522 if (WARN(!uport, "detached port still initialized!\n"))
1523 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001524
Andy Shevchenkoa5a2b132016-09-13 00:23:42 +03001525 spin_lock_irq(&uport->lock);
Rob Herring761ed4a2016-08-22 17:39:10 -05001526 uport->ops->stop_rx(uport);
Rob Herring761ed4a2016-08-22 17:39:10 -05001527 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001528
Rob Herring761ed4a2016-08-22 17:39:10 -05001529 uart_port_shutdown(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001530
1531 /*
Rob Herring761ed4a2016-08-22 17:39:10 -05001532 * It's possible for shutdown to be called after suspend if we get
1533 * a DCD drop (hangup) at just the right time. Clear suspended bit so
1534 * we don't try to resume a port that has been shutdown.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001535 */
Rob Herring761ed4a2016-08-22 17:39:10 -05001536 tty_port_set_suspended(port, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001537
Rob Herring761ed4a2016-08-22 17:39:10 -05001538 uart_change_pm(state, UART_PM_STATE_OFF);
Peter Hurley2e758912014-10-16 16:54:19 -04001539
Linus Torvalds1da177e2005-04-16 15:20:36 -07001540}
1541
Jiri Slaby1f33a512011-07-14 14:35:10 +02001542static void uart_wait_until_sent(struct tty_struct *tty, int timeout)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001543{
Jiri Slaby1f33a512011-07-14 14:35:10 +02001544 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -07001545 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001546 unsigned long char_time, expire;
1547
Peter Hurley9ed19422016-04-09 18:56:34 -07001548 port = uart_port_ref(state);
1549 if (!port || port->type == PORT_UNKNOWN || port->fifosize == 0) {
1550 uart_port_deref(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001551 return;
Peter Hurley9ed19422016-04-09 18:56:34 -07001552 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001553
1554 /*
1555 * Set the check interval to be 1/5 of the estimated time to
1556 * send a single character, and make it at least 1. The check
1557 * interval should also be less than the timeout.
1558 *
1559 * Note: we have to use pretty tight timings here to satisfy
1560 * the NIST-PCTS.
1561 */
1562 char_time = (port->timeout - HZ/50) / port->fifosize;
1563 char_time = char_time / 5;
1564 if (char_time == 0)
1565 char_time = 1;
1566 if (timeout && timeout < char_time)
1567 char_time = timeout;
1568
1569 /*
1570 * If the transmitter hasn't cleared in twice the approximate
1571 * amount of time to send the entire FIFO, it probably won't
1572 * ever clear. This assumes the UART isn't doing flow
1573 * control, which is currently the case. Hence, if it ever
1574 * takes longer than port->timeout, this is probably due to a
1575 * UART bug of some kind. So, we clamp the timeout parameter at
1576 * 2*port->timeout.
1577 */
1578 if (timeout == 0 || timeout > 2 * port->timeout)
1579 timeout = 2 * port->timeout;
1580
1581 expire = jiffies + timeout;
1582
Jiri Slabyeb3a1e12007-05-06 14:48:52 -07001583 pr_debug("uart_wait_until_sent(%d), jiffies=%lu, expire=%lu...\n",
Alan Coxa46c9992008-02-08 04:18:53 -08001584 port->line, jiffies, expire);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001585
1586 /*
1587 * Check whether the transmitter is empty every 'char_time'.
1588 * 'timeout' / 'expire' give us the maximum amount of time
1589 * we wait.
1590 */
1591 while (!port->ops->tx_empty(port)) {
1592 msleep_interruptible(jiffies_to_msecs(char_time));
1593 if (signal_pending(current))
1594 break;
1595 if (time_after(jiffies, expire))
1596 break;
1597 }
Peter Hurley9ed19422016-04-09 18:56:34 -07001598 uart_port_deref(port);
Arnd Bergmann20365212010-06-01 22:53:07 +02001599}
1600
Linus Torvalds1da177e2005-04-16 15:20:36 -07001601/*
Kevin Cernekeeef4f5272012-12-26 20:43:41 -08001602 * Calls to uart_hangup() are serialised by the tty_lock in
1603 * drivers/tty/tty_io.c:do_tty_hangup()
1604 * This runs from a workqueue and can sleep for a _short_ time only.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001605 */
1606static void uart_hangup(struct tty_struct *tty)
1607{
1608 struct uart_state *state = tty->driver_data;
Alan Cox46d57a42009-09-19 13:13:29 -07001609 struct tty_port *port = &state->port;
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001610 struct uart_port *uport;
Alan Cox61cd8a22010-06-01 22:52:57 +02001611 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001612
Peter Hurley39b3d892016-01-10 20:23:57 -08001613 pr_debug("uart_hangup(%d)\n", tty->index);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001614
Alan Coxa2bceae2009-09-19 13:13:31 -07001615 mutex_lock(&port->mutex);
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001616 uport = uart_port_check(state);
1617 WARN(!uport, "hangup of detached port!\n");
1618
Peter Hurley807c8d812016-04-09 17:53:22 -07001619 if (tty_port_active(port)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001620 uart_flush_buffer(tty);
Alan Cox19225132010-06-01 22:52:51 +02001621 uart_shutdown(tty, state);
Alan Cox61cd8a22010-06-01 22:52:57 +02001622 spin_lock_irqsave(&port->lock, flags);
Alan Cox91312cd2009-09-19 13:13:29 -07001623 port->count = 0;
Alan Cox61cd8a22010-06-01 22:52:57 +02001624 spin_unlock_irqrestore(&port->lock, flags);
Peter Hurley807c8d812016-04-09 17:53:22 -07001625 tty_port_set_active(port, 0);
Alan Cox7b014782009-09-19 13:13:33 -07001626 tty_port_tty_set(port, NULL);
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001627 if (uport && !uart_console(uport))
Geert Uytterhoevenbf903c02014-03-27 11:40:39 +01001628 uart_change_pm(state, UART_PM_STATE_OFF);
Alan Cox46d57a42009-09-19 13:13:29 -07001629 wake_up_interruptible(&port->open_wait);
Alan Coxbdc04e32009-09-19 13:13:31 -07001630 wake_up_interruptible(&port->delta_msr_wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001631 }
Alan Coxa2bceae2009-09-19 13:13:31 -07001632 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001633}
1634
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001635/* uport == NULL if uart_port has already been removed */
Jiri Slaby0b1db832011-11-09 21:33:50 +01001636static void uart_port_shutdown(struct tty_port *port)
1637{
Jiri Slabyb922e192011-11-09 21:33:51 +01001638 struct uart_state *state = container_of(port, struct uart_state, port);
Peter Hurley4047b372016-04-09 18:56:33 -07001639 struct uart_port *uport = uart_port_check(state);
Jiri Slabyb922e192011-11-09 21:33:51 +01001640
1641 /*
1642 * clear delta_msr_wait queue to avoid mem leaks: we may free
1643 * the irq here so the queue might never be woken up. Note
1644 * that we won't end up waiting on delta_msr_wait again since
1645 * any outstanding file descriptors should be pointing at
1646 * hung_up_tty_fops now.
1647 */
1648 wake_up_interruptible(&port->delta_msr_wait);
1649
1650 /*
1651 * Free the IRQ and disable the port.
1652 */
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001653 if (uport)
1654 uport->ops->shutdown(uport);
Jiri Slabyb922e192011-11-09 21:33:51 +01001655
1656 /*
1657 * Ensure that the IRQ handler isn't running on another CPU.
1658 */
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001659 if (uport)
1660 synchronize_irq(uport->irq);
Jiri Slaby0b1db832011-11-09 21:33:50 +01001661}
1662
Alan Coxde0c8cb2010-06-01 22:52:58 +02001663static int uart_carrier_raised(struct tty_port *port)
1664{
1665 struct uart_state *state = container_of(port, struct uart_state, port);
Peter Hurley9ed19422016-04-09 18:56:34 -07001666 struct uart_port *uport;
Alan Coxde0c8cb2010-06-01 22:52:58 +02001667 int mctrl;
Peter Hurley9ed19422016-04-09 18:56:34 -07001668
1669 uport = uart_port_ref(state);
1670 /*
1671 * Should never observe uport == NULL since checks for hangup should
1672 * abort the tty_port_block_til_ready() loop before checking for carrier
1673 * raised -- but report carrier raised if it does anyway so open will
1674 * continue and not sleep
1675 */
1676 if (WARN_ON(!uport))
1677 return 1;
Alan Coxde0c8cb2010-06-01 22:52:58 +02001678 spin_lock_irq(&uport->lock);
Alexander Shiyan1fdc3102014-06-03 18:54:43 +04001679 uart_enable_ms(uport);
Alan Coxde0c8cb2010-06-01 22:52:58 +02001680 mctrl = uport->ops->get_mctrl(uport);
1681 spin_unlock_irq(&uport->lock);
Peter Hurley9ed19422016-04-09 18:56:34 -07001682 uart_port_deref(uport);
Alan Coxde0c8cb2010-06-01 22:52:58 +02001683 if (mctrl & TIOCM_CAR)
1684 return 1;
1685 return 0;
1686}
1687
1688static void uart_dtr_rts(struct tty_port *port, int onoff)
1689{
1690 struct uart_state *state = container_of(port, struct uart_state, port);
Peter Hurley9ed19422016-04-09 18:56:34 -07001691 struct uart_port *uport;
1692
1693 uport = uart_port_ref(state);
1694 if (!uport)
1695 return;
Alan Cox24fcc7c2010-06-01 22:52:59 +02001696
Jiri Slaby6f5c24a2011-03-30 00:10:57 +02001697 if (onoff)
Alan Coxde0c8cb2010-06-01 22:52:58 +02001698 uart_set_mctrl(uport, TIOCM_DTR | TIOCM_RTS);
1699 else
1700 uart_clear_mctrl(uport, TIOCM_DTR | TIOCM_RTS);
Peter Hurley9ed19422016-04-09 18:56:34 -07001701
1702 uart_port_deref(uport);
Alan Coxde0c8cb2010-06-01 22:52:58 +02001703}
1704
Linus Torvalds1da177e2005-04-16 15:20:36 -07001705/*
Kevin Cernekeeef4f5272012-12-26 20:43:41 -08001706 * Calls to uart_open are serialised by the tty_lock in
1707 * drivers/tty/tty_io.c:tty_open()
Linus Torvalds1da177e2005-04-16 15:20:36 -07001708 * Note that if this fails, then uart_close() _will_ be called.
1709 *
1710 * In time, we want to scrap the "opening nonpresent ports"
1711 * behaviour and implement an alternative way for setserial
1712 * to set base addresses/ports/types. This will allow us to
1713 * get rid of a certain amount of extra tests.
1714 */
1715static int uart_open(struct tty_struct *tty, struct file *filp)
1716{
Jiri Slabyabad73a2019-04-17 10:58:53 +02001717 struct uart_state *state = tty->driver_data;
1718 int retval;
Rob Herringb3b57642016-08-22 17:39:09 -05001719
1720 retval = tty_port_open(&state->port, tty, filp);
1721 if (retval > 0)
1722 retval = 0;
1723
1724 return retval;
1725}
1726
1727static int uart_port_activate(struct tty_port *port, struct tty_struct *tty)
1728{
1729 struct uart_state *state = container_of(port, struct uart_state, port);
1730 struct uart_port *uport;
1731
1732 uport = uart_port_check(state);
1733 if (!uport || uport->flags & UPF_DEAD)
1734 return -ENXIO;
1735
Peter Hurley4047b372016-04-09 18:56:33 -07001736 port->low_latency = (uport->flags & UPF_LOW_LATENCY) ? 1 : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001737
1738 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001739 * Start up the serial port.
1740 */
Rob Herringb3b57642016-08-22 17:39:09 -05001741 return uart_startup(tty, state, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001742}
1743
1744static const char *uart_type(struct uart_port *port)
1745{
1746 const char *str = NULL;
1747
1748 if (port->ops->type)
1749 str = port->ops->type(port);
1750
1751 if (!str)
1752 str = "unknown";
1753
1754 return str;
1755}
1756
1757#ifdef CONFIG_PROC_FS
1758
Alexey Dobriyand196a942009-03-31 15:19:21 -07001759static void uart_line_info(struct seq_file *m, struct uart_driver *drv, int i)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001760{
1761 struct uart_state *state = drv->state + i;
Alan Coxa2bceae2009-09-19 13:13:31 -07001762 struct tty_port *port = &state->port;
Linus Walleij6f538fe2012-12-07 11:36:08 +01001763 enum uart_pm_state pm_state;
Peter Hurley4047b372016-04-09 18:56:33 -07001764 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001765 char stat_buf[32];
1766 unsigned int status;
Alexey Dobriyand196a942009-03-31 15:19:21 -07001767 int mmio;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001768
Peter Hurley4047b372016-04-09 18:56:33 -07001769 mutex_lock(&port->mutex);
1770 uport = uart_port_check(state);
Alan Coxa2bceae2009-09-19 13:13:31 -07001771 if (!uport)
Peter Hurley4047b372016-04-09 18:56:33 -07001772 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001773
Alan Coxa2bceae2009-09-19 13:13:31 -07001774 mmio = uport->iotype >= UPIO_MEM;
Alexey Dobriyand196a942009-03-31 15:19:21 -07001775 seq_printf(m, "%d: uart:%s %s%08llX irq:%d",
Alan Coxa2bceae2009-09-19 13:13:31 -07001776 uport->line, uart_type(uport),
Sergei Shtylyov6c6a2332006-09-04 00:04:20 +04001777 mmio ? "mmio:0x" : "port:",
Alan Coxa2bceae2009-09-19 13:13:31 -07001778 mmio ? (unsigned long long)uport->mapbase
1779 : (unsigned long long)uport->iobase,
1780 uport->irq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001781
Alan Coxa2bceae2009-09-19 13:13:31 -07001782 if (uport->type == PORT_UNKNOWN) {
Alexey Dobriyand196a942009-03-31 15:19:21 -07001783 seq_putc(m, '\n');
Peter Hurley4047b372016-04-09 18:56:33 -07001784 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001785 }
1786
Alan Coxa46c9992008-02-08 04:18:53 -08001787 if (capable(CAP_SYS_ADMIN)) {
George G. Davis3689a0e2007-02-14 00:33:06 -08001788 pm_state = state->pm_state;
Linus Walleij6f538fe2012-12-07 11:36:08 +01001789 if (pm_state != UART_PM_STATE_ON)
1790 uart_change_pm(state, UART_PM_STATE_ON);
Alan Coxa2bceae2009-09-19 13:13:31 -07001791 spin_lock_irq(&uport->lock);
1792 status = uport->ops->get_mctrl(uport);
1793 spin_unlock_irq(&uport->lock);
Linus Walleij6f538fe2012-12-07 11:36:08 +01001794 if (pm_state != UART_PM_STATE_ON)
George G. Davis3689a0e2007-02-14 00:33:06 -08001795 uart_change_pm(state, pm_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001796
Alexey Dobriyand196a942009-03-31 15:19:21 -07001797 seq_printf(m, " tx:%d rx:%d",
Alan Coxa2bceae2009-09-19 13:13:31 -07001798 uport->icount.tx, uport->icount.rx);
1799 if (uport->icount.frame)
Peter Hurley968af292016-01-10 20:24:01 -08001800 seq_printf(m, " fe:%d", uport->icount.frame);
Alan Coxa2bceae2009-09-19 13:13:31 -07001801 if (uport->icount.parity)
Peter Hurley968af292016-01-10 20:24:01 -08001802 seq_printf(m, " pe:%d", uport->icount.parity);
Alan Coxa2bceae2009-09-19 13:13:31 -07001803 if (uport->icount.brk)
Peter Hurley968af292016-01-10 20:24:01 -08001804 seq_printf(m, " brk:%d", uport->icount.brk);
Alan Coxa2bceae2009-09-19 13:13:31 -07001805 if (uport->icount.overrun)
Peter Hurley968af292016-01-10 20:24:01 -08001806 seq_printf(m, " oe:%d", uport->icount.overrun);
Alan Coxa46c9992008-02-08 04:18:53 -08001807
1808#define INFOBIT(bit, str) \
Alan Coxa2bceae2009-09-19 13:13:31 -07001809 if (uport->mctrl & (bit)) \
Linus Torvalds1da177e2005-04-16 15:20:36 -07001810 strncat(stat_buf, (str), sizeof(stat_buf) - \
1811 strlen(stat_buf) - 2)
Alan Coxa46c9992008-02-08 04:18:53 -08001812#define STATBIT(bit, str) \
Linus Torvalds1da177e2005-04-16 15:20:36 -07001813 if (status & (bit)) \
1814 strncat(stat_buf, (str), sizeof(stat_buf) - \
1815 strlen(stat_buf) - 2)
1816
1817 stat_buf[0] = '\0';
1818 stat_buf[1] = '\0';
1819 INFOBIT(TIOCM_RTS, "|RTS");
1820 STATBIT(TIOCM_CTS, "|CTS");
1821 INFOBIT(TIOCM_DTR, "|DTR");
1822 STATBIT(TIOCM_DSR, "|DSR");
1823 STATBIT(TIOCM_CAR, "|CD");
1824 STATBIT(TIOCM_RNG, "|RI");
1825 if (stat_buf[0])
1826 stat_buf[0] = ' ';
Alan Coxa46c9992008-02-08 04:18:53 -08001827
Alexey Dobriyand196a942009-03-31 15:19:21 -07001828 seq_puts(m, stat_buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001829 }
Alexey Dobriyand196a942009-03-31 15:19:21 -07001830 seq_putc(m, '\n');
Linus Torvalds1da177e2005-04-16 15:20:36 -07001831#undef STATBIT
1832#undef INFOBIT
Peter Hurley4047b372016-04-09 18:56:33 -07001833out:
1834 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001835}
1836
Alexey Dobriyand196a942009-03-31 15:19:21 -07001837static int uart_proc_show(struct seq_file *m, void *v)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001838{
Alexey Dobriyan833bb302009-04-02 01:30:04 +04001839 struct tty_driver *ttydrv = m->private;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001840 struct uart_driver *drv = ttydrv->driver_state;
Alexey Dobriyand196a942009-03-31 15:19:21 -07001841 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001842
Peter Hurley968af292016-01-10 20:24:01 -08001843 seq_printf(m, "serinfo:1.0 driver%s%s revision:%s\n", "", "", "");
Alexey Dobriyand196a942009-03-31 15:19:21 -07001844 for (i = 0; i < drv->nr; i++)
1845 uart_line_info(m, drv, i);
1846 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001847}
Alexey Dobriyand196a942009-03-31 15:19:21 -07001848
1849static int uart_proc_open(struct inode *inode, struct file *file)
1850{
Al Virod9dda782013-03-31 18:16:14 -04001851 return single_open(file, uart_proc_show, PDE_DATA(inode));
Alexey Dobriyand196a942009-03-31 15:19:21 -07001852}
1853
1854static const struct file_operations uart_proc_fops = {
1855 .owner = THIS_MODULE,
1856 .open = uart_proc_open,
1857 .read = seq_read,
1858 .llseek = seq_lseek,
1859 .release = single_release,
1860};
Linus Torvalds1da177e2005-04-16 15:20:36 -07001861#endif
1862
Andrew Morton4a1b5502008-03-07 15:51:16 -08001863#if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(CONFIG_CONSOLE_POLL)
Peter Hurley1cfe42b2015-03-09 16:27:13 -04001864/**
Russell Kingd3587882006-03-20 20:00:09 +00001865 * uart_console_write - write a console message to a serial port
1866 * @port: the port to write the message
1867 * @s: array of characters
1868 * @count: number of characters in string to write
Peter Hurley10afbe32015-04-11 10:05:07 -04001869 * @putchar: function to write character to port
Russell Kingd3587882006-03-20 20:00:09 +00001870 */
1871void uart_console_write(struct uart_port *port, const char *s,
1872 unsigned int count,
1873 void (*putchar)(struct uart_port *, int))
1874{
1875 unsigned int i;
1876
1877 for (i = 0; i < count; i++, s++) {
1878 if (*s == '\n')
1879 putchar(port, '\r');
1880 putchar(port, *s);
1881 }
1882}
1883EXPORT_SYMBOL_GPL(uart_console_write);
1884
1885/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001886 * Check whether an invalid uart number has been specified, and
1887 * if so, search for the first available port that does have
1888 * console support.
1889 */
1890struct uart_port * __init
1891uart_get_console(struct uart_port *ports, int nr, struct console *co)
1892{
1893 int idx = co->index;
1894
1895 if (idx < 0 || idx >= nr || (ports[idx].iobase == 0 &&
1896 ports[idx].membase == NULL))
1897 for (idx = 0; idx < nr; idx++)
1898 if (ports[idx].iobase != 0 ||
1899 ports[idx].membase != NULL)
1900 break;
1901
1902 co->index = idx;
1903
1904 return ports + idx;
1905}
1906
1907/**
Peter Hurley73abaf82015-03-01 11:05:46 -05001908 * uart_parse_earlycon - Parse earlycon options
1909 * @p: ptr to 2nd field (ie., just beyond '<name>,')
1910 * @iotype: ptr for decoded iotype (out)
1911 * @addr: ptr for decoded mapbase/iobase (out)
1912 * @options: ptr for <options> field; NULL if not present (out)
1913 *
1914 * Decodes earlycon kernel command line parameters of the form
Masahiro Yamadabd94c402015-10-28 12:46:05 +09001915 * earlycon=<name>,io|mmio|mmio16|mmio32|mmio32be|mmio32native,<addr>,<options>
1916 * console=<name>,io|mmio|mmio16|mmio32|mmio32be|mmio32native,<addr>,<options>
Peter Hurley73abaf82015-03-01 11:05:46 -05001917 *
1918 * The optional form
1919 * earlycon=<name>,0x<addr>,<options>
1920 * console=<name>,0x<addr>,<options>
1921 * is also accepted; the returned @iotype will be UPIO_MEM.
1922 *
Alexander Sverdlin8b2303d2016-09-12 13:29:29 +02001923 * Returns 0 on success or -EINVAL on failure
Peter Hurley73abaf82015-03-01 11:05:46 -05001924 */
Alexander Sverdlin46e36682016-09-02 13:20:21 +02001925int uart_parse_earlycon(char *p, unsigned char *iotype, resource_size_t *addr,
Peter Hurley73abaf82015-03-01 11:05:46 -05001926 char **options)
1927{
1928 if (strncmp(p, "mmio,", 5) == 0) {
1929 *iotype = UPIO_MEM;
1930 p += 5;
Masahiro Yamadabd94c402015-10-28 12:46:05 +09001931 } else if (strncmp(p, "mmio16,", 7) == 0) {
1932 *iotype = UPIO_MEM16;
1933 p += 7;
Peter Hurley73abaf82015-03-01 11:05:46 -05001934 } else if (strncmp(p, "mmio32,", 7) == 0) {
1935 *iotype = UPIO_MEM32;
1936 p += 7;
Noam Camus6e63be32015-05-25 06:54:28 +03001937 } else if (strncmp(p, "mmio32be,", 9) == 0) {
1938 *iotype = UPIO_MEM32BE;
1939 p += 9;
Max Filippovd215d802015-09-22 15:20:32 +03001940 } else if (strncmp(p, "mmio32native,", 13) == 0) {
1941 *iotype = IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) ?
1942 UPIO_MEM32BE : UPIO_MEM32;
1943 p += 13;
Peter Hurley73abaf82015-03-01 11:05:46 -05001944 } else if (strncmp(p, "io,", 3) == 0) {
1945 *iotype = UPIO_PORT;
1946 p += 3;
1947 } else if (strncmp(p, "0x", 2) == 0) {
1948 *iotype = UPIO_MEM;
1949 } else {
1950 return -EINVAL;
1951 }
1952
Alexander Sverdlin8b2303d2016-09-12 13:29:29 +02001953 /*
1954 * Before you replace it with kstrtoull(), think about options separator
1955 * (',') it will not tolerate
1956 */
1957 *addr = simple_strtoull(p, NULL, 0);
Peter Hurley73abaf82015-03-01 11:05:46 -05001958 p = strchr(p, ',');
1959 if (p)
1960 p++;
1961
1962 *options = p;
1963 return 0;
1964}
1965EXPORT_SYMBOL_GPL(uart_parse_earlycon);
1966
1967/**
Geert Uytterhoeven02088ca2014-03-11 11:23:35 +01001968 * uart_parse_options - Parse serial port baud/parity/bits/flow control.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001969 * @options: pointer to option string
1970 * @baud: pointer to an 'int' variable for the baud rate.
1971 * @parity: pointer to an 'int' variable for the parity.
1972 * @bits: pointer to an 'int' variable for the number of data bits.
1973 * @flow: pointer to an 'int' variable for the flow control character.
1974 *
1975 * uart_parse_options decodes a string containing the serial console
1976 * options. The format of the string is <baud><parity><bits><flow>,
1977 * eg: 115200n8r
1978 */
Jason Wesself2d937f2008-04-17 20:05:37 +02001979void
Linus Torvalds1da177e2005-04-16 15:20:36 -07001980uart_parse_options(char *options, int *baud, int *parity, int *bits, int *flow)
1981{
1982 char *s = options;
1983
1984 *baud = simple_strtoul(s, NULL, 10);
1985 while (*s >= '0' && *s <= '9')
1986 s++;
1987 if (*s)
1988 *parity = *s++;
1989 if (*s)
1990 *bits = *s++ - '0';
1991 if (*s)
1992 *flow = *s;
1993}
Jason Wesself2d937f2008-04-17 20:05:37 +02001994EXPORT_SYMBOL_GPL(uart_parse_options);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001995
Linus Torvalds1da177e2005-04-16 15:20:36 -07001996/**
1997 * uart_set_options - setup the serial console parameters
1998 * @port: pointer to the serial ports uart_port structure
1999 * @co: console pointer
2000 * @baud: baud rate
2001 * @parity: parity character - 'n' (none), 'o' (odd), 'e' (even)
2002 * @bits: number of data bits
2003 * @flow: flow control character - 'r' (rts)
2004 */
Jason Wesself2d937f2008-04-17 20:05:37 +02002005int
Linus Torvalds1da177e2005-04-16 15:20:36 -07002006uart_set_options(struct uart_port *port, struct console *co,
2007 int baud, int parity, int bits, int flow)
2008{
Alan Cox606d0992006-12-08 02:38:45 -08002009 struct ktermios termios;
Alan Cox149b36e2007-10-18 01:24:16 -07002010 static struct ktermios dummy;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002011
Russell King976ecd12005-07-03 21:05:45 +01002012 /*
2013 * Ensure that the serial console lock is initialised
2014 * early.
Randy Witt42b6a1b2013-10-17 16:56:47 -04002015 * If this port is a console, then the spinlock is already
2016 * initialised.
Russell King976ecd12005-07-03 21:05:45 +01002017 */
Randy Witt42b6a1b2013-10-17 16:56:47 -04002018 if (!(uart_console(port) && (port->cons->flags & CON_ENABLED))) {
2019 spin_lock_init(&port->lock);
2020 lockdep_set_class(&port->lock, &port_lock_key);
2021 }
Russell King976ecd12005-07-03 21:05:45 +01002022
Alan Cox606d0992006-12-08 02:38:45 -08002023 memset(&termios, 0, sizeof(struct ktermios));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002024
Jeffy Chenba47f972016-01-04 15:54:46 +08002025 termios.c_cflag |= CREAD | HUPCL | CLOCAL;
2026 tty_termios_encode_baud_rate(&termios, baud, baud);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002027
2028 if (bits == 7)
2029 termios.c_cflag |= CS7;
2030 else
2031 termios.c_cflag |= CS8;
2032
2033 switch (parity) {
2034 case 'o': case 'O':
2035 termios.c_cflag |= PARODD;
2036 /*fall through*/
2037 case 'e': case 'E':
2038 termios.c_cflag |= PARENB;
2039 break;
2040 }
2041
2042 if (flow == 'r')
2043 termios.c_cflag |= CRTSCTS;
2044
Yinghai Lu79492682007-07-15 23:37:25 -07002045 /*
2046 * some uarts on other side don't support no flow control.
2047 * So we set * DTR in host uart to make them happy
2048 */
2049 port->mctrl |= TIOCM_DTR;
2050
Alan Cox149b36e2007-10-18 01:24:16 -07002051 port->ops->set_termios(port, &termios, &dummy);
Jason Wesself2d937f2008-04-17 20:05:37 +02002052 /*
2053 * Allow the setting of the UART parameters with a NULL console
2054 * too:
2055 */
2056 if (co)
2057 co->cflag = termios.c_cflag;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002058
2059 return 0;
2060}
Jason Wesself2d937f2008-04-17 20:05:37 +02002061EXPORT_SYMBOL_GPL(uart_set_options);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002062#endif /* CONFIG_SERIAL_CORE_CONSOLE */
2063
Jiri Slabycf755252011-11-09 21:33:47 +01002064/**
2065 * uart_change_pm - set power state of the port
2066 *
2067 * @state: port descriptor
2068 * @pm_state: new state
2069 *
2070 * Locking: port->mutex has to be held
2071 */
Linus Walleij6f538fe2012-12-07 11:36:08 +01002072static void uart_change_pm(struct uart_state *state,
2073 enum uart_pm_state pm_state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002074{
Peter Hurley4047b372016-04-09 18:56:33 -07002075 struct uart_port *port = uart_port_check(state);
Andrew Victor1281e362006-05-16 11:28:49 +01002076
2077 if (state->pm_state != pm_state) {
Peter Hurley4047b372016-04-09 18:56:33 -07002078 if (port && port->ops->pm)
Andrew Victor1281e362006-05-16 11:28:49 +01002079 port->ops->pm(port, pm_state, state->pm_state);
2080 state->pm_state = pm_state;
2081 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002082}
2083
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002084struct uart_match {
2085 struct uart_port *port;
2086 struct uart_driver *driver;
2087};
2088
2089static int serial_match_port(struct device *dev, void *data)
2090{
2091 struct uart_match *match = data;
Guennadi Liakhovetski7ca796f2008-07-04 09:59:28 -07002092 struct tty_driver *tty_drv = match->driver->tty_driver;
2093 dev_t devt = MKDEV(tty_drv->major, tty_drv->minor_start) +
2094 match->port->line;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002095
2096 return dev->devt == devt; /* Actually, only one tty per port */
2097}
2098
Alan Coxccce6de2009-09-19 13:13:30 -07002099int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002100{
Alan Coxccce6de2009-09-19 13:13:30 -07002101 struct uart_state *state = drv->state + uport->line;
2102 struct tty_port *port = &state->port;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002103 struct device *tty_dev;
Alan Coxccce6de2009-09-19 13:13:30 -07002104 struct uart_match match = {uport, drv};
Linus Torvalds1da177e2005-04-16 15:20:36 -07002105
Alan Coxa2bceae2009-09-19 13:13:31 -07002106 mutex_lock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002107
Alan Coxccce6de2009-09-19 13:13:30 -07002108 tty_dev = device_find_child(uport->dev, &match, serial_match_port);
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002109 if (device_may_wakeup(tty_dev)) {
Govindraj.R3f960db2010-12-16 18:12:47 +05302110 if (!enable_irq_wake(uport->irq))
2111 uport->irq_wake = 1;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002112 put_device(tty_dev);
Alan Coxa2bceae2009-09-19 13:13:31 -07002113 mutex_unlock(&port->mutex);
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002114 return 0;
2115 }
Federico Vaga5a65dcc2013-04-15 16:01:07 +02002116 put_device(tty_dev);
2117
Peter Hurleyb164c972015-01-22 12:24:25 -05002118 /* Nothing to do if the console is not suspending */
2119 if (!console_suspend_enabled && uart_console(uport))
2120 goto unlock;
2121
2122 uport->suspended = 1;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002123
Peter Hurleyd41861c2016-04-09 17:53:25 -07002124 if (tty_port_initialized(port)) {
Alan Coxccce6de2009-09-19 13:13:30 -07002125 const struct uart_ops *ops = uport->ops;
Russell Kingc8c6bfa2008-02-04 22:27:52 -08002126 int tries;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002127
Peter Hurley80f02d52016-04-09 17:53:24 -07002128 tty_port_set_suspended(port, 1);
Peter Hurleyd41861c2016-04-09 17:53:25 -07002129 tty_port_set_initialized(port, 0);
Russell Kinga6b93a92006-10-01 17:17:40 +01002130
Peter Hurleyb164c972015-01-22 12:24:25 -05002131 spin_lock_irq(&uport->lock);
2132 ops->stop_tx(uport);
2133 ops->set_mctrl(uport, 0);
2134 ops->stop_rx(uport);
2135 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002136
2137 /*
2138 * Wait for the transmitter to empty.
2139 */
Alan Coxccce6de2009-09-19 13:13:30 -07002140 for (tries = 3; !ops->tx_empty(uport) && tries; tries--)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002141 msleep(10);
Russell Kingc8c6bfa2008-02-04 22:27:52 -08002142 if (!tries)
Sudip Mukherjee2f2dafe2014-09-01 20:49:43 +05302143 dev_err(uport->dev, "%s%d: Unable to drain transmitter\n",
2144 drv->dev_name,
2145 drv->tty_driver->name_base + uport->line);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002146
Peter Hurleyb164c972015-01-22 12:24:25 -05002147 ops->shutdown(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002148 }
2149
2150 /*
2151 * Disable the console device before suspending.
2152 */
Peter Hurleyb164c972015-01-22 12:24:25 -05002153 if (uart_console(uport))
Alan Coxccce6de2009-09-19 13:13:30 -07002154 console_stop(uport->cons);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002155
Peter Hurleyb164c972015-01-22 12:24:25 -05002156 uart_change_pm(state, UART_PM_STATE_OFF);
2157unlock:
Alan Coxa2bceae2009-09-19 13:13:31 -07002158 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002159
2160 return 0;
2161}
2162
Alan Coxccce6de2009-09-19 13:13:30 -07002163int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002164{
Alan Coxccce6de2009-09-19 13:13:30 -07002165 struct uart_state *state = drv->state + uport->line;
2166 struct tty_port *port = &state->port;
Arjan van de Ven03a74dc2008-05-23 13:04:49 -07002167 struct device *tty_dev;
Alan Coxccce6de2009-09-19 13:13:30 -07002168 struct uart_match match = {uport, drv};
Deepak Saxenaba15ab02009-09-19 13:13:33 -07002169 struct ktermios termios;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002170
Alan Coxa2bceae2009-09-19 13:13:31 -07002171 mutex_lock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002172
Alan Coxccce6de2009-09-19 13:13:30 -07002173 tty_dev = device_find_child(uport->dev, &match, serial_match_port);
2174 if (!uport->suspended && device_may_wakeup(tty_dev)) {
Govindraj.R3f960db2010-12-16 18:12:47 +05302175 if (uport->irq_wake) {
2176 disable_irq_wake(uport->irq);
2177 uport->irq_wake = 0;
2178 }
Federico Vaga5a65dcc2013-04-15 16:01:07 +02002179 put_device(tty_dev);
Alan Coxa2bceae2009-09-19 13:13:31 -07002180 mutex_unlock(&port->mutex);
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002181 return 0;
2182 }
Federico Vaga5a65dcc2013-04-15 16:01:07 +02002183 put_device(tty_dev);
Alan Coxccce6de2009-09-19 13:13:30 -07002184 uport->suspended = 0;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002185
Linus Torvalds1da177e2005-04-16 15:20:36 -07002186 /*
2187 * Re-enable the console device after suspending.
2188 */
Yin Kangkai5933a162011-01-30 11:15:30 +08002189 if (uart_console(uport)) {
Jason Wang891b9dd2010-08-21 15:14:42 +08002190 /*
2191 * First try to use the console cflag setting.
2192 */
2193 memset(&termios, 0, sizeof(struct ktermios));
2194 termios.c_cflag = uport->cons->cflag;
2195
2196 /*
2197 * If that's unset, use the tty termios setting.
2198 */
Alan Coxadc8d742012-07-14 15:31:47 +01002199 if (port->tty && termios.c_cflag == 0)
2200 termios = port->tty->termios;
Jason Wang891b9dd2010-08-21 15:14:42 +08002201
Ning Jiang94abc562011-09-05 16:28:18 +08002202 if (console_suspend_enabled)
Linus Walleij6f538fe2012-12-07 11:36:08 +01002203 uart_change_pm(state, UART_PM_STATE_ON);
Alan Coxccce6de2009-09-19 13:13:30 -07002204 uport->ops->set_termios(uport, &termios, NULL);
Yin Kangkai5933a162011-01-30 11:15:30 +08002205 if (console_suspend_enabled)
2206 console_start(uport->cons);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002207 }
2208
Peter Hurley80f02d52016-04-09 17:53:24 -07002209 if (tty_port_suspended(port)) {
Alan Coxccce6de2009-09-19 13:13:30 -07002210 const struct uart_ops *ops = uport->ops;
Russell Kingee31b332005-11-13 15:28:51 +00002211 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002212
Linus Walleij6f538fe2012-12-07 11:36:08 +01002213 uart_change_pm(state, UART_PM_STATE_ON);
Alan Coxccce6de2009-09-19 13:13:30 -07002214 spin_lock_irq(&uport->lock);
2215 ops->set_mctrl(uport, 0);
2216 spin_unlock_irq(&uport->lock);
Stanislav Brabec4547be72009-12-02 16:20:56 +01002217 if (console_suspend_enabled || !uart_console(uport)) {
Alan Cox19225132010-06-01 22:52:51 +02002218 /* Protected by port mutex for now */
2219 struct tty_struct *tty = port->tty;
Stanislav Brabec4547be72009-12-02 16:20:56 +01002220 ret = ops->startup(uport);
2221 if (ret == 0) {
Alan Cox19225132010-06-01 22:52:51 +02002222 if (tty)
2223 uart_change_speed(tty, state, NULL);
Stanislav Brabec4547be72009-12-02 16:20:56 +01002224 spin_lock_irq(&uport->lock);
2225 ops->set_mctrl(uport, uport->mctrl);
2226 ops->start_tx(uport);
2227 spin_unlock_irq(&uport->lock);
Peter Hurleyd41861c2016-04-09 17:53:25 -07002228 tty_port_set_initialized(port, 1);
Stanislav Brabec4547be72009-12-02 16:20:56 +01002229 } else {
2230 /*
2231 * Failed to resume - maybe hardware went away?
2232 * Clear the "initialized" flag so we won't try
2233 * to call the low level drivers shutdown method.
2234 */
Alan Cox19225132010-06-01 22:52:51 +02002235 uart_shutdown(tty, state);
Stanislav Brabec4547be72009-12-02 16:20:56 +01002236 }
Russell Kingee31b332005-11-13 15:28:51 +00002237 }
Russell Kinga6b93a92006-10-01 17:17:40 +01002238
Peter Hurley80f02d52016-04-09 17:53:24 -07002239 tty_port_set_suspended(port, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002240 }
2241
Alan Coxa2bceae2009-09-19 13:13:31 -07002242 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002243
2244 return 0;
2245}
2246
2247static inline void
2248uart_report_port(struct uart_driver *drv, struct uart_port *port)
2249{
Russell King30b7a3b2005-09-03 15:30:21 +01002250 char address[64];
2251
Linus Torvalds1da177e2005-04-16 15:20:36 -07002252 switch (port->iotype) {
2253 case UPIO_PORT:
Andrew Morton9bde10a2008-10-13 10:35:42 +01002254 snprintf(address, sizeof(address), "I/O 0x%lx", port->iobase);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002255 break;
2256 case UPIO_HUB6:
Russell King30b7a3b2005-09-03 15:30:21 +01002257 snprintf(address, sizeof(address),
Andrew Morton9bde10a2008-10-13 10:35:42 +01002258 "I/O 0x%lx offset 0x%x", port->iobase, port->hub6);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002259 break;
2260 case UPIO_MEM:
Masahiro Yamadabd94c402015-10-28 12:46:05 +09002261 case UPIO_MEM16:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002262 case UPIO_MEM32:
Kevin Cernekee3ffb1a82014-11-12 12:53:59 -08002263 case UPIO_MEM32BE:
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00002264 case UPIO_AU:
Zang Roy-r619113be91ec2006-06-30 02:29:58 -07002265 case UPIO_TSI:
Russell King30b7a3b2005-09-03 15:30:21 +01002266 snprintf(address, sizeof(address),
Josh Boyer4f640ef2007-07-23 18:43:44 -07002267 "MMIO 0x%llx", (unsigned long long)port->mapbase);
Russell King30b7a3b2005-09-03 15:30:21 +01002268 break;
2269 default:
2270 strlcpy(address, "*unknown*", sizeof(address));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002271 break;
2272 }
Russell King30b7a3b2005-09-03 15:30:21 +01002273
James Bottomley68ed7e12015-01-02 10:05:13 -08002274 printk(KERN_INFO "%s%s%s%d at %s (irq = %d, base_baud = %d) is a %s\n",
2275 port->dev ? dev_name(port->dev) : "",
2276 port->dev ? ": " : "",
David S. Miller84408382008-10-13 10:45:26 +01002277 drv->dev_name,
2278 drv->tty_driver->name_base + port->line,
Kees Cook7d12b972013-07-12 13:07:39 -07002279 address, port->irq, port->uartclk / 16, uart_type(port));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002280}
2281
2282static void
2283uart_configure_port(struct uart_driver *drv, struct uart_state *state,
2284 struct uart_port *port)
2285{
2286 unsigned int flags;
2287
2288 /*
2289 * If there isn't a port here, don't do anything further.
2290 */
2291 if (!port->iobase && !port->mapbase && !port->membase)
2292 return;
2293
2294 /*
2295 * Now do the auto configuration stuff. Note that config_port
2296 * is expected to claim the resources and map the port for us.
2297 */
David Daney8e23fcc2009-01-02 13:49:54 +00002298 flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002299 if (port->flags & UPF_AUTO_IRQ)
2300 flags |= UART_CONFIG_IRQ;
2301 if (port->flags & UPF_BOOT_AUTOCONF) {
David Daney8e23fcc2009-01-02 13:49:54 +00002302 if (!(port->flags & UPF_FIXED_TYPE)) {
2303 port->type = PORT_UNKNOWN;
2304 flags |= UART_CONFIG_TYPE;
2305 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002306 port->ops->config_port(port, flags);
2307 }
2308
2309 if (port->type != PORT_UNKNOWN) {
2310 unsigned long flags;
2311
2312 uart_report_port(drv, port);
2313
George G. Davis3689a0e2007-02-14 00:33:06 -08002314 /* Power up port for set_mctrl() */
Linus Walleij6f538fe2012-12-07 11:36:08 +01002315 uart_change_pm(state, UART_PM_STATE_ON);
George G. Davis3689a0e2007-02-14 00:33:06 -08002316
Linus Torvalds1da177e2005-04-16 15:20:36 -07002317 /*
2318 * Ensure that the modem control lines are de-activated.
Yinghai Luc3e46422008-02-04 22:27:46 -08002319 * keep the DTR setting that is set in uart_set_options()
Linus Torvalds1da177e2005-04-16 15:20:36 -07002320 * We probably don't need a spinlock around this, but
2321 */
2322 spin_lock_irqsave(&port->lock, flags);
Yinghai Luc3e46422008-02-04 22:27:46 -08002323 port->ops->set_mctrl(port, port->mctrl & TIOCM_DTR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002324 spin_unlock_irqrestore(&port->lock, flags);
2325
2326 /*
Russell King97d97222007-09-01 21:25:09 +01002327 * If this driver supports console, and it hasn't been
2328 * successfully registered yet, try to re-register it.
2329 * It may be that the port was not available.
2330 */
2331 if (port->cons && !(port->cons->flags & CON_ENABLED))
2332 register_console(port->cons);
2333
2334 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002335 * Power down all ports by default, except the
2336 * console if we have one.
2337 */
2338 if (!uart_console(port))
Linus Walleij6f538fe2012-12-07 11:36:08 +01002339 uart_change_pm(state, UART_PM_STATE_OFF);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002340 }
2341}
2342
Jason Wesself2d937f2008-04-17 20:05:37 +02002343#ifdef CONFIG_CONSOLE_POLL
2344
2345static int uart_poll_init(struct tty_driver *driver, int line, char *options)
2346{
2347 struct uart_driver *drv = driver->driver_state;
2348 struct uart_state *state = drv->state + line;
Peter Hurley49c02302016-04-09 18:56:32 -07002349 struct tty_port *tport;
Jason Wesself2d937f2008-04-17 20:05:37 +02002350 struct uart_port *port;
2351 int baud = 9600;
2352 int bits = 8;
2353 int parity = 'n';
2354 int flow = 'n';
Peter Hurley49c02302016-04-09 18:56:32 -07002355 int ret = 0;
Jason Wesself2d937f2008-04-17 20:05:37 +02002356
Peter Hurley49c02302016-04-09 18:56:32 -07002357 if (!state)
Jason Wesself2d937f2008-04-17 20:05:37 +02002358 return -1;
2359
Peter Hurley49c02302016-04-09 18:56:32 -07002360 tport = &state->port;
2361 mutex_lock(&tport->mutex);
2362
Peter Hurley4047b372016-04-09 18:56:33 -07002363 port = uart_port_check(state);
2364 if (!port || !(port->ops->poll_get_char && port->ops->poll_put_char)) {
Peter Hurley49c02302016-04-09 18:56:32 -07002365 ret = -1;
2366 goto out;
2367 }
Jason Wesself2d937f2008-04-17 20:05:37 +02002368
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002369 if (port->ops->poll_init) {
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002370 /*
Peter Hurleyd41861c2016-04-09 17:53:25 -07002371 * We don't set initialized as we only initialized the hw,
2372 * e.g. state->xmit is still uninitialized.
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002373 */
Peter Hurleyd41861c2016-04-09 17:53:25 -07002374 if (!tty_port_initialized(tport))
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002375 ret = port->ops->poll_init(port);
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002376 }
2377
Peter Hurley49c02302016-04-09 18:56:32 -07002378 if (!ret && options) {
Jason Wesself2d937f2008-04-17 20:05:37 +02002379 uart_parse_options(options, &baud, &parity, &bits, &flow);
Peter Hurley49c02302016-04-09 18:56:32 -07002380 ret = uart_set_options(port, NULL, baud, parity, bits, flow);
Jason Wesself2d937f2008-04-17 20:05:37 +02002381 }
Peter Hurley49c02302016-04-09 18:56:32 -07002382out:
2383 mutex_unlock(&tport->mutex);
2384 return ret;
Jason Wesself2d937f2008-04-17 20:05:37 +02002385}
2386
2387static int uart_poll_get_char(struct tty_driver *driver, int line)
2388{
2389 struct uart_driver *drv = driver->driver_state;
2390 struct uart_state *state = drv->state + line;
2391 struct uart_port *port;
Peter Hurley9ed19422016-04-09 18:56:34 -07002392 int ret = -1;
Jason Wesself2d937f2008-04-17 20:05:37 +02002393
Peter Hurley9ed19422016-04-09 18:56:34 -07002394 if (state) {
2395 port = uart_port_ref(state);
2396 if (port)
2397 ret = port->ops->poll_get_char(port);
2398 uart_port_deref(port);
2399 }
2400 return ret;
Jason Wesself2d937f2008-04-17 20:05:37 +02002401}
2402
2403static void uart_poll_put_char(struct tty_driver *driver, int line, char ch)
2404{
2405 struct uart_driver *drv = driver->driver_state;
2406 struct uart_state *state = drv->state + line;
2407 struct uart_port *port;
2408
Peter Hurley9ed19422016-04-09 18:56:34 -07002409 port = uart_port_ref(state);
2410 if (!port)
2411 return;
Doug Andersonc7d44a02014-04-21 10:06:43 -07002412
2413 if (ch == '\n')
2414 port->ops->poll_put_char(port, '\r');
Jason Wesself2d937f2008-04-17 20:05:37 +02002415 port->ops->poll_put_char(port, ch);
Peter Hurley9ed19422016-04-09 18:56:34 -07002416 uart_port_deref(port);
Jason Wesself2d937f2008-04-17 20:05:37 +02002417}
2418#endif
2419
Jiri Slabyabad73a2019-04-17 10:58:53 +02002420static int uart_install(struct tty_driver *driver, struct tty_struct *tty)
2421{
2422 struct uart_driver *drv = driver->driver_state;
2423 struct uart_state *state = drv->state + tty->index;
2424
2425 tty->driver_data = state;
2426
2427 return tty_standard_install(driver, tty);
2428}
2429
Jeff Dikeb68e31d2006-10-02 02:17:18 -07002430static const struct tty_operations uart_ops = {
Jiri Slabyabad73a2019-04-17 10:58:53 +02002431 .install = uart_install,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002432 .open = uart_open,
2433 .close = uart_close,
2434 .write = uart_write,
2435 .put_char = uart_put_char,
2436 .flush_chars = uart_flush_chars,
2437 .write_room = uart_write_room,
2438 .chars_in_buffer= uart_chars_in_buffer,
2439 .flush_buffer = uart_flush_buffer,
2440 .ioctl = uart_ioctl,
2441 .throttle = uart_throttle,
2442 .unthrottle = uart_unthrottle,
2443 .send_xchar = uart_send_xchar,
2444 .set_termios = uart_set_termios,
Alan Cox64e91592008-06-03 15:18:54 +01002445 .set_ldisc = uart_set_ldisc,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002446 .stop = uart_stop,
2447 .start = uart_start,
2448 .hangup = uart_hangup,
2449 .break_ctl = uart_break_ctl,
2450 .wait_until_sent= uart_wait_until_sent,
2451#ifdef CONFIG_PROC_FS
Alexey Dobriyand196a942009-03-31 15:19:21 -07002452 .proc_fops = &uart_proc_fops,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002453#endif
2454 .tiocmget = uart_tiocmget,
2455 .tiocmset = uart_tiocmset,
Alan Coxd281da72010-09-16 18:21:24 +01002456 .get_icount = uart_get_icount,
Jason Wesself2d937f2008-04-17 20:05:37 +02002457#ifdef CONFIG_CONSOLE_POLL
2458 .poll_init = uart_poll_init,
2459 .poll_get_char = uart_poll_get_char,
2460 .poll_put_char = uart_poll_put_char,
2461#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07002462};
2463
Alan Coxde0c8cb2010-06-01 22:52:58 +02002464static const struct tty_port_operations uart_port_ops = {
2465 .carrier_raised = uart_carrier_raised,
2466 .dtr_rts = uart_dtr_rts,
Rob Herringb3b57642016-08-22 17:39:09 -05002467 .activate = uart_port_activate,
Rob Herring761ed4a2016-08-22 17:39:10 -05002468 .shutdown = uart_tty_port_shutdown,
Alan Coxde0c8cb2010-06-01 22:52:58 +02002469};
2470
Linus Torvalds1da177e2005-04-16 15:20:36 -07002471/**
2472 * uart_register_driver - register a driver with the uart core layer
2473 * @drv: low level driver structure
2474 *
2475 * Register a uart driver with the core driver. We in turn register
2476 * with the tty layer, and initialise the core driver per-port state.
2477 *
2478 * We have a proc file in /proc/tty/driver which is named after the
2479 * normal driver.
2480 *
2481 * drv->port should be NULL, and the per-port structures should be
2482 * registered using uart_add_one_port after this call has succeeded.
2483 */
2484int uart_register_driver(struct uart_driver *drv)
2485{
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002486 struct tty_driver *normal;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002487 int i, retval;
2488
2489 BUG_ON(drv->state);
2490
2491 /*
2492 * Maybe we should be using a slab cache for this, especially if
2493 * we have a large number of ports to handle.
2494 */
Burman Yan8f31bb32007-02-14 00:33:07 -08002495 drv->state = kzalloc(sizeof(struct uart_state) * drv->nr, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002496 if (!drv->state)
2497 goto out;
2498
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002499 normal = alloc_tty_driver(drv->nr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002500 if (!normal)
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002501 goto out_kfree;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002502
2503 drv->tty_driver = normal;
2504
Linus Torvalds1da177e2005-04-16 15:20:36 -07002505 normal->driver_name = drv->driver_name;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002506 normal->name = drv->dev_name;
2507 normal->major = drv->major;
2508 normal->minor_start = drv->minor;
2509 normal->type = TTY_DRIVER_TYPE_SERIAL;
2510 normal->subtype = SERIAL_TYPE_NORMAL;
2511 normal->init_termios = tty_std_termios;
2512 normal->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
Alan Cox606d0992006-12-08 02:38:45 -08002513 normal->init_termios.c_ispeed = normal->init_termios.c_ospeed = 9600;
Greg Kroah-Hartman331b8312005-06-20 21:15:16 -07002514 normal->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002515 normal->driver_state = drv;
2516 tty_set_operations(normal, &uart_ops);
2517
2518 /*
2519 * Initialise the UART state(s).
2520 */
2521 for (i = 0; i < drv->nr; i++) {
2522 struct uart_state *state = drv->state + i;
Alan Coxa2bceae2009-09-19 13:13:31 -07002523 struct tty_port *port = &state->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002524
Alan Coxa2bceae2009-09-19 13:13:31 -07002525 tty_port_init(port);
Alan Coxde0c8cb2010-06-01 22:52:58 +02002526 port->ops = &uart_port_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002527 }
2528
2529 retval = tty_register_driver(normal);
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002530 if (retval >= 0)
2531 return retval;
2532
Jiri Slaby191c5f12012-11-15 09:49:56 +01002533 for (i = 0; i < drv->nr; i++)
2534 tty_port_destroy(&drv->state[i].port);
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002535 put_tty_driver(normal);
2536out_kfree:
2537 kfree(drv->state);
2538out:
2539 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002540}
2541
2542/**
2543 * uart_unregister_driver - remove a driver from the uart core layer
2544 * @drv: low level driver structure
2545 *
2546 * Remove all references to a driver from the core driver. The low
2547 * level driver must have removed all its ports via the
2548 * uart_remove_one_port() if it registered them with uart_add_one_port().
2549 * (ie, drv->port == NULL)
2550 */
2551void uart_unregister_driver(struct uart_driver *drv)
2552{
2553 struct tty_driver *p = drv->tty_driver;
Jiri Slaby191c5f12012-11-15 09:49:56 +01002554 unsigned int i;
2555
Linus Torvalds1da177e2005-04-16 15:20:36 -07002556 tty_unregister_driver(p);
2557 put_tty_driver(p);
Jiri Slaby191c5f12012-11-15 09:49:56 +01002558 for (i = 0; i < drv->nr; i++)
2559 tty_port_destroy(&drv->state[i].port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002560 kfree(drv->state);
Alan Cox1e66cded2012-05-14 14:51:22 +01002561 drv->state = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002562 drv->tty_driver = NULL;
2563}
2564
2565struct tty_driver *uart_console_device(struct console *co, int *index)
2566{
2567 struct uart_driver *p = co->data;
2568 *index = co->index;
2569 return p->tty_driver;
2570}
2571
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002572static ssize_t uart_get_attr_uartclk(struct device *dev,
2573 struct device_attribute *attr, char *buf)
2574{
Alan Coxbebe73e2012-10-29 15:19:57 +00002575 struct serial_struct tmp;
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002576 struct tty_port *port = dev_get_drvdata(dev);
Tomas Hlavacekb1b79912012-09-06 23:17:47 +02002577
Alan Cox9f109692012-10-29 15:20:25 +00002578 uart_get_info(port, &tmp);
Alan Coxbebe73e2012-10-29 15:19:57 +00002579 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.baud_base * 16);
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002580}
2581
Alan Cox373bac42012-10-29 15:20:40 +00002582static ssize_t uart_get_attr_type(struct device *dev,
2583 struct device_attribute *attr, char *buf)
2584{
2585 struct serial_struct tmp;
2586 struct tty_port *port = dev_get_drvdata(dev);
2587
2588 uart_get_info(port, &tmp);
2589 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.type);
2590}
2591static ssize_t uart_get_attr_line(struct device *dev,
2592 struct device_attribute *attr, char *buf)
2593{
2594 struct serial_struct tmp;
2595 struct tty_port *port = dev_get_drvdata(dev);
2596
2597 uart_get_info(port, &tmp);
2598 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.line);
2599}
2600
2601static ssize_t uart_get_attr_port(struct device *dev,
2602 struct device_attribute *attr, char *buf)
2603{
2604 struct serial_struct tmp;
2605 struct tty_port *port = dev_get_drvdata(dev);
Andrew Mortonfd985e12012-11-26 15:47:15 -08002606 unsigned long ioaddr;
Alan Cox373bac42012-10-29 15:20:40 +00002607
2608 uart_get_info(port, &tmp);
Andrew Mortonfd985e12012-11-26 15:47:15 -08002609 ioaddr = tmp.port;
2610 if (HIGH_BITS_OFFSET)
2611 ioaddr |= (unsigned long)tmp.port_high << HIGH_BITS_OFFSET;
2612 return snprintf(buf, PAGE_SIZE, "0x%lX\n", ioaddr);
Alan Cox373bac42012-10-29 15:20:40 +00002613}
2614
2615static ssize_t uart_get_attr_irq(struct device *dev,
2616 struct device_attribute *attr, char *buf)
2617{
2618 struct serial_struct tmp;
2619 struct tty_port *port = dev_get_drvdata(dev);
2620
2621 uart_get_info(port, &tmp);
2622 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.irq);
2623}
2624
2625static ssize_t uart_get_attr_flags(struct device *dev,
2626 struct device_attribute *attr, char *buf)
2627{
2628 struct serial_struct tmp;
2629 struct tty_port *port = dev_get_drvdata(dev);
2630
2631 uart_get_info(port, &tmp);
2632 return snprintf(buf, PAGE_SIZE, "0x%X\n", tmp.flags);
2633}
2634
2635static ssize_t uart_get_attr_xmit_fifo_size(struct device *dev,
2636 struct device_attribute *attr, char *buf)
2637{
2638 struct serial_struct tmp;
2639 struct tty_port *port = dev_get_drvdata(dev);
2640
2641 uart_get_info(port, &tmp);
2642 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.xmit_fifo_size);
2643}
2644
2645
2646static ssize_t uart_get_attr_close_delay(struct device *dev,
2647 struct device_attribute *attr, char *buf)
2648{
2649 struct serial_struct tmp;
2650 struct tty_port *port = dev_get_drvdata(dev);
2651
2652 uart_get_info(port, &tmp);
2653 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.close_delay);
2654}
2655
2656
2657static ssize_t uart_get_attr_closing_wait(struct device *dev,
2658 struct device_attribute *attr, char *buf)
2659{
2660 struct serial_struct tmp;
2661 struct tty_port *port = dev_get_drvdata(dev);
2662
2663 uart_get_info(port, &tmp);
2664 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.closing_wait);
2665}
2666
2667static ssize_t uart_get_attr_custom_divisor(struct device *dev,
2668 struct device_attribute *attr, char *buf)
2669{
2670 struct serial_struct tmp;
2671 struct tty_port *port = dev_get_drvdata(dev);
2672
2673 uart_get_info(port, &tmp);
2674 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.custom_divisor);
2675}
2676
2677static ssize_t uart_get_attr_io_type(struct device *dev,
2678 struct device_attribute *attr, char *buf)
2679{
2680 struct serial_struct tmp;
2681 struct tty_port *port = dev_get_drvdata(dev);
2682
2683 uart_get_info(port, &tmp);
2684 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.io_type);
2685}
2686
2687static ssize_t uart_get_attr_iomem_base(struct device *dev,
2688 struct device_attribute *attr, char *buf)
2689{
2690 struct serial_struct tmp;
2691 struct tty_port *port = dev_get_drvdata(dev);
2692
2693 uart_get_info(port, &tmp);
2694 return snprintf(buf, PAGE_SIZE, "0x%lX\n", (unsigned long)tmp.iomem_base);
2695}
2696
2697static ssize_t uart_get_attr_iomem_reg_shift(struct device *dev,
2698 struct device_attribute *attr, char *buf)
2699{
2700 struct serial_struct tmp;
2701 struct tty_port *port = dev_get_drvdata(dev);
2702
2703 uart_get_info(port, &tmp);
2704 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.iomem_reg_shift);
2705}
2706
2707static DEVICE_ATTR(type, S_IRUSR | S_IRGRP, uart_get_attr_type, NULL);
2708static DEVICE_ATTR(line, S_IRUSR | S_IRGRP, uart_get_attr_line, NULL);
2709static DEVICE_ATTR(port, S_IRUSR | S_IRGRP, uart_get_attr_port, NULL);
2710static DEVICE_ATTR(irq, S_IRUSR | S_IRGRP, uart_get_attr_irq, NULL);
2711static DEVICE_ATTR(flags, S_IRUSR | S_IRGRP, uart_get_attr_flags, NULL);
2712static DEVICE_ATTR(xmit_fifo_size, S_IRUSR | S_IRGRP, uart_get_attr_xmit_fifo_size, NULL);
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002713static DEVICE_ATTR(uartclk, S_IRUSR | S_IRGRP, uart_get_attr_uartclk, NULL);
Alan Cox373bac42012-10-29 15:20:40 +00002714static DEVICE_ATTR(close_delay, S_IRUSR | S_IRGRP, uart_get_attr_close_delay, NULL);
2715static DEVICE_ATTR(closing_wait, S_IRUSR | S_IRGRP, uart_get_attr_closing_wait, NULL);
2716static DEVICE_ATTR(custom_divisor, S_IRUSR | S_IRGRP, uart_get_attr_custom_divisor, NULL);
2717static DEVICE_ATTR(io_type, S_IRUSR | S_IRGRP, uart_get_attr_io_type, NULL);
2718static DEVICE_ATTR(iomem_base, S_IRUSR | S_IRGRP, uart_get_attr_iomem_base, NULL);
2719static DEVICE_ATTR(iomem_reg_shift, S_IRUSR | S_IRGRP, uart_get_attr_iomem_reg_shift, NULL);
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002720
2721static struct attribute *tty_dev_attrs[] = {
Alan Cox373bac42012-10-29 15:20:40 +00002722 &dev_attr_type.attr,
2723 &dev_attr_line.attr,
2724 &dev_attr_port.attr,
2725 &dev_attr_irq.attr,
2726 &dev_attr_flags.attr,
2727 &dev_attr_xmit_fifo_size.attr,
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002728 &dev_attr_uartclk.attr,
Alan Cox373bac42012-10-29 15:20:40 +00002729 &dev_attr_close_delay.attr,
2730 &dev_attr_closing_wait.attr,
2731 &dev_attr_custom_divisor.attr,
2732 &dev_attr_io_type.attr,
2733 &dev_attr_iomem_base.attr,
2734 &dev_attr_iomem_reg_shift.attr,
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002735 NULL,
2736 };
2737
Tomas Hlavacekb1b79912012-09-06 23:17:47 +02002738static const struct attribute_group tty_dev_attr_group = {
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002739 .attrs = tty_dev_attrs,
2740 };
2741
Linus Torvalds1da177e2005-04-16 15:20:36 -07002742/**
2743 * uart_add_one_port - attach a driver-defined port structure
2744 * @drv: pointer to the uart low level driver structure for this port
Randy Dunlap1b9894f2009-09-21 11:12:03 -07002745 * @uport: uart port structure to use for this port.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002746 *
2747 * This allows the driver to register its own uart_port structure
2748 * with the core driver. The main purpose is to allow the low
2749 * level uart drivers to expand uart_port, rather than having yet
2750 * more levels of structures.
2751 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002752int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002753{
2754 struct uart_state *state;
Alan Coxa2bceae2009-09-19 13:13:31 -07002755 struct tty_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002756 int ret = 0;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002757 struct device *tty_dev;
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002758 int num_groups;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002759
2760 BUG_ON(in_interrupt());
2761
Alan Coxa2bceae2009-09-19 13:13:31 -07002762 if (uport->line >= drv->nr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002763 return -EINVAL;
2764
Alan Coxa2bceae2009-09-19 13:13:31 -07002765 state = drv->state + uport->line;
2766 port = &state->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002767
Arjan van de Venf392ecf2006-01-12 18:44:32 +00002768 mutex_lock(&port_mutex);
Alan Coxa2bceae2009-09-19 13:13:31 -07002769 mutex_lock(&port->mutex);
Alan Coxebd2c8f2009-09-19 13:13:28 -07002770 if (state->uart_port) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002771 ret = -EINVAL;
2772 goto out;
2773 }
2774
Peter Hurley2b702b92014-10-16 16:54:25 -04002775 /* Link the port to the driver state table and vice versa */
Peter Hurley9ed19422016-04-09 18:56:34 -07002776 atomic_set(&state->refcount, 1);
2777 init_waitqueue_head(&state->remove_wait);
Alan Coxa2bceae2009-09-19 13:13:31 -07002778 state->uart_port = uport;
Alan Coxa2bceae2009-09-19 13:13:31 -07002779 uport->state = state;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002780
Peter Hurley2b702b92014-10-16 16:54:25 -04002781 state->pm_state = UART_PM_STATE_UNDEFINED;
2782 uport->cons = drv->cons;
Peter Hurley959801f2015-02-24 14:25:00 -05002783 uport->minor = drv->tty_driver->minor_start + uport->line;
Peter Hurley2b702b92014-10-16 16:54:25 -04002784
Russell King976ecd12005-07-03 21:05:45 +01002785 /*
2786 * If this port is a console, then the spinlock is already
2787 * initialised.
2788 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002789 if (!(uart_console(uport) && (uport->cons->flags & CON_ENABLED))) {
2790 spin_lock_init(&uport->lock);
2791 lockdep_set_class(&uport->lock, &port_lock_key);
Ingo Molnar13e83592006-07-03 00:25:03 -07002792 }
Grant Likelya208ffd2014-03-27 18:29:46 -07002793 if (uport->cons && uport->dev)
2794 of_console_check(uport->dev->of_node, uport->cons->name, uport->line);
Russell King976ecd12005-07-03 21:05:45 +01002795
Alan Coxa2bceae2009-09-19 13:13:31 -07002796 uart_configure_port(drv, state, uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002797
Geert Uytterhoeven4dda8642016-10-28 07:07:47 -05002798 port->console = uart_console(uport);
2799
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002800 num_groups = 2;
2801 if (uport->attr_group)
2802 num_groups++;
2803
Yoshihiro YUNOMAEc2b703b2014-07-23 06:06:22 +00002804 uport->tty_groups = kcalloc(num_groups, sizeof(*uport->tty_groups),
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002805 GFP_KERNEL);
2806 if (!uport->tty_groups) {
2807 ret = -ENOMEM;
2808 goto out;
2809 }
2810 uport->tty_groups[0] = &tty_dev_attr_group;
2811 if (uport->attr_group)
2812 uport->tty_groups[1] = uport->attr_group;
2813
Linus Torvalds1da177e2005-04-16 15:20:36 -07002814 /*
2815 * Register the port whether it's detected or not. This allows
Geert Uytterhoeven015355b2014-03-11 11:23:36 +01002816 * setserial to be used to alter this port's parameters.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002817 */
Tomas Hlavacekb1b79912012-09-06 23:17:47 +02002818 tty_dev = tty_port_register_device_attr(port, drv->tty_driver,
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002819 uport->line, uport->dev, port, uport->tty_groups);
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002820 if (likely(!IS_ERR(tty_dev))) {
Simon Glass77359832012-01-19 11:28:56 -08002821 device_set_wakeup_capable(tty_dev, 1);
2822 } else {
Sudip Mukherjee2f2dafe2014-09-01 20:49:43 +05302823 dev_err(uport->dev, "Cannot register tty device on line %d\n",
Alan Coxa2bceae2009-09-19 13:13:31 -07002824 uport->line);
Simon Glass77359832012-01-19 11:28:56 -08002825 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002826
2827 /*
Russell King68ac64c2006-04-30 11:13:50 +01002828 * Ensure UPF_DEAD is not set.
2829 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002830 uport->flags &= ~UPF_DEAD;
Russell King68ac64c2006-04-30 11:13:50 +01002831
Linus Torvalds1da177e2005-04-16 15:20:36 -07002832 out:
Alan Coxa2bceae2009-09-19 13:13:31 -07002833 mutex_unlock(&port->mutex);
Arjan van de Venf392ecf2006-01-12 18:44:32 +00002834 mutex_unlock(&port_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002835
2836 return ret;
2837}
2838
2839/**
2840 * uart_remove_one_port - detach a driver defined port structure
2841 * @drv: pointer to the uart low level driver structure for this port
Randy Dunlap1b9894f2009-09-21 11:12:03 -07002842 * @uport: uart port structure for this port
Linus Torvalds1da177e2005-04-16 15:20:36 -07002843 *
2844 * This unhooks (and hangs up) the specified port structure from the
2845 * core driver. No further calls will be made to the low-level code
2846 * for this port.
2847 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002848int uart_remove_one_port(struct uart_driver *drv, struct uart_port *uport)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002849{
Alan Coxa2bceae2009-09-19 13:13:31 -07002850 struct uart_state *state = drv->state + uport->line;
2851 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07002852 struct uart_port *uart_port;
Geert Uytterhoeven4c6d5b42014-03-17 14:10:58 +01002853 struct tty_struct *tty;
Chen Gangb342dd52012-12-27 15:51:31 +08002854 int ret = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002855
2856 BUG_ON(in_interrupt());
2857
Arjan van de Venf392ecf2006-01-12 18:44:32 +00002858 mutex_lock(&port_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002859
2860 /*
Russell King68ac64c2006-04-30 11:13:50 +01002861 * Mark the port "dead" - this prevents any opens from
2862 * succeeding while we shut down the port.
2863 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002864 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07002865 uart_port = uart_port_check(state);
2866 if (uart_port != uport)
2867 dev_alert(uport->dev, "Removing wrong port: %p != %p\n",
2868 uart_port, uport);
2869
2870 if (!uart_port) {
Chen Gangb342dd52012-12-27 15:51:31 +08002871 mutex_unlock(&port->mutex);
2872 ret = -EINVAL;
2873 goto out;
2874 }
Alan Coxa2bceae2009-09-19 13:13:31 -07002875 uport->flags |= UPF_DEAD;
2876 mutex_unlock(&port->mutex);
Russell King68ac64c2006-04-30 11:13:50 +01002877
2878 /*
Greg Kroah-Hartmanaa4148c2005-06-20 21:15:16 -07002879 * Remove the devices from the tty layer
Linus Torvalds1da177e2005-04-16 15:20:36 -07002880 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002881 tty_unregister_device(drv->tty_driver, uport->line);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002882
Geert Uytterhoeven4c6d5b42014-03-17 14:10:58 +01002883 tty = tty_port_tty_get(port);
2884 if (tty) {
Alan Coxa2bceae2009-09-19 13:13:31 -07002885 tty_vhangup(port->tty);
Geert Uytterhoeven4c6d5b42014-03-17 14:10:58 +01002886 tty_kref_put(tty);
2887 }
Russell King68ac64c2006-04-30 11:13:50 +01002888
2889 /*
Geert Uytterhoeven5f5c9ae2014-02-28 14:21:32 +01002890 * If the port is used as a console, unregister it
2891 */
2892 if (uart_console(uport))
2893 unregister_console(uport->cons);
2894
2895 /*
Russell King68ac64c2006-04-30 11:13:50 +01002896 * Free the port IO and memory resources, if any.
2897 */
Fabio Estevama7cfaf12016-05-20 01:59:54 -03002898 if (uport->type != PORT_UNKNOWN && uport->ops->release_port)
Alan Coxa2bceae2009-09-19 13:13:31 -07002899 uport->ops->release_port(uport);
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002900 kfree(uport->tty_groups);
Russell King68ac64c2006-04-30 11:13:50 +01002901
2902 /*
2903 * Indicate that there isn't a port here anymore.
2904 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002905 uport->type = PORT_UNKNOWN;
Russell King68ac64c2006-04-30 11:13:50 +01002906
Peter Hurley4047b372016-04-09 18:56:33 -07002907 mutex_lock(&port->mutex);
Peter Hurley9ed19422016-04-09 18:56:34 -07002908 WARN_ON(atomic_dec_return(&state->refcount) < 0);
2909 wait_event(state->remove_wait, !atomic_read(&state->refcount));
Alan Coxebd2c8f2009-09-19 13:13:28 -07002910 state->uart_port = NULL;
Peter Hurley4047b372016-04-09 18:56:33 -07002911 mutex_unlock(&port->mutex);
Chen Gangb342dd52012-12-27 15:51:31 +08002912out:
Arjan van de Venf392ecf2006-01-12 18:44:32 +00002913 mutex_unlock(&port_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002914
Chen Gangb342dd52012-12-27 15:51:31 +08002915 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002916}
2917
2918/*
2919 * Are the two ports equivalent?
2920 */
2921int uart_match_port(struct uart_port *port1, struct uart_port *port2)
2922{
2923 if (port1->iotype != port2->iotype)
2924 return 0;
2925
2926 switch (port1->iotype) {
2927 case UPIO_PORT:
2928 return (port1->iobase == port2->iobase);
2929 case UPIO_HUB6:
2930 return (port1->iobase == port2->iobase) &&
2931 (port1->hub6 == port2->hub6);
2932 case UPIO_MEM:
Masahiro Yamadabd94c402015-10-28 12:46:05 +09002933 case UPIO_MEM16:
Sergei Shtylyovd21b55d2006-08-28 19:49:03 +04002934 case UPIO_MEM32:
Kevin Cernekee3ffb1a82014-11-12 12:53:59 -08002935 case UPIO_MEM32BE:
Sergei Shtylyovd21b55d2006-08-28 19:49:03 +04002936 case UPIO_AU:
2937 case UPIO_TSI:
Benjamin Herrenschmidt1624f002006-01-04 18:09:44 +00002938 return (port1->mapbase == port2->mapbase);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002939 }
2940 return 0;
2941}
2942EXPORT_SYMBOL(uart_match_port);
2943
Jiri Slaby027d7da2011-11-09 21:33:43 +01002944/**
2945 * uart_handle_dcd_change - handle a change of carrier detect state
2946 * @uport: uart_port structure for the open port
2947 * @status: new carrier detect status, nonzero if active
Peter Hurley4d90bb12014-09-10 15:06:23 -04002948 *
2949 * Caller must hold uport->lock
Jiri Slaby027d7da2011-11-09 21:33:43 +01002950 */
2951void uart_handle_dcd_change(struct uart_port *uport, unsigned int status)
2952{
George Spelvin42381572013-02-10 04:44:30 -05002953 struct tty_port *port = &uport->state->port;
Alan Cox43eca0a2012-09-19 15:35:46 +01002954 struct tty_struct *tty = port->tty;
Peter Hurleyc9932572014-09-02 17:39:21 -04002955 struct tty_ldisc *ld;
Jiri Slaby027d7da2011-11-09 21:33:43 +01002956
Peter Hurley4d90bb12014-09-10 15:06:23 -04002957 lockdep_assert_held_once(&uport->lock);
2958
Peter Hurleyc9932572014-09-02 17:39:21 -04002959 if (tty) {
2960 ld = tty_ldisc_ref(tty);
2961 if (ld) {
2962 if (ld->ops->dcd_change)
2963 ld->ops->dcd_change(tty, status);
2964 tty_ldisc_deref(ld);
2965 }
George Spelvin42381572013-02-10 04:44:30 -05002966 }
Jiri Slaby027d7da2011-11-09 21:33:43 +01002967
2968 uport->icount.dcd++;
Jiri Slaby027d7da2011-11-09 21:33:43 +01002969
Peter Hurley299245a2014-09-10 15:06:24 -04002970 if (uart_dcd_enabled(uport)) {
Jiri Slaby027d7da2011-11-09 21:33:43 +01002971 if (status)
2972 wake_up_interruptible(&port->open_wait);
Alan Cox43eca0a2012-09-19 15:35:46 +01002973 else if (tty)
2974 tty_hangup(tty);
Jiri Slaby027d7da2011-11-09 21:33:43 +01002975 }
Jiri Slaby027d7da2011-11-09 21:33:43 +01002976}
2977EXPORT_SYMBOL_GPL(uart_handle_dcd_change);
2978
2979/**
2980 * uart_handle_cts_change - handle a change of clear-to-send state
2981 * @uport: uart_port structure for the open port
2982 * @status: new clear to send status, nonzero if active
Peter Hurley4d90bb12014-09-10 15:06:23 -04002983 *
2984 * Caller must hold uport->lock
Jiri Slaby027d7da2011-11-09 21:33:43 +01002985 */
2986void uart_handle_cts_change(struct uart_port *uport, unsigned int status)
2987{
Peter Hurley4d90bb12014-09-10 15:06:23 -04002988 lockdep_assert_held_once(&uport->lock);
2989
Jiri Slaby027d7da2011-11-09 21:33:43 +01002990 uport->icount.cts++;
2991
Peter Hurley391f93f2015-01-25 14:44:51 -05002992 if (uart_softcts_mode(uport)) {
Peter Hurleyd01f4d12014-09-10 15:06:26 -04002993 if (uport->hw_stopped) {
Jiri Slaby027d7da2011-11-09 21:33:43 +01002994 if (status) {
Peter Hurleyd01f4d12014-09-10 15:06:26 -04002995 uport->hw_stopped = 0;
Jiri Slaby027d7da2011-11-09 21:33:43 +01002996 uport->ops->start_tx(uport);
2997 uart_write_wakeup(uport);
2998 }
2999 } else {
3000 if (!status) {
Peter Hurleyd01f4d12014-09-10 15:06:26 -04003001 uport->hw_stopped = 1;
Jiri Slaby027d7da2011-11-09 21:33:43 +01003002 uport->ops->stop_tx(uport);
3003 }
3004 }
Peter Hurley391f93f2015-01-25 14:44:51 -05003005
Jiri Slaby027d7da2011-11-09 21:33:43 +01003006 }
3007}
3008EXPORT_SYMBOL_GPL(uart_handle_cts_change);
3009
Jiri Slabycf755252011-11-09 21:33:47 +01003010/**
3011 * uart_insert_char - push a char to the uart layer
3012 *
3013 * User is responsible to call tty_flip_buffer_push when they are done with
3014 * insertion.
3015 *
3016 * @port: corresponding port
3017 * @status: state of the serial port RX buffer (LSR for 8250)
3018 * @overrun: mask of overrun bits in @status
3019 * @ch: character to push
3020 * @flag: flag for the character (see TTY_NORMAL and friends)
3021 */
Jiri Slaby027d7da2011-11-09 21:33:43 +01003022void uart_insert_char(struct uart_port *port, unsigned int status,
3023 unsigned int overrun, unsigned int ch, unsigned int flag)
3024{
Jiri Slaby92a19f92013-01-03 15:53:03 +01003025 struct tty_port *tport = &port->state->port;
Jiri Slaby027d7da2011-11-09 21:33:43 +01003026
3027 if ((status & port->ignore_status_mask & ~overrun) == 0)
Jiri Slaby92a19f92013-01-03 15:53:03 +01003028 if (tty_insert_flip_char(tport, ch, flag) == 0)
Corbindabfb352012-05-23 09:37:31 -05003029 ++port->icount.buf_overrun;
Jiri Slaby027d7da2011-11-09 21:33:43 +01003030
3031 /*
3032 * Overrun is special. Since it's reported immediately,
3033 * it doesn't affect the current character.
3034 */
3035 if (status & ~port->ignore_status_mask & overrun)
Jiri Slaby92a19f92013-01-03 15:53:03 +01003036 if (tty_insert_flip_char(tport, 0, TTY_OVERRUN) == 0)
Corbindabfb352012-05-23 09:37:31 -05003037 ++port->icount.buf_overrun;
Jiri Slaby027d7da2011-11-09 21:33:43 +01003038}
3039EXPORT_SYMBOL_GPL(uart_insert_char);
3040
Linus Torvalds1da177e2005-04-16 15:20:36 -07003041EXPORT_SYMBOL(uart_write_wakeup);
3042EXPORT_SYMBOL(uart_register_driver);
3043EXPORT_SYMBOL(uart_unregister_driver);
3044EXPORT_SYMBOL(uart_suspend_port);
3045EXPORT_SYMBOL(uart_resume_port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003046EXPORT_SYMBOL(uart_add_one_port);
3047EXPORT_SYMBOL(uart_remove_one_port);
3048
3049MODULE_DESCRIPTION("Serial driver core");
3050MODULE_LICENSE("GPL");