blob: 3701b240fcb3003e062424320b260382173933bd [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
Peter Hurley9ed19422016-04-09 18:56:34 -0700134 if (port && !uart_tx_stopped(port))
Russell Kingb129a8c2005-08-31 10:12:14 +0100135 port->ops->start_tx(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700136}
137
138static void uart_start(struct tty_struct *tty)
139{
140 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700141 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700142 unsigned long flags;
143
Peter Hurley9ed19422016-04-09 18:56:34 -0700144 port = uart_port_lock(state, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700145 __uart_start(tty);
Peter Hurley9ed19422016-04-09 18:56:34 -0700146 uart_port_unlock(port, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700147}
148
Denys Vlasenkof4581ca2015-10-27 17:40:01 +0100149static void
Linus Torvalds1da177e2005-04-16 15:20:36 -0700150uart_update_mctrl(struct uart_port *port, unsigned int set, unsigned int clear)
151{
152 unsigned long flags;
153 unsigned int old;
154
155 spin_lock_irqsave(&port->lock, flags);
156 old = port->mctrl;
157 port->mctrl = (old & ~clear) | set;
158 if (old != port->mctrl)
159 port->ops->set_mctrl(port, port->mctrl);
160 spin_unlock_irqrestore(&port->lock, flags);
161}
162
Alan Coxa46c9992008-02-08 04:18:53 -0800163#define uart_set_mctrl(port, set) uart_update_mctrl(port, set, 0)
164#define uart_clear_mctrl(port, clear) uart_update_mctrl(port, 0, clear)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700165
166/*
167 * Startup the port. This will be called once per open. All calls
Alan Coxdf4f4dd2008-07-16 21:53:50 +0100168 * will be serialised by the per-port mutex.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700169 */
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100170static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
171 int init_hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700172{
Peter Hurley4047b372016-04-09 18:56:33 -0700173 struct uart_port *uport = uart_port_check(state);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700174 unsigned long page;
Tycho Andersene5147bb2018-07-06 10:24:57 -0600175 unsigned long flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700176 int retval = 0;
177
Alan Cox46d57a42009-09-19 13:13:29 -0700178 if (uport->type == PORT_UNKNOWN)
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100179 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700180
181 /*
Thomas Pfaff7deb39e2014-04-23 12:33:22 +0200182 * Make sure the device is in D0 state.
183 */
184 uart_change_pm(state, UART_PM_STATE_ON);
185
186 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700187 * Initialise and allocate the transmit and temporary
188 * buffer.
189 */
Tycho Andersene5147bb2018-07-06 10:24:57 -0600190 page = get_zeroed_page(GFP_KERNEL);
191 if (!page)
192 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700193
Tycho Andersene5147bb2018-07-06 10:24:57 -0600194 uart_port_lock(state, flags);
195 if (!state->xmit.buf) {
Alan Coxebd2c8f2009-09-19 13:13:28 -0700196 state->xmit.buf = (unsigned char *) page;
197 uart_circ_clear(&state->xmit);
Sergey Senozhatsky80c8e522018-12-13 13:58:39 +0900198 uart_port_unlock(uport, flags);
Tycho Andersene5147bb2018-07-06 10:24:57 -0600199 } else {
Sergey Senozhatsky80c8e522018-12-13 13:58:39 +0900200 uart_port_unlock(uport, flags);
201 /*
202 * Do not free() the page under the port lock, see
203 * uart_shutdown().
204 */
Tycho Andersene5147bb2018-07-06 10:24:57 -0600205 free_page(page);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700206 }
207
Alan Cox46d57a42009-09-19 13:13:29 -0700208 retval = uport->ops->startup(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700209 if (retval == 0) {
Jiri Slabyc7d7abf2011-03-30 00:10:55 +0200210 if (uart_console(uport) && uport->cons->cflag) {
Alan Coxadc8d742012-07-14 15:31:47 +0100211 tty->termios.c_cflag = uport->cons->cflag;
Jiri Slabyc7d7abf2011-03-30 00:10:55 +0200212 uport->cons->cflag = 0;
213 }
214 /*
215 * Initialise the hardware port settings.
216 */
217 uart_change_speed(tty, state, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700218
Peter Hurley9db276f2016-01-10 20:36:15 -0800219 /*
220 * Setup the RTS and DTR signals once the
221 * port is open and ready to respond.
222 */
223 if (init_hw && C_BAUD(tty))
224 uart_set_mctrl(uport, TIOCM_RTS | TIOCM_DTR);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700225 }
226
Jiri Slaby00551972011-08-17 13:48:15 +0200227 /*
228 * This is to allow setserial on this port. People may want to set
229 * port/irq/type and then reconfigure the port properly if it failed
230 * now.
231 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700232 if (retval && capable(CAP_SYS_ADMIN))
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100233 return 1;
234
235 return retval;
236}
237
238static int uart_startup(struct tty_struct *tty, struct uart_state *state,
239 int init_hw)
240{
241 struct tty_port *port = &state->port;
242 int retval;
243
Peter Hurleyd41861c2016-04-09 17:53:25 -0700244 if (tty_port_initialized(port))
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100245 return 0;
246
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100247 retval = uart_port_startup(tty, state, init_hw);
Rob Herringb3b57642016-08-22 17:39:09 -0500248 if (retval)
249 set_bit(TTY_IO_ERROR, &tty->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700250
251 return retval;
252}
253
254/*
255 * This routine will shutdown a serial port; interrupts are disabled, and
256 * DTR is dropped if the hangup on close termio flag is on. Calls to
257 * uart_shutdown are serialised by the per-port semaphore.
Peter Hurleyaf224ca2016-04-09 18:56:35 -0700258 *
259 * uport == NULL if uart_port has already been removed
Linus Torvalds1da177e2005-04-16 15:20:36 -0700260 */
Alan Cox19225132010-06-01 22:52:51 +0200261static void uart_shutdown(struct tty_struct *tty, struct uart_state *state)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700262{
Peter Hurley4047b372016-04-09 18:56:33 -0700263 struct uart_port *uport = uart_port_check(state);
Alan Coxbdc04e32009-09-19 13:13:31 -0700264 struct tty_port *port = &state->port;
Tycho Andersene5147bb2018-07-06 10:24:57 -0600265 unsigned long flags = 0;
Sergey Senozhatsky80c8e522018-12-13 13:58:39 +0900266 char *xmit_buf = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700267
Russell Kingee31b332005-11-13 15:28:51 +0000268 /*
269 * Set the TTY IO error marker
270 */
Alan Coxf7519282009-01-02 13:49:21 +0000271 if (tty)
272 set_bit(TTY_IO_ERROR, &tty->flags);
Russell Kingee31b332005-11-13 15:28:51 +0000273
Peter Hurleyd41861c2016-04-09 17:53:25 -0700274 if (tty_port_initialized(port)) {
275 tty_port_set_initialized(port, 0);
276
Russell Kingee31b332005-11-13 15:28:51 +0000277 /*
278 * Turn off DTR and RTS early.
279 */
Peter Hurleyaf224ca2016-04-09 18:56:35 -0700280 if (uport && uart_console(uport) && tty)
Peter Hurleyae84db92014-07-09 09:21:14 -0400281 uport->cons->cflag = tty->termios.c_cflag;
282
Peter Hurley9db276f2016-01-10 20:36:15 -0800283 if (!tty || C_HUPCL(tty))
Alan Coxccce6de2009-09-19 13:13:30 -0700284 uart_clear_mctrl(uport, TIOCM_DTR | TIOCM_RTS);
Russell Kingee31b332005-11-13 15:28:51 +0000285
Jiri Slabyb922e192011-11-09 21:33:51 +0100286 uart_port_shutdown(port);
Russell Kingee31b332005-11-13 15:28:51 +0000287 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700288
289 /*
Doug Andersond208a3b2011-10-19 11:52:01 -0700290 * It's possible for shutdown to be called after suspend if we get
291 * a DCD drop (hangup) at just the right time. Clear suspended bit so
292 * we don't try to resume a port that has been shutdown.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700293 */
Peter Hurley80f02d52016-04-09 17:53:24 -0700294 tty_port_set_suspended(port, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700295
296 /*
Sergey Senozhatsky80c8e522018-12-13 13:58:39 +0900297 * Do not free() the transmit buffer page under the port lock since
298 * this can create various circular locking scenarios. For instance,
299 * console driver may need to allocate/free a debug object, which
300 * can endup in printk() recursion.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700301 */
Tycho Andersene5147bb2018-07-06 10:24:57 -0600302 uart_port_lock(state, flags);
Sergey Senozhatsky80c8e522018-12-13 13:58:39 +0900303 xmit_buf = state->xmit.buf;
304 state->xmit.buf = NULL;
Tycho Andersene5147bb2018-07-06 10:24:57 -0600305 uart_port_unlock(uport, flags);
Sergey Senozhatsky80c8e522018-12-13 13:58:39 +0900306
307 if (xmit_buf)
308 free_page((unsigned long)xmit_buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700309}
310
311/**
312 * uart_update_timeout - update per-port FIFO timeout.
313 * @port: uart_port structure describing the port
314 * @cflag: termios cflag value
315 * @baud: speed of the port
316 *
317 * Set the port FIFO timeout value. The @cflag value should
318 * reflect the actual hardware settings.
319 */
320void
321uart_update_timeout(struct uart_port *port, unsigned int cflag,
322 unsigned int baud)
323{
324 unsigned int bits;
325
326 /* byte size and parity */
327 switch (cflag & CSIZE) {
328 case CS5:
329 bits = 7;
330 break;
331 case CS6:
332 bits = 8;
333 break;
334 case CS7:
335 bits = 9;
336 break;
337 default:
338 bits = 10;
Alan Coxa46c9992008-02-08 04:18:53 -0800339 break; /* CS8 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700340 }
341
342 if (cflag & CSTOPB)
343 bits++;
344 if (cflag & PARENB)
345 bits++;
346
347 /*
348 * The total number of bits to be transmitted in the fifo.
349 */
350 bits = bits * port->fifosize;
351
352 /*
353 * Figure the timeout to send the above number of bits.
354 * Add .02 seconds of slop
355 */
356 port->timeout = (HZ * bits) / baud + HZ/50;
357}
358
359EXPORT_SYMBOL(uart_update_timeout);
360
361/**
362 * uart_get_baud_rate - return baud rate for a particular port
363 * @port: uart_port structure describing the port in question.
364 * @termios: desired termios settings.
365 * @old: old termios (or NULL)
366 * @min: minimum acceptable baud rate
367 * @max: maximum acceptable baud rate
368 *
369 * Decode the termios structure into a numeric baud rate,
370 * taking account of the magic 38400 baud rate (with spd_*
371 * flags), and mapping the %B0 rate to 9600 baud.
372 *
373 * If the new baud rate is invalid, try the old termios setting.
374 * If it's still invalid, we try 9600 baud.
375 *
376 * Update the @termios structure to reflect the baud rate
Alan Coxeb424fd2008-04-28 02:14:07 -0700377 * we're actually going to be using. Don't do this for the case
378 * where B0 is requested ("hang up").
Linus Torvalds1da177e2005-04-16 15:20:36 -0700379 */
380unsigned int
Alan Cox606d0992006-12-08 02:38:45 -0800381uart_get_baud_rate(struct uart_port *port, struct ktermios *termios,
382 struct ktermios *old, unsigned int min, unsigned int max)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700383{
Joakim Nordellf10a2232015-06-08 14:56:51 +0200384 unsigned int try;
385 unsigned int baud;
386 unsigned int altbaud;
Alan Coxeb424fd2008-04-28 02:14:07 -0700387 int hung_up = 0;
Russell King0077d452006-01-21 23:03:28 +0000388 upf_t flags = port->flags & UPF_SPD_MASK;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700389
Joakim Nordellf10a2232015-06-08 14:56:51 +0200390 switch (flags) {
391 case UPF_SPD_HI:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700392 altbaud = 57600;
Joakim Nordellf10a2232015-06-08 14:56:51 +0200393 break;
394 case UPF_SPD_VHI:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700395 altbaud = 115200;
Joakim Nordellf10a2232015-06-08 14:56:51 +0200396 break;
397 case UPF_SPD_SHI:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700398 altbaud = 230400;
Joakim Nordellf10a2232015-06-08 14:56:51 +0200399 break;
400 case UPF_SPD_WARP:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700401 altbaud = 460800;
Joakim Nordellf10a2232015-06-08 14:56:51 +0200402 break;
403 default:
404 altbaud = 38400;
405 break;
406 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700407
408 for (try = 0; try < 2; try++) {
409 baud = tty_termios_baud_rate(termios);
410
411 /*
412 * The spd_hi, spd_vhi, spd_shi, spd_warp kludge...
413 * Die! Die! Die!
414 */
Peter Hurley547039e2014-10-16 13:46:38 -0400415 if (try == 0 && baud == 38400)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700416 baud = altbaud;
417
418 /*
419 * Special case: B0 rate.
420 */
Alan Coxeb424fd2008-04-28 02:14:07 -0700421 if (baud == 0) {
422 hung_up = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700423 baud = 9600;
Alan Coxeb424fd2008-04-28 02:14:07 -0700424 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700425
426 if (baud >= min && baud <= max)
427 return baud;
428
429 /*
430 * Oops, the quotient was zero. Try again with
431 * the old baud rate if possible.
432 */
433 termios->c_cflag &= ~CBAUD;
434 if (old) {
Alan Cox6d4d67b2008-02-04 22:27:53 -0800435 baud = tty_termios_baud_rate(old);
Alan Coxeb424fd2008-04-28 02:14:07 -0700436 if (!hung_up)
437 tty_termios_encode_baud_rate(termios,
438 baud, baud);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700439 old = NULL;
440 continue;
441 }
442
443 /*
Alan Cox16ae2a82010-01-04 16:26:21 +0000444 * As a last resort, if the range cannot be met then clip to
445 * the nearest chip supported rate.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700446 */
Alan Cox16ae2a82010-01-04 16:26:21 +0000447 if (!hung_up) {
448 if (baud <= min)
449 tty_termios_encode_baud_rate(termios,
450 min + 1, min + 1);
451 else
452 tty_termios_encode_baud_rate(termios,
453 max - 1, max - 1);
454 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700455 }
Alan Cox16ae2a82010-01-04 16:26:21 +0000456 /* Should never happen */
457 WARN_ON(1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700458 return 0;
459}
460
461EXPORT_SYMBOL(uart_get_baud_rate);
462
463/**
464 * uart_get_divisor - return uart clock divisor
465 * @port: uart_port structure describing the port.
466 * @baud: desired baud rate
467 *
468 * Calculate the uart clock divisor for the port.
469 */
470unsigned int
471uart_get_divisor(struct uart_port *port, unsigned int baud)
472{
473 unsigned int quot;
474
475 /*
476 * Old custom speed handling.
477 */
478 if (baud == 38400 && (port->flags & UPF_SPD_MASK) == UPF_SPD_CUST)
479 quot = port->custom_divisor;
480 else
Uwe Kleine-König97d24632011-12-20 11:47:44 +0100481 quot = DIV_ROUND_CLOSEST(port->uartclk, 16 * baud);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700482
483 return quot;
484}
485
486EXPORT_SYMBOL(uart_get_divisor);
487
Peter Hurley7c8ab962014-10-16 16:54:20 -0400488/* Caller holds port mutex */
Alan Cox19225132010-06-01 22:52:51 +0200489static void uart_change_speed(struct tty_struct *tty, struct uart_state *state,
490 struct ktermios *old_termios)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700491{
Peter Hurley4047b372016-04-09 18:56:33 -0700492 struct uart_port *uport = uart_port_check(state);
Alan Cox606d0992006-12-08 02:38:45 -0800493 struct ktermios *termios;
Peter Hurley391f93f2015-01-25 14:44:51 -0500494 int hw_stopped;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700495
496 /*
497 * If we have no tty, termios, or the port does not exist,
498 * then we can't set the parameters for this port.
499 */
Alan Coxadc8d742012-07-14 15:31:47 +0100500 if (!tty || uport->type == PORT_UNKNOWN)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700501 return;
502
Alan Coxadc8d742012-07-14 15:31:47 +0100503 termios = &tty->termios;
Peter Hurleyc18b55f2014-06-16 09:17:09 -0400504 uport->ops->set_termios(uport, termios, old_termios);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700505
506 /*
Peter Hurley299245a2014-09-10 15:06:24 -0400507 * Set modem status enables based on termios cflag
Linus Torvalds1da177e2005-04-16 15:20:36 -0700508 */
Peter Hurley299245a2014-09-10 15:06:24 -0400509 spin_lock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700510 if (termios->c_cflag & CRTSCTS)
Peter Hurley299245a2014-09-10 15:06:24 -0400511 uport->status |= UPSTAT_CTS_ENABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700512 else
Peter Hurley299245a2014-09-10 15:06:24 -0400513 uport->status &= ~UPSTAT_CTS_ENABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700514
515 if (termios->c_cflag & CLOCAL)
Peter Hurley299245a2014-09-10 15:06:24 -0400516 uport->status &= ~UPSTAT_DCD_ENABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700517 else
Peter Hurley299245a2014-09-10 15:06:24 -0400518 uport->status |= UPSTAT_DCD_ENABLE;
Peter Hurley391f93f2015-01-25 14:44:51 -0500519
520 /* reset sw-assisted CTS flow control based on (possibly) new mode */
521 hw_stopped = uport->hw_stopped;
522 uport->hw_stopped = uart_softcts_mode(uport) &&
523 !(uport->ops->get_mctrl(uport) & TIOCM_CTS);
524 if (uport->hw_stopped) {
525 if (!hw_stopped)
526 uport->ops->stop_tx(uport);
527 } else {
528 if (hw_stopped)
529 __uart_start(tty);
530 }
Peter Hurley299245a2014-09-10 15:06:24 -0400531 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700532}
533
Peter Hurleyf5291ec2016-01-10 20:23:55 -0800534static int uart_put_char(struct tty_struct *tty, unsigned char c)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700535{
Peter Hurleyf5291ec2016-01-10 20:23:55 -0800536 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700537 struct uart_port *port;
Peter Hurleyf5291ec2016-01-10 20:23:55 -0800538 struct circ_buf *circ;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700539 unsigned long flags;
Alan Cox23d22ce2008-04-30 00:54:11 -0700540 int ret = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700541
Peter Hurleyf5291ec2016-01-10 20:23:55 -0800542 circ = &state->xmit;
Peter Hurley9ed19422016-04-09 18:56:34 -0700543 port = uart_port_lock(state, flags);
Samir Virmanib7bd4a22019-01-16 10:28:07 -0800544 if (!circ->buf) {
545 uart_port_unlock(port, flags);
546 return 0;
547 }
548
Peter Hurley9ed19422016-04-09 18:56:34 -0700549 if (port && uart_circ_chars_free(circ) != 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700550 circ->buf[circ->head] = c;
551 circ->head = (circ->head + 1) & (UART_XMIT_SIZE - 1);
Alan Cox23d22ce2008-04-30 00:54:11 -0700552 ret = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700553 }
Peter Hurley9ed19422016-04-09 18:56:34 -0700554 uart_port_unlock(port, flags);
Alan Cox23d22ce2008-04-30 00:54:11 -0700555 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700556}
557
Linus Torvalds1da177e2005-04-16 15:20:36 -0700558static void uart_flush_chars(struct tty_struct *tty)
559{
560 uart_start(tty);
561}
562
Alan Cox19225132010-06-01 22:52:51 +0200563static int uart_write(struct tty_struct *tty,
564 const unsigned char *buf, int count)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700565{
566 struct uart_state *state = tty->driver_data;
Pavel Machekd5f735e2006-03-07 21:55:20 -0800567 struct uart_port *port;
568 struct circ_buf *circ;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700569 unsigned long flags;
570 int c, ret = 0;
571
Pavel Machekd5f735e2006-03-07 21:55:20 -0800572 /*
573 * This means you called this function _after_ the port was
574 * closed. No cookie for you.
575 */
Alan Coxf7519282009-01-02 13:49:21 +0000576 if (!state) {
Pavel Machekd5f735e2006-03-07 21:55:20 -0800577 WARN_ON(1);
578 return -EL3HLT;
579 }
580
Peter Hurley9ed19422016-04-09 18:56:34 -0700581 port = uart_port_lock(state, flags);
Samir Virmanib7bd4a22019-01-16 10:28:07 -0800582 circ = &state->xmit;
583 if (!circ->buf) {
584 uart_port_unlock(port, flags);
585 return 0;
586 }
587
Peter Hurley9ed19422016-04-09 18:56:34 -0700588 while (port) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700589 c = CIRC_SPACE_TO_END(circ->head, circ->tail, UART_XMIT_SIZE);
590 if (count < c)
591 c = count;
592 if (c <= 0)
593 break;
594 memcpy(circ->buf + circ->head, buf, c);
595 circ->head = (circ->head + c) & (UART_XMIT_SIZE - 1);
596 buf += c;
597 count -= c;
598 ret += c;
599 }
Peter Hurley64dbee32014-10-16 16:54:26 -0400600
601 __uart_start(tty);
Peter Hurley9ed19422016-04-09 18:56:34 -0700602 uart_port_unlock(port, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700603 return ret;
604}
605
606static int uart_write_room(struct tty_struct *tty)
607{
608 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700609 struct uart_port *port;
Alan Coxf34d7a52008-04-30 00:54:13 -0700610 unsigned long flags;
611 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700612
Peter Hurley9ed19422016-04-09 18:56:34 -0700613 port = uart_port_lock(state, flags);
Alan Coxebd2c8f2009-09-19 13:13:28 -0700614 ret = uart_circ_chars_free(&state->xmit);
Peter Hurley9ed19422016-04-09 18:56:34 -0700615 uart_port_unlock(port, flags);
Alan Coxf34d7a52008-04-30 00:54:13 -0700616 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700617}
618
619static int uart_chars_in_buffer(struct tty_struct *tty)
620{
621 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700622 struct uart_port *port;
Alan Coxf34d7a52008-04-30 00:54:13 -0700623 unsigned long flags;
624 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700625
Peter Hurley9ed19422016-04-09 18:56:34 -0700626 port = uart_port_lock(state, flags);
Alan Coxebd2c8f2009-09-19 13:13:28 -0700627 ret = uart_circ_chars_pending(&state->xmit);
Peter Hurley9ed19422016-04-09 18:56:34 -0700628 uart_port_unlock(port, flags);
Alan Coxf34d7a52008-04-30 00:54:13 -0700629 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700630}
631
632static void uart_flush_buffer(struct tty_struct *tty)
633{
634 struct uart_state *state = tty->driver_data;
Tetsuo Handa55d7b682008-05-06 20:42:27 -0700635 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700636 unsigned long flags;
637
Pavel Machekd5f735e2006-03-07 21:55:20 -0800638 /*
639 * This means you called this function _after_ the port was
640 * closed. No cookie for you.
641 */
Alan Coxf7519282009-01-02 13:49:21 +0000642 if (!state) {
Pavel Machekd5f735e2006-03-07 21:55:20 -0800643 WARN_ON(1);
644 return;
645 }
646
Jiri Slabyeb3a1e12007-05-06 14:48:52 -0700647 pr_debug("uart_flush_buffer(%d) called\n", tty->index);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700648
Peter Hurley9ed19422016-04-09 18:56:34 -0700649 port = uart_port_lock(state, flags);
650 if (!port)
651 return;
Alan Coxebd2c8f2009-09-19 13:13:28 -0700652 uart_circ_clear(&state->xmit);
Haavard Skinnemoen6bb0e3a2008-07-16 21:52:36 +0100653 if (port->ops->flush_buffer)
654 port->ops->flush_buffer(port);
Peter Hurley9ed19422016-04-09 18:56:34 -0700655 uart_port_unlock(port, flags);
Rob Herringd0f4bce2016-10-28 07:07:48 -0500656 tty_port_tty_wakeup(&state->port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700657}
658
659/*
660 * This function is used to send a high-priority XON/XOFF character to
661 * the device
662 */
663static void uart_send_xchar(struct tty_struct *tty, char ch)
664{
665 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700666 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700667 unsigned long flags;
668
Peter Hurley9ed19422016-04-09 18:56:34 -0700669 port = uart_port_ref(state);
670 if (!port)
671 return;
672
Linus Torvalds1da177e2005-04-16 15:20:36 -0700673 if (port->ops->send_xchar)
674 port->ops->send_xchar(port, ch);
675 else {
Peter Hurleyc235ccc2014-09-02 17:39:13 -0400676 spin_lock_irqsave(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700677 port->x_char = ch;
Peter Hurleyc235ccc2014-09-02 17:39:13 -0400678 if (ch)
Russell Kingb129a8c2005-08-31 10:12:14 +0100679 port->ops->start_tx(port);
Peter Hurleyc235ccc2014-09-02 17:39:13 -0400680 spin_unlock_irqrestore(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700681 }
Peter Hurley9ed19422016-04-09 18:56:34 -0700682 uart_port_deref(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700683}
684
685static void uart_throttle(struct tty_struct *tty)
686{
687 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700688 struct uart_port *port;
Peter Hurley391f93f2015-01-25 14:44:51 -0500689 upstat_t mask = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700690
Peter Hurley9ed19422016-04-09 18:56:34 -0700691 port = uart_port_ref(state);
692 if (!port)
693 return;
694
Linus Torvalds1da177e2005-04-16 15:20:36 -0700695 if (I_IXOFF(tty))
Peter Hurley391f93f2015-01-25 14:44:51 -0500696 mask |= UPSTAT_AUTOXOFF;
Peter Hurley9db276f2016-01-10 20:36:15 -0800697 if (C_CRTSCTS(tty))
Peter Hurley391f93f2015-01-25 14:44:51 -0500698 mask |= UPSTAT_AUTORTS;
Russell King9aba8d5b2012-04-17 17:23:14 +0100699
Peter Hurley391f93f2015-01-25 14:44:51 -0500700 if (port->status & mask) {
Russell King9aba8d5b2012-04-17 17:23:14 +0100701 port->ops->throttle(port);
Peter Hurley391f93f2015-01-25 14:44:51 -0500702 mask &= ~port->status;
Russell King9aba8d5b2012-04-17 17:23:14 +0100703 }
704
Peter Hurley391f93f2015-01-25 14:44:51 -0500705 if (mask & UPSTAT_AUTORTS)
Russell King9aba8d5b2012-04-17 17:23:14 +0100706 uart_clear_mctrl(port, TIOCM_RTS);
Peter Hurleyb4749b92016-01-10 20:24:02 -0800707
708 if (mask & UPSTAT_AUTOXOFF)
709 uart_send_xchar(tty, STOP_CHAR(tty));
Peter Hurley9ed19422016-04-09 18:56:34 -0700710
711 uart_port_deref(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700712}
713
714static void uart_unthrottle(struct tty_struct *tty)
715{
716 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700717 struct uart_port *port;
Peter Hurley391f93f2015-01-25 14:44:51 -0500718 upstat_t mask = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700719
Greg Kroah-Hartmand13ed612019-01-31 17:43:16 +0800720 if (!state)
721 return;
722
Peter Hurley9ed19422016-04-09 18:56:34 -0700723 port = uart_port_ref(state);
724 if (!port)
725 return;
726
Russell King9aba8d5b2012-04-17 17:23:14 +0100727 if (I_IXOFF(tty))
Peter Hurley391f93f2015-01-25 14:44:51 -0500728 mask |= UPSTAT_AUTOXOFF;
Peter Hurley9db276f2016-01-10 20:36:15 -0800729 if (C_CRTSCTS(tty))
Peter Hurley391f93f2015-01-25 14:44:51 -0500730 mask |= UPSTAT_AUTORTS;
Russell King9aba8d5b2012-04-17 17:23:14 +0100731
Peter Hurley391f93f2015-01-25 14:44:51 -0500732 if (port->status & mask) {
Russell King9aba8d5b2012-04-17 17:23:14 +0100733 port->ops->unthrottle(port);
Peter Hurley391f93f2015-01-25 14:44:51 -0500734 mask &= ~port->status;
Russell King9aba8d5b2012-04-17 17:23:14 +0100735 }
736
Peter Hurley391f93f2015-01-25 14:44:51 -0500737 if (mask & UPSTAT_AUTORTS)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700738 uart_set_mctrl(port, TIOCM_RTS);
Peter Hurleyb4749b92016-01-10 20:24:02 -0800739
740 if (mask & UPSTAT_AUTOXOFF)
741 uart_send_xchar(tty, START_CHAR(tty));
Peter Hurley9ed19422016-04-09 18:56:34 -0700742
743 uart_port_deref(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700744}
745
Peter Hurley4047b372016-04-09 18:56:33 -0700746static int uart_get_info(struct tty_port *port, struct serial_struct *retinfo)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700747{
Alan Cox9f109692012-10-29 15:20:25 +0000748 struct uart_state *state = container_of(port, struct uart_state, port);
Peter Hurley4047b372016-04-09 18:56:33 -0700749 struct uart_port *uport;
750 int ret = -ENODEV;
Alan Cox7ba2e762012-09-04 16:34:45 +0100751
Fengguang Wu37cd0c92012-09-06 10:27:51 +0800752 memset(retinfo, 0, sizeof(*retinfo));
Alan Cox7ba2e762012-09-04 16:34:45 +0100753
Peter Hurley3abe8c72016-01-10 20:23:56 -0800754 /*
755 * Ensure the state we copy is consistent and no hardware changes
756 * occur as we go
757 */
758 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -0700759 uport = uart_port_check(state);
760 if (!uport)
761 goto out;
762
Alan Cox7ba2e762012-09-04 16:34:45 +0100763 retinfo->type = uport->type;
764 retinfo->line = uport->line;
765 retinfo->port = uport->iobase;
766 if (HIGH_BITS_OFFSET)
767 retinfo->port_high = (long) uport->iobase >> HIGH_BITS_OFFSET;
768 retinfo->irq = uport->irq;
769 retinfo->flags = uport->flags;
770 retinfo->xmit_fifo_size = uport->fifosize;
771 retinfo->baud_base = uport->uartclk / 16;
772 retinfo->close_delay = jiffies_to_msecs(port->close_delay) / 10;
773 retinfo->closing_wait = port->closing_wait == ASYNC_CLOSING_WAIT_NONE ?
774 ASYNC_CLOSING_WAIT_NONE :
775 jiffies_to_msecs(port->closing_wait) / 10;
776 retinfo->custom_divisor = uport->custom_divisor;
777 retinfo->hub6 = uport->hub6;
778 retinfo->io_type = uport->iotype;
779 retinfo->iomem_reg_shift = uport->regshift;
780 retinfo->iomem_base = (void *)(unsigned long)uport->mapbase;
Peter Hurley4047b372016-04-09 18:56:33 -0700781
782 ret = 0;
783out:
Alan Coxa2bceae2009-09-19 13:13:31 -0700784 mutex_unlock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -0700785 return ret;
Alan Cox9f109692012-10-29 15:20:25 +0000786}
787
788static int uart_get_info_user(struct tty_port *port,
789 struct serial_struct __user *retinfo)
790{
791 struct serial_struct tmp;
Peter Hurley3abe8c72016-01-10 20:23:56 -0800792
Peter Hurley4047b372016-04-09 18:56:33 -0700793 if (uart_get_info(port, &tmp) < 0)
794 return -EIO;
Alan Coxf34d7a52008-04-30 00:54:13 -0700795
Linus Torvalds1da177e2005-04-16 15:20:36 -0700796 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
797 return -EFAULT;
798 return 0;
799}
800
Alan Cox7ba2e762012-09-04 16:34:45 +0100801static int uart_set_info(struct tty_struct *tty, struct tty_port *port,
802 struct uart_state *state,
803 struct serial_struct *new_info)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700804{
Peter Hurley4047b372016-04-09 18:56:33 -0700805 struct uart_port *uport = uart_port_check(state);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700806 unsigned long new_port;
Russell King0077d452006-01-21 23:03:28 +0000807 unsigned int change_irq, change_port, closing_wait;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700808 unsigned int old_custom_divisor, close_delay;
Russell King0077d452006-01-21 23:03:28 +0000809 upf_t old_flags, new_flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700810 int retval = 0;
811
Peter Hurley4047b372016-04-09 18:56:33 -0700812 if (!uport)
813 return -EIO;
814
Alan Cox7ba2e762012-09-04 16:34:45 +0100815 new_port = new_info->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700816 if (HIGH_BITS_OFFSET)
Alan Cox7ba2e762012-09-04 16:34:45 +0100817 new_port += (unsigned long) new_info->port_high << HIGH_BITS_OFFSET;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700818
Alan Cox7ba2e762012-09-04 16:34:45 +0100819 new_info->irq = irq_canonicalize(new_info->irq);
820 close_delay = msecs_to_jiffies(new_info->close_delay * 10);
821 closing_wait = new_info->closing_wait == ASYNC_CLOSING_WAIT_NONE ?
Jiri Slaby4cb0fbf2011-11-09 21:33:45 +0100822 ASYNC_CLOSING_WAIT_NONE :
Alan Cox7ba2e762012-09-04 16:34:45 +0100823 msecs_to_jiffies(new_info->closing_wait * 10);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700824
Linus Torvalds1da177e2005-04-16 15:20:36 -0700825
Alan Cox46d57a42009-09-19 13:13:29 -0700826 change_irq = !(uport->flags & UPF_FIXED_PORT)
Alan Cox7ba2e762012-09-04 16:34:45 +0100827 && new_info->irq != uport->irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700828
829 /*
830 * Since changing the 'type' of the port changes its resource
831 * allocations, we should treat type changes the same as
832 * IO port changes.
833 */
Alan Cox46d57a42009-09-19 13:13:29 -0700834 change_port = !(uport->flags & UPF_FIXED_PORT)
835 && (new_port != uport->iobase ||
Alan Cox7ba2e762012-09-04 16:34:45 +0100836 (unsigned long)new_info->iomem_base != uport->mapbase ||
837 new_info->hub6 != uport->hub6 ||
838 new_info->io_type != uport->iotype ||
839 new_info->iomem_reg_shift != uport->regshift ||
840 new_info->type != uport->type);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700841
Alan Cox46d57a42009-09-19 13:13:29 -0700842 old_flags = uport->flags;
Alan Cox7ba2e762012-09-04 16:34:45 +0100843 new_flags = new_info->flags;
Alan Cox46d57a42009-09-19 13:13:29 -0700844 old_custom_divisor = uport->custom_divisor;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700845
846 if (!capable(CAP_SYS_ADMIN)) {
847 retval = -EPERM;
848 if (change_irq || change_port ||
Alan Cox7ba2e762012-09-04 16:34:45 +0100849 (new_info->baud_base != uport->uartclk / 16) ||
Alan Cox46d57a42009-09-19 13:13:29 -0700850 (close_delay != port->close_delay) ||
851 (closing_wait != port->closing_wait) ||
Alan Cox7ba2e762012-09-04 16:34:45 +0100852 (new_info->xmit_fifo_size &&
853 new_info->xmit_fifo_size != uport->fifosize) ||
Russell King0077d452006-01-21 23:03:28 +0000854 (((new_flags ^ old_flags) & ~UPF_USR_MASK) != 0))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700855 goto exit;
Alan Cox46d57a42009-09-19 13:13:29 -0700856 uport->flags = ((uport->flags & ~UPF_USR_MASK) |
Russell King0077d452006-01-21 23:03:28 +0000857 (new_flags & UPF_USR_MASK));
Alan Cox7ba2e762012-09-04 16:34:45 +0100858 uport->custom_divisor = new_info->custom_divisor;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700859 goto check_and_exit;
860 }
861
862 /*
863 * Ask the low level driver to verify the settings.
864 */
Alan Cox46d57a42009-09-19 13:13:29 -0700865 if (uport->ops->verify_port)
Alan Cox7ba2e762012-09-04 16:34:45 +0100866 retval = uport->ops->verify_port(uport, new_info);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700867
Alan Cox7ba2e762012-09-04 16:34:45 +0100868 if ((new_info->irq >= nr_irqs) || (new_info->irq < 0) ||
869 (new_info->baud_base < 9600))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700870 retval = -EINVAL;
871
872 if (retval)
873 goto exit;
874
875 if (change_port || change_irq) {
876 retval = -EBUSY;
877
878 /*
879 * Make sure that we are the sole user of this port.
880 */
Alan Coxb58d13a2009-09-19 13:13:32 -0700881 if (tty_port_users(port) > 1)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700882 goto exit;
883
884 /*
885 * We need to shutdown the serial port at the old
886 * port/type/irq combination.
887 */
Alan Cox19225132010-06-01 22:52:51 +0200888 uart_shutdown(tty, state);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700889 }
890
891 if (change_port) {
892 unsigned long old_iobase, old_mapbase;
893 unsigned int old_type, old_iotype, old_hub6, old_shift;
894
Alan Cox46d57a42009-09-19 13:13:29 -0700895 old_iobase = uport->iobase;
896 old_mapbase = uport->mapbase;
897 old_type = uport->type;
898 old_hub6 = uport->hub6;
899 old_iotype = uport->iotype;
900 old_shift = uport->regshift;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700901
902 /*
903 * Free and release old regions
904 */
Fabio Estevama7cfaf12016-05-20 01:59:54 -0300905 if (old_type != PORT_UNKNOWN && uport->ops->release_port)
Alan Cox46d57a42009-09-19 13:13:29 -0700906 uport->ops->release_port(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700907
Alan Cox46d57a42009-09-19 13:13:29 -0700908 uport->iobase = new_port;
Alan Cox7ba2e762012-09-04 16:34:45 +0100909 uport->type = new_info->type;
910 uport->hub6 = new_info->hub6;
911 uport->iotype = new_info->io_type;
912 uport->regshift = new_info->iomem_reg_shift;
913 uport->mapbase = (unsigned long)new_info->iomem_base;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700914
915 /*
916 * Claim and map the new regions
917 */
Fabio Estevama7cfaf12016-05-20 01:59:54 -0300918 if (uport->type != PORT_UNKNOWN && uport->ops->request_port) {
Alan Cox46d57a42009-09-19 13:13:29 -0700919 retval = uport->ops->request_port(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700920 } else {
921 /* Always success - Jean II */
922 retval = 0;
923 }
924
925 /*
926 * If we fail to request resources for the
927 * new port, try to restore the old settings.
928 */
Thomas Pfaff7deb39e2014-04-23 12:33:22 +0200929 if (retval) {
Alan Cox46d57a42009-09-19 13:13:29 -0700930 uport->iobase = old_iobase;
931 uport->type = old_type;
932 uport->hub6 = old_hub6;
933 uport->iotype = old_iotype;
934 uport->regshift = old_shift;
935 uport->mapbase = old_mapbase;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700936
Thomas Pfaff7deb39e2014-04-23 12:33:22 +0200937 if (old_type != PORT_UNKNOWN) {
938 retval = uport->ops->request_port(uport);
939 /*
940 * If we failed to restore the old settings,
941 * we fail like this.
942 */
943 if (retval)
944 uport->type = PORT_UNKNOWN;
945
946 /*
947 * We failed anyway.
948 */
949 retval = -EBUSY;
950 }
951
Alan Coxa46c9992008-02-08 04:18:53 -0800952 /* Added to return the correct error -Ram Gupta */
953 goto exit;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700954 }
955 }
956
David Gibsonabb4a232007-05-06 14:48:49 -0700957 if (change_irq)
Alan Cox7ba2e762012-09-04 16:34:45 +0100958 uport->irq = new_info->irq;
Alan Cox46d57a42009-09-19 13:13:29 -0700959 if (!(uport->flags & UPF_FIXED_PORT))
Alan Cox7ba2e762012-09-04 16:34:45 +0100960 uport->uartclk = new_info->baud_base * 16;
Alan Cox46d57a42009-09-19 13:13:29 -0700961 uport->flags = (uport->flags & ~UPF_CHANGE_MASK) |
Russell King0077d452006-01-21 23:03:28 +0000962 (new_flags & UPF_CHANGE_MASK);
Alan Cox7ba2e762012-09-04 16:34:45 +0100963 uport->custom_divisor = new_info->custom_divisor;
Alan Cox46d57a42009-09-19 13:13:29 -0700964 port->close_delay = close_delay;
965 port->closing_wait = closing_wait;
Alan Cox7ba2e762012-09-04 16:34:45 +0100966 if (new_info->xmit_fifo_size)
967 uport->fifosize = new_info->xmit_fifo_size;
Jiri Slabyd6c53c02013-01-03 15:53:05 +0100968 port->low_latency = (uport->flags & UPF_LOW_LATENCY) ? 1 : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700969
970 check_and_exit:
971 retval = 0;
Alan Cox46d57a42009-09-19 13:13:29 -0700972 if (uport->type == PORT_UNKNOWN)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700973 goto exit;
Peter Hurleyd41861c2016-04-09 17:53:25 -0700974 if (tty_port_initialized(port)) {
Alan Cox46d57a42009-09-19 13:13:29 -0700975 if (((old_flags ^ uport->flags) & UPF_SPD_MASK) ||
976 old_custom_divisor != uport->custom_divisor) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700977 /*
978 * If they're setting up a custom divisor or speed,
979 * instead of clearing it, then bitch about it. No
980 * need to rate-limit; it's CAP_SYS_ADMIN only.
981 */
Alan Cox46d57a42009-09-19 13:13:29 -0700982 if (uport->flags & UPF_SPD_MASK) {
Sudip Mukherjee2f2dafe2014-09-01 20:49:43 +0530983 dev_notice(uport->dev,
984 "%s sets custom speed on %s. This is deprecated.\n",
985 current->comm,
Rasmus Villemoes429b4742015-03-31 15:55:59 +0200986 tty_name(port->tty));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700987 }
Alan Cox19225132010-06-01 22:52:51 +0200988 uart_change_speed(tty, state, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700989 }
Rob Herringb3b57642016-08-22 17:39:09 -0500990 } else {
Alan Cox19225132010-06-01 22:52:51 +0200991 retval = uart_startup(tty, state, 1);
Sebastian Andrzej Siewiorffcf1672018-01-11 18:57:26 +0100992 if (retval == 0)
993 tty_port_set_initialized(port, true);
Rob Herringb3b57642016-08-22 17:39:09 -0500994 if (retval > 0)
995 retval = 0;
996 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700997 exit:
Alan Cox7ba2e762012-09-04 16:34:45 +0100998 return retval;
999}
1000
1001static int uart_set_info_user(struct tty_struct *tty, struct uart_state *state,
1002 struct serial_struct __user *newinfo)
1003{
1004 struct serial_struct new_serial;
1005 struct tty_port *port = &state->port;
1006 int retval;
1007
1008 if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
1009 return -EFAULT;
1010
1011 /*
1012 * This semaphore protects port->count. It is also
1013 * very useful to prevent opens. Also, take the
1014 * port configuration semaphore to make sure that a
1015 * module insertion/removal doesn't change anything
1016 * under us.
1017 */
1018 mutex_lock(&port->mutex);
1019 retval = uart_set_info(tty, port, state, &new_serial);
Alan Coxa2bceae2009-09-19 13:13:31 -07001020 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001021 return retval;
1022}
1023
Alan Cox19225132010-06-01 22:52:51 +02001024/**
1025 * uart_get_lsr_info - get line status register info
1026 * @tty: tty associated with the UART
1027 * @state: UART being queried
1028 * @value: returned modem value
Linus Torvalds1da177e2005-04-16 15:20:36 -07001029 */
Alan Cox19225132010-06-01 22:52:51 +02001030static int uart_get_lsr_info(struct tty_struct *tty,
1031 struct uart_state *state, unsigned int __user *value)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001032{
Peter Hurley4047b372016-04-09 18:56:33 -07001033 struct uart_port *uport = uart_port_check(state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001034 unsigned int result;
1035
Alan Cox46d57a42009-09-19 13:13:29 -07001036 result = uport->ops->tx_empty(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001037
1038 /*
1039 * If we're about to load something into the transmit
1040 * register, we'll pretend the transmitter isn't empty to
1041 * avoid a race condition (depending on when the transmit
1042 * interrupt happens).
1043 */
Alan Cox46d57a42009-09-19 13:13:29 -07001044 if (uport->x_char ||
Alan Coxebd2c8f2009-09-19 13:13:28 -07001045 ((uart_circ_chars_pending(&state->xmit) > 0) &&
Peter Hurleyd01f4d12014-09-10 15:06:26 -04001046 !uart_tx_stopped(uport)))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001047 result &= ~TIOCSER_TEMT;
Alan Coxa46c9992008-02-08 04:18:53 -08001048
Linus Torvalds1da177e2005-04-16 15:20:36 -07001049 return put_user(result, value);
1050}
1051
Alan Cox60b33c12011-02-14 16:26:14 +00001052static int uart_tiocmget(struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001053{
1054 struct uart_state *state = tty->driver_data;
Alan Coxa2bceae2009-09-19 13:13:31 -07001055 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001056 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001057 int result = -EIO;
1058
Alan Coxa2bceae2009-09-19 13:13:31 -07001059 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001060 uport = uart_port_check(state);
1061 if (!uport)
1062 goto out;
1063
Peter Hurley18900ca2016-04-09 17:06:48 -07001064 if (!tty_io_error(tty)) {
Alan Cox46d57a42009-09-19 13:13:29 -07001065 result = uport->mctrl;
Alan Cox46d57a42009-09-19 13:13:29 -07001066 spin_lock_irq(&uport->lock);
1067 result |= uport->ops->get_mctrl(uport);
1068 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001069 }
Peter Hurley4047b372016-04-09 18:56:33 -07001070out:
Alan Coxa2bceae2009-09-19 13:13:31 -07001071 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001072 return result;
1073}
1074
1075static int
Alan Cox20b9d172011-02-14 16:26:50 +00001076uart_tiocmset(struct tty_struct *tty, unsigned int set, unsigned int clear)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001077{
1078 struct uart_state *state = tty->driver_data;
Alan Coxa2bceae2009-09-19 13:13:31 -07001079 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001080 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001081 int ret = -EIO;
1082
Alan Coxa2bceae2009-09-19 13:13:31 -07001083 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001084 uport = uart_port_check(state);
1085 if (!uport)
1086 goto out;
1087
Peter Hurley18900ca2016-04-09 17:06:48 -07001088 if (!tty_io_error(tty)) {
Alan Cox46d57a42009-09-19 13:13:29 -07001089 uart_update_mctrl(uport, set, clear);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001090 ret = 0;
1091 }
Peter Hurley4047b372016-04-09 18:56:33 -07001092out:
Alan Coxa2bceae2009-09-19 13:13:31 -07001093 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001094 return ret;
1095}
1096
Alan Cox9e989662008-07-22 11:18:03 +01001097static int uart_break_ctl(struct tty_struct *tty, int break_state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001098{
1099 struct uart_state *state = tty->driver_data;
Alan Coxa2bceae2009-09-19 13:13:31 -07001100 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001101 struct uart_port *uport;
1102 int ret = -EIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001103
Alan Coxa2bceae2009-09-19 13:13:31 -07001104 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001105 uport = uart_port_check(state);
1106 if (!uport)
1107 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001108
Jiangfeng Xiao8b054e02019-11-20 23:18:53 +08001109 if (uport->type != PORT_UNKNOWN && uport->ops->break_ctl)
Alan Cox46d57a42009-09-19 13:13:29 -07001110 uport->ops->break_ctl(uport, break_state);
Peter Hurley4047b372016-04-09 18:56:33 -07001111 ret = 0;
1112out:
Alan Coxa2bceae2009-09-19 13:13:31 -07001113 mutex_unlock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001114 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001115}
1116
Alan Cox19225132010-06-01 22:52:51 +02001117static int uart_do_autoconfig(struct tty_struct *tty,struct uart_state *state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001118{
Alan Coxa2bceae2009-09-19 13:13:31 -07001119 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001120 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001121 int flags, ret;
1122
1123 if (!capable(CAP_SYS_ADMIN))
1124 return -EPERM;
1125
1126 /*
1127 * Take the per-port semaphore. This prevents count from
1128 * changing, and hence any extra opens of the port while
1129 * we're auto-configuring.
1130 */
Alan Coxa2bceae2009-09-19 13:13:31 -07001131 if (mutex_lock_interruptible(&port->mutex))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001132 return -ERESTARTSYS;
1133
Peter Hurley4047b372016-04-09 18:56:33 -07001134 uport = uart_port_check(state);
1135 if (!uport) {
1136 ret = -EIO;
1137 goto out;
1138 }
1139
Linus Torvalds1da177e2005-04-16 15:20:36 -07001140 ret = -EBUSY;
Alan Coxb58d13a2009-09-19 13:13:32 -07001141 if (tty_port_users(port) == 1) {
Alan Cox19225132010-06-01 22:52:51 +02001142 uart_shutdown(tty, state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001143
1144 /*
1145 * If we already have a port type configured,
1146 * we must release its resources.
1147 */
Fabio Estevama7cfaf12016-05-20 01:59:54 -03001148 if (uport->type != PORT_UNKNOWN && uport->ops->release_port)
Alan Cox46d57a42009-09-19 13:13:29 -07001149 uport->ops->release_port(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001150
1151 flags = UART_CONFIG_TYPE;
Alan Cox46d57a42009-09-19 13:13:29 -07001152 if (uport->flags & UPF_AUTO_IRQ)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001153 flags |= UART_CONFIG_IRQ;
1154
1155 /*
1156 * This will claim the ports resources if
1157 * a port is found.
1158 */
Alan Cox46d57a42009-09-19 13:13:29 -07001159 uport->ops->config_port(uport, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001160
Alan Cox19225132010-06-01 22:52:51 +02001161 ret = uart_startup(tty, state, 1);
Sebastian Andrzej Siewiorfbe1ad92018-02-03 12:27:23 +01001162 if (ret == 0)
1163 tty_port_set_initialized(port, true);
Rob Herringb3b57642016-08-22 17:39:09 -05001164 if (ret > 0)
1165 ret = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001166 }
Peter Hurley4047b372016-04-09 18:56:33 -07001167out:
Alan Coxa2bceae2009-09-19 13:13:31 -07001168 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001169 return ret;
1170}
1171
Alexander Shiyan1fdc3102014-06-03 18:54:43 +04001172static void uart_enable_ms(struct uart_port *uport)
1173{
1174 /*
1175 * Force modem status interrupts on
1176 */
1177 if (uport->ops->enable_ms)
1178 uport->ops->enable_ms(uport);
1179}
1180
Linus Torvalds1da177e2005-04-16 15:20:36 -07001181/*
1182 * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
1183 * - mask passed in arg for lines of interest
1184 * (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
1185 * Caller should use TIOCGICOUNT to see which one it was
Alan Coxbdc04e32009-09-19 13:13:31 -07001186 *
1187 * FIXME: This wants extracting into a common all driver implementation
1188 * of TIOCMWAIT using tty_port.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001189 */
Peter Hurley9ed19422016-04-09 18:56:34 -07001190static int uart_wait_modem_status(struct uart_state *state, unsigned long arg)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001191{
Peter Hurley9ed19422016-04-09 18:56:34 -07001192 struct uart_port *uport;
Alan Coxbdc04e32009-09-19 13:13:31 -07001193 struct tty_port *port = &state->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001194 DECLARE_WAITQUEUE(wait, current);
1195 struct uart_icount cprev, cnow;
1196 int ret;
1197
1198 /*
1199 * note the counters on entry
1200 */
Peter Hurley9ed19422016-04-09 18:56:34 -07001201 uport = uart_port_ref(state);
1202 if (!uport)
1203 return -EIO;
Alan Cox46d57a42009-09-19 13:13:29 -07001204 spin_lock_irq(&uport->lock);
1205 memcpy(&cprev, &uport->icount, sizeof(struct uart_icount));
Alexander Shiyan1fdc3102014-06-03 18:54:43 +04001206 uart_enable_ms(uport);
Alan Cox46d57a42009-09-19 13:13:29 -07001207 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001208
Alan Coxbdc04e32009-09-19 13:13:31 -07001209 add_wait_queue(&port->delta_msr_wait, &wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001210 for (;;) {
Alan Cox46d57a42009-09-19 13:13:29 -07001211 spin_lock_irq(&uport->lock);
1212 memcpy(&cnow, &uport->icount, sizeof(struct uart_icount));
1213 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001214
1215 set_current_state(TASK_INTERRUPTIBLE);
1216
1217 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
1218 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
1219 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
1220 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts))) {
Alan Coxa46c9992008-02-08 04:18:53 -08001221 ret = 0;
1222 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001223 }
1224
1225 schedule();
1226
1227 /* see if a signal did it */
1228 if (signal_pending(current)) {
1229 ret = -ERESTARTSYS;
1230 break;
1231 }
1232
1233 cprev = cnow;
1234 }
Fabian Frederick97f9f702015-02-20 19:12:57 +01001235 __set_current_state(TASK_RUNNING);
Alan Coxbdc04e32009-09-19 13:13:31 -07001236 remove_wait_queue(&port->delta_msr_wait, &wait);
Peter Hurley9ed19422016-04-09 18:56:34 -07001237 uart_port_deref(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001238
1239 return ret;
1240}
1241
1242/*
1243 * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
1244 * Return: write counters to the user passed counter struct
1245 * NB: both 1->0 and 0->1 transitions are counted except for
1246 * RI where only 0->1 is counted.
1247 */
Alan Coxd281da72010-09-16 18:21:24 +01001248static int uart_get_icount(struct tty_struct *tty,
1249 struct serial_icounter_struct *icount)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001250{
Alan Coxd281da72010-09-16 18:21:24 +01001251 struct uart_state *state = tty->driver_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001252 struct uart_icount cnow;
Peter Hurley9ed19422016-04-09 18:56:34 -07001253 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001254
Peter Hurley9ed19422016-04-09 18:56:34 -07001255 uport = uart_port_ref(state);
1256 if (!uport)
1257 return -EIO;
Alan Cox46d57a42009-09-19 13:13:29 -07001258 spin_lock_irq(&uport->lock);
1259 memcpy(&cnow, &uport->icount, sizeof(struct uart_icount));
1260 spin_unlock_irq(&uport->lock);
Peter Hurley9ed19422016-04-09 18:56:34 -07001261 uart_port_deref(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001262
Alan Coxd281da72010-09-16 18:21:24 +01001263 icount->cts = cnow.cts;
1264 icount->dsr = cnow.dsr;
1265 icount->rng = cnow.rng;
1266 icount->dcd = cnow.dcd;
1267 icount->rx = cnow.rx;
1268 icount->tx = cnow.tx;
1269 icount->frame = cnow.frame;
1270 icount->overrun = cnow.overrun;
1271 icount->parity = cnow.parity;
1272 icount->brk = cnow.brk;
1273 icount->buf_overrun = cnow.buf_overrun;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001274
Alan Coxd281da72010-09-16 18:21:24 +01001275 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001276}
1277
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001278static int uart_get_rs485_config(struct uart_port *port,
1279 struct serial_rs485 __user *rs485)
1280{
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001281 unsigned long flags;
1282 struct serial_rs485 aux;
1283
1284 spin_lock_irqsave(&port->lock, flags);
1285 aux = port->rs485;
1286 spin_unlock_irqrestore(&port->lock, flags);
1287
1288 if (copy_to_user(rs485, &aux, sizeof(aux)))
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001289 return -EFAULT;
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001290
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001291 return 0;
1292}
1293
1294static int uart_set_rs485_config(struct uart_port *port,
1295 struct serial_rs485 __user *rs485_user)
1296{
1297 struct serial_rs485 rs485;
1298 int ret;
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001299 unsigned long flags;
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001300
1301 if (!port->rs485_config)
1302 return -ENOIOCTLCMD;
1303
1304 if (copy_from_user(&rs485, rs485_user, sizeof(*rs485_user)))
1305 return -EFAULT;
1306
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001307 spin_lock_irqsave(&port->lock, flags);
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001308 ret = port->rs485_config(port, &rs485);
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001309 spin_unlock_irqrestore(&port->lock, flags);
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001310 if (ret)
1311 return ret;
1312
1313 if (copy_to_user(rs485_user, &port->rs485, sizeof(port->rs485)))
1314 return -EFAULT;
1315
1316 return 0;
1317}
1318
Linus Torvalds1da177e2005-04-16 15:20:36 -07001319/*
Alan Coxe5238442008-04-30 00:53:28 -07001320 * Called via sys_ioctl. We can use spin_lock_irq() here.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001321 */
1322static int
Peter Hurley4047b372016-04-09 18:56:33 -07001323uart_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001324{
1325 struct uart_state *state = tty->driver_data;
Alan Coxa2bceae2009-09-19 13:13:31 -07001326 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001327 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001328 void __user *uarg = (void __user *)arg;
1329 int ret = -ENOIOCTLCMD;
1330
Linus Torvalds1da177e2005-04-16 15:20:36 -07001331
1332 /*
1333 * These ioctls don't rely on the hardware to be present.
1334 */
1335 switch (cmd) {
1336 case TIOCGSERIAL:
Alan Cox9f109692012-10-29 15:20:25 +00001337 ret = uart_get_info_user(port, uarg);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001338 break;
1339
1340 case TIOCSSERIAL:
Peter Hurley7c8ab962014-10-16 16:54:20 -04001341 down_write(&tty->termios_rwsem);
Alan Cox7ba2e762012-09-04 16:34:45 +01001342 ret = uart_set_info_user(tty, state, uarg);
Peter Hurley7c8ab962014-10-16 16:54:20 -04001343 up_write(&tty->termios_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001344 break;
1345
1346 case TIOCSERCONFIG:
Peter Hurley7c8ab962014-10-16 16:54:20 -04001347 down_write(&tty->termios_rwsem);
Alan Cox19225132010-06-01 22:52:51 +02001348 ret = uart_do_autoconfig(tty, state);
Peter Hurley7c8ab962014-10-16 16:54:20 -04001349 up_write(&tty->termios_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001350 break;
1351
1352 case TIOCSERGWILD: /* obsolete */
1353 case TIOCSERSWILD: /* obsolete */
1354 ret = 0;
1355 break;
1356 }
1357
1358 if (ret != -ENOIOCTLCMD)
1359 goto out;
1360
Peter Hurley18900ca2016-04-09 17:06:48 -07001361 if (tty_io_error(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001362 ret = -EIO;
1363 goto out;
1364 }
1365
1366 /*
1367 * The following should only be used when hardware is present.
1368 */
1369 switch (cmd) {
1370 case TIOCMIWAIT:
1371 ret = uart_wait_modem_status(state, arg);
1372 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001373 }
1374
1375 if (ret != -ENOIOCTLCMD)
1376 goto out;
1377
Alan Coxa2bceae2009-09-19 13:13:31 -07001378 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001379 uport = uart_port_check(state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001380
Peter Hurley4047b372016-04-09 18:56:33 -07001381 if (!uport || tty_io_error(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001382 ret = -EIO;
1383 goto out_up;
1384 }
1385
1386 /*
1387 * All these rely on hardware being present and need to be
1388 * protected against the tty being hung up.
1389 */
Ricardo Ribalda Delgadoa9c20a92014-11-06 09:22:59 +01001390
Linus Torvalds1da177e2005-04-16 15:20:36 -07001391 switch (cmd) {
Ricardo Ribalda Delgadoa9c20a92014-11-06 09:22:59 +01001392 case TIOCSERGETLSR: /* Get line status register */
1393 ret = uart_get_lsr_info(tty, state, uarg);
1394 break;
1395
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001396 case TIOCGRS485:
Peter Hurley4047b372016-04-09 18:56:33 -07001397 ret = uart_get_rs485_config(uport, uarg);
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001398 break;
1399
1400 case TIOCSRS485:
Peter Hurley4047b372016-04-09 18:56:33 -07001401 ret = uart_set_rs485_config(uport, uarg);
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001402 break;
Peter Hurley4047b372016-04-09 18:56:33 -07001403 default:
Alan Cox46d57a42009-09-19 13:13:29 -07001404 if (uport->ops->ioctl)
1405 ret = uport->ops->ioctl(uport, cmd, arg);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001406 break;
1407 }
Alan Coxf34d7a52008-04-30 00:54:13 -07001408out_up:
Alan Coxa2bceae2009-09-19 13:13:31 -07001409 mutex_unlock(&port->mutex);
Alan Coxf34d7a52008-04-30 00:54:13 -07001410out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001411 return ret;
1412}
1413
Linus Torvaldsedeb2802008-06-04 10:35:03 -07001414static void uart_set_ldisc(struct tty_struct *tty)
Alan Cox64e91592008-06-03 15:18:54 +01001415{
1416 struct uart_state *state = tty->driver_data;
Peter Hurley4047b372016-04-09 18:56:33 -07001417 struct uart_port *uport;
Alan Cox64e91592008-06-03 15:18:54 +01001418
Peter Hurley4047b372016-04-09 18:56:33 -07001419 mutex_lock(&state->port.mutex);
1420 uport = uart_port_check(state);
1421 if (uport && uport->ops->set_ldisc)
Peter Hurley732a84a2014-11-05 13:11:43 -05001422 uport->ops->set_ldisc(uport, &tty->termios);
Peter Hurley4047b372016-04-09 18:56:33 -07001423 mutex_unlock(&state->port.mutex);
Alan Cox64e91592008-06-03 15:18:54 +01001424}
1425
Alan Coxa46c9992008-02-08 04:18:53 -08001426static void uart_set_termios(struct tty_struct *tty,
1427 struct ktermios *old_termios)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001428{
1429 struct uart_state *state = tty->driver_data;
Peter Hurley4047b372016-04-09 18:56:33 -07001430 struct uart_port *uport;
Alan Coxadc8d742012-07-14 15:31:47 +01001431 unsigned int cflag = tty->termios.c_cflag;
Russell King2cbacaf2012-04-17 16:34:13 +01001432 unsigned int iflag_mask = IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK;
1433 bool sw_changed = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001434
Peter Hurley4047b372016-04-09 18:56:33 -07001435 mutex_lock(&state->port.mutex);
1436 uport = uart_port_check(state);
1437 if (!uport)
1438 goto out;
1439
Russell King2cbacaf2012-04-17 16:34:13 +01001440 /*
1441 * Drivers doing software flow control also need to know
1442 * about changes to these input settings.
1443 */
1444 if (uport->flags & UPF_SOFT_FLOW) {
1445 iflag_mask |= IXANY|IXON|IXOFF;
1446 sw_changed =
1447 tty->termios.c_cc[VSTART] != old_termios->c_cc[VSTART] ||
1448 tty->termios.c_cc[VSTOP] != old_termios->c_cc[VSTOP];
1449 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001450
1451 /*
1452 * These are the bits that are used to setup various
David Woodhouse20620d62007-08-22 14:01:11 -07001453 * flags in the low level driver. We can ignore the Bfoo
1454 * bits in c_cflag; c_[io]speed will always be set
1455 * appropriately by set_termios() in tty_ioctl.c
Linus Torvalds1da177e2005-04-16 15:20:36 -07001456 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001457 if ((cflag ^ old_termios->c_cflag) == 0 &&
Alan Coxadc8d742012-07-14 15:31:47 +01001458 tty->termios.c_ospeed == old_termios->c_ospeed &&
1459 tty->termios.c_ispeed == old_termios->c_ispeed &&
Russell King2cbacaf2012-04-17 16:34:13 +01001460 ((tty->termios.c_iflag ^ old_termios->c_iflag) & iflag_mask) == 0 &&
1461 !sw_changed) {
Peter Hurley4047b372016-04-09 18:56:33 -07001462 goto out;
Alan Coxe5238442008-04-30 00:53:28 -07001463 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001464
Alan Cox19225132010-06-01 22:52:51 +02001465 uart_change_speed(tty, state, old_termios);
Peter Hurleyc18b55f2014-06-16 09:17:09 -04001466 /* reload cflag from termios; port driver may have overriden flags */
1467 cflag = tty->termios.c_cflag;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001468
1469 /* Handle transition to B0 status */
1470 if ((old_termios->c_cflag & CBAUD) && !(cflag & CBAUD))
Russell Kingdec94e72012-09-24 11:13:15 +01001471 uart_clear_mctrl(uport, TIOCM_RTS | TIOCM_DTR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001472 /* Handle transition away from B0 status */
André Goddard Rosa82cb7ba2009-10-25 11:18:26 -02001473 else if (!(old_termios->c_cflag & CBAUD) && (cflag & CBAUD)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001474 unsigned int mask = TIOCM_DTR;
Peter Hurley97ef38b2016-04-09 17:11:36 -07001475 if (!(cflag & CRTSCTS) || !tty_throttled(tty))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001476 mask |= TIOCM_RTS;
Russell Kingdec94e72012-09-24 11:13:15 +01001477 uart_set_mctrl(uport, mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001478 }
Peter Hurley4047b372016-04-09 18:56:33 -07001479out:
1480 mutex_unlock(&state->port.mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001481}
1482
1483/*
Kevin Cernekeeef4f5272012-12-26 20:43:41 -08001484 * Calls to uart_close() are serialised via the tty_lock in
1485 * drivers/tty/tty_io.c:tty_release()
1486 * drivers/tty/tty_io.c:do_tty_hangup()
Linus Torvalds1da177e2005-04-16 15:20:36 -07001487 */
1488static void uart_close(struct tty_struct *tty, struct file *filp)
1489{
1490 struct uart_state *state = tty->driver_data;
Alan Cox46d57a42009-09-19 13:13:29 -07001491 struct tty_port *port;
Alan Coxa46c9992008-02-08 04:18:53 -08001492
Peter Hurley91b32f52014-10-16 16:54:27 -04001493 if (!state) {
1494 struct uart_driver *drv = tty->driver->driver_state;
1495
1496 state = drv->state + tty->index;
1497 port = &state->port;
1498 spin_lock_irq(&port->lock);
1499 --port->count;
1500 spin_unlock_irq(&port->lock);
Linus Torvaldseea7e172009-10-12 19:13:54 +02001501 return;
Peter Hurley91b32f52014-10-16 16:54:27 -04001502 }
Linus Torvaldseea7e172009-10-12 19:13:54 +02001503
Alan Cox46d57a42009-09-19 13:13:29 -07001504 port = &state->port;
Peter Hurley39b3d892016-01-10 20:23:57 -08001505 pr_debug("uart_close(%d) called\n", tty->index);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001506
Rob Herring761ed4a2016-08-22 17:39:10 -05001507 tty_port_close(tty->port, tty, filp);
1508}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001509
Rob Herring761ed4a2016-08-22 17:39:10 -05001510static void uart_tty_port_shutdown(struct tty_port *port)
1511{
1512 struct uart_state *state = container_of(port, struct uart_state, port);
1513 struct uart_port *uport = uart_port_check(state);
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001514
Linus Torvalds1da177e2005-04-16 15:20:36 -07001515 /*
1516 * At this point, we stop accepting input. To do this, we
1517 * disable the receive line status interrupts.
1518 */
Andy Shevchenkoa5a2b132016-09-13 00:23:42 +03001519 if (WARN(!uport, "detached port still initialized!\n"))
1520 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001521
Andy Shevchenkoa5a2b132016-09-13 00:23:42 +03001522 spin_lock_irq(&uport->lock);
Rob Herring761ed4a2016-08-22 17:39:10 -05001523 uport->ops->stop_rx(uport);
Rob Herring761ed4a2016-08-22 17:39:10 -05001524 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001525
Rob Herring761ed4a2016-08-22 17:39:10 -05001526 uart_port_shutdown(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001527
1528 /*
Rob Herring761ed4a2016-08-22 17:39:10 -05001529 * It's possible for shutdown to be called after suspend if we get
1530 * a DCD drop (hangup) at just the right time. Clear suspended bit so
1531 * we don't try to resume a port that has been shutdown.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001532 */
Rob Herring761ed4a2016-08-22 17:39:10 -05001533 tty_port_set_suspended(port, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001534
Rob Herring761ed4a2016-08-22 17:39:10 -05001535 uart_change_pm(state, UART_PM_STATE_OFF);
Peter Hurley2e758912014-10-16 16:54:19 -04001536
Linus Torvalds1da177e2005-04-16 15:20:36 -07001537}
1538
Jiri Slaby1f33a512011-07-14 14:35:10 +02001539static void uart_wait_until_sent(struct tty_struct *tty, int timeout)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001540{
Jiri Slaby1f33a512011-07-14 14:35:10 +02001541 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -07001542 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001543 unsigned long char_time, expire;
1544
Peter Hurley9ed19422016-04-09 18:56:34 -07001545 port = uart_port_ref(state);
1546 if (!port || port->type == PORT_UNKNOWN || port->fifosize == 0) {
1547 uart_port_deref(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001548 return;
Peter Hurley9ed19422016-04-09 18:56:34 -07001549 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001550
1551 /*
1552 * Set the check interval to be 1/5 of the estimated time to
1553 * send a single character, and make it at least 1. The check
1554 * interval should also be less than the timeout.
1555 *
1556 * Note: we have to use pretty tight timings here to satisfy
1557 * the NIST-PCTS.
1558 */
1559 char_time = (port->timeout - HZ/50) / port->fifosize;
1560 char_time = char_time / 5;
1561 if (char_time == 0)
1562 char_time = 1;
1563 if (timeout && timeout < char_time)
1564 char_time = timeout;
1565
1566 /*
1567 * If the transmitter hasn't cleared in twice the approximate
1568 * amount of time to send the entire FIFO, it probably won't
1569 * ever clear. This assumes the UART isn't doing flow
1570 * control, which is currently the case. Hence, if it ever
1571 * takes longer than port->timeout, this is probably due to a
1572 * UART bug of some kind. So, we clamp the timeout parameter at
1573 * 2*port->timeout.
1574 */
1575 if (timeout == 0 || timeout > 2 * port->timeout)
1576 timeout = 2 * port->timeout;
1577
1578 expire = jiffies + timeout;
1579
Jiri Slabyeb3a1e12007-05-06 14:48:52 -07001580 pr_debug("uart_wait_until_sent(%d), jiffies=%lu, expire=%lu...\n",
Alan Coxa46c9992008-02-08 04:18:53 -08001581 port->line, jiffies, expire);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001582
1583 /*
1584 * Check whether the transmitter is empty every 'char_time'.
1585 * 'timeout' / 'expire' give us the maximum amount of time
1586 * we wait.
1587 */
1588 while (!port->ops->tx_empty(port)) {
1589 msleep_interruptible(jiffies_to_msecs(char_time));
1590 if (signal_pending(current))
1591 break;
1592 if (time_after(jiffies, expire))
1593 break;
1594 }
Peter Hurley9ed19422016-04-09 18:56:34 -07001595 uart_port_deref(port);
Arnd Bergmann20365212010-06-01 22:53:07 +02001596}
1597
Linus Torvalds1da177e2005-04-16 15:20:36 -07001598/*
Kevin Cernekeeef4f5272012-12-26 20:43:41 -08001599 * Calls to uart_hangup() are serialised by the tty_lock in
1600 * drivers/tty/tty_io.c:do_tty_hangup()
1601 * This runs from a workqueue and can sleep for a _short_ time only.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001602 */
1603static void uart_hangup(struct tty_struct *tty)
1604{
1605 struct uart_state *state = tty->driver_data;
Alan Cox46d57a42009-09-19 13:13:29 -07001606 struct tty_port *port = &state->port;
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001607 struct uart_port *uport;
Alan Cox61cd8a22010-06-01 22:52:57 +02001608 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001609
Peter Hurley39b3d892016-01-10 20:23:57 -08001610 pr_debug("uart_hangup(%d)\n", tty->index);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001611
Alan Coxa2bceae2009-09-19 13:13:31 -07001612 mutex_lock(&port->mutex);
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001613 uport = uart_port_check(state);
1614 WARN(!uport, "hangup of detached port!\n");
1615
Peter Hurley807c8d812016-04-09 17:53:22 -07001616 if (tty_port_active(port)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001617 uart_flush_buffer(tty);
Alan Cox19225132010-06-01 22:52:51 +02001618 uart_shutdown(tty, state);
Alan Cox61cd8a22010-06-01 22:52:57 +02001619 spin_lock_irqsave(&port->lock, flags);
Alan Cox91312cd2009-09-19 13:13:29 -07001620 port->count = 0;
Alan Cox61cd8a22010-06-01 22:52:57 +02001621 spin_unlock_irqrestore(&port->lock, flags);
Peter Hurley807c8d812016-04-09 17:53:22 -07001622 tty_port_set_active(port, 0);
Alan Cox7b014782009-09-19 13:13:33 -07001623 tty_port_tty_set(port, NULL);
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001624 if (uport && !uart_console(uport))
Geert Uytterhoevenbf903c02014-03-27 11:40:39 +01001625 uart_change_pm(state, UART_PM_STATE_OFF);
Alan Cox46d57a42009-09-19 13:13:29 -07001626 wake_up_interruptible(&port->open_wait);
Alan Coxbdc04e32009-09-19 13:13:31 -07001627 wake_up_interruptible(&port->delta_msr_wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001628 }
Alan Coxa2bceae2009-09-19 13:13:31 -07001629 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001630}
1631
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001632/* uport == NULL if uart_port has already been removed */
Jiri Slaby0b1db832011-11-09 21:33:50 +01001633static void uart_port_shutdown(struct tty_port *port)
1634{
Jiri Slabyb922e192011-11-09 21:33:51 +01001635 struct uart_state *state = container_of(port, struct uart_state, port);
Peter Hurley4047b372016-04-09 18:56:33 -07001636 struct uart_port *uport = uart_port_check(state);
Jiri Slabyb922e192011-11-09 21:33:51 +01001637
1638 /*
1639 * clear delta_msr_wait queue to avoid mem leaks: we may free
1640 * the irq here so the queue might never be woken up. Note
1641 * that we won't end up waiting on delta_msr_wait again since
1642 * any outstanding file descriptors should be pointing at
1643 * hung_up_tty_fops now.
1644 */
1645 wake_up_interruptible(&port->delta_msr_wait);
1646
1647 /*
1648 * Free the IRQ and disable the port.
1649 */
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001650 if (uport)
1651 uport->ops->shutdown(uport);
Jiri Slabyb922e192011-11-09 21:33:51 +01001652
1653 /*
1654 * Ensure that the IRQ handler isn't running on another CPU.
1655 */
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001656 if (uport)
1657 synchronize_irq(uport->irq);
Jiri Slaby0b1db832011-11-09 21:33:50 +01001658}
1659
Alan Coxde0c8cb2010-06-01 22:52:58 +02001660static int uart_carrier_raised(struct tty_port *port)
1661{
1662 struct uart_state *state = container_of(port, struct uart_state, port);
Peter Hurley9ed19422016-04-09 18:56:34 -07001663 struct uart_port *uport;
Alan Coxde0c8cb2010-06-01 22:52:58 +02001664 int mctrl;
Peter Hurley9ed19422016-04-09 18:56:34 -07001665
1666 uport = uart_port_ref(state);
1667 /*
1668 * Should never observe uport == NULL since checks for hangup should
1669 * abort the tty_port_block_til_ready() loop before checking for carrier
1670 * raised -- but report carrier raised if it does anyway so open will
1671 * continue and not sleep
1672 */
1673 if (WARN_ON(!uport))
1674 return 1;
Alan Coxde0c8cb2010-06-01 22:52:58 +02001675 spin_lock_irq(&uport->lock);
Alexander Shiyan1fdc3102014-06-03 18:54:43 +04001676 uart_enable_ms(uport);
Alan Coxde0c8cb2010-06-01 22:52:58 +02001677 mctrl = uport->ops->get_mctrl(uport);
1678 spin_unlock_irq(&uport->lock);
Peter Hurley9ed19422016-04-09 18:56:34 -07001679 uart_port_deref(uport);
Alan Coxde0c8cb2010-06-01 22:52:58 +02001680 if (mctrl & TIOCM_CAR)
1681 return 1;
1682 return 0;
1683}
1684
1685static void uart_dtr_rts(struct tty_port *port, int onoff)
1686{
1687 struct uart_state *state = container_of(port, struct uart_state, port);
Peter Hurley9ed19422016-04-09 18:56:34 -07001688 struct uart_port *uport;
1689
1690 uport = uart_port_ref(state);
1691 if (!uport)
1692 return;
Alan Cox24fcc7c2010-06-01 22:52:59 +02001693
Jiri Slaby6f5c24a2011-03-30 00:10:57 +02001694 if (onoff)
Alan Coxde0c8cb2010-06-01 22:52:58 +02001695 uart_set_mctrl(uport, TIOCM_DTR | TIOCM_RTS);
1696 else
1697 uart_clear_mctrl(uport, TIOCM_DTR | TIOCM_RTS);
Peter Hurley9ed19422016-04-09 18:56:34 -07001698
1699 uart_port_deref(uport);
Alan Coxde0c8cb2010-06-01 22:52:58 +02001700}
1701
Linus Torvalds1da177e2005-04-16 15:20:36 -07001702/*
Kevin Cernekeeef4f5272012-12-26 20:43:41 -08001703 * Calls to uart_open are serialised by the tty_lock in
1704 * drivers/tty/tty_io.c:tty_open()
Linus Torvalds1da177e2005-04-16 15:20:36 -07001705 * Note that if this fails, then uart_close() _will_ be called.
1706 *
1707 * In time, we want to scrap the "opening nonpresent ports"
1708 * behaviour and implement an alternative way for setserial
1709 * to set base addresses/ports/types. This will allow us to
1710 * get rid of a certain amount of extra tests.
1711 */
1712static int uart_open(struct tty_struct *tty, struct file *filp)
1713{
Jiri Slabyabad73a2019-04-17 10:58:53 +02001714 struct uart_state *state = tty->driver_data;
1715 int retval;
Rob Herringb3b57642016-08-22 17:39:09 -05001716
1717 retval = tty_port_open(&state->port, tty, filp);
1718 if (retval > 0)
1719 retval = 0;
1720
1721 return retval;
1722}
1723
1724static int uart_port_activate(struct tty_port *port, struct tty_struct *tty)
1725{
1726 struct uart_state *state = container_of(port, struct uart_state, port);
1727 struct uart_port *uport;
Serge Semin47807592019-05-08 13:44:41 +03001728 int ret;
Rob Herringb3b57642016-08-22 17:39:09 -05001729
1730 uport = uart_port_check(state);
1731 if (!uport || uport->flags & UPF_DEAD)
1732 return -ENXIO;
1733
Peter Hurley4047b372016-04-09 18:56:33 -07001734 port->low_latency = (uport->flags & UPF_LOW_LATENCY) ? 1 : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001735
1736 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001737 * Start up the serial port.
1738 */
Serge Semin47807592019-05-08 13:44:41 +03001739 ret = uart_startup(tty, state, 0);
1740 if (ret > 0)
1741 tty_port_set_active(port, 1);
1742
1743 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001744}
1745
1746static const char *uart_type(struct uart_port *port)
1747{
1748 const char *str = NULL;
1749
1750 if (port->ops->type)
1751 str = port->ops->type(port);
1752
1753 if (!str)
1754 str = "unknown";
1755
1756 return str;
1757}
1758
1759#ifdef CONFIG_PROC_FS
1760
Alexey Dobriyand196a942009-03-31 15:19:21 -07001761static void uart_line_info(struct seq_file *m, struct uart_driver *drv, int i)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001762{
1763 struct uart_state *state = drv->state + i;
Alan Coxa2bceae2009-09-19 13:13:31 -07001764 struct tty_port *port = &state->port;
Linus Walleij6f538fe2012-12-07 11:36:08 +01001765 enum uart_pm_state pm_state;
Peter Hurley4047b372016-04-09 18:56:33 -07001766 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001767 char stat_buf[32];
1768 unsigned int status;
Alexey Dobriyand196a942009-03-31 15:19:21 -07001769 int mmio;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001770
Peter Hurley4047b372016-04-09 18:56:33 -07001771 mutex_lock(&port->mutex);
1772 uport = uart_port_check(state);
Alan Coxa2bceae2009-09-19 13:13:31 -07001773 if (!uport)
Peter Hurley4047b372016-04-09 18:56:33 -07001774 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001775
Alan Coxa2bceae2009-09-19 13:13:31 -07001776 mmio = uport->iotype >= UPIO_MEM;
Alexey Dobriyand196a942009-03-31 15:19:21 -07001777 seq_printf(m, "%d: uart:%s %s%08llX irq:%d",
Alan Coxa2bceae2009-09-19 13:13:31 -07001778 uport->line, uart_type(uport),
Sergei Shtylyov6c6a2332006-09-04 00:04:20 +04001779 mmio ? "mmio:0x" : "port:",
Alan Coxa2bceae2009-09-19 13:13:31 -07001780 mmio ? (unsigned long long)uport->mapbase
1781 : (unsigned long long)uport->iobase,
1782 uport->irq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001783
Alan Coxa2bceae2009-09-19 13:13:31 -07001784 if (uport->type == PORT_UNKNOWN) {
Alexey Dobriyand196a942009-03-31 15:19:21 -07001785 seq_putc(m, '\n');
Peter Hurley4047b372016-04-09 18:56:33 -07001786 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001787 }
1788
Alan Coxa46c9992008-02-08 04:18:53 -08001789 if (capable(CAP_SYS_ADMIN)) {
George G. Davis3689a0e2007-02-14 00:33:06 -08001790 pm_state = state->pm_state;
Linus Walleij6f538fe2012-12-07 11:36:08 +01001791 if (pm_state != UART_PM_STATE_ON)
1792 uart_change_pm(state, UART_PM_STATE_ON);
Alan Coxa2bceae2009-09-19 13:13:31 -07001793 spin_lock_irq(&uport->lock);
1794 status = uport->ops->get_mctrl(uport);
1795 spin_unlock_irq(&uport->lock);
Linus Walleij6f538fe2012-12-07 11:36:08 +01001796 if (pm_state != UART_PM_STATE_ON)
George G. Davis3689a0e2007-02-14 00:33:06 -08001797 uart_change_pm(state, pm_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001798
Alexey Dobriyand196a942009-03-31 15:19:21 -07001799 seq_printf(m, " tx:%d rx:%d",
Alan Coxa2bceae2009-09-19 13:13:31 -07001800 uport->icount.tx, uport->icount.rx);
1801 if (uport->icount.frame)
Peter Hurley968af292016-01-10 20:24:01 -08001802 seq_printf(m, " fe:%d", uport->icount.frame);
Alan Coxa2bceae2009-09-19 13:13:31 -07001803 if (uport->icount.parity)
Peter Hurley968af292016-01-10 20:24:01 -08001804 seq_printf(m, " pe:%d", uport->icount.parity);
Alan Coxa2bceae2009-09-19 13:13:31 -07001805 if (uport->icount.brk)
Peter Hurley968af292016-01-10 20:24:01 -08001806 seq_printf(m, " brk:%d", uport->icount.brk);
Alan Coxa2bceae2009-09-19 13:13:31 -07001807 if (uport->icount.overrun)
Peter Hurley968af292016-01-10 20:24:01 -08001808 seq_printf(m, " oe:%d", uport->icount.overrun);
Alan Coxa46c9992008-02-08 04:18:53 -08001809
1810#define INFOBIT(bit, str) \
Alan Coxa2bceae2009-09-19 13:13:31 -07001811 if (uport->mctrl & (bit)) \
Linus Torvalds1da177e2005-04-16 15:20:36 -07001812 strncat(stat_buf, (str), sizeof(stat_buf) - \
1813 strlen(stat_buf) - 2)
Alan Coxa46c9992008-02-08 04:18:53 -08001814#define STATBIT(bit, str) \
Linus Torvalds1da177e2005-04-16 15:20:36 -07001815 if (status & (bit)) \
1816 strncat(stat_buf, (str), sizeof(stat_buf) - \
1817 strlen(stat_buf) - 2)
1818
1819 stat_buf[0] = '\0';
1820 stat_buf[1] = '\0';
1821 INFOBIT(TIOCM_RTS, "|RTS");
1822 STATBIT(TIOCM_CTS, "|CTS");
1823 INFOBIT(TIOCM_DTR, "|DTR");
1824 STATBIT(TIOCM_DSR, "|DSR");
1825 STATBIT(TIOCM_CAR, "|CD");
1826 STATBIT(TIOCM_RNG, "|RI");
1827 if (stat_buf[0])
1828 stat_buf[0] = ' ';
Alan Coxa46c9992008-02-08 04:18:53 -08001829
Alexey Dobriyand196a942009-03-31 15:19:21 -07001830 seq_puts(m, stat_buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001831 }
Alexey Dobriyand196a942009-03-31 15:19:21 -07001832 seq_putc(m, '\n');
Linus Torvalds1da177e2005-04-16 15:20:36 -07001833#undef STATBIT
1834#undef INFOBIT
Peter Hurley4047b372016-04-09 18:56:33 -07001835out:
1836 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001837}
1838
Alexey Dobriyand196a942009-03-31 15:19:21 -07001839static int uart_proc_show(struct seq_file *m, void *v)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001840{
Alexey Dobriyan833bb302009-04-02 01:30:04 +04001841 struct tty_driver *ttydrv = m->private;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001842 struct uart_driver *drv = ttydrv->driver_state;
Alexey Dobriyand196a942009-03-31 15:19:21 -07001843 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001844
Peter Hurley968af292016-01-10 20:24:01 -08001845 seq_printf(m, "serinfo:1.0 driver%s%s revision:%s\n", "", "", "");
Alexey Dobriyand196a942009-03-31 15:19:21 -07001846 for (i = 0; i < drv->nr; i++)
1847 uart_line_info(m, drv, i);
1848 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001849}
Alexey Dobriyand196a942009-03-31 15:19:21 -07001850
1851static int uart_proc_open(struct inode *inode, struct file *file)
1852{
Al Virod9dda782013-03-31 18:16:14 -04001853 return single_open(file, uart_proc_show, PDE_DATA(inode));
Alexey Dobriyand196a942009-03-31 15:19:21 -07001854}
1855
1856static const struct file_operations uart_proc_fops = {
1857 .owner = THIS_MODULE,
1858 .open = uart_proc_open,
1859 .read = seq_read,
1860 .llseek = seq_lseek,
1861 .release = single_release,
1862};
Linus Torvalds1da177e2005-04-16 15:20:36 -07001863#endif
1864
Andrew Morton4a1b5502008-03-07 15:51:16 -08001865#if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(CONFIG_CONSOLE_POLL)
Peter Hurley1cfe42b2015-03-09 16:27:13 -04001866/**
Russell Kingd3587882006-03-20 20:00:09 +00001867 * uart_console_write - write a console message to a serial port
1868 * @port: the port to write the message
1869 * @s: array of characters
1870 * @count: number of characters in string to write
Peter Hurley10afbe32015-04-11 10:05:07 -04001871 * @putchar: function to write character to port
Russell Kingd3587882006-03-20 20:00:09 +00001872 */
1873void uart_console_write(struct uart_port *port, const char *s,
1874 unsigned int count,
1875 void (*putchar)(struct uart_port *, int))
1876{
1877 unsigned int i;
1878
1879 for (i = 0; i < count; i++, s++) {
1880 if (*s == '\n')
1881 putchar(port, '\r');
1882 putchar(port, *s);
1883 }
1884}
1885EXPORT_SYMBOL_GPL(uart_console_write);
1886
1887/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001888 * Check whether an invalid uart number has been specified, and
1889 * if so, search for the first available port that does have
1890 * console support.
1891 */
1892struct uart_port * __init
1893uart_get_console(struct uart_port *ports, int nr, struct console *co)
1894{
1895 int idx = co->index;
1896
1897 if (idx < 0 || idx >= nr || (ports[idx].iobase == 0 &&
1898 ports[idx].membase == NULL))
1899 for (idx = 0; idx < nr; idx++)
1900 if (ports[idx].iobase != 0 ||
1901 ports[idx].membase != NULL)
1902 break;
1903
1904 co->index = idx;
1905
1906 return ports + idx;
1907}
1908
1909/**
Peter Hurley73abaf82015-03-01 11:05:46 -05001910 * uart_parse_earlycon - Parse earlycon options
1911 * @p: ptr to 2nd field (ie., just beyond '<name>,')
1912 * @iotype: ptr for decoded iotype (out)
1913 * @addr: ptr for decoded mapbase/iobase (out)
1914 * @options: ptr for <options> field; NULL if not present (out)
1915 *
1916 * Decodes earlycon kernel command line parameters of the form
Masahiro Yamadabd94c402015-10-28 12:46:05 +09001917 * earlycon=<name>,io|mmio|mmio16|mmio32|mmio32be|mmio32native,<addr>,<options>
1918 * console=<name>,io|mmio|mmio16|mmio32|mmio32be|mmio32native,<addr>,<options>
Peter Hurley73abaf82015-03-01 11:05:46 -05001919 *
1920 * The optional form
1921 * earlycon=<name>,0x<addr>,<options>
1922 * console=<name>,0x<addr>,<options>
1923 * is also accepted; the returned @iotype will be UPIO_MEM.
1924 *
Alexander Sverdlin8b2303d2016-09-12 13:29:29 +02001925 * Returns 0 on success or -EINVAL on failure
Peter Hurley73abaf82015-03-01 11:05:46 -05001926 */
Alexander Sverdlin46e36682016-09-02 13:20:21 +02001927int uart_parse_earlycon(char *p, unsigned char *iotype, resource_size_t *addr,
Peter Hurley73abaf82015-03-01 11:05:46 -05001928 char **options)
1929{
1930 if (strncmp(p, "mmio,", 5) == 0) {
1931 *iotype = UPIO_MEM;
1932 p += 5;
Masahiro Yamadabd94c402015-10-28 12:46:05 +09001933 } else if (strncmp(p, "mmio16,", 7) == 0) {
1934 *iotype = UPIO_MEM16;
1935 p += 7;
Peter Hurley73abaf82015-03-01 11:05:46 -05001936 } else if (strncmp(p, "mmio32,", 7) == 0) {
1937 *iotype = UPIO_MEM32;
1938 p += 7;
Noam Camus6e63be32015-05-25 06:54:28 +03001939 } else if (strncmp(p, "mmio32be,", 9) == 0) {
1940 *iotype = UPIO_MEM32BE;
1941 p += 9;
Max Filippovd215d802015-09-22 15:20:32 +03001942 } else if (strncmp(p, "mmio32native,", 13) == 0) {
1943 *iotype = IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) ?
1944 UPIO_MEM32BE : UPIO_MEM32;
1945 p += 13;
Peter Hurley73abaf82015-03-01 11:05:46 -05001946 } else if (strncmp(p, "io,", 3) == 0) {
1947 *iotype = UPIO_PORT;
1948 p += 3;
1949 } else if (strncmp(p, "0x", 2) == 0) {
1950 *iotype = UPIO_MEM;
1951 } else {
1952 return -EINVAL;
1953 }
1954
Alexander Sverdlin8b2303d2016-09-12 13:29:29 +02001955 /*
1956 * Before you replace it with kstrtoull(), think about options separator
1957 * (',') it will not tolerate
1958 */
1959 *addr = simple_strtoull(p, NULL, 0);
Peter Hurley73abaf82015-03-01 11:05:46 -05001960 p = strchr(p, ',');
1961 if (p)
1962 p++;
1963
1964 *options = p;
1965 return 0;
1966}
1967EXPORT_SYMBOL_GPL(uart_parse_earlycon);
1968
1969/**
Geert Uytterhoeven02088ca2014-03-11 11:23:35 +01001970 * uart_parse_options - Parse serial port baud/parity/bits/flow control.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001971 * @options: pointer to option string
1972 * @baud: pointer to an 'int' variable for the baud rate.
1973 * @parity: pointer to an 'int' variable for the parity.
1974 * @bits: pointer to an 'int' variable for the number of data bits.
1975 * @flow: pointer to an 'int' variable for the flow control character.
1976 *
1977 * uart_parse_options decodes a string containing the serial console
1978 * options. The format of the string is <baud><parity><bits><flow>,
1979 * eg: 115200n8r
1980 */
Jason Wesself2d937f2008-04-17 20:05:37 +02001981void
Linus Torvalds1da177e2005-04-16 15:20:36 -07001982uart_parse_options(char *options, int *baud, int *parity, int *bits, int *flow)
1983{
1984 char *s = options;
1985
1986 *baud = simple_strtoul(s, NULL, 10);
1987 while (*s >= '0' && *s <= '9')
1988 s++;
1989 if (*s)
1990 *parity = *s++;
1991 if (*s)
1992 *bits = *s++ - '0';
1993 if (*s)
1994 *flow = *s;
1995}
Jason Wesself2d937f2008-04-17 20:05:37 +02001996EXPORT_SYMBOL_GPL(uart_parse_options);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001997
Linus Torvalds1da177e2005-04-16 15:20:36 -07001998/**
1999 * uart_set_options - setup the serial console parameters
2000 * @port: pointer to the serial ports uart_port structure
2001 * @co: console pointer
2002 * @baud: baud rate
2003 * @parity: parity character - 'n' (none), 'o' (odd), 'e' (even)
2004 * @bits: number of data bits
2005 * @flow: flow control character - 'r' (rts)
2006 */
Jason Wesself2d937f2008-04-17 20:05:37 +02002007int
Linus Torvalds1da177e2005-04-16 15:20:36 -07002008uart_set_options(struct uart_port *port, struct console *co,
2009 int baud, int parity, int bits, int flow)
2010{
Alan Cox606d0992006-12-08 02:38:45 -08002011 struct ktermios termios;
Alan Cox149b36e2007-10-18 01:24:16 -07002012 static struct ktermios dummy;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002013
Russell King976ecd12005-07-03 21:05:45 +01002014 /*
2015 * Ensure that the serial console lock is initialised
2016 * early.
Randy Witt42b6a1b2013-10-17 16:56:47 -04002017 * If this port is a console, then the spinlock is already
2018 * initialised.
Russell King976ecd12005-07-03 21:05:45 +01002019 */
Randy Witt42b6a1b2013-10-17 16:56:47 -04002020 if (!(uart_console(port) && (port->cons->flags & CON_ENABLED))) {
2021 spin_lock_init(&port->lock);
2022 lockdep_set_class(&port->lock, &port_lock_key);
2023 }
Russell King976ecd12005-07-03 21:05:45 +01002024
Alan Cox606d0992006-12-08 02:38:45 -08002025 memset(&termios, 0, sizeof(struct ktermios));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002026
Jeffy Chenba47f972016-01-04 15:54:46 +08002027 termios.c_cflag |= CREAD | HUPCL | CLOCAL;
2028 tty_termios_encode_baud_rate(&termios, baud, baud);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002029
2030 if (bits == 7)
2031 termios.c_cflag |= CS7;
2032 else
2033 termios.c_cflag |= CS8;
2034
2035 switch (parity) {
2036 case 'o': case 'O':
2037 termios.c_cflag |= PARODD;
2038 /*fall through*/
2039 case 'e': case 'E':
2040 termios.c_cflag |= PARENB;
2041 break;
2042 }
2043
2044 if (flow == 'r')
2045 termios.c_cflag |= CRTSCTS;
2046
Yinghai Lu79492682007-07-15 23:37:25 -07002047 /*
2048 * some uarts on other side don't support no flow control.
2049 * So we set * DTR in host uart to make them happy
2050 */
2051 port->mctrl |= TIOCM_DTR;
2052
Alan Cox149b36e2007-10-18 01:24:16 -07002053 port->ops->set_termios(port, &termios, &dummy);
Jason Wesself2d937f2008-04-17 20:05:37 +02002054 /*
2055 * Allow the setting of the UART parameters with a NULL console
2056 * too:
2057 */
2058 if (co)
2059 co->cflag = termios.c_cflag;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002060
2061 return 0;
2062}
Jason Wesself2d937f2008-04-17 20:05:37 +02002063EXPORT_SYMBOL_GPL(uart_set_options);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002064#endif /* CONFIG_SERIAL_CORE_CONSOLE */
2065
Jiri Slabycf755252011-11-09 21:33:47 +01002066/**
2067 * uart_change_pm - set power state of the port
2068 *
2069 * @state: port descriptor
2070 * @pm_state: new state
2071 *
2072 * Locking: port->mutex has to be held
2073 */
Linus Walleij6f538fe2012-12-07 11:36:08 +01002074static void uart_change_pm(struct uart_state *state,
2075 enum uart_pm_state pm_state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002076{
Peter Hurley4047b372016-04-09 18:56:33 -07002077 struct uart_port *port = uart_port_check(state);
Andrew Victor1281e362006-05-16 11:28:49 +01002078
2079 if (state->pm_state != pm_state) {
Peter Hurley4047b372016-04-09 18:56:33 -07002080 if (port && port->ops->pm)
Andrew Victor1281e362006-05-16 11:28:49 +01002081 port->ops->pm(port, pm_state, state->pm_state);
2082 state->pm_state = pm_state;
2083 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002084}
2085
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002086struct uart_match {
2087 struct uart_port *port;
2088 struct uart_driver *driver;
2089};
2090
2091static int serial_match_port(struct device *dev, void *data)
2092{
2093 struct uart_match *match = data;
Guennadi Liakhovetski7ca796f2008-07-04 09:59:28 -07002094 struct tty_driver *tty_drv = match->driver->tty_driver;
2095 dev_t devt = MKDEV(tty_drv->major, tty_drv->minor_start) +
2096 match->port->line;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002097
2098 return dev->devt == devt; /* Actually, only one tty per port */
2099}
2100
Alan Coxccce6de2009-09-19 13:13:30 -07002101int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002102{
Alan Coxccce6de2009-09-19 13:13:30 -07002103 struct uart_state *state = drv->state + uport->line;
2104 struct tty_port *port = &state->port;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002105 struct device *tty_dev;
Alan Coxccce6de2009-09-19 13:13:30 -07002106 struct uart_match match = {uport, drv};
Linus Torvalds1da177e2005-04-16 15:20:36 -07002107
Alan Coxa2bceae2009-09-19 13:13:31 -07002108 mutex_lock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002109
Alan Coxccce6de2009-09-19 13:13:30 -07002110 tty_dev = device_find_child(uport->dev, &match, serial_match_port);
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002111 if (device_may_wakeup(tty_dev)) {
Govindraj.R3f960db2010-12-16 18:12:47 +05302112 if (!enable_irq_wake(uport->irq))
2113 uport->irq_wake = 1;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002114 put_device(tty_dev);
Alan Coxa2bceae2009-09-19 13:13:31 -07002115 mutex_unlock(&port->mutex);
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002116 return 0;
2117 }
Federico Vaga5a65dcc2013-04-15 16:01:07 +02002118 put_device(tty_dev);
2119
Peter Hurleyb164c972015-01-22 12:24:25 -05002120 /* Nothing to do if the console is not suspending */
2121 if (!console_suspend_enabled && uart_console(uport))
2122 goto unlock;
2123
2124 uport->suspended = 1;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002125
Peter Hurleyd41861c2016-04-09 17:53:25 -07002126 if (tty_port_initialized(port)) {
Alan Coxccce6de2009-09-19 13:13:30 -07002127 const struct uart_ops *ops = uport->ops;
Russell Kingc8c6bfa2008-02-04 22:27:52 -08002128 int tries;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002129
Peter Hurley80f02d52016-04-09 17:53:24 -07002130 tty_port_set_suspended(port, 1);
Peter Hurleyd41861c2016-04-09 17:53:25 -07002131 tty_port_set_initialized(port, 0);
Russell Kinga6b93a92006-10-01 17:17:40 +01002132
Peter Hurleyb164c972015-01-22 12:24:25 -05002133 spin_lock_irq(&uport->lock);
2134 ops->stop_tx(uport);
2135 ops->set_mctrl(uport, 0);
2136 ops->stop_rx(uport);
2137 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002138
2139 /*
2140 * Wait for the transmitter to empty.
2141 */
Alan Coxccce6de2009-09-19 13:13:30 -07002142 for (tries = 3; !ops->tx_empty(uport) && tries; tries--)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002143 msleep(10);
Russell Kingc8c6bfa2008-02-04 22:27:52 -08002144 if (!tries)
Sudip Mukherjee2f2dafe2014-09-01 20:49:43 +05302145 dev_err(uport->dev, "%s%d: Unable to drain transmitter\n",
2146 drv->dev_name,
2147 drv->tty_driver->name_base + uport->line);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002148
Peter Hurleyb164c972015-01-22 12:24:25 -05002149 ops->shutdown(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002150 }
2151
2152 /*
2153 * Disable the console device before suspending.
2154 */
Peter Hurleyb164c972015-01-22 12:24:25 -05002155 if (uart_console(uport))
Alan Coxccce6de2009-09-19 13:13:30 -07002156 console_stop(uport->cons);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002157
Peter Hurleyb164c972015-01-22 12:24:25 -05002158 uart_change_pm(state, UART_PM_STATE_OFF);
2159unlock:
Alan Coxa2bceae2009-09-19 13:13:31 -07002160 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002161
2162 return 0;
2163}
2164
Alan Coxccce6de2009-09-19 13:13:30 -07002165int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002166{
Alan Coxccce6de2009-09-19 13:13:30 -07002167 struct uart_state *state = drv->state + uport->line;
2168 struct tty_port *port = &state->port;
Arjan van de Ven03a74dc2008-05-23 13:04:49 -07002169 struct device *tty_dev;
Alan Coxccce6de2009-09-19 13:13:30 -07002170 struct uart_match match = {uport, drv};
Deepak Saxenaba15ab02009-09-19 13:13:33 -07002171 struct ktermios termios;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002172
Alan Coxa2bceae2009-09-19 13:13:31 -07002173 mutex_lock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002174
Alan Coxccce6de2009-09-19 13:13:30 -07002175 tty_dev = device_find_child(uport->dev, &match, serial_match_port);
2176 if (!uport->suspended && device_may_wakeup(tty_dev)) {
Govindraj.R3f960db2010-12-16 18:12:47 +05302177 if (uport->irq_wake) {
2178 disable_irq_wake(uport->irq);
2179 uport->irq_wake = 0;
2180 }
Federico Vaga5a65dcc2013-04-15 16:01:07 +02002181 put_device(tty_dev);
Alan Coxa2bceae2009-09-19 13:13:31 -07002182 mutex_unlock(&port->mutex);
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002183 return 0;
2184 }
Federico Vaga5a65dcc2013-04-15 16:01:07 +02002185 put_device(tty_dev);
Alan Coxccce6de2009-09-19 13:13:30 -07002186 uport->suspended = 0;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002187
Linus Torvalds1da177e2005-04-16 15:20:36 -07002188 /*
2189 * Re-enable the console device after suspending.
2190 */
Yin Kangkai5933a162011-01-30 11:15:30 +08002191 if (uart_console(uport)) {
Jason Wang891b9dd2010-08-21 15:14:42 +08002192 /*
2193 * First try to use the console cflag setting.
2194 */
2195 memset(&termios, 0, sizeof(struct ktermios));
2196 termios.c_cflag = uport->cons->cflag;
2197
2198 /*
2199 * If that's unset, use the tty termios setting.
2200 */
Alan Coxadc8d742012-07-14 15:31:47 +01002201 if (port->tty && termios.c_cflag == 0)
2202 termios = port->tty->termios;
Jason Wang891b9dd2010-08-21 15:14:42 +08002203
Ning Jiang94abc562011-09-05 16:28:18 +08002204 if (console_suspend_enabled)
Linus Walleij6f538fe2012-12-07 11:36:08 +01002205 uart_change_pm(state, UART_PM_STATE_ON);
Alan Coxccce6de2009-09-19 13:13:30 -07002206 uport->ops->set_termios(uport, &termios, NULL);
Yin Kangkai5933a162011-01-30 11:15:30 +08002207 if (console_suspend_enabled)
2208 console_start(uport->cons);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002209 }
2210
Peter Hurley80f02d52016-04-09 17:53:24 -07002211 if (tty_port_suspended(port)) {
Alan Coxccce6de2009-09-19 13:13:30 -07002212 const struct uart_ops *ops = uport->ops;
Russell Kingee31b332005-11-13 15:28:51 +00002213 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002214
Linus Walleij6f538fe2012-12-07 11:36:08 +01002215 uart_change_pm(state, UART_PM_STATE_ON);
Alan Coxccce6de2009-09-19 13:13:30 -07002216 spin_lock_irq(&uport->lock);
2217 ops->set_mctrl(uport, 0);
2218 spin_unlock_irq(&uport->lock);
Stanislav Brabec4547be72009-12-02 16:20:56 +01002219 if (console_suspend_enabled || !uart_console(uport)) {
Alan Cox19225132010-06-01 22:52:51 +02002220 /* Protected by port mutex for now */
2221 struct tty_struct *tty = port->tty;
Stanislav Brabec4547be72009-12-02 16:20:56 +01002222 ret = ops->startup(uport);
2223 if (ret == 0) {
Alan Cox19225132010-06-01 22:52:51 +02002224 if (tty)
2225 uart_change_speed(tty, state, NULL);
Stanislav Brabec4547be72009-12-02 16:20:56 +01002226 spin_lock_irq(&uport->lock);
2227 ops->set_mctrl(uport, uport->mctrl);
2228 ops->start_tx(uport);
2229 spin_unlock_irq(&uport->lock);
Peter Hurleyd41861c2016-04-09 17:53:25 -07002230 tty_port_set_initialized(port, 1);
Stanislav Brabec4547be72009-12-02 16:20:56 +01002231 } else {
2232 /*
2233 * Failed to resume - maybe hardware went away?
2234 * Clear the "initialized" flag so we won't try
2235 * to call the low level drivers shutdown method.
2236 */
Alan Cox19225132010-06-01 22:52:51 +02002237 uart_shutdown(tty, state);
Stanislav Brabec4547be72009-12-02 16:20:56 +01002238 }
Russell Kingee31b332005-11-13 15:28:51 +00002239 }
Russell Kinga6b93a92006-10-01 17:17:40 +01002240
Peter Hurley80f02d52016-04-09 17:53:24 -07002241 tty_port_set_suspended(port, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002242 }
2243
Alan Coxa2bceae2009-09-19 13:13:31 -07002244 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002245
2246 return 0;
2247}
2248
2249static inline void
2250uart_report_port(struct uart_driver *drv, struct uart_port *port)
2251{
Russell King30b7a3b2005-09-03 15:30:21 +01002252 char address[64];
2253
Linus Torvalds1da177e2005-04-16 15:20:36 -07002254 switch (port->iotype) {
2255 case UPIO_PORT:
Andrew Morton9bde10a2008-10-13 10:35:42 +01002256 snprintf(address, sizeof(address), "I/O 0x%lx", port->iobase);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002257 break;
2258 case UPIO_HUB6:
Russell King30b7a3b2005-09-03 15:30:21 +01002259 snprintf(address, sizeof(address),
Andrew Morton9bde10a2008-10-13 10:35:42 +01002260 "I/O 0x%lx offset 0x%x", port->iobase, port->hub6);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002261 break;
2262 case UPIO_MEM:
Masahiro Yamadabd94c402015-10-28 12:46:05 +09002263 case UPIO_MEM16:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002264 case UPIO_MEM32:
Kevin Cernekee3ffb1a82014-11-12 12:53:59 -08002265 case UPIO_MEM32BE:
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00002266 case UPIO_AU:
Zang Roy-r619113be91ec2006-06-30 02:29:58 -07002267 case UPIO_TSI:
Russell King30b7a3b2005-09-03 15:30:21 +01002268 snprintf(address, sizeof(address),
Josh Boyer4f640ef2007-07-23 18:43:44 -07002269 "MMIO 0x%llx", (unsigned long long)port->mapbase);
Russell King30b7a3b2005-09-03 15:30:21 +01002270 break;
2271 default:
2272 strlcpy(address, "*unknown*", sizeof(address));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002273 break;
2274 }
Russell King30b7a3b2005-09-03 15:30:21 +01002275
James Bottomley68ed7e12015-01-02 10:05:13 -08002276 printk(KERN_INFO "%s%s%s%d at %s (irq = %d, base_baud = %d) is a %s\n",
2277 port->dev ? dev_name(port->dev) : "",
2278 port->dev ? ": " : "",
David S. Miller84408382008-10-13 10:45:26 +01002279 drv->dev_name,
2280 drv->tty_driver->name_base + port->line,
Kees Cook7d12b972013-07-12 13:07:39 -07002281 address, port->irq, port->uartclk / 16, uart_type(port));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002282}
2283
2284static void
2285uart_configure_port(struct uart_driver *drv, struct uart_state *state,
2286 struct uart_port *port)
2287{
2288 unsigned int flags;
2289
2290 /*
2291 * If there isn't a port here, don't do anything further.
2292 */
2293 if (!port->iobase && !port->mapbase && !port->membase)
2294 return;
2295
2296 /*
2297 * Now do the auto configuration stuff. Note that config_port
2298 * is expected to claim the resources and map the port for us.
2299 */
David Daney8e23fcc2009-01-02 13:49:54 +00002300 flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002301 if (port->flags & UPF_AUTO_IRQ)
2302 flags |= UART_CONFIG_IRQ;
2303 if (port->flags & UPF_BOOT_AUTOCONF) {
David Daney8e23fcc2009-01-02 13:49:54 +00002304 if (!(port->flags & UPF_FIXED_TYPE)) {
2305 port->type = PORT_UNKNOWN;
2306 flags |= UART_CONFIG_TYPE;
2307 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002308 port->ops->config_port(port, flags);
2309 }
2310
2311 if (port->type != PORT_UNKNOWN) {
2312 unsigned long flags;
2313
2314 uart_report_port(drv, port);
2315
George G. Davis3689a0e2007-02-14 00:33:06 -08002316 /* Power up port for set_mctrl() */
Linus Walleij6f538fe2012-12-07 11:36:08 +01002317 uart_change_pm(state, UART_PM_STATE_ON);
George G. Davis3689a0e2007-02-14 00:33:06 -08002318
Linus Torvalds1da177e2005-04-16 15:20:36 -07002319 /*
2320 * Ensure that the modem control lines are de-activated.
Yinghai Luc3e46422008-02-04 22:27:46 -08002321 * keep the DTR setting that is set in uart_set_options()
Linus Torvalds1da177e2005-04-16 15:20:36 -07002322 * We probably don't need a spinlock around this, but
2323 */
2324 spin_lock_irqsave(&port->lock, flags);
Yinghai Luc3e46422008-02-04 22:27:46 -08002325 port->ops->set_mctrl(port, port->mctrl & TIOCM_DTR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002326 spin_unlock_irqrestore(&port->lock, flags);
2327
2328 /*
Russell King97d97222007-09-01 21:25:09 +01002329 * If this driver supports console, and it hasn't been
2330 * successfully registered yet, try to re-register it.
2331 * It may be that the port was not available.
2332 */
2333 if (port->cons && !(port->cons->flags & CON_ENABLED))
2334 register_console(port->cons);
2335
2336 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002337 * Power down all ports by default, except the
2338 * console if we have one.
2339 */
2340 if (!uart_console(port))
Linus Walleij6f538fe2012-12-07 11:36:08 +01002341 uart_change_pm(state, UART_PM_STATE_OFF);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002342 }
2343}
2344
Jason Wesself2d937f2008-04-17 20:05:37 +02002345#ifdef CONFIG_CONSOLE_POLL
2346
2347static int uart_poll_init(struct tty_driver *driver, int line, char *options)
2348{
2349 struct uart_driver *drv = driver->driver_state;
2350 struct uart_state *state = drv->state + line;
Peter Hurley49c02302016-04-09 18:56:32 -07002351 struct tty_port *tport;
Jason Wesself2d937f2008-04-17 20:05:37 +02002352 struct uart_port *port;
2353 int baud = 9600;
2354 int bits = 8;
2355 int parity = 'n';
2356 int flow = 'n';
Peter Hurley49c02302016-04-09 18:56:32 -07002357 int ret = 0;
Jason Wesself2d937f2008-04-17 20:05:37 +02002358
Peter Hurley49c02302016-04-09 18:56:32 -07002359 if (!state)
Jason Wesself2d937f2008-04-17 20:05:37 +02002360 return -1;
2361
Peter Hurley49c02302016-04-09 18:56:32 -07002362 tport = &state->port;
2363 mutex_lock(&tport->mutex);
2364
Peter Hurley4047b372016-04-09 18:56:33 -07002365 port = uart_port_check(state);
2366 if (!port || !(port->ops->poll_get_char && port->ops->poll_put_char)) {
Peter Hurley49c02302016-04-09 18:56:32 -07002367 ret = -1;
2368 goto out;
2369 }
Jason Wesself2d937f2008-04-17 20:05:37 +02002370
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002371 if (port->ops->poll_init) {
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002372 /*
Peter Hurleyd41861c2016-04-09 17:53:25 -07002373 * We don't set initialized as we only initialized the hw,
2374 * e.g. state->xmit is still uninitialized.
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002375 */
Peter Hurleyd41861c2016-04-09 17:53:25 -07002376 if (!tty_port_initialized(tport))
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002377 ret = port->ops->poll_init(port);
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002378 }
2379
Peter Hurley49c02302016-04-09 18:56:32 -07002380 if (!ret && options) {
Jason Wesself2d937f2008-04-17 20:05:37 +02002381 uart_parse_options(options, &baud, &parity, &bits, &flow);
Peter Hurley49c02302016-04-09 18:56:32 -07002382 ret = uart_set_options(port, NULL, baud, parity, bits, flow);
Jason Wesself2d937f2008-04-17 20:05:37 +02002383 }
Peter Hurley49c02302016-04-09 18:56:32 -07002384out:
2385 mutex_unlock(&tport->mutex);
2386 return ret;
Jason Wesself2d937f2008-04-17 20:05:37 +02002387}
2388
2389static int uart_poll_get_char(struct tty_driver *driver, int line)
2390{
2391 struct uart_driver *drv = driver->driver_state;
2392 struct uart_state *state = drv->state + line;
2393 struct uart_port *port;
Peter Hurley9ed19422016-04-09 18:56:34 -07002394 int ret = -1;
Jason Wesself2d937f2008-04-17 20:05:37 +02002395
Peter Hurley9ed19422016-04-09 18:56:34 -07002396 if (state) {
2397 port = uart_port_ref(state);
2398 if (port)
2399 ret = port->ops->poll_get_char(port);
2400 uart_port_deref(port);
2401 }
2402 return ret;
Jason Wesself2d937f2008-04-17 20:05:37 +02002403}
2404
2405static void uart_poll_put_char(struct tty_driver *driver, int line, char ch)
2406{
2407 struct uart_driver *drv = driver->driver_state;
2408 struct uart_state *state = drv->state + line;
2409 struct uart_port *port;
2410
Peter Hurley9ed19422016-04-09 18:56:34 -07002411 port = uart_port_ref(state);
2412 if (!port)
2413 return;
Doug Andersonc7d44a02014-04-21 10:06:43 -07002414
2415 if (ch == '\n')
2416 port->ops->poll_put_char(port, '\r');
Jason Wesself2d937f2008-04-17 20:05:37 +02002417 port->ops->poll_put_char(port, ch);
Peter Hurley9ed19422016-04-09 18:56:34 -07002418 uart_port_deref(port);
Jason Wesself2d937f2008-04-17 20:05:37 +02002419}
2420#endif
2421
Jiri Slabyabad73a2019-04-17 10:58:53 +02002422static int uart_install(struct tty_driver *driver, struct tty_struct *tty)
2423{
2424 struct uart_driver *drv = driver->driver_state;
2425 struct uart_state *state = drv->state + tty->index;
2426
2427 tty->driver_data = state;
2428
2429 return tty_standard_install(driver, tty);
2430}
2431
Jeff Dikeb68e31d2006-10-02 02:17:18 -07002432static const struct tty_operations uart_ops = {
Jiri Slabyabad73a2019-04-17 10:58:53 +02002433 .install = uart_install,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002434 .open = uart_open,
2435 .close = uart_close,
2436 .write = uart_write,
2437 .put_char = uart_put_char,
2438 .flush_chars = uart_flush_chars,
2439 .write_room = uart_write_room,
2440 .chars_in_buffer= uart_chars_in_buffer,
2441 .flush_buffer = uart_flush_buffer,
2442 .ioctl = uart_ioctl,
2443 .throttle = uart_throttle,
2444 .unthrottle = uart_unthrottle,
2445 .send_xchar = uart_send_xchar,
2446 .set_termios = uart_set_termios,
Alan Cox64e91592008-06-03 15:18:54 +01002447 .set_ldisc = uart_set_ldisc,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002448 .stop = uart_stop,
2449 .start = uart_start,
2450 .hangup = uart_hangup,
2451 .break_ctl = uart_break_ctl,
2452 .wait_until_sent= uart_wait_until_sent,
2453#ifdef CONFIG_PROC_FS
Alexey Dobriyand196a942009-03-31 15:19:21 -07002454 .proc_fops = &uart_proc_fops,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002455#endif
2456 .tiocmget = uart_tiocmget,
2457 .tiocmset = uart_tiocmset,
Alan Coxd281da72010-09-16 18:21:24 +01002458 .get_icount = uart_get_icount,
Jason Wesself2d937f2008-04-17 20:05:37 +02002459#ifdef CONFIG_CONSOLE_POLL
2460 .poll_init = uart_poll_init,
2461 .poll_get_char = uart_poll_get_char,
2462 .poll_put_char = uart_poll_put_char,
2463#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07002464};
2465
Alan Coxde0c8cb2010-06-01 22:52:58 +02002466static const struct tty_port_operations uart_port_ops = {
2467 .carrier_raised = uart_carrier_raised,
2468 .dtr_rts = uart_dtr_rts,
Rob Herringb3b57642016-08-22 17:39:09 -05002469 .activate = uart_port_activate,
Rob Herring761ed4a2016-08-22 17:39:10 -05002470 .shutdown = uart_tty_port_shutdown,
Alan Coxde0c8cb2010-06-01 22:52:58 +02002471};
2472
Linus Torvalds1da177e2005-04-16 15:20:36 -07002473/**
2474 * uart_register_driver - register a driver with the uart core layer
2475 * @drv: low level driver structure
2476 *
2477 * Register a uart driver with the core driver. We in turn register
2478 * with the tty layer, and initialise the core driver per-port state.
2479 *
2480 * We have a proc file in /proc/tty/driver which is named after the
2481 * normal driver.
2482 *
2483 * drv->port should be NULL, and the per-port structures should be
2484 * registered using uart_add_one_port after this call has succeeded.
2485 */
2486int uart_register_driver(struct uart_driver *drv)
2487{
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002488 struct tty_driver *normal;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002489 int i, retval;
2490
2491 BUG_ON(drv->state);
2492
2493 /*
2494 * Maybe we should be using a slab cache for this, especially if
2495 * we have a large number of ports to handle.
2496 */
Burman Yan8f31bb32007-02-14 00:33:07 -08002497 drv->state = kzalloc(sizeof(struct uart_state) * drv->nr, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002498 if (!drv->state)
2499 goto out;
2500
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002501 normal = alloc_tty_driver(drv->nr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002502 if (!normal)
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002503 goto out_kfree;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002504
2505 drv->tty_driver = normal;
2506
Linus Torvalds1da177e2005-04-16 15:20:36 -07002507 normal->driver_name = drv->driver_name;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002508 normal->name = drv->dev_name;
2509 normal->major = drv->major;
2510 normal->minor_start = drv->minor;
2511 normal->type = TTY_DRIVER_TYPE_SERIAL;
2512 normal->subtype = SERIAL_TYPE_NORMAL;
2513 normal->init_termios = tty_std_termios;
2514 normal->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
Alan Cox606d0992006-12-08 02:38:45 -08002515 normal->init_termios.c_ispeed = normal->init_termios.c_ospeed = 9600;
Greg Kroah-Hartman331b8312005-06-20 21:15:16 -07002516 normal->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002517 normal->driver_state = drv;
2518 tty_set_operations(normal, &uart_ops);
2519
2520 /*
2521 * Initialise the UART state(s).
2522 */
2523 for (i = 0; i < drv->nr; i++) {
2524 struct uart_state *state = drv->state + i;
Alan Coxa2bceae2009-09-19 13:13:31 -07002525 struct tty_port *port = &state->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002526
Alan Coxa2bceae2009-09-19 13:13:31 -07002527 tty_port_init(port);
Alan Coxde0c8cb2010-06-01 22:52:58 +02002528 port->ops = &uart_port_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002529 }
2530
2531 retval = tty_register_driver(normal);
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002532 if (retval >= 0)
2533 return retval;
2534
Jiri Slaby191c5f12012-11-15 09:49:56 +01002535 for (i = 0; i < drv->nr; i++)
2536 tty_port_destroy(&drv->state[i].port);
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002537 put_tty_driver(normal);
2538out_kfree:
2539 kfree(drv->state);
2540out:
2541 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002542}
2543
2544/**
2545 * uart_unregister_driver - remove a driver from the uart core layer
2546 * @drv: low level driver structure
2547 *
2548 * Remove all references to a driver from the core driver. The low
2549 * level driver must have removed all its ports via the
2550 * uart_remove_one_port() if it registered them with uart_add_one_port().
2551 * (ie, drv->port == NULL)
2552 */
2553void uart_unregister_driver(struct uart_driver *drv)
2554{
2555 struct tty_driver *p = drv->tty_driver;
Jiri Slaby191c5f12012-11-15 09:49:56 +01002556 unsigned int i;
2557
Linus Torvalds1da177e2005-04-16 15:20:36 -07002558 tty_unregister_driver(p);
2559 put_tty_driver(p);
Jiri Slaby191c5f12012-11-15 09:49:56 +01002560 for (i = 0; i < drv->nr; i++)
2561 tty_port_destroy(&drv->state[i].port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002562 kfree(drv->state);
Alan Cox1e66cded2012-05-14 14:51:22 +01002563 drv->state = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002564 drv->tty_driver = NULL;
2565}
2566
2567struct tty_driver *uart_console_device(struct console *co, int *index)
2568{
2569 struct uart_driver *p = co->data;
2570 *index = co->index;
2571 return p->tty_driver;
2572}
2573
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002574static ssize_t uart_get_attr_uartclk(struct device *dev,
2575 struct device_attribute *attr, char *buf)
2576{
Alan Coxbebe73e2012-10-29 15:19:57 +00002577 struct serial_struct tmp;
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002578 struct tty_port *port = dev_get_drvdata(dev);
Tomas Hlavacekb1b79912012-09-06 23:17:47 +02002579
Alan Cox9f109692012-10-29 15:20:25 +00002580 uart_get_info(port, &tmp);
Alan Coxbebe73e2012-10-29 15:19:57 +00002581 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.baud_base * 16);
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002582}
2583
Alan Cox373bac42012-10-29 15:20:40 +00002584static ssize_t uart_get_attr_type(struct device *dev,
2585 struct device_attribute *attr, char *buf)
2586{
2587 struct serial_struct tmp;
2588 struct tty_port *port = dev_get_drvdata(dev);
2589
2590 uart_get_info(port, &tmp);
2591 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.type);
2592}
2593static ssize_t uart_get_attr_line(struct device *dev,
2594 struct device_attribute *attr, char *buf)
2595{
2596 struct serial_struct tmp;
2597 struct tty_port *port = dev_get_drvdata(dev);
2598
2599 uart_get_info(port, &tmp);
2600 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.line);
2601}
2602
2603static ssize_t uart_get_attr_port(struct device *dev,
2604 struct device_attribute *attr, char *buf)
2605{
2606 struct serial_struct tmp;
2607 struct tty_port *port = dev_get_drvdata(dev);
Andrew Mortonfd985e12012-11-26 15:47:15 -08002608 unsigned long ioaddr;
Alan Cox373bac42012-10-29 15:20:40 +00002609
2610 uart_get_info(port, &tmp);
Andrew Mortonfd985e12012-11-26 15:47:15 -08002611 ioaddr = tmp.port;
2612 if (HIGH_BITS_OFFSET)
2613 ioaddr |= (unsigned long)tmp.port_high << HIGH_BITS_OFFSET;
2614 return snprintf(buf, PAGE_SIZE, "0x%lX\n", ioaddr);
Alan Cox373bac42012-10-29 15:20:40 +00002615}
2616
2617static ssize_t uart_get_attr_irq(struct device *dev,
2618 struct device_attribute *attr, char *buf)
2619{
2620 struct serial_struct tmp;
2621 struct tty_port *port = dev_get_drvdata(dev);
2622
2623 uart_get_info(port, &tmp);
2624 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.irq);
2625}
2626
2627static ssize_t uart_get_attr_flags(struct device *dev,
2628 struct device_attribute *attr, char *buf)
2629{
2630 struct serial_struct tmp;
2631 struct tty_port *port = dev_get_drvdata(dev);
2632
2633 uart_get_info(port, &tmp);
2634 return snprintf(buf, PAGE_SIZE, "0x%X\n", tmp.flags);
2635}
2636
2637static ssize_t uart_get_attr_xmit_fifo_size(struct device *dev,
2638 struct device_attribute *attr, char *buf)
2639{
2640 struct serial_struct tmp;
2641 struct tty_port *port = dev_get_drvdata(dev);
2642
2643 uart_get_info(port, &tmp);
2644 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.xmit_fifo_size);
2645}
2646
2647
2648static ssize_t uart_get_attr_close_delay(struct device *dev,
2649 struct device_attribute *attr, char *buf)
2650{
2651 struct serial_struct tmp;
2652 struct tty_port *port = dev_get_drvdata(dev);
2653
2654 uart_get_info(port, &tmp);
2655 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.close_delay);
2656}
2657
2658
2659static ssize_t uart_get_attr_closing_wait(struct device *dev,
2660 struct device_attribute *attr, char *buf)
2661{
2662 struct serial_struct tmp;
2663 struct tty_port *port = dev_get_drvdata(dev);
2664
2665 uart_get_info(port, &tmp);
2666 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.closing_wait);
2667}
2668
2669static ssize_t uart_get_attr_custom_divisor(struct device *dev,
2670 struct device_attribute *attr, char *buf)
2671{
2672 struct serial_struct tmp;
2673 struct tty_port *port = dev_get_drvdata(dev);
2674
2675 uart_get_info(port, &tmp);
2676 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.custom_divisor);
2677}
2678
2679static ssize_t uart_get_attr_io_type(struct device *dev,
2680 struct device_attribute *attr, char *buf)
2681{
2682 struct serial_struct tmp;
2683 struct tty_port *port = dev_get_drvdata(dev);
2684
2685 uart_get_info(port, &tmp);
2686 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.io_type);
2687}
2688
2689static ssize_t uart_get_attr_iomem_base(struct device *dev,
2690 struct device_attribute *attr, char *buf)
2691{
2692 struct serial_struct tmp;
2693 struct tty_port *port = dev_get_drvdata(dev);
2694
2695 uart_get_info(port, &tmp);
2696 return snprintf(buf, PAGE_SIZE, "0x%lX\n", (unsigned long)tmp.iomem_base);
2697}
2698
2699static ssize_t uart_get_attr_iomem_reg_shift(struct device *dev,
2700 struct device_attribute *attr, char *buf)
2701{
2702 struct serial_struct tmp;
2703 struct tty_port *port = dev_get_drvdata(dev);
2704
2705 uart_get_info(port, &tmp);
2706 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.iomem_reg_shift);
2707}
2708
2709static DEVICE_ATTR(type, S_IRUSR | S_IRGRP, uart_get_attr_type, NULL);
2710static DEVICE_ATTR(line, S_IRUSR | S_IRGRP, uart_get_attr_line, NULL);
2711static DEVICE_ATTR(port, S_IRUSR | S_IRGRP, uart_get_attr_port, NULL);
2712static DEVICE_ATTR(irq, S_IRUSR | S_IRGRP, uart_get_attr_irq, NULL);
2713static DEVICE_ATTR(flags, S_IRUSR | S_IRGRP, uart_get_attr_flags, NULL);
2714static DEVICE_ATTR(xmit_fifo_size, S_IRUSR | S_IRGRP, uart_get_attr_xmit_fifo_size, NULL);
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002715static DEVICE_ATTR(uartclk, S_IRUSR | S_IRGRP, uart_get_attr_uartclk, NULL);
Alan Cox373bac42012-10-29 15:20:40 +00002716static DEVICE_ATTR(close_delay, S_IRUSR | S_IRGRP, uart_get_attr_close_delay, NULL);
2717static DEVICE_ATTR(closing_wait, S_IRUSR | S_IRGRP, uart_get_attr_closing_wait, NULL);
2718static DEVICE_ATTR(custom_divisor, S_IRUSR | S_IRGRP, uart_get_attr_custom_divisor, NULL);
2719static DEVICE_ATTR(io_type, S_IRUSR | S_IRGRP, uart_get_attr_io_type, NULL);
2720static DEVICE_ATTR(iomem_base, S_IRUSR | S_IRGRP, uart_get_attr_iomem_base, NULL);
2721static DEVICE_ATTR(iomem_reg_shift, S_IRUSR | S_IRGRP, uart_get_attr_iomem_reg_shift, NULL);
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002722
2723static struct attribute *tty_dev_attrs[] = {
Alan Cox373bac42012-10-29 15:20:40 +00002724 &dev_attr_type.attr,
2725 &dev_attr_line.attr,
2726 &dev_attr_port.attr,
2727 &dev_attr_irq.attr,
2728 &dev_attr_flags.attr,
2729 &dev_attr_xmit_fifo_size.attr,
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002730 &dev_attr_uartclk.attr,
Alan Cox373bac42012-10-29 15:20:40 +00002731 &dev_attr_close_delay.attr,
2732 &dev_attr_closing_wait.attr,
2733 &dev_attr_custom_divisor.attr,
2734 &dev_attr_io_type.attr,
2735 &dev_attr_iomem_base.attr,
2736 &dev_attr_iomem_reg_shift.attr,
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002737 NULL,
2738 };
2739
Tomas Hlavacekb1b79912012-09-06 23:17:47 +02002740static const struct attribute_group tty_dev_attr_group = {
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002741 .attrs = tty_dev_attrs,
2742 };
2743
Linus Torvalds1da177e2005-04-16 15:20:36 -07002744/**
2745 * uart_add_one_port - attach a driver-defined port structure
2746 * @drv: pointer to the uart low level driver structure for this port
Randy Dunlap1b9894f2009-09-21 11:12:03 -07002747 * @uport: uart port structure to use for this port.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002748 *
2749 * This allows the driver to register its own uart_port structure
2750 * with the core driver. The main purpose is to allow the low
2751 * level uart drivers to expand uart_port, rather than having yet
2752 * more levels of structures.
2753 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002754int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002755{
2756 struct uart_state *state;
Alan Coxa2bceae2009-09-19 13:13:31 -07002757 struct tty_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002758 int ret = 0;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002759 struct device *tty_dev;
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002760 int num_groups;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002761
2762 BUG_ON(in_interrupt());
2763
Alan Coxa2bceae2009-09-19 13:13:31 -07002764 if (uport->line >= drv->nr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002765 return -EINVAL;
2766
Alan Coxa2bceae2009-09-19 13:13:31 -07002767 state = drv->state + uport->line;
2768 port = &state->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002769
Arjan van de Venf392ecf2006-01-12 18:44:32 +00002770 mutex_lock(&port_mutex);
Alan Coxa2bceae2009-09-19 13:13:31 -07002771 mutex_lock(&port->mutex);
Alan Coxebd2c8f2009-09-19 13:13:28 -07002772 if (state->uart_port) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002773 ret = -EINVAL;
2774 goto out;
2775 }
2776
Peter Hurley2b702b92014-10-16 16:54:25 -04002777 /* Link the port to the driver state table and vice versa */
Peter Hurley9ed19422016-04-09 18:56:34 -07002778 atomic_set(&state->refcount, 1);
2779 init_waitqueue_head(&state->remove_wait);
Alan Coxa2bceae2009-09-19 13:13:31 -07002780 state->uart_port = uport;
Alan Coxa2bceae2009-09-19 13:13:31 -07002781 uport->state = state;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002782
Peter Hurley2b702b92014-10-16 16:54:25 -04002783 state->pm_state = UART_PM_STATE_UNDEFINED;
2784 uport->cons = drv->cons;
Peter Hurley959801f2015-02-24 14:25:00 -05002785 uport->minor = drv->tty_driver->minor_start + uport->line;
Peter Hurley2b702b92014-10-16 16:54:25 -04002786
Russell King976ecd12005-07-03 21:05:45 +01002787 /*
2788 * If this port is a console, then the spinlock is already
2789 * initialised.
2790 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002791 if (!(uart_console(uport) && (uport->cons->flags & CON_ENABLED))) {
2792 spin_lock_init(&uport->lock);
2793 lockdep_set_class(&uport->lock, &port_lock_key);
Ingo Molnar13e83592006-07-03 00:25:03 -07002794 }
Grant Likelya208ffd2014-03-27 18:29:46 -07002795 if (uport->cons && uport->dev)
2796 of_console_check(uport->dev->of_node, uport->cons->name, uport->line);
Russell King976ecd12005-07-03 21:05:45 +01002797
Sudip Mukherjeecaeb5e12019-12-12 13:16:02 +00002798 tty_port_link_device(port, drv->tty_driver, uport->line);
Alan Coxa2bceae2009-09-19 13:13:31 -07002799 uart_configure_port(drv, state, uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002800
Geert Uytterhoeven4dda8642016-10-28 07:07:47 -05002801 port->console = uart_console(uport);
2802
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002803 num_groups = 2;
2804 if (uport->attr_group)
2805 num_groups++;
2806
Yoshihiro YUNOMAEc2b703b2014-07-23 06:06:22 +00002807 uport->tty_groups = kcalloc(num_groups, sizeof(*uport->tty_groups),
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002808 GFP_KERNEL);
2809 if (!uport->tty_groups) {
2810 ret = -ENOMEM;
2811 goto out;
2812 }
2813 uport->tty_groups[0] = &tty_dev_attr_group;
2814 if (uport->attr_group)
2815 uport->tty_groups[1] = uport->attr_group;
2816
Linus Torvalds1da177e2005-04-16 15:20:36 -07002817 /*
2818 * Register the port whether it's detected or not. This allows
Geert Uytterhoeven015355b2014-03-11 11:23:36 +01002819 * setserial to be used to alter this port's parameters.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002820 */
Tomas Hlavacekb1b79912012-09-06 23:17:47 +02002821 tty_dev = tty_port_register_device_attr(port, drv->tty_driver,
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002822 uport->line, uport->dev, port, uport->tty_groups);
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002823 if (likely(!IS_ERR(tty_dev))) {
Simon Glass77359832012-01-19 11:28:56 -08002824 device_set_wakeup_capable(tty_dev, 1);
2825 } else {
Sudip Mukherjee2f2dafe2014-09-01 20:49:43 +05302826 dev_err(uport->dev, "Cannot register tty device on line %d\n",
Alan Coxa2bceae2009-09-19 13:13:31 -07002827 uport->line);
Simon Glass77359832012-01-19 11:28:56 -08002828 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002829
2830 /*
Russell King68ac64c2006-04-30 11:13:50 +01002831 * Ensure UPF_DEAD is not set.
2832 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002833 uport->flags &= ~UPF_DEAD;
Russell King68ac64c2006-04-30 11:13:50 +01002834
Linus Torvalds1da177e2005-04-16 15:20:36 -07002835 out:
Alan Coxa2bceae2009-09-19 13:13:31 -07002836 mutex_unlock(&port->mutex);
Arjan van de Venf392ecf2006-01-12 18:44:32 +00002837 mutex_unlock(&port_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002838
2839 return ret;
2840}
2841
2842/**
2843 * uart_remove_one_port - detach a driver defined port structure
2844 * @drv: pointer to the uart low level driver structure for this port
Randy Dunlap1b9894f2009-09-21 11:12:03 -07002845 * @uport: uart port structure for this port
Linus Torvalds1da177e2005-04-16 15:20:36 -07002846 *
2847 * This unhooks (and hangs up) the specified port structure from the
2848 * core driver. No further calls will be made to the low-level code
2849 * for this port.
2850 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002851int uart_remove_one_port(struct uart_driver *drv, struct uart_port *uport)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002852{
Alan Coxa2bceae2009-09-19 13:13:31 -07002853 struct uart_state *state = drv->state + uport->line;
2854 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07002855 struct uart_port *uart_port;
Geert Uytterhoeven4c6d5b42014-03-17 14:10:58 +01002856 struct tty_struct *tty;
Chen Gangb342dd52012-12-27 15:51:31 +08002857 int ret = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002858
2859 BUG_ON(in_interrupt());
2860
Arjan van de Venf392ecf2006-01-12 18:44:32 +00002861 mutex_lock(&port_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002862
2863 /*
Russell King68ac64c2006-04-30 11:13:50 +01002864 * Mark the port "dead" - this prevents any opens from
2865 * succeeding while we shut down the port.
2866 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002867 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07002868 uart_port = uart_port_check(state);
2869 if (uart_port != uport)
2870 dev_alert(uport->dev, "Removing wrong port: %p != %p\n",
2871 uart_port, uport);
2872
2873 if (!uart_port) {
Chen Gangb342dd52012-12-27 15:51:31 +08002874 mutex_unlock(&port->mutex);
2875 ret = -EINVAL;
2876 goto out;
2877 }
Alan Coxa2bceae2009-09-19 13:13:31 -07002878 uport->flags |= UPF_DEAD;
2879 mutex_unlock(&port->mutex);
Russell King68ac64c2006-04-30 11:13:50 +01002880
2881 /*
Greg Kroah-Hartmanaa4148c2005-06-20 21:15:16 -07002882 * Remove the devices from the tty layer
Linus Torvalds1da177e2005-04-16 15:20:36 -07002883 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002884 tty_unregister_device(drv->tty_driver, uport->line);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002885
Geert Uytterhoeven4c6d5b42014-03-17 14:10:58 +01002886 tty = tty_port_tty_get(port);
2887 if (tty) {
Alan Coxa2bceae2009-09-19 13:13:31 -07002888 tty_vhangup(port->tty);
Geert Uytterhoeven4c6d5b42014-03-17 14:10:58 +01002889 tty_kref_put(tty);
2890 }
Russell King68ac64c2006-04-30 11:13:50 +01002891
2892 /*
Geert Uytterhoeven5f5c9ae2014-02-28 14:21:32 +01002893 * If the port is used as a console, unregister it
2894 */
2895 if (uart_console(uport))
2896 unregister_console(uport->cons);
2897
2898 /*
Russell King68ac64c2006-04-30 11:13:50 +01002899 * Free the port IO and memory resources, if any.
2900 */
Fabio Estevama7cfaf12016-05-20 01:59:54 -03002901 if (uport->type != PORT_UNKNOWN && uport->ops->release_port)
Alan Coxa2bceae2009-09-19 13:13:31 -07002902 uport->ops->release_port(uport);
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002903 kfree(uport->tty_groups);
Russell King68ac64c2006-04-30 11:13:50 +01002904
2905 /*
2906 * Indicate that there isn't a port here anymore.
2907 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002908 uport->type = PORT_UNKNOWN;
Russell King68ac64c2006-04-30 11:13:50 +01002909
Peter Hurley4047b372016-04-09 18:56:33 -07002910 mutex_lock(&port->mutex);
Peter Hurley9ed19422016-04-09 18:56:34 -07002911 WARN_ON(atomic_dec_return(&state->refcount) < 0);
2912 wait_event(state->remove_wait, !atomic_read(&state->refcount));
Alan Coxebd2c8f2009-09-19 13:13:28 -07002913 state->uart_port = NULL;
Peter Hurley4047b372016-04-09 18:56:33 -07002914 mutex_unlock(&port->mutex);
Chen Gangb342dd52012-12-27 15:51:31 +08002915out:
Arjan van de Venf392ecf2006-01-12 18:44:32 +00002916 mutex_unlock(&port_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002917
Chen Gangb342dd52012-12-27 15:51:31 +08002918 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002919}
2920
2921/*
2922 * Are the two ports equivalent?
2923 */
2924int uart_match_port(struct uart_port *port1, struct uart_port *port2)
2925{
2926 if (port1->iotype != port2->iotype)
2927 return 0;
2928
2929 switch (port1->iotype) {
2930 case UPIO_PORT:
2931 return (port1->iobase == port2->iobase);
2932 case UPIO_HUB6:
2933 return (port1->iobase == port2->iobase) &&
2934 (port1->hub6 == port2->hub6);
2935 case UPIO_MEM:
Masahiro Yamadabd94c402015-10-28 12:46:05 +09002936 case UPIO_MEM16:
Sergei Shtylyovd21b55d2006-08-28 19:49:03 +04002937 case UPIO_MEM32:
Kevin Cernekee3ffb1a82014-11-12 12:53:59 -08002938 case UPIO_MEM32BE:
Sergei Shtylyovd21b55d2006-08-28 19:49:03 +04002939 case UPIO_AU:
2940 case UPIO_TSI:
Benjamin Herrenschmidt1624f002006-01-04 18:09:44 +00002941 return (port1->mapbase == port2->mapbase);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002942 }
2943 return 0;
2944}
2945EXPORT_SYMBOL(uart_match_port);
2946
Jiri Slaby027d7da2011-11-09 21:33:43 +01002947/**
2948 * uart_handle_dcd_change - handle a change of carrier detect state
2949 * @uport: uart_port structure for the open port
2950 * @status: new carrier detect status, nonzero if active
Peter Hurley4d90bb12014-09-10 15:06:23 -04002951 *
2952 * Caller must hold uport->lock
Jiri Slaby027d7da2011-11-09 21:33:43 +01002953 */
2954void uart_handle_dcd_change(struct uart_port *uport, unsigned int status)
2955{
George Spelvin42381572013-02-10 04:44:30 -05002956 struct tty_port *port = &uport->state->port;
Alan Cox43eca0a2012-09-19 15:35:46 +01002957 struct tty_struct *tty = port->tty;
Peter Hurleyc9932572014-09-02 17:39:21 -04002958 struct tty_ldisc *ld;
Jiri Slaby027d7da2011-11-09 21:33:43 +01002959
Peter Hurley4d90bb12014-09-10 15:06:23 -04002960 lockdep_assert_held_once(&uport->lock);
2961
Peter Hurleyc9932572014-09-02 17:39:21 -04002962 if (tty) {
2963 ld = tty_ldisc_ref(tty);
2964 if (ld) {
2965 if (ld->ops->dcd_change)
2966 ld->ops->dcd_change(tty, status);
2967 tty_ldisc_deref(ld);
2968 }
George Spelvin42381572013-02-10 04:44:30 -05002969 }
Jiri Slaby027d7da2011-11-09 21:33:43 +01002970
2971 uport->icount.dcd++;
Jiri Slaby027d7da2011-11-09 21:33:43 +01002972
Peter Hurley299245a2014-09-10 15:06:24 -04002973 if (uart_dcd_enabled(uport)) {
Jiri Slaby027d7da2011-11-09 21:33:43 +01002974 if (status)
2975 wake_up_interruptible(&port->open_wait);
Alan Cox43eca0a2012-09-19 15:35:46 +01002976 else if (tty)
2977 tty_hangup(tty);
Jiri Slaby027d7da2011-11-09 21:33:43 +01002978 }
Jiri Slaby027d7da2011-11-09 21:33:43 +01002979}
2980EXPORT_SYMBOL_GPL(uart_handle_dcd_change);
2981
2982/**
2983 * uart_handle_cts_change - handle a change of clear-to-send state
2984 * @uport: uart_port structure for the open port
2985 * @status: new clear to send status, nonzero if active
Peter Hurley4d90bb12014-09-10 15:06:23 -04002986 *
2987 * Caller must hold uport->lock
Jiri Slaby027d7da2011-11-09 21:33:43 +01002988 */
2989void uart_handle_cts_change(struct uart_port *uport, unsigned int status)
2990{
Peter Hurley4d90bb12014-09-10 15:06:23 -04002991 lockdep_assert_held_once(&uport->lock);
2992
Jiri Slaby027d7da2011-11-09 21:33:43 +01002993 uport->icount.cts++;
2994
Peter Hurley391f93f2015-01-25 14:44:51 -05002995 if (uart_softcts_mode(uport)) {
Peter Hurleyd01f4d12014-09-10 15:06:26 -04002996 if (uport->hw_stopped) {
Jiri Slaby027d7da2011-11-09 21:33:43 +01002997 if (status) {
Peter Hurleyd01f4d12014-09-10 15:06:26 -04002998 uport->hw_stopped = 0;
Jiri Slaby027d7da2011-11-09 21:33:43 +01002999 uport->ops->start_tx(uport);
3000 uart_write_wakeup(uport);
3001 }
3002 } else {
3003 if (!status) {
Peter Hurleyd01f4d12014-09-10 15:06:26 -04003004 uport->hw_stopped = 1;
Jiri Slaby027d7da2011-11-09 21:33:43 +01003005 uport->ops->stop_tx(uport);
3006 }
3007 }
Peter Hurley391f93f2015-01-25 14:44:51 -05003008
Jiri Slaby027d7da2011-11-09 21:33:43 +01003009 }
3010}
3011EXPORT_SYMBOL_GPL(uart_handle_cts_change);
3012
Jiri Slabycf755252011-11-09 21:33:47 +01003013/**
3014 * uart_insert_char - push a char to the uart layer
3015 *
3016 * User is responsible to call tty_flip_buffer_push when they are done with
3017 * insertion.
3018 *
3019 * @port: corresponding port
3020 * @status: state of the serial port RX buffer (LSR for 8250)
3021 * @overrun: mask of overrun bits in @status
3022 * @ch: character to push
3023 * @flag: flag for the character (see TTY_NORMAL and friends)
3024 */
Jiri Slaby027d7da2011-11-09 21:33:43 +01003025void uart_insert_char(struct uart_port *port, unsigned int status,
3026 unsigned int overrun, unsigned int ch, unsigned int flag)
3027{
Jiri Slaby92a19f92013-01-03 15:53:03 +01003028 struct tty_port *tport = &port->state->port;
Jiri Slaby027d7da2011-11-09 21:33:43 +01003029
3030 if ((status & port->ignore_status_mask & ~overrun) == 0)
Jiri Slaby92a19f92013-01-03 15:53:03 +01003031 if (tty_insert_flip_char(tport, ch, flag) == 0)
Corbindabfb352012-05-23 09:37:31 -05003032 ++port->icount.buf_overrun;
Jiri Slaby027d7da2011-11-09 21:33:43 +01003033
3034 /*
3035 * Overrun is special. Since it's reported immediately,
3036 * it doesn't affect the current character.
3037 */
3038 if (status & ~port->ignore_status_mask & overrun)
Jiri Slaby92a19f92013-01-03 15:53:03 +01003039 if (tty_insert_flip_char(tport, 0, TTY_OVERRUN) == 0)
Corbindabfb352012-05-23 09:37:31 -05003040 ++port->icount.buf_overrun;
Jiri Slaby027d7da2011-11-09 21:33:43 +01003041}
3042EXPORT_SYMBOL_GPL(uart_insert_char);
3043
Linus Torvalds1da177e2005-04-16 15:20:36 -07003044EXPORT_SYMBOL(uart_write_wakeup);
3045EXPORT_SYMBOL(uart_register_driver);
3046EXPORT_SYMBOL(uart_unregister_driver);
3047EXPORT_SYMBOL(uart_suspend_port);
3048EXPORT_SYMBOL(uart_resume_port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003049EXPORT_SYMBOL(uart_add_one_port);
3050EXPORT_SYMBOL(uart_remove_one_port);
3051
3052MODULE_DESCRIPTION("Serial driver core");
3053MODULE_LICENSE("GPL");