blob: 17c2ee2acb65d6dd968dc110a4a26a00fc76c097 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 * Driver core for serial ports
3 *
4 * Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
5 *
6 * Copyright 1999 ARM Limited
7 * Copyright (C) 2000-2001 Deep Blue Solutions Ltd.
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 */
Linus Torvalds1da177e2005-04-16 15:20:36 -070023#include <linux/module.h>
24#include <linux/tty.h>
Jiri Slaby027d7da2011-11-09 21:33:43 +010025#include <linux/tty_flip.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070026#include <linux/slab.h>
27#include <linux/init.h>
28#include <linux/console.h>
Grant Likelya208ffd2014-03-27 18:29:46 -070029#include <linux/of.h>
Alexey Dobriyand196a942009-03-31 15:19:21 -070030#include <linux/proc_fs.h>
31#include <linux/seq_file.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070032#include <linux/device.h>
33#include <linux/serial.h> /* for serial_state and serial_icounter_struct */
Alan Coxccce6de2009-09-19 13:13:30 -070034#include <linux/serial_core.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070035#include <linux/delay.h>
Arjan van de Venf392ecf2006-01-12 18:44:32 +000036#include <linux/mutex.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070037
38#include <asm/irq.h>
39#include <asm/uaccess.h>
40
Linus Torvalds1da177e2005-04-16 15:20:36 -070041/*
42 * This is used to lock changes in serial line configuration.
43 */
Arjan van de Venf392ecf2006-01-12 18:44:32 +000044static DEFINE_MUTEX(port_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -070045
Ingo Molnar13e83592006-07-03 00:25:03 -070046/*
47 * lockdep: port->lock is initialized in two places, but we
48 * want only one lock-class:
49 */
50static struct lock_class_key port_lock_key;
51
Linus Torvalds1da177e2005-04-16 15:20:36 -070052#define HIGH_BITS_OFFSET ((sizeof(long)-sizeof(int))*8)
53
Alan Cox19225132010-06-01 22:52:51 +020054static void uart_change_speed(struct tty_struct *tty, struct uart_state *state,
Alan Coxa46c9992008-02-08 04:18:53 -080055 struct ktermios *old_termios);
Jiri Slaby1f33a512011-07-14 14:35:10 +020056static void uart_wait_until_sent(struct tty_struct *tty, int timeout);
Linus Walleij6f538fe2012-12-07 11:36:08 +010057static void uart_change_pm(struct uart_state *state,
58 enum uart_pm_state pm_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -070059
Jiri Slabyb922e192011-11-09 21:33:51 +010060static void uart_port_shutdown(struct tty_port *port);
61
Peter Hurley299245a2014-09-10 15:06:24 -040062static int uart_dcd_enabled(struct uart_port *uport)
63{
Peter Hurleyd4260b52014-10-16 14:19:47 -040064 return !!(uport->status & UPSTAT_DCD_ENABLE);
Peter Hurley299245a2014-09-10 15:06:24 -040065}
66
Peter Hurley9ed19422016-04-09 18:56:34 -070067static inline struct uart_port *uart_port_ref(struct uart_state *state)
68{
69 if (atomic_add_unless(&state->refcount, 1, 0))
70 return state->uart_port;
71 return NULL;
72}
73
74static inline void uart_port_deref(struct uart_port *uport)
75{
76 if (uport && atomic_dec_and_test(&uport->state->refcount))
77 wake_up(&uport->state->remove_wait);
78}
79
80#define uart_port_lock(state, flags) \
81 ({ \
82 struct uart_port *__uport = uart_port_ref(state); \
83 if (__uport) \
84 spin_lock_irqsave(&__uport->lock, flags); \
85 __uport; \
86 })
87
88#define uart_port_unlock(uport, flags) \
89 ({ \
90 struct uart_port *__uport = uport; \
91 if (__uport) \
92 spin_unlock_irqrestore(&__uport->lock, flags); \
93 uart_port_deref(__uport); \
94 })
95
Peter Hurley4047b372016-04-09 18:56:33 -070096static inline struct uart_port *uart_port_check(struct uart_state *state)
97{
Peter Hurley7da4b8b2016-05-03 14:01:51 -070098 lockdep_assert_held(&state->port.mutex);
Peter Hurley4047b372016-04-09 18:56:33 -070099 return state->uart_port;
100}
101
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102/*
103 * This routine is used by the interrupt handler to schedule processing in
104 * the software interrupt portion of the driver.
105 */
106void uart_write_wakeup(struct uart_port *port)
107{
Alan Coxebd2c8f2009-09-19 13:13:28 -0700108 struct uart_state *state = port->state;
Pavel Machekd5f735e2006-03-07 21:55:20 -0800109 /*
110 * This means you called this function _after_ the port was
111 * closed. No cookie for you.
112 */
Alan Coxebd2c8f2009-09-19 13:13:28 -0700113 BUG_ON(!state);
Rob Herringd0f4bce2016-10-28 07:07:48 -0500114 tty_port_tty_wakeup(&state->port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700115}
116
117static void uart_stop(struct tty_struct *tty)
118{
119 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700120 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700121 unsigned long flags;
122
Peter Hurley9ed19422016-04-09 18:56:34 -0700123 port = uart_port_lock(state, flags);
124 if (port)
125 port->ops->stop_tx(port);
126 uart_port_unlock(port, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700127}
128
129static void __uart_start(struct tty_struct *tty)
130{
131 struct uart_state *state = tty->driver_data;
Alan Coxebd2c8f2009-09-19 13:13:28 -0700132 struct uart_port *port = state->uart_port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700133
San Mehat47f5e052009-07-29 20:21:28 -0700134 if (port && port->ops->wake_peer)
135 port->ops->wake_peer(port);
136
Peter Hurley9ed19422016-04-09 18:56:34 -0700137 if (port && !uart_tx_stopped(port))
Russell Kingb129a8c2005-08-31 10:12:14 +0100138 port->ops->start_tx(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700139}
140
141static void uart_start(struct tty_struct *tty)
142{
143 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700144 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700145 unsigned long flags;
146
Peter Hurley9ed19422016-04-09 18:56:34 -0700147 port = uart_port_lock(state, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700148 __uart_start(tty);
Peter Hurley9ed19422016-04-09 18:56:34 -0700149 uart_port_unlock(port, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700150}
151
Denys Vlasenkof4581ca2015-10-27 17:40:01 +0100152static void
Linus Torvalds1da177e2005-04-16 15:20:36 -0700153uart_update_mctrl(struct uart_port *port, unsigned int set, unsigned int clear)
154{
155 unsigned long flags;
156 unsigned int old;
157
158 spin_lock_irqsave(&port->lock, flags);
159 old = port->mctrl;
160 port->mctrl = (old & ~clear) | set;
161 if (old != port->mctrl)
162 port->ops->set_mctrl(port, port->mctrl);
163 spin_unlock_irqrestore(&port->lock, flags);
164}
165
Alan Coxa46c9992008-02-08 04:18:53 -0800166#define uart_set_mctrl(port, set) uart_update_mctrl(port, set, 0)
167#define uart_clear_mctrl(port, clear) uart_update_mctrl(port, 0, clear)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700168
169/*
170 * Startup the port. This will be called once per open. All calls
Alan Coxdf4f4dd2008-07-16 21:53:50 +0100171 * will be serialised by the per-port mutex.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700172 */
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100173static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
174 int init_hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700175{
Peter Hurley4047b372016-04-09 18:56:33 -0700176 struct uart_port *uport = uart_port_check(state);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700177 unsigned long page;
Tycho Andersene5147bb2018-07-06 10:24:57 -0600178 unsigned long flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700179 int retval = 0;
180
Alan Cox46d57a42009-09-19 13:13:29 -0700181 if (uport->type == PORT_UNKNOWN)
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100182 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700183
184 /*
Thomas Pfaff7deb39e2014-04-23 12:33:22 +0200185 * Make sure the device is in D0 state.
186 */
187 uart_change_pm(state, UART_PM_STATE_ON);
188
189 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700190 * Initialise and allocate the transmit and temporary
191 * buffer.
192 */
Tycho Andersene5147bb2018-07-06 10:24:57 -0600193 page = get_zeroed_page(GFP_KERNEL);
194 if (!page)
195 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700196
Tycho Andersene5147bb2018-07-06 10:24:57 -0600197 uart_port_lock(state, flags);
198 if (!state->xmit.buf) {
Alan Coxebd2c8f2009-09-19 13:13:28 -0700199 state->xmit.buf = (unsigned char *) page;
200 uart_circ_clear(&state->xmit);
Tycho Andersene5147bb2018-07-06 10:24:57 -0600201 } else {
202 free_page(page);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700203 }
Tycho Andersene5147bb2018-07-06 10:24:57 -0600204 uart_port_unlock(uport, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700205
Alan Cox46d57a42009-09-19 13:13:29 -0700206 retval = uport->ops->startup(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700207 if (retval == 0) {
Jiri Slabyc7d7abf2011-03-30 00:10:55 +0200208 if (uart_console(uport) && uport->cons->cflag) {
Alan Coxadc8d742012-07-14 15:31:47 +0100209 tty->termios.c_cflag = uport->cons->cflag;
Jiri Slabyc7d7abf2011-03-30 00:10:55 +0200210 uport->cons->cflag = 0;
211 }
212 /*
213 * Initialise the hardware port settings.
214 */
215 uart_change_speed(tty, state, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700216
Peter Hurley9db276f2016-01-10 20:36:15 -0800217 /*
218 * Setup the RTS and DTR signals once the
219 * port is open and ready to respond.
220 */
221 if (init_hw && C_BAUD(tty))
222 uart_set_mctrl(uport, TIOCM_RTS | TIOCM_DTR);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700223 }
224
Jiri Slaby00551972011-08-17 13:48:15 +0200225 /*
226 * This is to allow setserial on this port. People may want to set
227 * port/irq/type and then reconfigure the port properly if it failed
228 * now.
229 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700230 if (retval && capable(CAP_SYS_ADMIN))
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100231 return 1;
232
233 return retval;
234}
235
236static int uart_startup(struct tty_struct *tty, struct uart_state *state,
237 int init_hw)
238{
239 struct tty_port *port = &state->port;
240 int retval;
241
Peter Hurleyd41861c2016-04-09 17:53:25 -0700242 if (tty_port_initialized(port))
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100243 return 0;
244
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100245 retval = uart_port_startup(tty, state, init_hw);
Rob Herringb3b57642016-08-22 17:39:09 -0500246 if (retval)
247 set_bit(TTY_IO_ERROR, &tty->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700248
249 return retval;
250}
251
252/*
253 * This routine will shutdown a serial port; interrupts are disabled, and
254 * DTR is dropped if the hangup on close termio flag is on. Calls to
255 * uart_shutdown are serialised by the per-port semaphore.
Peter Hurleyaf224ca2016-04-09 18:56:35 -0700256 *
257 * uport == NULL if uart_port has already been removed
Linus Torvalds1da177e2005-04-16 15:20:36 -0700258 */
Alan Cox19225132010-06-01 22:52:51 +0200259static void uart_shutdown(struct tty_struct *tty, struct uart_state *state)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700260{
Peter Hurley4047b372016-04-09 18:56:33 -0700261 struct uart_port *uport = uart_port_check(state);
Alan Coxbdc04e32009-09-19 13:13:31 -0700262 struct tty_port *port = &state->port;
Tycho Andersene5147bb2018-07-06 10:24:57 -0600263 unsigned long flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700264
Russell Kingee31b332005-11-13 15:28:51 +0000265 /*
266 * Set the TTY IO error marker
267 */
Alan Coxf7519282009-01-02 13:49:21 +0000268 if (tty)
269 set_bit(TTY_IO_ERROR, &tty->flags);
Russell Kingee31b332005-11-13 15:28:51 +0000270
Peter Hurleyd41861c2016-04-09 17:53:25 -0700271 if (tty_port_initialized(port)) {
272 tty_port_set_initialized(port, 0);
273
Russell Kingee31b332005-11-13 15:28:51 +0000274 /*
275 * Turn off DTR and RTS early.
276 */
Peter Hurleyaf224ca2016-04-09 18:56:35 -0700277 if (uport && uart_console(uport) && tty)
Peter Hurleyae84db92014-07-09 09:21:14 -0400278 uport->cons->cflag = tty->termios.c_cflag;
279
Peter Hurley9db276f2016-01-10 20:36:15 -0800280 if (!tty || C_HUPCL(tty))
Alan Coxccce6de2009-09-19 13:13:30 -0700281 uart_clear_mctrl(uport, TIOCM_DTR | TIOCM_RTS);
Russell Kingee31b332005-11-13 15:28:51 +0000282
Jiri Slabyb922e192011-11-09 21:33:51 +0100283 uart_port_shutdown(port);
Russell Kingee31b332005-11-13 15:28:51 +0000284 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700285
286 /*
Doug Andersond208a3b2011-10-19 11:52:01 -0700287 * It's possible for shutdown to be called after suspend if we get
288 * a DCD drop (hangup) at just the right time. Clear suspended bit so
289 * we don't try to resume a port that has been shutdown.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700290 */
Peter Hurley80f02d52016-04-09 17:53:24 -0700291 tty_port_set_suspended(port, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700292
293 /*
294 * Free the transmit buffer page.
295 */
Tycho Andersene5147bb2018-07-06 10:24:57 -0600296 uart_port_lock(state, flags);
Alan Coxebd2c8f2009-09-19 13:13:28 -0700297 if (state->xmit.buf) {
298 free_page((unsigned long)state->xmit.buf);
299 state->xmit.buf = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700300 }
Tycho Andersene5147bb2018-07-06 10:24:57 -0600301 uart_port_unlock(uport, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700302}
303
304/**
305 * uart_update_timeout - update per-port FIFO timeout.
306 * @port: uart_port structure describing the port
307 * @cflag: termios cflag value
308 * @baud: speed of the port
309 *
310 * Set the port FIFO timeout value. The @cflag value should
311 * reflect the actual hardware settings.
312 */
313void
314uart_update_timeout(struct uart_port *port, unsigned int cflag,
315 unsigned int baud)
316{
317 unsigned int bits;
318
319 /* byte size and parity */
320 switch (cflag & CSIZE) {
321 case CS5:
322 bits = 7;
323 break;
324 case CS6:
325 bits = 8;
326 break;
327 case CS7:
328 bits = 9;
329 break;
330 default:
331 bits = 10;
Alan Coxa46c9992008-02-08 04:18:53 -0800332 break; /* CS8 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700333 }
334
335 if (cflag & CSTOPB)
336 bits++;
337 if (cflag & PARENB)
338 bits++;
339
340 /*
341 * The total number of bits to be transmitted in the fifo.
342 */
343 bits = bits * port->fifosize;
344
345 /*
346 * Figure the timeout to send the above number of bits.
347 * Add .02 seconds of slop
348 */
349 port->timeout = (HZ * bits) / baud + HZ/50;
350}
351
352EXPORT_SYMBOL(uart_update_timeout);
353
354/**
355 * uart_get_baud_rate - return baud rate for a particular port
356 * @port: uart_port structure describing the port in question.
357 * @termios: desired termios settings.
358 * @old: old termios (or NULL)
359 * @min: minimum acceptable baud rate
360 * @max: maximum acceptable baud rate
361 *
362 * Decode the termios structure into a numeric baud rate,
363 * taking account of the magic 38400 baud rate (with spd_*
364 * flags), and mapping the %B0 rate to 9600 baud.
365 *
366 * If the new baud rate is invalid, try the old termios setting.
367 * If it's still invalid, we try 9600 baud.
368 *
369 * Update the @termios structure to reflect the baud rate
Alan Coxeb424fd2008-04-28 02:14:07 -0700370 * we're actually going to be using. Don't do this for the case
371 * where B0 is requested ("hang up").
Linus Torvalds1da177e2005-04-16 15:20:36 -0700372 */
373unsigned int
Alan Cox606d0992006-12-08 02:38:45 -0800374uart_get_baud_rate(struct uart_port *port, struct ktermios *termios,
375 struct ktermios *old, unsigned int min, unsigned int max)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700376{
Joakim Nordellf10a2232015-06-08 14:56:51 +0200377 unsigned int try;
378 unsigned int baud;
379 unsigned int altbaud;
Alan Coxeb424fd2008-04-28 02:14:07 -0700380 int hung_up = 0;
Russell King0077d452006-01-21 23:03:28 +0000381 upf_t flags = port->flags & UPF_SPD_MASK;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700382
Joakim Nordellf10a2232015-06-08 14:56:51 +0200383 switch (flags) {
384 case UPF_SPD_HI:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700385 altbaud = 57600;
Joakim Nordellf10a2232015-06-08 14:56:51 +0200386 break;
387 case UPF_SPD_VHI:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700388 altbaud = 115200;
Joakim Nordellf10a2232015-06-08 14:56:51 +0200389 break;
390 case UPF_SPD_SHI:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700391 altbaud = 230400;
Joakim Nordellf10a2232015-06-08 14:56:51 +0200392 break;
393 case UPF_SPD_WARP:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700394 altbaud = 460800;
Joakim Nordellf10a2232015-06-08 14:56:51 +0200395 break;
396 default:
397 altbaud = 38400;
398 break;
399 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700400
401 for (try = 0; try < 2; try++) {
402 baud = tty_termios_baud_rate(termios);
403
404 /*
405 * The spd_hi, spd_vhi, spd_shi, spd_warp kludge...
406 * Die! Die! Die!
407 */
Peter Hurley547039e2014-10-16 13:46:38 -0400408 if (try == 0 && baud == 38400)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700409 baud = altbaud;
410
411 /*
412 * Special case: B0 rate.
413 */
Alan Coxeb424fd2008-04-28 02:14:07 -0700414 if (baud == 0) {
415 hung_up = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700416 baud = 9600;
Alan Coxeb424fd2008-04-28 02:14:07 -0700417 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700418
419 if (baud >= min && baud <= max)
420 return baud;
421
422 /*
423 * Oops, the quotient was zero. Try again with
424 * the old baud rate if possible.
425 */
426 termios->c_cflag &= ~CBAUD;
427 if (old) {
Alan Cox6d4d67b2008-02-04 22:27:53 -0800428 baud = tty_termios_baud_rate(old);
Alan Coxeb424fd2008-04-28 02:14:07 -0700429 if (!hung_up)
430 tty_termios_encode_baud_rate(termios,
431 baud, baud);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700432 old = NULL;
433 continue;
434 }
435
436 /*
Alan Cox16ae2a82010-01-04 16:26:21 +0000437 * As a last resort, if the range cannot be met then clip to
438 * the nearest chip supported rate.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700439 */
Alan Cox16ae2a82010-01-04 16:26:21 +0000440 if (!hung_up) {
441 if (baud <= min)
442 tty_termios_encode_baud_rate(termios,
443 min + 1, min + 1);
444 else
445 tty_termios_encode_baud_rate(termios,
446 max - 1, max - 1);
447 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700448 }
Alan Cox16ae2a82010-01-04 16:26:21 +0000449 /* Should never happen */
450 WARN_ON(1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700451 return 0;
452}
453
454EXPORT_SYMBOL(uart_get_baud_rate);
455
456/**
457 * uart_get_divisor - return uart clock divisor
458 * @port: uart_port structure describing the port.
459 * @baud: desired baud rate
460 *
461 * Calculate the uart clock divisor for the port.
462 */
463unsigned int
464uart_get_divisor(struct uart_port *port, unsigned int baud)
465{
466 unsigned int quot;
467
468 /*
469 * Old custom speed handling.
470 */
471 if (baud == 38400 && (port->flags & UPF_SPD_MASK) == UPF_SPD_CUST)
472 quot = port->custom_divisor;
473 else
Uwe Kleine-König97d24632011-12-20 11:47:44 +0100474 quot = DIV_ROUND_CLOSEST(port->uartclk, 16 * baud);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700475
476 return quot;
477}
478
479EXPORT_SYMBOL(uart_get_divisor);
480
Peter Hurley7c8ab962014-10-16 16:54:20 -0400481/* Caller holds port mutex */
Alan Cox19225132010-06-01 22:52:51 +0200482static void uart_change_speed(struct tty_struct *tty, struct uart_state *state,
483 struct ktermios *old_termios)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700484{
Peter Hurley4047b372016-04-09 18:56:33 -0700485 struct uart_port *uport = uart_port_check(state);
Alan Cox606d0992006-12-08 02:38:45 -0800486 struct ktermios *termios;
Peter Hurley391f93f2015-01-25 14:44:51 -0500487 int hw_stopped;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700488
489 /*
490 * If we have no tty, termios, or the port does not exist,
491 * then we can't set the parameters for this port.
492 */
Alan Coxadc8d742012-07-14 15:31:47 +0100493 if (!tty || uport->type == PORT_UNKNOWN)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700494 return;
495
Alan Coxadc8d742012-07-14 15:31:47 +0100496 termios = &tty->termios;
Peter Hurleyc18b55f2014-06-16 09:17:09 -0400497 uport->ops->set_termios(uport, termios, old_termios);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700498
499 /*
Peter Hurley299245a2014-09-10 15:06:24 -0400500 * Set modem status enables based on termios cflag
Linus Torvalds1da177e2005-04-16 15:20:36 -0700501 */
Peter Hurley299245a2014-09-10 15:06:24 -0400502 spin_lock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700503 if (termios->c_cflag & CRTSCTS)
Peter Hurley299245a2014-09-10 15:06:24 -0400504 uport->status |= UPSTAT_CTS_ENABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700505 else
Peter Hurley299245a2014-09-10 15:06:24 -0400506 uport->status &= ~UPSTAT_CTS_ENABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700507
508 if (termios->c_cflag & CLOCAL)
Peter Hurley299245a2014-09-10 15:06:24 -0400509 uport->status &= ~UPSTAT_DCD_ENABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700510 else
Peter Hurley299245a2014-09-10 15:06:24 -0400511 uport->status |= UPSTAT_DCD_ENABLE;
Peter Hurley391f93f2015-01-25 14:44:51 -0500512
513 /* reset sw-assisted CTS flow control based on (possibly) new mode */
514 hw_stopped = uport->hw_stopped;
515 uport->hw_stopped = uart_softcts_mode(uport) &&
516 !(uport->ops->get_mctrl(uport) & TIOCM_CTS);
517 if (uport->hw_stopped) {
518 if (!hw_stopped)
519 uport->ops->stop_tx(uport);
520 } else {
521 if (hw_stopped)
522 __uart_start(tty);
523 }
Peter Hurley299245a2014-09-10 15:06:24 -0400524 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700525}
526
Peter Hurleyf5291ec2016-01-10 20:23:55 -0800527static int uart_put_char(struct tty_struct *tty, unsigned char c)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700528{
Peter Hurleyf5291ec2016-01-10 20:23:55 -0800529 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700530 struct uart_port *port;
Peter Hurleyf5291ec2016-01-10 20:23:55 -0800531 struct circ_buf *circ;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700532 unsigned long flags;
Alan Cox23d22ce2008-04-30 00:54:11 -0700533 int ret = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700534
Peter Hurleyf5291ec2016-01-10 20:23:55 -0800535 circ = &state->xmit;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700536 if (!circ->buf)
Alan Cox23d22ce2008-04-30 00:54:11 -0700537 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700538
Peter Hurley9ed19422016-04-09 18:56:34 -0700539 port = uart_port_lock(state, flags);
540 if (port && uart_circ_chars_free(circ) != 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700541 circ->buf[circ->head] = c;
542 circ->head = (circ->head + 1) & (UART_XMIT_SIZE - 1);
Alan Cox23d22ce2008-04-30 00:54:11 -0700543 ret = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700544 }
Peter Hurley9ed19422016-04-09 18:56:34 -0700545 uart_port_unlock(port, flags);
Alan Cox23d22ce2008-04-30 00:54:11 -0700546 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700547}
548
Linus Torvalds1da177e2005-04-16 15:20:36 -0700549static void uart_flush_chars(struct tty_struct *tty)
550{
551 uart_start(tty);
552}
553
Alan Cox19225132010-06-01 22:52:51 +0200554static int uart_write(struct tty_struct *tty,
555 const unsigned char *buf, int count)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700556{
557 struct uart_state *state = tty->driver_data;
Pavel Machekd5f735e2006-03-07 21:55:20 -0800558 struct uart_port *port;
559 struct circ_buf *circ;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700560 unsigned long flags;
561 int c, ret = 0;
562
Pavel Machekd5f735e2006-03-07 21:55:20 -0800563 /*
564 * This means you called this function _after_ the port was
565 * closed. No cookie for you.
566 */
Alan Coxf7519282009-01-02 13:49:21 +0000567 if (!state) {
Pavel Machekd5f735e2006-03-07 21:55:20 -0800568 WARN_ON(1);
569 return -EL3HLT;
570 }
571
Alan Coxebd2c8f2009-09-19 13:13:28 -0700572 circ = &state->xmit;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700573 if (!circ->buf)
574 return 0;
575
Peter Hurley9ed19422016-04-09 18:56:34 -0700576 port = uart_port_lock(state, flags);
577 while (port) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700578 c = CIRC_SPACE_TO_END(circ->head, circ->tail, UART_XMIT_SIZE);
579 if (count < c)
580 c = count;
581 if (c <= 0)
582 break;
583 memcpy(circ->buf + circ->head, buf, c);
584 circ->head = (circ->head + c) & (UART_XMIT_SIZE - 1);
585 buf += c;
586 count -= c;
587 ret += c;
588 }
Peter Hurley64dbee32014-10-16 16:54:26 -0400589
590 __uart_start(tty);
Peter Hurley9ed19422016-04-09 18:56:34 -0700591 uart_port_unlock(port, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700592 return ret;
593}
594
595static int uart_write_room(struct tty_struct *tty)
596{
597 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700598 struct uart_port *port;
Alan Coxf34d7a52008-04-30 00:54:13 -0700599 unsigned long flags;
600 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700601
Peter Hurley9ed19422016-04-09 18:56:34 -0700602 port = uart_port_lock(state, flags);
Alan Coxebd2c8f2009-09-19 13:13:28 -0700603 ret = uart_circ_chars_free(&state->xmit);
Peter Hurley9ed19422016-04-09 18:56:34 -0700604 uart_port_unlock(port, flags);
Alan Coxf34d7a52008-04-30 00:54:13 -0700605 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700606}
607
608static int uart_chars_in_buffer(struct tty_struct *tty)
609{
610 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700611 struct uart_port *port;
Alan Coxf34d7a52008-04-30 00:54:13 -0700612 unsigned long flags;
613 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700614
Peter Hurley9ed19422016-04-09 18:56:34 -0700615 port = uart_port_lock(state, flags);
Alan Coxebd2c8f2009-09-19 13:13:28 -0700616 ret = uart_circ_chars_pending(&state->xmit);
Peter Hurley9ed19422016-04-09 18:56:34 -0700617 uart_port_unlock(port, flags);
Alan Coxf34d7a52008-04-30 00:54:13 -0700618 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700619}
620
621static void uart_flush_buffer(struct tty_struct *tty)
622{
623 struct uart_state *state = tty->driver_data;
Tetsuo Handa55d7b682008-05-06 20:42:27 -0700624 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700625 unsigned long flags;
626
Pavel Machekd5f735e2006-03-07 21:55:20 -0800627 /*
628 * This means you called this function _after_ the port was
629 * closed. No cookie for you.
630 */
Alan Coxf7519282009-01-02 13:49:21 +0000631 if (!state) {
Pavel Machekd5f735e2006-03-07 21:55:20 -0800632 WARN_ON(1);
633 return;
634 }
635
Jiri Slabyeb3a1e12007-05-06 14:48:52 -0700636 pr_debug("uart_flush_buffer(%d) called\n", tty->index);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700637
Peter Hurley9ed19422016-04-09 18:56:34 -0700638 port = uart_port_lock(state, flags);
639 if (!port)
640 return;
Alan Coxebd2c8f2009-09-19 13:13:28 -0700641 uart_circ_clear(&state->xmit);
Haavard Skinnemoen6bb0e3a2008-07-16 21:52:36 +0100642 if (port->ops->flush_buffer)
643 port->ops->flush_buffer(port);
Peter Hurley9ed19422016-04-09 18:56:34 -0700644 uart_port_unlock(port, flags);
Rob Herringd0f4bce2016-10-28 07:07:48 -0500645 tty_port_tty_wakeup(&state->port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700646}
647
648/*
649 * This function is used to send a high-priority XON/XOFF character to
650 * the device
651 */
652static void uart_send_xchar(struct tty_struct *tty, char ch)
653{
654 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700655 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700656 unsigned long flags;
657
Peter Hurley9ed19422016-04-09 18:56:34 -0700658 port = uart_port_ref(state);
659 if (!port)
660 return;
661
Linus Torvalds1da177e2005-04-16 15:20:36 -0700662 if (port->ops->send_xchar)
663 port->ops->send_xchar(port, ch);
664 else {
Peter Hurleyc235ccc2014-09-02 17:39:13 -0400665 spin_lock_irqsave(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700666 port->x_char = ch;
Peter Hurleyc235ccc2014-09-02 17:39:13 -0400667 if (ch)
Russell Kingb129a8c2005-08-31 10:12:14 +0100668 port->ops->start_tx(port);
Peter Hurleyc235ccc2014-09-02 17:39:13 -0400669 spin_unlock_irqrestore(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700670 }
Peter Hurley9ed19422016-04-09 18:56:34 -0700671 uart_port_deref(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700672}
673
674static void uart_throttle(struct tty_struct *tty)
675{
676 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700677 struct uart_port *port;
Peter Hurley391f93f2015-01-25 14:44:51 -0500678 upstat_t mask = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700679
Peter Hurley9ed19422016-04-09 18:56:34 -0700680 port = uart_port_ref(state);
681 if (!port)
682 return;
683
Linus Torvalds1da177e2005-04-16 15:20:36 -0700684 if (I_IXOFF(tty))
Peter Hurley391f93f2015-01-25 14:44:51 -0500685 mask |= UPSTAT_AUTOXOFF;
Peter Hurley9db276f2016-01-10 20:36:15 -0800686 if (C_CRTSCTS(tty))
Peter Hurley391f93f2015-01-25 14:44:51 -0500687 mask |= UPSTAT_AUTORTS;
Russell King9aba8d5b2012-04-17 17:23:14 +0100688
Peter Hurley391f93f2015-01-25 14:44:51 -0500689 if (port->status & mask) {
Russell King9aba8d5b2012-04-17 17:23:14 +0100690 port->ops->throttle(port);
Peter Hurley391f93f2015-01-25 14:44:51 -0500691 mask &= ~port->status;
Russell King9aba8d5b2012-04-17 17:23:14 +0100692 }
693
Peter Hurley391f93f2015-01-25 14:44:51 -0500694 if (mask & UPSTAT_AUTORTS)
Russell King9aba8d5b2012-04-17 17:23:14 +0100695 uart_clear_mctrl(port, TIOCM_RTS);
Peter Hurleyb4749b92016-01-10 20:24:02 -0800696
697 if (mask & UPSTAT_AUTOXOFF)
698 uart_send_xchar(tty, STOP_CHAR(tty));
Peter Hurley9ed19422016-04-09 18:56:34 -0700699
700 uart_port_deref(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700701}
702
703static void uart_unthrottle(struct tty_struct *tty)
704{
705 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700706 struct uart_port *port;
Peter Hurley391f93f2015-01-25 14:44:51 -0500707 upstat_t mask = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700708
Peter Hurley9ed19422016-04-09 18:56:34 -0700709 port = uart_port_ref(state);
710 if (!port)
711 return;
712
Russell King9aba8d5b2012-04-17 17:23:14 +0100713 if (I_IXOFF(tty))
Peter Hurley391f93f2015-01-25 14:44:51 -0500714 mask |= UPSTAT_AUTOXOFF;
Peter Hurley9db276f2016-01-10 20:36:15 -0800715 if (C_CRTSCTS(tty))
Peter Hurley391f93f2015-01-25 14:44:51 -0500716 mask |= UPSTAT_AUTORTS;
Russell King9aba8d5b2012-04-17 17:23:14 +0100717
Peter Hurley391f93f2015-01-25 14:44:51 -0500718 if (port->status & mask) {
Russell King9aba8d5b2012-04-17 17:23:14 +0100719 port->ops->unthrottle(port);
Peter Hurley391f93f2015-01-25 14:44:51 -0500720 mask &= ~port->status;
Russell King9aba8d5b2012-04-17 17:23:14 +0100721 }
722
Peter Hurley391f93f2015-01-25 14:44:51 -0500723 if (mask & UPSTAT_AUTORTS)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700724 uart_set_mctrl(port, TIOCM_RTS);
Peter Hurleyb4749b92016-01-10 20:24:02 -0800725
726 if (mask & UPSTAT_AUTOXOFF)
727 uart_send_xchar(tty, START_CHAR(tty));
Peter Hurley9ed19422016-04-09 18:56:34 -0700728
729 uart_port_deref(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700730}
731
Peter Hurley4047b372016-04-09 18:56:33 -0700732static int uart_get_info(struct tty_port *port, struct serial_struct *retinfo)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700733{
Alan Cox9f109692012-10-29 15:20:25 +0000734 struct uart_state *state = container_of(port, struct uart_state, port);
Peter Hurley4047b372016-04-09 18:56:33 -0700735 struct uart_port *uport;
736 int ret = -ENODEV;
Alan Cox7ba2e762012-09-04 16:34:45 +0100737
Fengguang Wu37cd0c92012-09-06 10:27:51 +0800738 memset(retinfo, 0, sizeof(*retinfo));
Alan Cox7ba2e762012-09-04 16:34:45 +0100739
Peter Hurley3abe8c72016-01-10 20:23:56 -0800740 /*
741 * Ensure the state we copy is consistent and no hardware changes
742 * occur as we go
743 */
744 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -0700745 uport = uart_port_check(state);
746 if (!uport)
747 goto out;
748
Alan Cox7ba2e762012-09-04 16:34:45 +0100749 retinfo->type = uport->type;
750 retinfo->line = uport->line;
751 retinfo->port = uport->iobase;
752 if (HIGH_BITS_OFFSET)
753 retinfo->port_high = (long) uport->iobase >> HIGH_BITS_OFFSET;
754 retinfo->irq = uport->irq;
755 retinfo->flags = uport->flags;
756 retinfo->xmit_fifo_size = uport->fifosize;
757 retinfo->baud_base = uport->uartclk / 16;
758 retinfo->close_delay = jiffies_to_msecs(port->close_delay) / 10;
759 retinfo->closing_wait = port->closing_wait == ASYNC_CLOSING_WAIT_NONE ?
760 ASYNC_CLOSING_WAIT_NONE :
761 jiffies_to_msecs(port->closing_wait) / 10;
762 retinfo->custom_divisor = uport->custom_divisor;
763 retinfo->hub6 = uport->hub6;
764 retinfo->io_type = uport->iotype;
765 retinfo->iomem_reg_shift = uport->regshift;
766 retinfo->iomem_base = (void *)(unsigned long)uport->mapbase;
Peter Hurley4047b372016-04-09 18:56:33 -0700767
768 ret = 0;
769out:
Alan Coxa2bceae2009-09-19 13:13:31 -0700770 mutex_unlock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -0700771 return ret;
Alan Cox9f109692012-10-29 15:20:25 +0000772}
773
774static int uart_get_info_user(struct tty_port *port,
775 struct serial_struct __user *retinfo)
776{
777 struct serial_struct tmp;
Peter Hurley3abe8c72016-01-10 20:23:56 -0800778
Peter Hurley4047b372016-04-09 18:56:33 -0700779 if (uart_get_info(port, &tmp) < 0)
780 return -EIO;
Alan Coxf34d7a52008-04-30 00:54:13 -0700781
Linus Torvalds1da177e2005-04-16 15:20:36 -0700782 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
783 return -EFAULT;
784 return 0;
785}
786
Alan Cox7ba2e762012-09-04 16:34:45 +0100787static int uart_set_info(struct tty_struct *tty, struct tty_port *port,
788 struct uart_state *state,
789 struct serial_struct *new_info)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700790{
Peter Hurley4047b372016-04-09 18:56:33 -0700791 struct uart_port *uport = uart_port_check(state);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700792 unsigned long new_port;
Russell King0077d452006-01-21 23:03:28 +0000793 unsigned int change_irq, change_port, closing_wait;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700794 unsigned int old_custom_divisor, close_delay;
Russell King0077d452006-01-21 23:03:28 +0000795 upf_t old_flags, new_flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700796 int retval = 0;
797
Peter Hurley4047b372016-04-09 18:56:33 -0700798 if (!uport)
799 return -EIO;
800
Alan Cox7ba2e762012-09-04 16:34:45 +0100801 new_port = new_info->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700802 if (HIGH_BITS_OFFSET)
Alan Cox7ba2e762012-09-04 16:34:45 +0100803 new_port += (unsigned long) new_info->port_high << HIGH_BITS_OFFSET;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700804
Alan Cox7ba2e762012-09-04 16:34:45 +0100805 new_info->irq = irq_canonicalize(new_info->irq);
806 close_delay = msecs_to_jiffies(new_info->close_delay * 10);
807 closing_wait = new_info->closing_wait == ASYNC_CLOSING_WAIT_NONE ?
Jiri Slaby4cb0fbf2011-11-09 21:33:45 +0100808 ASYNC_CLOSING_WAIT_NONE :
Alan Cox7ba2e762012-09-04 16:34:45 +0100809 msecs_to_jiffies(new_info->closing_wait * 10);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700810
Linus Torvalds1da177e2005-04-16 15:20:36 -0700811
Alan Cox46d57a42009-09-19 13:13:29 -0700812 change_irq = !(uport->flags & UPF_FIXED_PORT)
Alan Cox7ba2e762012-09-04 16:34:45 +0100813 && new_info->irq != uport->irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700814
815 /*
816 * Since changing the 'type' of the port changes its resource
817 * allocations, we should treat type changes the same as
818 * IO port changes.
819 */
Alan Cox46d57a42009-09-19 13:13:29 -0700820 change_port = !(uport->flags & UPF_FIXED_PORT)
821 && (new_port != uport->iobase ||
Alan Cox7ba2e762012-09-04 16:34:45 +0100822 (unsigned long)new_info->iomem_base != uport->mapbase ||
823 new_info->hub6 != uport->hub6 ||
824 new_info->io_type != uport->iotype ||
825 new_info->iomem_reg_shift != uport->regshift ||
826 new_info->type != uport->type);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700827
Alan Cox46d57a42009-09-19 13:13:29 -0700828 old_flags = uport->flags;
Alan Cox7ba2e762012-09-04 16:34:45 +0100829 new_flags = new_info->flags;
Alan Cox46d57a42009-09-19 13:13:29 -0700830 old_custom_divisor = uport->custom_divisor;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700831
832 if (!capable(CAP_SYS_ADMIN)) {
833 retval = -EPERM;
834 if (change_irq || change_port ||
Alan Cox7ba2e762012-09-04 16:34:45 +0100835 (new_info->baud_base != uport->uartclk / 16) ||
Alan Cox46d57a42009-09-19 13:13:29 -0700836 (close_delay != port->close_delay) ||
837 (closing_wait != port->closing_wait) ||
Alan Cox7ba2e762012-09-04 16:34:45 +0100838 (new_info->xmit_fifo_size &&
839 new_info->xmit_fifo_size != uport->fifosize) ||
Russell King0077d452006-01-21 23:03:28 +0000840 (((new_flags ^ old_flags) & ~UPF_USR_MASK) != 0))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700841 goto exit;
Alan Cox46d57a42009-09-19 13:13:29 -0700842 uport->flags = ((uport->flags & ~UPF_USR_MASK) |
Russell King0077d452006-01-21 23:03:28 +0000843 (new_flags & UPF_USR_MASK));
Alan Cox7ba2e762012-09-04 16:34:45 +0100844 uport->custom_divisor = new_info->custom_divisor;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700845 goto check_and_exit;
846 }
847
848 /*
849 * Ask the low level driver to verify the settings.
850 */
Alan Cox46d57a42009-09-19 13:13:29 -0700851 if (uport->ops->verify_port)
Alan Cox7ba2e762012-09-04 16:34:45 +0100852 retval = uport->ops->verify_port(uport, new_info);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700853
Alan Cox7ba2e762012-09-04 16:34:45 +0100854 if ((new_info->irq >= nr_irqs) || (new_info->irq < 0) ||
855 (new_info->baud_base < 9600))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700856 retval = -EINVAL;
857
858 if (retval)
859 goto exit;
860
861 if (change_port || change_irq) {
862 retval = -EBUSY;
863
864 /*
865 * Make sure that we are the sole user of this port.
866 */
Alan Coxb58d13a2009-09-19 13:13:32 -0700867 if (tty_port_users(port) > 1)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700868 goto exit;
869
870 /*
871 * We need to shutdown the serial port at the old
872 * port/type/irq combination.
873 */
Alan Cox19225132010-06-01 22:52:51 +0200874 uart_shutdown(tty, state);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700875 }
876
877 if (change_port) {
878 unsigned long old_iobase, old_mapbase;
879 unsigned int old_type, old_iotype, old_hub6, old_shift;
880
Alan Cox46d57a42009-09-19 13:13:29 -0700881 old_iobase = uport->iobase;
882 old_mapbase = uport->mapbase;
883 old_type = uport->type;
884 old_hub6 = uport->hub6;
885 old_iotype = uport->iotype;
886 old_shift = uport->regshift;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700887
888 /*
889 * Free and release old regions
890 */
Fabio Estevama7cfaf12016-05-20 01:59:54 -0300891 if (old_type != PORT_UNKNOWN && uport->ops->release_port)
Alan Cox46d57a42009-09-19 13:13:29 -0700892 uport->ops->release_port(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700893
Alan Cox46d57a42009-09-19 13:13:29 -0700894 uport->iobase = new_port;
Alan Cox7ba2e762012-09-04 16:34:45 +0100895 uport->type = new_info->type;
896 uport->hub6 = new_info->hub6;
897 uport->iotype = new_info->io_type;
898 uport->regshift = new_info->iomem_reg_shift;
899 uport->mapbase = (unsigned long)new_info->iomem_base;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700900
901 /*
902 * Claim and map the new regions
903 */
Fabio Estevama7cfaf12016-05-20 01:59:54 -0300904 if (uport->type != PORT_UNKNOWN && uport->ops->request_port) {
Alan Cox46d57a42009-09-19 13:13:29 -0700905 retval = uport->ops->request_port(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700906 } else {
907 /* Always success - Jean II */
908 retval = 0;
909 }
910
911 /*
912 * If we fail to request resources for the
913 * new port, try to restore the old settings.
914 */
Thomas Pfaff7deb39e2014-04-23 12:33:22 +0200915 if (retval) {
Alan Cox46d57a42009-09-19 13:13:29 -0700916 uport->iobase = old_iobase;
917 uport->type = old_type;
918 uport->hub6 = old_hub6;
919 uport->iotype = old_iotype;
920 uport->regshift = old_shift;
921 uport->mapbase = old_mapbase;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700922
Thomas Pfaff7deb39e2014-04-23 12:33:22 +0200923 if (old_type != PORT_UNKNOWN) {
924 retval = uport->ops->request_port(uport);
925 /*
926 * If we failed to restore the old settings,
927 * we fail like this.
928 */
929 if (retval)
930 uport->type = PORT_UNKNOWN;
931
932 /*
933 * We failed anyway.
934 */
935 retval = -EBUSY;
936 }
937
Alan Coxa46c9992008-02-08 04:18:53 -0800938 /* Added to return the correct error -Ram Gupta */
939 goto exit;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700940 }
941 }
942
David Gibsonabb4a232007-05-06 14:48:49 -0700943 if (change_irq)
Alan Cox7ba2e762012-09-04 16:34:45 +0100944 uport->irq = new_info->irq;
Alan Cox46d57a42009-09-19 13:13:29 -0700945 if (!(uport->flags & UPF_FIXED_PORT))
Alan Cox7ba2e762012-09-04 16:34:45 +0100946 uport->uartclk = new_info->baud_base * 16;
Alan Cox46d57a42009-09-19 13:13:29 -0700947 uport->flags = (uport->flags & ~UPF_CHANGE_MASK) |
Russell King0077d452006-01-21 23:03:28 +0000948 (new_flags & UPF_CHANGE_MASK);
Alan Cox7ba2e762012-09-04 16:34:45 +0100949 uport->custom_divisor = new_info->custom_divisor;
Alan Cox46d57a42009-09-19 13:13:29 -0700950 port->close_delay = close_delay;
951 port->closing_wait = closing_wait;
Alan Cox7ba2e762012-09-04 16:34:45 +0100952 if (new_info->xmit_fifo_size)
953 uport->fifosize = new_info->xmit_fifo_size;
Jiri Slabyd6c53c02013-01-03 15:53:05 +0100954 port->low_latency = (uport->flags & UPF_LOW_LATENCY) ? 1 : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700955
956 check_and_exit:
957 retval = 0;
Alan Cox46d57a42009-09-19 13:13:29 -0700958 if (uport->type == PORT_UNKNOWN)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700959 goto exit;
Peter Hurleyd41861c2016-04-09 17:53:25 -0700960 if (tty_port_initialized(port)) {
Alan Cox46d57a42009-09-19 13:13:29 -0700961 if (((old_flags ^ uport->flags) & UPF_SPD_MASK) ||
962 old_custom_divisor != uport->custom_divisor) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700963 /*
964 * If they're setting up a custom divisor or speed,
965 * instead of clearing it, then bitch about it. No
966 * need to rate-limit; it's CAP_SYS_ADMIN only.
967 */
Alan Cox46d57a42009-09-19 13:13:29 -0700968 if (uport->flags & UPF_SPD_MASK) {
Sudip Mukherjee2f2dafe2014-09-01 20:49:43 +0530969 dev_notice(uport->dev,
970 "%s sets custom speed on %s. This is deprecated.\n",
971 current->comm,
Rasmus Villemoes429b4742015-03-31 15:55:59 +0200972 tty_name(port->tty));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700973 }
Alan Cox19225132010-06-01 22:52:51 +0200974 uart_change_speed(tty, state, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700975 }
Rob Herringb3b57642016-08-22 17:39:09 -0500976 } else {
Alan Cox19225132010-06-01 22:52:51 +0200977 retval = uart_startup(tty, state, 1);
Sebastian Andrzej Siewiorffcf1672018-01-11 18:57:26 +0100978 if (retval == 0)
979 tty_port_set_initialized(port, true);
Rob Herringb3b57642016-08-22 17:39:09 -0500980 if (retval > 0)
981 retval = 0;
982 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700983 exit:
Alan Cox7ba2e762012-09-04 16:34:45 +0100984 return retval;
985}
986
987static int uart_set_info_user(struct tty_struct *tty, struct uart_state *state,
988 struct serial_struct __user *newinfo)
989{
990 struct serial_struct new_serial;
991 struct tty_port *port = &state->port;
992 int retval;
993
994 if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
995 return -EFAULT;
996
997 /*
998 * This semaphore protects port->count. It is also
999 * very useful to prevent opens. Also, take the
1000 * port configuration semaphore to make sure that a
1001 * module insertion/removal doesn't change anything
1002 * under us.
1003 */
1004 mutex_lock(&port->mutex);
1005 retval = uart_set_info(tty, port, state, &new_serial);
Alan Coxa2bceae2009-09-19 13:13:31 -07001006 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001007 return retval;
1008}
1009
Alan Cox19225132010-06-01 22:52:51 +02001010/**
1011 * uart_get_lsr_info - get line status register info
1012 * @tty: tty associated with the UART
1013 * @state: UART being queried
1014 * @value: returned modem value
Linus Torvalds1da177e2005-04-16 15:20:36 -07001015 */
Alan Cox19225132010-06-01 22:52:51 +02001016static int uart_get_lsr_info(struct tty_struct *tty,
1017 struct uart_state *state, unsigned int __user *value)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001018{
Peter Hurley4047b372016-04-09 18:56:33 -07001019 struct uart_port *uport = uart_port_check(state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001020 unsigned int result;
1021
Alan Cox46d57a42009-09-19 13:13:29 -07001022 result = uport->ops->tx_empty(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001023
1024 /*
1025 * If we're about to load something into the transmit
1026 * register, we'll pretend the transmitter isn't empty to
1027 * avoid a race condition (depending on when the transmit
1028 * interrupt happens).
1029 */
Alan Cox46d57a42009-09-19 13:13:29 -07001030 if (uport->x_char ||
Alan Coxebd2c8f2009-09-19 13:13:28 -07001031 ((uart_circ_chars_pending(&state->xmit) > 0) &&
Peter Hurleyd01f4d12014-09-10 15:06:26 -04001032 !uart_tx_stopped(uport)))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001033 result &= ~TIOCSER_TEMT;
Alan Coxa46c9992008-02-08 04:18:53 -08001034
Linus Torvalds1da177e2005-04-16 15:20:36 -07001035 return put_user(result, value);
1036}
1037
Alan Cox60b33c12011-02-14 16:26:14 +00001038static int uart_tiocmget(struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001039{
1040 struct uart_state *state = tty->driver_data;
Alan Coxa2bceae2009-09-19 13:13:31 -07001041 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001042 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001043 int result = -EIO;
1044
Alan Coxa2bceae2009-09-19 13:13:31 -07001045 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001046 uport = uart_port_check(state);
1047 if (!uport)
1048 goto out;
1049
Peter Hurley18900ca2016-04-09 17:06:48 -07001050 if (!tty_io_error(tty)) {
Alan Cox46d57a42009-09-19 13:13:29 -07001051 result = uport->mctrl;
Alan Cox46d57a42009-09-19 13:13:29 -07001052 spin_lock_irq(&uport->lock);
1053 result |= uport->ops->get_mctrl(uport);
1054 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001055 }
Peter Hurley4047b372016-04-09 18:56:33 -07001056out:
Alan Coxa2bceae2009-09-19 13:13:31 -07001057 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001058 return result;
1059}
1060
1061static int
Alan Cox20b9d172011-02-14 16:26:50 +00001062uart_tiocmset(struct tty_struct *tty, unsigned int set, unsigned int clear)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001063{
1064 struct uart_state *state = tty->driver_data;
Alan Coxa2bceae2009-09-19 13:13:31 -07001065 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001066 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001067 int ret = -EIO;
1068
Alan Coxa2bceae2009-09-19 13:13:31 -07001069 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001070 uport = uart_port_check(state);
1071 if (!uport)
1072 goto out;
1073
Peter Hurley18900ca2016-04-09 17:06:48 -07001074 if (!tty_io_error(tty)) {
Alan Cox46d57a42009-09-19 13:13:29 -07001075 uart_update_mctrl(uport, set, clear);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001076 ret = 0;
1077 }
Peter Hurley4047b372016-04-09 18:56:33 -07001078out:
Alan Coxa2bceae2009-09-19 13:13:31 -07001079 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001080 return ret;
1081}
1082
Alan Cox9e989662008-07-22 11:18:03 +01001083static int uart_break_ctl(struct tty_struct *tty, int break_state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001084{
1085 struct uart_state *state = tty->driver_data;
Alan Coxa2bceae2009-09-19 13:13:31 -07001086 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001087 struct uart_port *uport;
1088 int ret = -EIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001089
Alan Coxa2bceae2009-09-19 13:13:31 -07001090 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001091 uport = uart_port_check(state);
1092 if (!uport)
1093 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001094
Alan Cox46d57a42009-09-19 13:13:29 -07001095 if (uport->type != PORT_UNKNOWN)
1096 uport->ops->break_ctl(uport, break_state);
Peter Hurley4047b372016-04-09 18:56:33 -07001097 ret = 0;
1098out:
Alan Coxa2bceae2009-09-19 13:13:31 -07001099 mutex_unlock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001100 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001101}
1102
Alan Cox19225132010-06-01 22:52:51 +02001103static int uart_do_autoconfig(struct tty_struct *tty,struct uart_state *state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001104{
Alan Coxa2bceae2009-09-19 13:13:31 -07001105 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001106 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001107 int flags, ret;
1108
1109 if (!capable(CAP_SYS_ADMIN))
1110 return -EPERM;
1111
1112 /*
1113 * Take the per-port semaphore. This prevents count from
1114 * changing, and hence any extra opens of the port while
1115 * we're auto-configuring.
1116 */
Alan Coxa2bceae2009-09-19 13:13:31 -07001117 if (mutex_lock_interruptible(&port->mutex))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001118 return -ERESTARTSYS;
1119
Peter Hurley4047b372016-04-09 18:56:33 -07001120 uport = uart_port_check(state);
1121 if (!uport) {
1122 ret = -EIO;
1123 goto out;
1124 }
1125
Linus Torvalds1da177e2005-04-16 15:20:36 -07001126 ret = -EBUSY;
Alan Coxb58d13a2009-09-19 13:13:32 -07001127 if (tty_port_users(port) == 1) {
Alan Cox19225132010-06-01 22:52:51 +02001128 uart_shutdown(tty, state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001129
1130 /*
1131 * If we already have a port type configured,
1132 * we must release its resources.
1133 */
Fabio Estevama7cfaf12016-05-20 01:59:54 -03001134 if (uport->type != PORT_UNKNOWN && uport->ops->release_port)
Alan Cox46d57a42009-09-19 13:13:29 -07001135 uport->ops->release_port(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001136
1137 flags = UART_CONFIG_TYPE;
Alan Cox46d57a42009-09-19 13:13:29 -07001138 if (uport->flags & UPF_AUTO_IRQ)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001139 flags |= UART_CONFIG_IRQ;
1140
1141 /*
1142 * This will claim the ports resources if
1143 * a port is found.
1144 */
Alan Cox46d57a42009-09-19 13:13:29 -07001145 uport->ops->config_port(uport, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001146
Alan Cox19225132010-06-01 22:52:51 +02001147 ret = uart_startup(tty, state, 1);
Sebastian Andrzej Siewiorfbe1ad92018-02-03 12:27:23 +01001148 if (ret == 0)
1149 tty_port_set_initialized(port, true);
Rob Herringb3b57642016-08-22 17:39:09 -05001150 if (ret > 0)
1151 ret = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001152 }
Peter Hurley4047b372016-04-09 18:56:33 -07001153out:
Alan Coxa2bceae2009-09-19 13:13:31 -07001154 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001155 return ret;
1156}
1157
Alexander Shiyan1fdc3102014-06-03 18:54:43 +04001158static void uart_enable_ms(struct uart_port *uport)
1159{
1160 /*
1161 * Force modem status interrupts on
1162 */
1163 if (uport->ops->enable_ms)
1164 uport->ops->enable_ms(uport);
1165}
1166
Linus Torvalds1da177e2005-04-16 15:20:36 -07001167/*
1168 * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
1169 * - mask passed in arg for lines of interest
1170 * (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
1171 * Caller should use TIOCGICOUNT to see which one it was
Alan Coxbdc04e32009-09-19 13:13:31 -07001172 *
1173 * FIXME: This wants extracting into a common all driver implementation
1174 * of TIOCMWAIT using tty_port.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001175 */
Peter Hurley9ed19422016-04-09 18:56:34 -07001176static int uart_wait_modem_status(struct uart_state *state, unsigned long arg)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001177{
Peter Hurley9ed19422016-04-09 18:56:34 -07001178 struct uart_port *uport;
Alan Coxbdc04e32009-09-19 13:13:31 -07001179 struct tty_port *port = &state->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001180 DECLARE_WAITQUEUE(wait, current);
1181 struct uart_icount cprev, cnow;
1182 int ret;
1183
1184 /*
1185 * note the counters on entry
1186 */
Peter Hurley9ed19422016-04-09 18:56:34 -07001187 uport = uart_port_ref(state);
1188 if (!uport)
1189 return -EIO;
Alan Cox46d57a42009-09-19 13:13:29 -07001190 spin_lock_irq(&uport->lock);
1191 memcpy(&cprev, &uport->icount, sizeof(struct uart_icount));
Alexander Shiyan1fdc3102014-06-03 18:54:43 +04001192 uart_enable_ms(uport);
Alan Cox46d57a42009-09-19 13:13:29 -07001193 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001194
Alan Coxbdc04e32009-09-19 13:13:31 -07001195 add_wait_queue(&port->delta_msr_wait, &wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001196 for (;;) {
Alan Cox46d57a42009-09-19 13:13:29 -07001197 spin_lock_irq(&uport->lock);
1198 memcpy(&cnow, &uport->icount, sizeof(struct uart_icount));
1199 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001200
1201 set_current_state(TASK_INTERRUPTIBLE);
1202
1203 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
1204 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
1205 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
1206 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts))) {
Alan Coxa46c9992008-02-08 04:18:53 -08001207 ret = 0;
1208 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001209 }
1210
1211 schedule();
1212
1213 /* see if a signal did it */
1214 if (signal_pending(current)) {
1215 ret = -ERESTARTSYS;
1216 break;
1217 }
1218
1219 cprev = cnow;
1220 }
Fabian Frederick97f9f702015-02-20 19:12:57 +01001221 __set_current_state(TASK_RUNNING);
Alan Coxbdc04e32009-09-19 13:13:31 -07001222 remove_wait_queue(&port->delta_msr_wait, &wait);
Peter Hurley9ed19422016-04-09 18:56:34 -07001223 uart_port_deref(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001224
1225 return ret;
1226}
1227
1228/*
1229 * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
1230 * Return: write counters to the user passed counter struct
1231 * NB: both 1->0 and 0->1 transitions are counted except for
1232 * RI where only 0->1 is counted.
1233 */
Alan Coxd281da72010-09-16 18:21:24 +01001234static int uart_get_icount(struct tty_struct *tty,
1235 struct serial_icounter_struct *icount)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001236{
Alan Coxd281da72010-09-16 18:21:24 +01001237 struct uart_state *state = tty->driver_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001238 struct uart_icount cnow;
Peter Hurley9ed19422016-04-09 18:56:34 -07001239 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001240
Peter Hurley9ed19422016-04-09 18:56:34 -07001241 uport = uart_port_ref(state);
1242 if (!uport)
1243 return -EIO;
Alan Cox46d57a42009-09-19 13:13:29 -07001244 spin_lock_irq(&uport->lock);
1245 memcpy(&cnow, &uport->icount, sizeof(struct uart_icount));
1246 spin_unlock_irq(&uport->lock);
Peter Hurley9ed19422016-04-09 18:56:34 -07001247 uart_port_deref(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001248
Alan Coxd281da72010-09-16 18:21:24 +01001249 icount->cts = cnow.cts;
1250 icount->dsr = cnow.dsr;
1251 icount->rng = cnow.rng;
1252 icount->dcd = cnow.dcd;
1253 icount->rx = cnow.rx;
1254 icount->tx = cnow.tx;
1255 icount->frame = cnow.frame;
1256 icount->overrun = cnow.overrun;
1257 icount->parity = cnow.parity;
1258 icount->brk = cnow.brk;
1259 icount->buf_overrun = cnow.buf_overrun;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001260
Alan Coxd281da72010-09-16 18:21:24 +01001261 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001262}
1263
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001264static int uart_get_rs485_config(struct uart_port *port,
1265 struct serial_rs485 __user *rs485)
1266{
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001267 unsigned long flags;
1268 struct serial_rs485 aux;
1269
1270 spin_lock_irqsave(&port->lock, flags);
1271 aux = port->rs485;
1272 spin_unlock_irqrestore(&port->lock, flags);
1273
1274 if (copy_to_user(rs485, &aux, sizeof(aux)))
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001275 return -EFAULT;
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001276
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001277 return 0;
1278}
1279
1280static int uart_set_rs485_config(struct uart_port *port,
1281 struct serial_rs485 __user *rs485_user)
1282{
1283 struct serial_rs485 rs485;
1284 int ret;
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001285 unsigned long flags;
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001286
1287 if (!port->rs485_config)
1288 return -ENOIOCTLCMD;
1289
1290 if (copy_from_user(&rs485, rs485_user, sizeof(*rs485_user)))
1291 return -EFAULT;
1292
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001293 spin_lock_irqsave(&port->lock, flags);
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001294 ret = port->rs485_config(port, &rs485);
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001295 spin_unlock_irqrestore(&port->lock, flags);
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001296 if (ret)
1297 return ret;
1298
1299 if (copy_to_user(rs485_user, &port->rs485, sizeof(port->rs485)))
1300 return -EFAULT;
1301
1302 return 0;
1303}
1304
Linus Torvalds1da177e2005-04-16 15:20:36 -07001305/*
Alan Coxe5238442008-04-30 00:53:28 -07001306 * Called via sys_ioctl. We can use spin_lock_irq() here.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001307 */
1308static int
Peter Hurley4047b372016-04-09 18:56:33 -07001309uart_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001310{
1311 struct uart_state *state = tty->driver_data;
Alan Coxa2bceae2009-09-19 13:13:31 -07001312 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001313 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001314 void __user *uarg = (void __user *)arg;
1315 int ret = -ENOIOCTLCMD;
1316
Linus Torvalds1da177e2005-04-16 15:20:36 -07001317
1318 /*
1319 * These ioctls don't rely on the hardware to be present.
1320 */
1321 switch (cmd) {
1322 case TIOCGSERIAL:
Alan Cox9f109692012-10-29 15:20:25 +00001323 ret = uart_get_info_user(port, uarg);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001324 break;
1325
1326 case TIOCSSERIAL:
Peter Hurley7c8ab962014-10-16 16:54:20 -04001327 down_write(&tty->termios_rwsem);
Alan Cox7ba2e762012-09-04 16:34:45 +01001328 ret = uart_set_info_user(tty, state, uarg);
Peter Hurley7c8ab962014-10-16 16:54:20 -04001329 up_write(&tty->termios_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001330 break;
1331
1332 case TIOCSERCONFIG:
Peter Hurley7c8ab962014-10-16 16:54:20 -04001333 down_write(&tty->termios_rwsem);
Alan Cox19225132010-06-01 22:52:51 +02001334 ret = uart_do_autoconfig(tty, state);
Peter Hurley7c8ab962014-10-16 16:54:20 -04001335 up_write(&tty->termios_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001336 break;
1337
1338 case TIOCSERGWILD: /* obsolete */
1339 case TIOCSERSWILD: /* obsolete */
1340 ret = 0;
1341 break;
1342 }
1343
1344 if (ret != -ENOIOCTLCMD)
1345 goto out;
1346
Peter Hurley18900ca2016-04-09 17:06:48 -07001347 if (tty_io_error(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001348 ret = -EIO;
1349 goto out;
1350 }
1351
1352 /*
1353 * The following should only be used when hardware is present.
1354 */
1355 switch (cmd) {
1356 case TIOCMIWAIT:
1357 ret = uart_wait_modem_status(state, arg);
1358 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001359 }
1360
1361 if (ret != -ENOIOCTLCMD)
1362 goto out;
1363
Alan Coxa2bceae2009-09-19 13:13:31 -07001364 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001365 uport = uart_port_check(state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001366
Peter Hurley4047b372016-04-09 18:56:33 -07001367 if (!uport || tty_io_error(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001368 ret = -EIO;
1369 goto out_up;
1370 }
1371
1372 /*
1373 * All these rely on hardware being present and need to be
1374 * protected against the tty being hung up.
1375 */
Ricardo Ribalda Delgadoa9c20a92014-11-06 09:22:59 +01001376
Linus Torvalds1da177e2005-04-16 15:20:36 -07001377 switch (cmd) {
Ricardo Ribalda Delgadoa9c20a92014-11-06 09:22:59 +01001378 case TIOCSERGETLSR: /* Get line status register */
1379 ret = uart_get_lsr_info(tty, state, uarg);
1380 break;
1381
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001382 case TIOCGRS485:
Peter Hurley4047b372016-04-09 18:56:33 -07001383 ret = uart_get_rs485_config(uport, uarg);
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001384 break;
1385
1386 case TIOCSRS485:
Peter Hurley4047b372016-04-09 18:56:33 -07001387 ret = uart_set_rs485_config(uport, uarg);
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001388 break;
Peter Hurley4047b372016-04-09 18:56:33 -07001389 default:
Alan Cox46d57a42009-09-19 13:13:29 -07001390 if (uport->ops->ioctl)
1391 ret = uport->ops->ioctl(uport, cmd, arg);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001392 break;
1393 }
Alan Coxf34d7a52008-04-30 00:54:13 -07001394out_up:
Alan Coxa2bceae2009-09-19 13:13:31 -07001395 mutex_unlock(&port->mutex);
Alan Coxf34d7a52008-04-30 00:54:13 -07001396out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001397 return ret;
1398}
1399
Linus Torvaldsedeb2802008-06-04 10:35:03 -07001400static void uart_set_ldisc(struct tty_struct *tty)
Alan Cox64e91592008-06-03 15:18:54 +01001401{
1402 struct uart_state *state = tty->driver_data;
Peter Hurley4047b372016-04-09 18:56:33 -07001403 struct uart_port *uport;
Alan Cox64e91592008-06-03 15:18:54 +01001404
Peter Hurley4047b372016-04-09 18:56:33 -07001405 mutex_lock(&state->port.mutex);
1406 uport = uart_port_check(state);
1407 if (uport && uport->ops->set_ldisc)
Peter Hurley732a84a2014-11-05 13:11:43 -05001408 uport->ops->set_ldisc(uport, &tty->termios);
Peter Hurley4047b372016-04-09 18:56:33 -07001409 mutex_unlock(&state->port.mutex);
Alan Cox64e91592008-06-03 15:18:54 +01001410}
1411
Alan Coxa46c9992008-02-08 04:18:53 -08001412static void uart_set_termios(struct tty_struct *tty,
1413 struct ktermios *old_termios)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001414{
1415 struct uart_state *state = tty->driver_data;
Peter Hurley4047b372016-04-09 18:56:33 -07001416 struct uart_port *uport;
Alan Coxadc8d742012-07-14 15:31:47 +01001417 unsigned int cflag = tty->termios.c_cflag;
Russell King2cbacaf2012-04-17 16:34:13 +01001418 unsigned int iflag_mask = IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK;
1419 bool sw_changed = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001420
Peter Hurley4047b372016-04-09 18:56:33 -07001421 mutex_lock(&state->port.mutex);
1422 uport = uart_port_check(state);
1423 if (!uport)
1424 goto out;
1425
Russell King2cbacaf2012-04-17 16:34:13 +01001426 /*
1427 * Drivers doing software flow control also need to know
1428 * about changes to these input settings.
1429 */
1430 if (uport->flags & UPF_SOFT_FLOW) {
1431 iflag_mask |= IXANY|IXON|IXOFF;
1432 sw_changed =
1433 tty->termios.c_cc[VSTART] != old_termios->c_cc[VSTART] ||
1434 tty->termios.c_cc[VSTOP] != old_termios->c_cc[VSTOP];
1435 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001436
1437 /*
1438 * These are the bits that are used to setup various
David Woodhouse20620d62007-08-22 14:01:11 -07001439 * flags in the low level driver. We can ignore the Bfoo
1440 * bits in c_cflag; c_[io]speed will always be set
1441 * appropriately by set_termios() in tty_ioctl.c
Linus Torvalds1da177e2005-04-16 15:20:36 -07001442 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001443 if ((cflag ^ old_termios->c_cflag) == 0 &&
Alan Coxadc8d742012-07-14 15:31:47 +01001444 tty->termios.c_ospeed == old_termios->c_ospeed &&
1445 tty->termios.c_ispeed == old_termios->c_ispeed &&
Russell King2cbacaf2012-04-17 16:34:13 +01001446 ((tty->termios.c_iflag ^ old_termios->c_iflag) & iflag_mask) == 0 &&
1447 !sw_changed) {
Peter Hurley4047b372016-04-09 18:56:33 -07001448 goto out;
Alan Coxe5238442008-04-30 00:53:28 -07001449 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001450
Alan Cox19225132010-06-01 22:52:51 +02001451 uart_change_speed(tty, state, old_termios);
Peter Hurleyc18b55f2014-06-16 09:17:09 -04001452 /* reload cflag from termios; port driver may have overriden flags */
1453 cflag = tty->termios.c_cflag;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001454
1455 /* Handle transition to B0 status */
1456 if ((old_termios->c_cflag & CBAUD) && !(cflag & CBAUD))
Russell Kingdec94e72012-09-24 11:13:15 +01001457 uart_clear_mctrl(uport, TIOCM_RTS | TIOCM_DTR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001458 /* Handle transition away from B0 status */
André Goddard Rosa82cb7ba2009-10-25 11:18:26 -02001459 else if (!(old_termios->c_cflag & CBAUD) && (cflag & CBAUD)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001460 unsigned int mask = TIOCM_DTR;
Peter Hurley97ef38b2016-04-09 17:11:36 -07001461 if (!(cflag & CRTSCTS) || !tty_throttled(tty))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001462 mask |= TIOCM_RTS;
Russell Kingdec94e72012-09-24 11:13:15 +01001463 uart_set_mctrl(uport, mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001464 }
Peter Hurley4047b372016-04-09 18:56:33 -07001465out:
1466 mutex_unlock(&state->port.mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001467}
1468
1469/*
Kevin Cernekeeef4f5272012-12-26 20:43:41 -08001470 * Calls to uart_close() are serialised via the tty_lock in
1471 * drivers/tty/tty_io.c:tty_release()
1472 * drivers/tty/tty_io.c:do_tty_hangup()
Linus Torvalds1da177e2005-04-16 15:20:36 -07001473 */
1474static void uart_close(struct tty_struct *tty, struct file *filp)
1475{
1476 struct uart_state *state = tty->driver_data;
Alan Cox46d57a42009-09-19 13:13:29 -07001477 struct tty_port *port;
Alan Coxa46c9992008-02-08 04:18:53 -08001478
Peter Hurley91b32f52014-10-16 16:54:27 -04001479 if (!state) {
1480 struct uart_driver *drv = tty->driver->driver_state;
1481
1482 state = drv->state + tty->index;
1483 port = &state->port;
1484 spin_lock_irq(&port->lock);
1485 --port->count;
1486 spin_unlock_irq(&port->lock);
Linus Torvaldseea7e172009-10-12 19:13:54 +02001487 return;
Peter Hurley91b32f52014-10-16 16:54:27 -04001488 }
Linus Torvaldseea7e172009-10-12 19:13:54 +02001489
Alan Cox46d57a42009-09-19 13:13:29 -07001490 port = &state->port;
Peter Hurley39b3d892016-01-10 20:23:57 -08001491 pr_debug("uart_close(%d) called\n", tty->index);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001492
Rob Herring761ed4a2016-08-22 17:39:10 -05001493 tty_port_close(tty->port, tty, filp);
1494}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001495
Rob Herring761ed4a2016-08-22 17:39:10 -05001496static void uart_tty_port_shutdown(struct tty_port *port)
1497{
1498 struct uart_state *state = container_of(port, struct uart_state, port);
1499 struct uart_port *uport = uart_port_check(state);
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001500
Linus Torvalds1da177e2005-04-16 15:20:36 -07001501 /*
1502 * At this point, we stop accepting input. To do this, we
1503 * disable the receive line status interrupts.
1504 */
Andy Shevchenkoa5a2b132016-09-13 00:23:42 +03001505 if (WARN(!uport, "detached port still initialized!\n"))
1506 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001507
Andy Shevchenkoa5a2b132016-09-13 00:23:42 +03001508 spin_lock_irq(&uport->lock);
Rob Herring761ed4a2016-08-22 17:39:10 -05001509 uport->ops->stop_rx(uport);
Rob Herring761ed4a2016-08-22 17:39:10 -05001510 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001511
Rob Herring761ed4a2016-08-22 17:39:10 -05001512 uart_port_shutdown(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001513
1514 /*
Rob Herring761ed4a2016-08-22 17:39:10 -05001515 * It's possible for shutdown to be called after suspend if we get
1516 * a DCD drop (hangup) at just the right time. Clear suspended bit so
1517 * we don't try to resume a port that has been shutdown.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001518 */
Rob Herring761ed4a2016-08-22 17:39:10 -05001519 tty_port_set_suspended(port, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001520
Rob Herring761ed4a2016-08-22 17:39:10 -05001521 uart_change_pm(state, UART_PM_STATE_OFF);
Peter Hurley2e758912014-10-16 16:54:19 -04001522
Linus Torvalds1da177e2005-04-16 15:20:36 -07001523}
1524
Jiri Slaby1f33a512011-07-14 14:35:10 +02001525static void uart_wait_until_sent(struct tty_struct *tty, int timeout)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001526{
Jiri Slaby1f33a512011-07-14 14:35:10 +02001527 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -07001528 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001529 unsigned long char_time, expire;
1530
Peter Hurley9ed19422016-04-09 18:56:34 -07001531 port = uart_port_ref(state);
1532 if (!port || port->type == PORT_UNKNOWN || port->fifosize == 0) {
1533 uart_port_deref(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001534 return;
Peter Hurley9ed19422016-04-09 18:56:34 -07001535 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001536
1537 /*
1538 * Set the check interval to be 1/5 of the estimated time to
1539 * send a single character, and make it at least 1. The check
1540 * interval should also be less than the timeout.
1541 *
1542 * Note: we have to use pretty tight timings here to satisfy
1543 * the NIST-PCTS.
1544 */
1545 char_time = (port->timeout - HZ/50) / port->fifosize;
1546 char_time = char_time / 5;
1547 if (char_time == 0)
1548 char_time = 1;
1549 if (timeout && timeout < char_time)
1550 char_time = timeout;
1551
1552 /*
1553 * If the transmitter hasn't cleared in twice the approximate
1554 * amount of time to send the entire FIFO, it probably won't
1555 * ever clear. This assumes the UART isn't doing flow
1556 * control, which is currently the case. Hence, if it ever
1557 * takes longer than port->timeout, this is probably due to a
1558 * UART bug of some kind. So, we clamp the timeout parameter at
1559 * 2*port->timeout.
1560 */
1561 if (timeout == 0 || timeout > 2 * port->timeout)
1562 timeout = 2 * port->timeout;
1563
1564 expire = jiffies + timeout;
1565
Jiri Slabyeb3a1e12007-05-06 14:48:52 -07001566 pr_debug("uart_wait_until_sent(%d), jiffies=%lu, expire=%lu...\n",
Alan Coxa46c9992008-02-08 04:18:53 -08001567 port->line, jiffies, expire);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001568
1569 /*
1570 * Check whether the transmitter is empty every 'char_time'.
1571 * 'timeout' / 'expire' give us the maximum amount of time
1572 * we wait.
1573 */
1574 while (!port->ops->tx_empty(port)) {
1575 msleep_interruptible(jiffies_to_msecs(char_time));
1576 if (signal_pending(current))
1577 break;
1578 if (time_after(jiffies, expire))
1579 break;
1580 }
Peter Hurley9ed19422016-04-09 18:56:34 -07001581 uart_port_deref(port);
Arnd Bergmann20365212010-06-01 22:53:07 +02001582}
1583
Linus Torvalds1da177e2005-04-16 15:20:36 -07001584/*
Kevin Cernekeeef4f5272012-12-26 20:43:41 -08001585 * Calls to uart_hangup() are serialised by the tty_lock in
1586 * drivers/tty/tty_io.c:do_tty_hangup()
1587 * This runs from a workqueue and can sleep for a _short_ time only.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001588 */
1589static void uart_hangup(struct tty_struct *tty)
1590{
1591 struct uart_state *state = tty->driver_data;
Alan Cox46d57a42009-09-19 13:13:29 -07001592 struct tty_port *port = &state->port;
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001593 struct uart_port *uport;
Alan Cox61cd8a22010-06-01 22:52:57 +02001594 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001595
Peter Hurley39b3d892016-01-10 20:23:57 -08001596 pr_debug("uart_hangup(%d)\n", tty->index);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001597
Alan Coxa2bceae2009-09-19 13:13:31 -07001598 mutex_lock(&port->mutex);
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001599 uport = uart_port_check(state);
1600 WARN(!uport, "hangup of detached port!\n");
1601
Peter Hurley807c8d812016-04-09 17:53:22 -07001602 if (tty_port_active(port)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001603 uart_flush_buffer(tty);
Alan Cox19225132010-06-01 22:52:51 +02001604 uart_shutdown(tty, state);
Alan Cox61cd8a22010-06-01 22:52:57 +02001605 spin_lock_irqsave(&port->lock, flags);
Alan Cox91312cd2009-09-19 13:13:29 -07001606 port->count = 0;
Alan Cox61cd8a22010-06-01 22:52:57 +02001607 spin_unlock_irqrestore(&port->lock, flags);
Peter Hurley807c8d812016-04-09 17:53:22 -07001608 tty_port_set_active(port, 0);
Alan Cox7b014782009-09-19 13:13:33 -07001609 tty_port_tty_set(port, NULL);
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001610 if (uport && !uart_console(uport))
Geert Uytterhoevenbf903c02014-03-27 11:40:39 +01001611 uart_change_pm(state, UART_PM_STATE_OFF);
Alan Cox46d57a42009-09-19 13:13:29 -07001612 wake_up_interruptible(&port->open_wait);
Alan Coxbdc04e32009-09-19 13:13:31 -07001613 wake_up_interruptible(&port->delta_msr_wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001614 }
Alan Coxa2bceae2009-09-19 13:13:31 -07001615 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001616}
1617
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001618/* uport == NULL if uart_port has already been removed */
Jiri Slaby0b1db832011-11-09 21:33:50 +01001619static void uart_port_shutdown(struct tty_port *port)
1620{
Jiri Slabyb922e192011-11-09 21:33:51 +01001621 struct uart_state *state = container_of(port, struct uart_state, port);
Peter Hurley4047b372016-04-09 18:56:33 -07001622 struct uart_port *uport = uart_port_check(state);
Jiri Slabyb922e192011-11-09 21:33:51 +01001623
1624 /*
1625 * clear delta_msr_wait queue to avoid mem leaks: we may free
1626 * the irq here so the queue might never be woken up. Note
1627 * that we won't end up waiting on delta_msr_wait again since
1628 * any outstanding file descriptors should be pointing at
1629 * hung_up_tty_fops now.
1630 */
1631 wake_up_interruptible(&port->delta_msr_wait);
1632
1633 /*
1634 * Free the IRQ and disable the port.
1635 */
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001636 if (uport)
1637 uport->ops->shutdown(uport);
Jiri Slabyb922e192011-11-09 21:33:51 +01001638
1639 /*
1640 * Ensure that the IRQ handler isn't running on another CPU.
1641 */
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001642 if (uport)
1643 synchronize_irq(uport->irq);
Jiri Slaby0b1db832011-11-09 21:33:50 +01001644}
1645
Alan Coxde0c8cb2010-06-01 22:52:58 +02001646static int uart_carrier_raised(struct tty_port *port)
1647{
1648 struct uart_state *state = container_of(port, struct uart_state, port);
Peter Hurley9ed19422016-04-09 18:56:34 -07001649 struct uart_port *uport;
Alan Coxde0c8cb2010-06-01 22:52:58 +02001650 int mctrl;
Peter Hurley9ed19422016-04-09 18:56:34 -07001651
1652 uport = uart_port_ref(state);
1653 /*
1654 * Should never observe uport == NULL since checks for hangup should
1655 * abort the tty_port_block_til_ready() loop before checking for carrier
1656 * raised -- but report carrier raised if it does anyway so open will
1657 * continue and not sleep
1658 */
1659 if (WARN_ON(!uport))
1660 return 1;
Alan Coxde0c8cb2010-06-01 22:52:58 +02001661 spin_lock_irq(&uport->lock);
Alexander Shiyan1fdc3102014-06-03 18:54:43 +04001662 uart_enable_ms(uport);
Alan Coxde0c8cb2010-06-01 22:52:58 +02001663 mctrl = uport->ops->get_mctrl(uport);
1664 spin_unlock_irq(&uport->lock);
Peter Hurley9ed19422016-04-09 18:56:34 -07001665 uart_port_deref(uport);
Alan Coxde0c8cb2010-06-01 22:52:58 +02001666 if (mctrl & TIOCM_CAR)
1667 return 1;
1668 return 0;
1669}
1670
1671static void uart_dtr_rts(struct tty_port *port, int onoff)
1672{
1673 struct uart_state *state = container_of(port, struct uart_state, port);
Peter Hurley9ed19422016-04-09 18:56:34 -07001674 struct uart_port *uport;
1675
1676 uport = uart_port_ref(state);
1677 if (!uport)
1678 return;
Alan Cox24fcc7c2010-06-01 22:52:59 +02001679
Jiri Slaby6f5c24a2011-03-30 00:10:57 +02001680 if (onoff)
Alan Coxde0c8cb2010-06-01 22:52:58 +02001681 uart_set_mctrl(uport, TIOCM_DTR | TIOCM_RTS);
1682 else
1683 uart_clear_mctrl(uport, TIOCM_DTR | TIOCM_RTS);
Peter Hurley9ed19422016-04-09 18:56:34 -07001684
1685 uart_port_deref(uport);
Alan Coxde0c8cb2010-06-01 22:52:58 +02001686}
1687
Linus Torvalds1da177e2005-04-16 15:20:36 -07001688/*
Kevin Cernekeeef4f5272012-12-26 20:43:41 -08001689 * Calls to uart_open are serialised by the tty_lock in
1690 * drivers/tty/tty_io.c:tty_open()
Linus Torvalds1da177e2005-04-16 15:20:36 -07001691 * Note that if this fails, then uart_close() _will_ be called.
1692 *
1693 * In time, we want to scrap the "opening nonpresent ports"
1694 * behaviour and implement an alternative way for setserial
1695 * to set base addresses/ports/types. This will allow us to
1696 * get rid of a certain amount of extra tests.
1697 */
1698static int uart_open(struct tty_struct *tty, struct file *filp)
1699{
Peter Hurley5e388022016-01-10 20:24:00 -08001700 struct uart_driver *drv = tty->driver->driver_state;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001701 int retval, line = tty->index;
Jiri Slaby1c7b13c2011-11-09 21:33:49 +01001702 struct uart_state *state = drv->state + line;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001703
Linus Torvalds1da177e2005-04-16 15:20:36 -07001704 tty->driver_data = state;
Rob Herringb3b57642016-08-22 17:39:09 -05001705
1706 retval = tty_port_open(&state->port, tty, filp);
1707 if (retval > 0)
1708 retval = 0;
1709
1710 return retval;
1711}
1712
1713static int uart_port_activate(struct tty_port *port, struct tty_struct *tty)
1714{
1715 struct uart_state *state = container_of(port, struct uart_state, port);
1716 struct uart_port *uport;
1717
1718 uport = uart_port_check(state);
1719 if (!uport || uport->flags & UPF_DEAD)
1720 return -ENXIO;
1721
Peter Hurley4047b372016-04-09 18:56:33 -07001722 port->low_latency = (uport->flags & UPF_LOW_LATENCY) ? 1 : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001723
1724 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001725 * Start up the serial port.
1726 */
Rob Herringb3b57642016-08-22 17:39:09 -05001727 return uart_startup(tty, state, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001728}
1729
1730static const char *uart_type(struct uart_port *port)
1731{
1732 const char *str = NULL;
1733
1734 if (port->ops->type)
1735 str = port->ops->type(port);
1736
1737 if (!str)
1738 str = "unknown";
1739
1740 return str;
1741}
1742
1743#ifdef CONFIG_PROC_FS
1744
Alexey Dobriyand196a942009-03-31 15:19:21 -07001745static void uart_line_info(struct seq_file *m, struct uart_driver *drv, int i)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001746{
1747 struct uart_state *state = drv->state + i;
Alan Coxa2bceae2009-09-19 13:13:31 -07001748 struct tty_port *port = &state->port;
Linus Walleij6f538fe2012-12-07 11:36:08 +01001749 enum uart_pm_state pm_state;
Peter Hurley4047b372016-04-09 18:56:33 -07001750 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001751 char stat_buf[32];
1752 unsigned int status;
Alexey Dobriyand196a942009-03-31 15:19:21 -07001753 int mmio;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001754
Peter Hurley4047b372016-04-09 18:56:33 -07001755 mutex_lock(&port->mutex);
1756 uport = uart_port_check(state);
Alan Coxa2bceae2009-09-19 13:13:31 -07001757 if (!uport)
Peter Hurley4047b372016-04-09 18:56:33 -07001758 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001759
Alan Coxa2bceae2009-09-19 13:13:31 -07001760 mmio = uport->iotype >= UPIO_MEM;
Alexey Dobriyand196a942009-03-31 15:19:21 -07001761 seq_printf(m, "%d: uart:%s %s%08llX irq:%d",
Alan Coxa2bceae2009-09-19 13:13:31 -07001762 uport->line, uart_type(uport),
Sergei Shtylyov6c6a2332006-09-04 00:04:20 +04001763 mmio ? "mmio:0x" : "port:",
Alan Coxa2bceae2009-09-19 13:13:31 -07001764 mmio ? (unsigned long long)uport->mapbase
1765 : (unsigned long long)uport->iobase,
1766 uport->irq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001767
Alan Coxa2bceae2009-09-19 13:13:31 -07001768 if (uport->type == PORT_UNKNOWN) {
Alexey Dobriyand196a942009-03-31 15:19:21 -07001769 seq_putc(m, '\n');
Peter Hurley4047b372016-04-09 18:56:33 -07001770 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001771 }
1772
Alan Coxa46c9992008-02-08 04:18:53 -08001773 if (capable(CAP_SYS_ADMIN)) {
George G. Davis3689a0e2007-02-14 00:33:06 -08001774 pm_state = state->pm_state;
Linus Walleij6f538fe2012-12-07 11:36:08 +01001775 if (pm_state != UART_PM_STATE_ON)
1776 uart_change_pm(state, UART_PM_STATE_ON);
Alan Coxa2bceae2009-09-19 13:13:31 -07001777 spin_lock_irq(&uport->lock);
1778 status = uport->ops->get_mctrl(uport);
1779 spin_unlock_irq(&uport->lock);
Linus Walleij6f538fe2012-12-07 11:36:08 +01001780 if (pm_state != UART_PM_STATE_ON)
George G. Davis3689a0e2007-02-14 00:33:06 -08001781 uart_change_pm(state, pm_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001782
Alexey Dobriyand196a942009-03-31 15:19:21 -07001783 seq_printf(m, " tx:%d rx:%d",
Alan Coxa2bceae2009-09-19 13:13:31 -07001784 uport->icount.tx, uport->icount.rx);
1785 if (uport->icount.frame)
Peter Hurley968af292016-01-10 20:24:01 -08001786 seq_printf(m, " fe:%d", uport->icount.frame);
Alan Coxa2bceae2009-09-19 13:13:31 -07001787 if (uport->icount.parity)
Peter Hurley968af292016-01-10 20:24:01 -08001788 seq_printf(m, " pe:%d", uport->icount.parity);
Alan Coxa2bceae2009-09-19 13:13:31 -07001789 if (uport->icount.brk)
Peter Hurley968af292016-01-10 20:24:01 -08001790 seq_printf(m, " brk:%d", uport->icount.brk);
Alan Coxa2bceae2009-09-19 13:13:31 -07001791 if (uport->icount.overrun)
Peter Hurley968af292016-01-10 20:24:01 -08001792 seq_printf(m, " oe:%d", uport->icount.overrun);
Alan Coxa46c9992008-02-08 04:18:53 -08001793
1794#define INFOBIT(bit, str) \
Alan Coxa2bceae2009-09-19 13:13:31 -07001795 if (uport->mctrl & (bit)) \
Linus Torvalds1da177e2005-04-16 15:20:36 -07001796 strncat(stat_buf, (str), sizeof(stat_buf) - \
1797 strlen(stat_buf) - 2)
Alan Coxa46c9992008-02-08 04:18:53 -08001798#define STATBIT(bit, str) \
Linus Torvalds1da177e2005-04-16 15:20:36 -07001799 if (status & (bit)) \
1800 strncat(stat_buf, (str), sizeof(stat_buf) - \
1801 strlen(stat_buf) - 2)
1802
1803 stat_buf[0] = '\0';
1804 stat_buf[1] = '\0';
1805 INFOBIT(TIOCM_RTS, "|RTS");
1806 STATBIT(TIOCM_CTS, "|CTS");
1807 INFOBIT(TIOCM_DTR, "|DTR");
1808 STATBIT(TIOCM_DSR, "|DSR");
1809 STATBIT(TIOCM_CAR, "|CD");
1810 STATBIT(TIOCM_RNG, "|RI");
1811 if (stat_buf[0])
1812 stat_buf[0] = ' ';
Alan Coxa46c9992008-02-08 04:18:53 -08001813
Alexey Dobriyand196a942009-03-31 15:19:21 -07001814 seq_puts(m, stat_buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001815 }
Alexey Dobriyand196a942009-03-31 15:19:21 -07001816 seq_putc(m, '\n');
Linus Torvalds1da177e2005-04-16 15:20:36 -07001817#undef STATBIT
1818#undef INFOBIT
Peter Hurley4047b372016-04-09 18:56:33 -07001819out:
1820 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001821}
1822
Alexey Dobriyand196a942009-03-31 15:19:21 -07001823static int uart_proc_show(struct seq_file *m, void *v)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001824{
Alexey Dobriyan833bb302009-04-02 01:30:04 +04001825 struct tty_driver *ttydrv = m->private;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001826 struct uart_driver *drv = ttydrv->driver_state;
Alexey Dobriyand196a942009-03-31 15:19:21 -07001827 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001828
Peter Hurley968af292016-01-10 20:24:01 -08001829 seq_printf(m, "serinfo:1.0 driver%s%s revision:%s\n", "", "", "");
Alexey Dobriyand196a942009-03-31 15:19:21 -07001830 for (i = 0; i < drv->nr; i++)
1831 uart_line_info(m, drv, i);
1832 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001833}
Alexey Dobriyand196a942009-03-31 15:19:21 -07001834
1835static int uart_proc_open(struct inode *inode, struct file *file)
1836{
Al Virod9dda782013-03-31 18:16:14 -04001837 return single_open(file, uart_proc_show, PDE_DATA(inode));
Alexey Dobriyand196a942009-03-31 15:19:21 -07001838}
1839
1840static const struct file_operations uart_proc_fops = {
1841 .owner = THIS_MODULE,
1842 .open = uart_proc_open,
1843 .read = seq_read,
1844 .llseek = seq_lseek,
1845 .release = single_release,
1846};
Linus Torvalds1da177e2005-04-16 15:20:36 -07001847#endif
1848
Andrew Morton4a1b5502008-03-07 15:51:16 -08001849#if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(CONFIG_CONSOLE_POLL)
Peter Hurley1cfe42b2015-03-09 16:27:13 -04001850/**
Russell Kingd3587882006-03-20 20:00:09 +00001851 * uart_console_write - write a console message to a serial port
1852 * @port: the port to write the message
1853 * @s: array of characters
1854 * @count: number of characters in string to write
Peter Hurley10afbe32015-04-11 10:05:07 -04001855 * @putchar: function to write character to port
Russell Kingd3587882006-03-20 20:00:09 +00001856 */
1857void uart_console_write(struct uart_port *port, const char *s,
1858 unsigned int count,
1859 void (*putchar)(struct uart_port *, int))
1860{
1861 unsigned int i;
1862
1863 for (i = 0; i < count; i++, s++) {
1864 if (*s == '\n')
1865 putchar(port, '\r');
1866 putchar(port, *s);
1867 }
1868}
1869EXPORT_SYMBOL_GPL(uart_console_write);
1870
1871/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001872 * Check whether an invalid uart number has been specified, and
1873 * if so, search for the first available port that does have
1874 * console support.
1875 */
1876struct uart_port * __init
1877uart_get_console(struct uart_port *ports, int nr, struct console *co)
1878{
1879 int idx = co->index;
1880
1881 if (idx < 0 || idx >= nr || (ports[idx].iobase == 0 &&
1882 ports[idx].membase == NULL))
1883 for (idx = 0; idx < nr; idx++)
1884 if (ports[idx].iobase != 0 ||
1885 ports[idx].membase != NULL)
1886 break;
1887
1888 co->index = idx;
1889
1890 return ports + idx;
1891}
1892
1893/**
Peter Hurley73abaf82015-03-01 11:05:46 -05001894 * uart_parse_earlycon - Parse earlycon options
1895 * @p: ptr to 2nd field (ie., just beyond '<name>,')
1896 * @iotype: ptr for decoded iotype (out)
1897 * @addr: ptr for decoded mapbase/iobase (out)
1898 * @options: ptr for <options> field; NULL if not present (out)
1899 *
1900 * Decodes earlycon kernel command line parameters of the form
Masahiro Yamadabd94c402015-10-28 12:46:05 +09001901 * earlycon=<name>,io|mmio|mmio16|mmio32|mmio32be|mmio32native,<addr>,<options>
1902 * console=<name>,io|mmio|mmio16|mmio32|mmio32be|mmio32native,<addr>,<options>
Peter Hurley73abaf82015-03-01 11:05:46 -05001903 *
1904 * The optional form
1905 * earlycon=<name>,0x<addr>,<options>
1906 * console=<name>,0x<addr>,<options>
1907 * is also accepted; the returned @iotype will be UPIO_MEM.
1908 *
Alexander Sverdlin8b2303d2016-09-12 13:29:29 +02001909 * Returns 0 on success or -EINVAL on failure
Peter Hurley73abaf82015-03-01 11:05:46 -05001910 */
Alexander Sverdlin46e36682016-09-02 13:20:21 +02001911int uart_parse_earlycon(char *p, unsigned char *iotype, resource_size_t *addr,
Peter Hurley73abaf82015-03-01 11:05:46 -05001912 char **options)
1913{
1914 if (strncmp(p, "mmio,", 5) == 0) {
1915 *iotype = UPIO_MEM;
1916 p += 5;
Masahiro Yamadabd94c402015-10-28 12:46:05 +09001917 } else if (strncmp(p, "mmio16,", 7) == 0) {
1918 *iotype = UPIO_MEM16;
1919 p += 7;
Peter Hurley73abaf82015-03-01 11:05:46 -05001920 } else if (strncmp(p, "mmio32,", 7) == 0) {
1921 *iotype = UPIO_MEM32;
1922 p += 7;
Noam Camus6e63be32015-05-25 06:54:28 +03001923 } else if (strncmp(p, "mmio32be,", 9) == 0) {
1924 *iotype = UPIO_MEM32BE;
1925 p += 9;
Max Filippovd215d802015-09-22 15:20:32 +03001926 } else if (strncmp(p, "mmio32native,", 13) == 0) {
1927 *iotype = IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) ?
1928 UPIO_MEM32BE : UPIO_MEM32;
1929 p += 13;
Peter Hurley73abaf82015-03-01 11:05:46 -05001930 } else if (strncmp(p, "io,", 3) == 0) {
1931 *iotype = UPIO_PORT;
1932 p += 3;
1933 } else if (strncmp(p, "0x", 2) == 0) {
1934 *iotype = UPIO_MEM;
1935 } else {
1936 return -EINVAL;
1937 }
1938
Alexander Sverdlin8b2303d2016-09-12 13:29:29 +02001939 /*
1940 * Before you replace it with kstrtoull(), think about options separator
1941 * (',') it will not tolerate
1942 */
1943 *addr = simple_strtoull(p, NULL, 0);
Peter Hurley73abaf82015-03-01 11:05:46 -05001944 p = strchr(p, ',');
1945 if (p)
1946 p++;
1947
1948 *options = p;
1949 return 0;
1950}
1951EXPORT_SYMBOL_GPL(uart_parse_earlycon);
1952
1953/**
Geert Uytterhoeven02088ca2014-03-11 11:23:35 +01001954 * uart_parse_options - Parse serial port baud/parity/bits/flow control.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001955 * @options: pointer to option string
1956 * @baud: pointer to an 'int' variable for the baud rate.
1957 * @parity: pointer to an 'int' variable for the parity.
1958 * @bits: pointer to an 'int' variable for the number of data bits.
1959 * @flow: pointer to an 'int' variable for the flow control character.
1960 *
1961 * uart_parse_options decodes a string containing the serial console
1962 * options. The format of the string is <baud><parity><bits><flow>,
1963 * eg: 115200n8r
1964 */
Jason Wesself2d937f2008-04-17 20:05:37 +02001965void
Linus Torvalds1da177e2005-04-16 15:20:36 -07001966uart_parse_options(char *options, int *baud, int *parity, int *bits, int *flow)
1967{
1968 char *s = options;
1969
1970 *baud = simple_strtoul(s, NULL, 10);
1971 while (*s >= '0' && *s <= '9')
1972 s++;
1973 if (*s)
1974 *parity = *s++;
1975 if (*s)
1976 *bits = *s++ - '0';
1977 if (*s)
1978 *flow = *s;
1979}
Jason Wesself2d937f2008-04-17 20:05:37 +02001980EXPORT_SYMBOL_GPL(uart_parse_options);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001981
Linus Torvalds1da177e2005-04-16 15:20:36 -07001982/**
1983 * uart_set_options - setup the serial console parameters
1984 * @port: pointer to the serial ports uart_port structure
1985 * @co: console pointer
1986 * @baud: baud rate
1987 * @parity: parity character - 'n' (none), 'o' (odd), 'e' (even)
1988 * @bits: number of data bits
1989 * @flow: flow control character - 'r' (rts)
1990 */
Jason Wesself2d937f2008-04-17 20:05:37 +02001991int
Linus Torvalds1da177e2005-04-16 15:20:36 -07001992uart_set_options(struct uart_port *port, struct console *co,
1993 int baud, int parity, int bits, int flow)
1994{
Alan Cox606d0992006-12-08 02:38:45 -08001995 struct ktermios termios;
Alan Cox149b36e2007-10-18 01:24:16 -07001996 static struct ktermios dummy;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001997
Russell King976ecd12005-07-03 21:05:45 +01001998 /*
1999 * Ensure that the serial console lock is initialised
2000 * early.
Randy Witt42b6a1b2013-10-17 16:56:47 -04002001 * If this port is a console, then the spinlock is already
2002 * initialised.
Russell King976ecd12005-07-03 21:05:45 +01002003 */
Randy Witt42b6a1b2013-10-17 16:56:47 -04002004 if (!(uart_console(port) && (port->cons->flags & CON_ENABLED))) {
2005 spin_lock_init(&port->lock);
2006 lockdep_set_class(&port->lock, &port_lock_key);
2007 }
Russell King976ecd12005-07-03 21:05:45 +01002008
Alan Cox606d0992006-12-08 02:38:45 -08002009 memset(&termios, 0, sizeof(struct ktermios));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002010
Jeffy Chenba47f972016-01-04 15:54:46 +08002011 termios.c_cflag |= CREAD | HUPCL | CLOCAL;
2012 tty_termios_encode_baud_rate(&termios, baud, baud);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002013
2014 if (bits == 7)
2015 termios.c_cflag |= CS7;
2016 else
2017 termios.c_cflag |= CS8;
2018
2019 switch (parity) {
2020 case 'o': case 'O':
2021 termios.c_cflag |= PARODD;
2022 /*fall through*/
2023 case 'e': case 'E':
2024 termios.c_cflag |= PARENB;
2025 break;
2026 }
2027
2028 if (flow == 'r')
2029 termios.c_cflag |= CRTSCTS;
2030
Yinghai Lu79492682007-07-15 23:37:25 -07002031 /*
2032 * some uarts on other side don't support no flow control.
2033 * So we set * DTR in host uart to make them happy
2034 */
2035 port->mctrl |= TIOCM_DTR;
2036
Alan Cox149b36e2007-10-18 01:24:16 -07002037 port->ops->set_termios(port, &termios, &dummy);
Jason Wesself2d937f2008-04-17 20:05:37 +02002038 /*
2039 * Allow the setting of the UART parameters with a NULL console
2040 * too:
2041 */
2042 if (co)
2043 co->cflag = termios.c_cflag;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002044
2045 return 0;
2046}
Jason Wesself2d937f2008-04-17 20:05:37 +02002047EXPORT_SYMBOL_GPL(uart_set_options);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002048#endif /* CONFIG_SERIAL_CORE_CONSOLE */
2049
Jiri Slabycf755252011-11-09 21:33:47 +01002050/**
2051 * uart_change_pm - set power state of the port
2052 *
2053 * @state: port descriptor
2054 * @pm_state: new state
2055 *
2056 * Locking: port->mutex has to be held
2057 */
Linus Walleij6f538fe2012-12-07 11:36:08 +01002058static void uart_change_pm(struct uart_state *state,
2059 enum uart_pm_state pm_state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002060{
Peter Hurley4047b372016-04-09 18:56:33 -07002061 struct uart_port *port = uart_port_check(state);
Andrew Victor1281e362006-05-16 11:28:49 +01002062
2063 if (state->pm_state != pm_state) {
Peter Hurley4047b372016-04-09 18:56:33 -07002064 if (port && port->ops->pm)
Andrew Victor1281e362006-05-16 11:28:49 +01002065 port->ops->pm(port, pm_state, state->pm_state);
2066 state->pm_state = pm_state;
2067 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002068}
2069
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002070struct uart_match {
2071 struct uart_port *port;
2072 struct uart_driver *driver;
2073};
2074
2075static int serial_match_port(struct device *dev, void *data)
2076{
2077 struct uart_match *match = data;
Guennadi Liakhovetski7ca796f2008-07-04 09:59:28 -07002078 struct tty_driver *tty_drv = match->driver->tty_driver;
2079 dev_t devt = MKDEV(tty_drv->major, tty_drv->minor_start) +
2080 match->port->line;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002081
2082 return dev->devt == devt; /* Actually, only one tty per port */
2083}
2084
Alan Coxccce6de2009-09-19 13:13:30 -07002085int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002086{
Alan Coxccce6de2009-09-19 13:13:30 -07002087 struct uart_state *state = drv->state + uport->line;
2088 struct tty_port *port = &state->port;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002089 struct device *tty_dev;
Alan Coxccce6de2009-09-19 13:13:30 -07002090 struct uart_match match = {uport, drv};
Linus Torvalds1da177e2005-04-16 15:20:36 -07002091
Alan Coxa2bceae2009-09-19 13:13:31 -07002092 mutex_lock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002093
Alan Coxccce6de2009-09-19 13:13:30 -07002094 tty_dev = device_find_child(uport->dev, &match, serial_match_port);
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002095 if (device_may_wakeup(tty_dev)) {
Govindraj.R3f960db2010-12-16 18:12:47 +05302096 if (!enable_irq_wake(uport->irq))
2097 uport->irq_wake = 1;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002098 put_device(tty_dev);
Alan Coxa2bceae2009-09-19 13:13:31 -07002099 mutex_unlock(&port->mutex);
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002100 return 0;
2101 }
Federico Vaga5a65dcc2013-04-15 16:01:07 +02002102 put_device(tty_dev);
2103
Peter Hurleyb164c972015-01-22 12:24:25 -05002104 /* Nothing to do if the console is not suspending */
2105 if (!console_suspend_enabled && uart_console(uport))
2106 goto unlock;
2107
2108 uport->suspended = 1;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002109
Peter Hurleyd41861c2016-04-09 17:53:25 -07002110 if (tty_port_initialized(port)) {
Alan Coxccce6de2009-09-19 13:13:30 -07002111 const struct uart_ops *ops = uport->ops;
Russell Kingc8c6bfa2008-02-04 22:27:52 -08002112 int tries;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002113
Peter Hurley80f02d52016-04-09 17:53:24 -07002114 tty_port_set_suspended(port, 1);
Peter Hurleyd41861c2016-04-09 17:53:25 -07002115 tty_port_set_initialized(port, 0);
Russell Kinga6b93a92006-10-01 17:17:40 +01002116
Peter Hurleyb164c972015-01-22 12:24:25 -05002117 spin_lock_irq(&uport->lock);
2118 ops->stop_tx(uport);
2119 ops->set_mctrl(uport, 0);
2120 ops->stop_rx(uport);
2121 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002122
2123 /*
2124 * Wait for the transmitter to empty.
2125 */
Alan Coxccce6de2009-09-19 13:13:30 -07002126 for (tries = 3; !ops->tx_empty(uport) && tries; tries--)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002127 msleep(10);
Russell Kingc8c6bfa2008-02-04 22:27:52 -08002128 if (!tries)
Sudip Mukherjee2f2dafe2014-09-01 20:49:43 +05302129 dev_err(uport->dev, "%s%d: Unable to drain transmitter\n",
2130 drv->dev_name,
2131 drv->tty_driver->name_base + uport->line);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002132
Peter Hurleyb164c972015-01-22 12:24:25 -05002133 ops->shutdown(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002134 }
2135
2136 /*
2137 * Disable the console device before suspending.
2138 */
Peter Hurleyb164c972015-01-22 12:24:25 -05002139 if (uart_console(uport))
Alan Coxccce6de2009-09-19 13:13:30 -07002140 console_stop(uport->cons);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002141
Peter Hurleyb164c972015-01-22 12:24:25 -05002142 uart_change_pm(state, UART_PM_STATE_OFF);
2143unlock:
Alan Coxa2bceae2009-09-19 13:13:31 -07002144 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002145
2146 return 0;
2147}
2148
Alan Coxccce6de2009-09-19 13:13:30 -07002149int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002150{
Alan Coxccce6de2009-09-19 13:13:30 -07002151 struct uart_state *state = drv->state + uport->line;
2152 struct tty_port *port = &state->port;
Arjan van de Ven03a74dc2008-05-23 13:04:49 -07002153 struct device *tty_dev;
Alan Coxccce6de2009-09-19 13:13:30 -07002154 struct uart_match match = {uport, drv};
Deepak Saxenaba15ab02009-09-19 13:13:33 -07002155 struct ktermios termios;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002156
Alan Coxa2bceae2009-09-19 13:13:31 -07002157 mutex_lock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002158
Alan Coxccce6de2009-09-19 13:13:30 -07002159 tty_dev = device_find_child(uport->dev, &match, serial_match_port);
2160 if (!uport->suspended && device_may_wakeup(tty_dev)) {
Govindraj.R3f960db2010-12-16 18:12:47 +05302161 if (uport->irq_wake) {
2162 disable_irq_wake(uport->irq);
2163 uport->irq_wake = 0;
2164 }
Federico Vaga5a65dcc2013-04-15 16:01:07 +02002165 put_device(tty_dev);
Alan Coxa2bceae2009-09-19 13:13:31 -07002166 mutex_unlock(&port->mutex);
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002167 return 0;
2168 }
Federico Vaga5a65dcc2013-04-15 16:01:07 +02002169 put_device(tty_dev);
Alan Coxccce6de2009-09-19 13:13:30 -07002170 uport->suspended = 0;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002171
Linus Torvalds1da177e2005-04-16 15:20:36 -07002172 /*
2173 * Re-enable the console device after suspending.
2174 */
Yin Kangkai5933a162011-01-30 11:15:30 +08002175 if (uart_console(uport)) {
Jason Wang891b9dd2010-08-21 15:14:42 +08002176 /*
2177 * First try to use the console cflag setting.
2178 */
2179 memset(&termios, 0, sizeof(struct ktermios));
2180 termios.c_cflag = uport->cons->cflag;
2181
2182 /*
2183 * If that's unset, use the tty termios setting.
2184 */
Alan Coxadc8d742012-07-14 15:31:47 +01002185 if (port->tty && termios.c_cflag == 0)
2186 termios = port->tty->termios;
Jason Wang891b9dd2010-08-21 15:14:42 +08002187
Ning Jiang94abc562011-09-05 16:28:18 +08002188 if (console_suspend_enabled)
Linus Walleij6f538fe2012-12-07 11:36:08 +01002189 uart_change_pm(state, UART_PM_STATE_ON);
Alan Coxccce6de2009-09-19 13:13:30 -07002190 uport->ops->set_termios(uport, &termios, NULL);
Yin Kangkai5933a162011-01-30 11:15:30 +08002191 if (console_suspend_enabled)
2192 console_start(uport->cons);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002193 }
2194
Peter Hurley80f02d52016-04-09 17:53:24 -07002195 if (tty_port_suspended(port)) {
Alan Coxccce6de2009-09-19 13:13:30 -07002196 const struct uart_ops *ops = uport->ops;
Russell Kingee31b332005-11-13 15:28:51 +00002197 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002198
Linus Walleij6f538fe2012-12-07 11:36:08 +01002199 uart_change_pm(state, UART_PM_STATE_ON);
Alan Coxccce6de2009-09-19 13:13:30 -07002200 spin_lock_irq(&uport->lock);
2201 ops->set_mctrl(uport, 0);
2202 spin_unlock_irq(&uport->lock);
Stanislav Brabec4547be72009-12-02 16:20:56 +01002203 if (console_suspend_enabled || !uart_console(uport)) {
Alan Cox19225132010-06-01 22:52:51 +02002204 /* Protected by port mutex for now */
2205 struct tty_struct *tty = port->tty;
Stanislav Brabec4547be72009-12-02 16:20:56 +01002206 ret = ops->startup(uport);
2207 if (ret == 0) {
Alan Cox19225132010-06-01 22:52:51 +02002208 if (tty)
2209 uart_change_speed(tty, state, NULL);
Stanislav Brabec4547be72009-12-02 16:20:56 +01002210 spin_lock_irq(&uport->lock);
2211 ops->set_mctrl(uport, uport->mctrl);
2212 ops->start_tx(uport);
2213 spin_unlock_irq(&uport->lock);
Peter Hurleyd41861c2016-04-09 17:53:25 -07002214 tty_port_set_initialized(port, 1);
Stanislav Brabec4547be72009-12-02 16:20:56 +01002215 } else {
2216 /*
2217 * Failed to resume - maybe hardware went away?
2218 * Clear the "initialized" flag so we won't try
2219 * to call the low level drivers shutdown method.
2220 */
Alan Cox19225132010-06-01 22:52:51 +02002221 uart_shutdown(tty, state);
Stanislav Brabec4547be72009-12-02 16:20:56 +01002222 }
Russell Kingee31b332005-11-13 15:28:51 +00002223 }
Russell Kinga6b93a92006-10-01 17:17:40 +01002224
Peter Hurley80f02d52016-04-09 17:53:24 -07002225 tty_port_set_suspended(port, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002226 }
2227
Alan Coxa2bceae2009-09-19 13:13:31 -07002228 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002229
2230 return 0;
2231}
2232
2233static inline void
2234uart_report_port(struct uart_driver *drv, struct uart_port *port)
2235{
Russell King30b7a3b2005-09-03 15:30:21 +01002236 char address[64];
2237
Linus Torvalds1da177e2005-04-16 15:20:36 -07002238 switch (port->iotype) {
2239 case UPIO_PORT:
Andrew Morton9bde10a2008-10-13 10:35:42 +01002240 snprintf(address, sizeof(address), "I/O 0x%lx", port->iobase);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002241 break;
2242 case UPIO_HUB6:
Russell King30b7a3b2005-09-03 15:30:21 +01002243 snprintf(address, sizeof(address),
Andrew Morton9bde10a2008-10-13 10:35:42 +01002244 "I/O 0x%lx offset 0x%x", port->iobase, port->hub6);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002245 break;
2246 case UPIO_MEM:
Masahiro Yamadabd94c402015-10-28 12:46:05 +09002247 case UPIO_MEM16:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002248 case UPIO_MEM32:
Kevin Cernekee3ffb1a82014-11-12 12:53:59 -08002249 case UPIO_MEM32BE:
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00002250 case UPIO_AU:
Zang Roy-r619113be91ec2006-06-30 02:29:58 -07002251 case UPIO_TSI:
Russell King30b7a3b2005-09-03 15:30:21 +01002252 snprintf(address, sizeof(address),
Josh Boyer4f640ef2007-07-23 18:43:44 -07002253 "MMIO 0x%llx", (unsigned long long)port->mapbase);
Russell King30b7a3b2005-09-03 15:30:21 +01002254 break;
2255 default:
2256 strlcpy(address, "*unknown*", sizeof(address));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002257 break;
2258 }
Russell King30b7a3b2005-09-03 15:30:21 +01002259
James Bottomley68ed7e12015-01-02 10:05:13 -08002260 printk(KERN_INFO "%s%s%s%d at %s (irq = %d, base_baud = %d) is a %s\n",
2261 port->dev ? dev_name(port->dev) : "",
2262 port->dev ? ": " : "",
David S. Miller84408382008-10-13 10:45:26 +01002263 drv->dev_name,
2264 drv->tty_driver->name_base + port->line,
Kees Cook7d12b972013-07-12 13:07:39 -07002265 address, port->irq, port->uartclk / 16, uart_type(port));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002266}
2267
2268static void
2269uart_configure_port(struct uart_driver *drv, struct uart_state *state,
2270 struct uart_port *port)
2271{
2272 unsigned int flags;
2273
2274 /*
2275 * If there isn't a port here, don't do anything further.
2276 */
2277 if (!port->iobase && !port->mapbase && !port->membase)
2278 return;
2279
2280 /*
2281 * Now do the auto configuration stuff. Note that config_port
2282 * is expected to claim the resources and map the port for us.
2283 */
David Daney8e23fcc2009-01-02 13:49:54 +00002284 flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002285 if (port->flags & UPF_AUTO_IRQ)
2286 flags |= UART_CONFIG_IRQ;
2287 if (port->flags & UPF_BOOT_AUTOCONF) {
David Daney8e23fcc2009-01-02 13:49:54 +00002288 if (!(port->flags & UPF_FIXED_TYPE)) {
2289 port->type = PORT_UNKNOWN;
2290 flags |= UART_CONFIG_TYPE;
2291 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002292 port->ops->config_port(port, flags);
2293 }
2294
2295 if (port->type != PORT_UNKNOWN) {
2296 unsigned long flags;
2297
2298 uart_report_port(drv, port);
2299
George G. Davis3689a0e2007-02-14 00:33:06 -08002300 /* Power up port for set_mctrl() */
Linus Walleij6f538fe2012-12-07 11:36:08 +01002301 uart_change_pm(state, UART_PM_STATE_ON);
George G. Davis3689a0e2007-02-14 00:33:06 -08002302
Linus Torvalds1da177e2005-04-16 15:20:36 -07002303 /*
2304 * Ensure that the modem control lines are de-activated.
Yinghai Luc3e46422008-02-04 22:27:46 -08002305 * keep the DTR setting that is set in uart_set_options()
Linus Torvalds1da177e2005-04-16 15:20:36 -07002306 * We probably don't need a spinlock around this, but
2307 */
2308 spin_lock_irqsave(&port->lock, flags);
Yinghai Luc3e46422008-02-04 22:27:46 -08002309 port->ops->set_mctrl(port, port->mctrl & TIOCM_DTR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002310 spin_unlock_irqrestore(&port->lock, flags);
2311
2312 /*
Russell King97d97222007-09-01 21:25:09 +01002313 * If this driver supports console, and it hasn't been
2314 * successfully registered yet, try to re-register it.
2315 * It may be that the port was not available.
2316 */
2317 if (port->cons && !(port->cons->flags & CON_ENABLED))
2318 register_console(port->cons);
2319
2320 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002321 * Power down all ports by default, except the
2322 * console if we have one.
2323 */
2324 if (!uart_console(port))
Linus Walleij6f538fe2012-12-07 11:36:08 +01002325 uart_change_pm(state, UART_PM_STATE_OFF);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002326 }
2327}
2328
Jason Wesself2d937f2008-04-17 20:05:37 +02002329#ifdef CONFIG_CONSOLE_POLL
2330
2331static int uart_poll_init(struct tty_driver *driver, int line, char *options)
2332{
2333 struct uart_driver *drv = driver->driver_state;
2334 struct uart_state *state = drv->state + line;
Peter Hurley49c02302016-04-09 18:56:32 -07002335 struct tty_port *tport;
Jason Wesself2d937f2008-04-17 20:05:37 +02002336 struct uart_port *port;
2337 int baud = 9600;
2338 int bits = 8;
2339 int parity = 'n';
2340 int flow = 'n';
Peter Hurley49c02302016-04-09 18:56:32 -07002341 int ret = 0;
Jason Wesself2d937f2008-04-17 20:05:37 +02002342
Peter Hurley49c02302016-04-09 18:56:32 -07002343 if (!state)
Jason Wesself2d937f2008-04-17 20:05:37 +02002344 return -1;
2345
Peter Hurley49c02302016-04-09 18:56:32 -07002346 tport = &state->port;
2347 mutex_lock(&tport->mutex);
2348
Peter Hurley4047b372016-04-09 18:56:33 -07002349 port = uart_port_check(state);
2350 if (!port || !(port->ops->poll_get_char && port->ops->poll_put_char)) {
Peter Hurley49c02302016-04-09 18:56:32 -07002351 ret = -1;
2352 goto out;
2353 }
Jason Wesself2d937f2008-04-17 20:05:37 +02002354
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002355 if (port->ops->poll_init) {
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002356 /*
Peter Hurleyd41861c2016-04-09 17:53:25 -07002357 * We don't set initialized as we only initialized the hw,
2358 * e.g. state->xmit is still uninitialized.
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002359 */
Peter Hurleyd41861c2016-04-09 17:53:25 -07002360 if (!tty_port_initialized(tport))
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002361 ret = port->ops->poll_init(port);
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002362 }
2363
Peter Hurley49c02302016-04-09 18:56:32 -07002364 if (!ret && options) {
Jason Wesself2d937f2008-04-17 20:05:37 +02002365 uart_parse_options(options, &baud, &parity, &bits, &flow);
Peter Hurley49c02302016-04-09 18:56:32 -07002366 ret = uart_set_options(port, NULL, baud, parity, bits, flow);
Jason Wesself2d937f2008-04-17 20:05:37 +02002367 }
Peter Hurley49c02302016-04-09 18:56:32 -07002368out:
2369 mutex_unlock(&tport->mutex);
2370 return ret;
Jason Wesself2d937f2008-04-17 20:05:37 +02002371}
2372
2373static int uart_poll_get_char(struct tty_driver *driver, int line)
2374{
2375 struct uart_driver *drv = driver->driver_state;
2376 struct uart_state *state = drv->state + line;
2377 struct uart_port *port;
Peter Hurley9ed19422016-04-09 18:56:34 -07002378 int ret = -1;
Jason Wesself2d937f2008-04-17 20:05:37 +02002379
Peter Hurley9ed19422016-04-09 18:56:34 -07002380 if (state) {
2381 port = uart_port_ref(state);
2382 if (port)
2383 ret = port->ops->poll_get_char(port);
2384 uart_port_deref(port);
2385 }
2386 return ret;
Jason Wesself2d937f2008-04-17 20:05:37 +02002387}
2388
2389static void uart_poll_put_char(struct tty_driver *driver, int line, char ch)
2390{
2391 struct uart_driver *drv = driver->driver_state;
2392 struct uart_state *state = drv->state + line;
2393 struct uart_port *port;
2394
Peter Hurley9ed19422016-04-09 18:56:34 -07002395 if (!state)
Jason Wesself2d937f2008-04-17 20:05:37 +02002396 return;
2397
Peter Hurley9ed19422016-04-09 18:56:34 -07002398 port = uart_port_ref(state);
2399 if (!port)
2400 return;
Doug Andersonc7d44a02014-04-21 10:06:43 -07002401
2402 if (ch == '\n')
2403 port->ops->poll_put_char(port, '\r');
Jason Wesself2d937f2008-04-17 20:05:37 +02002404 port->ops->poll_put_char(port, ch);
Peter Hurley9ed19422016-04-09 18:56:34 -07002405 uart_port_deref(port);
Jason Wesself2d937f2008-04-17 20:05:37 +02002406}
2407#endif
2408
Jeff Dikeb68e31d2006-10-02 02:17:18 -07002409static const struct tty_operations uart_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002410 .open = uart_open,
2411 .close = uart_close,
2412 .write = uart_write,
2413 .put_char = uart_put_char,
2414 .flush_chars = uart_flush_chars,
2415 .write_room = uart_write_room,
2416 .chars_in_buffer= uart_chars_in_buffer,
2417 .flush_buffer = uart_flush_buffer,
2418 .ioctl = uart_ioctl,
2419 .throttle = uart_throttle,
2420 .unthrottle = uart_unthrottle,
2421 .send_xchar = uart_send_xchar,
2422 .set_termios = uart_set_termios,
Alan Cox64e91592008-06-03 15:18:54 +01002423 .set_ldisc = uart_set_ldisc,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002424 .stop = uart_stop,
2425 .start = uart_start,
2426 .hangup = uart_hangup,
2427 .break_ctl = uart_break_ctl,
2428 .wait_until_sent= uart_wait_until_sent,
2429#ifdef CONFIG_PROC_FS
Alexey Dobriyand196a942009-03-31 15:19:21 -07002430 .proc_fops = &uart_proc_fops,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002431#endif
2432 .tiocmget = uart_tiocmget,
2433 .tiocmset = uart_tiocmset,
Alan Coxd281da72010-09-16 18:21:24 +01002434 .get_icount = uart_get_icount,
Jason Wesself2d937f2008-04-17 20:05:37 +02002435#ifdef CONFIG_CONSOLE_POLL
2436 .poll_init = uart_poll_init,
2437 .poll_get_char = uart_poll_get_char,
2438 .poll_put_char = uart_poll_put_char,
2439#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07002440};
2441
Alan Coxde0c8cb2010-06-01 22:52:58 +02002442static const struct tty_port_operations uart_port_ops = {
2443 .carrier_raised = uart_carrier_raised,
2444 .dtr_rts = uart_dtr_rts,
Rob Herringb3b57642016-08-22 17:39:09 -05002445 .activate = uart_port_activate,
Rob Herring761ed4a2016-08-22 17:39:10 -05002446 .shutdown = uart_tty_port_shutdown,
Alan Coxde0c8cb2010-06-01 22:52:58 +02002447};
2448
Linus Torvalds1da177e2005-04-16 15:20:36 -07002449/**
2450 * uart_register_driver - register a driver with the uart core layer
2451 * @drv: low level driver structure
2452 *
2453 * Register a uart driver with the core driver. We in turn register
2454 * with the tty layer, and initialise the core driver per-port state.
2455 *
2456 * We have a proc file in /proc/tty/driver which is named after the
2457 * normal driver.
2458 *
2459 * drv->port should be NULL, and the per-port structures should be
2460 * registered using uart_add_one_port after this call has succeeded.
2461 */
2462int uart_register_driver(struct uart_driver *drv)
2463{
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002464 struct tty_driver *normal;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002465 int i, retval;
2466
2467 BUG_ON(drv->state);
2468
2469 /*
2470 * Maybe we should be using a slab cache for this, especially if
2471 * we have a large number of ports to handle.
2472 */
Burman Yan8f31bb32007-02-14 00:33:07 -08002473 drv->state = kzalloc(sizeof(struct uart_state) * drv->nr, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002474 if (!drv->state)
2475 goto out;
2476
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002477 normal = alloc_tty_driver(drv->nr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002478 if (!normal)
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002479 goto out_kfree;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002480
2481 drv->tty_driver = normal;
2482
Linus Torvalds1da177e2005-04-16 15:20:36 -07002483 normal->driver_name = drv->driver_name;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002484 normal->name = drv->dev_name;
2485 normal->major = drv->major;
2486 normal->minor_start = drv->minor;
2487 normal->type = TTY_DRIVER_TYPE_SERIAL;
2488 normal->subtype = SERIAL_TYPE_NORMAL;
2489 normal->init_termios = tty_std_termios;
2490 normal->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
Alan Cox606d0992006-12-08 02:38:45 -08002491 normal->init_termios.c_ispeed = normal->init_termios.c_ospeed = 9600;
Greg Kroah-Hartman331b8312005-06-20 21:15:16 -07002492 normal->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002493 normal->driver_state = drv;
2494 tty_set_operations(normal, &uart_ops);
2495
2496 /*
2497 * Initialise the UART state(s).
2498 */
2499 for (i = 0; i < drv->nr; i++) {
2500 struct uart_state *state = drv->state + i;
Alan Coxa2bceae2009-09-19 13:13:31 -07002501 struct tty_port *port = &state->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002502
Alan Coxa2bceae2009-09-19 13:13:31 -07002503 tty_port_init(port);
Alan Coxde0c8cb2010-06-01 22:52:58 +02002504 port->ops = &uart_port_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002505 }
2506
2507 retval = tty_register_driver(normal);
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002508 if (retval >= 0)
2509 return retval;
2510
Jiri Slaby191c5f12012-11-15 09:49:56 +01002511 for (i = 0; i < drv->nr; i++)
2512 tty_port_destroy(&drv->state[i].port);
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002513 put_tty_driver(normal);
2514out_kfree:
2515 kfree(drv->state);
2516out:
2517 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002518}
2519
2520/**
2521 * uart_unregister_driver - remove a driver from the uart core layer
2522 * @drv: low level driver structure
2523 *
2524 * Remove all references to a driver from the core driver. The low
2525 * level driver must have removed all its ports via the
2526 * uart_remove_one_port() if it registered them with uart_add_one_port().
2527 * (ie, drv->port == NULL)
2528 */
2529void uart_unregister_driver(struct uart_driver *drv)
2530{
2531 struct tty_driver *p = drv->tty_driver;
Jiri Slaby191c5f12012-11-15 09:49:56 +01002532 unsigned int i;
2533
Linus Torvalds1da177e2005-04-16 15:20:36 -07002534 tty_unregister_driver(p);
2535 put_tty_driver(p);
Jiri Slaby191c5f12012-11-15 09:49:56 +01002536 for (i = 0; i < drv->nr; i++)
2537 tty_port_destroy(&drv->state[i].port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002538 kfree(drv->state);
Alan Cox1e66cded2012-05-14 14:51:22 +01002539 drv->state = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002540 drv->tty_driver = NULL;
2541}
2542
2543struct tty_driver *uart_console_device(struct console *co, int *index)
2544{
2545 struct uart_driver *p = co->data;
2546 *index = co->index;
2547 return p->tty_driver;
2548}
2549
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002550static ssize_t uart_get_attr_uartclk(struct device *dev,
2551 struct device_attribute *attr, char *buf)
2552{
Alan Coxbebe73e2012-10-29 15:19:57 +00002553 struct serial_struct tmp;
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002554 struct tty_port *port = dev_get_drvdata(dev);
Tomas Hlavacekb1b79912012-09-06 23:17:47 +02002555
Alan Cox9f109692012-10-29 15:20:25 +00002556 uart_get_info(port, &tmp);
Alan Coxbebe73e2012-10-29 15:19:57 +00002557 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.baud_base * 16);
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002558}
2559
Alan Cox373bac42012-10-29 15:20:40 +00002560static ssize_t uart_get_attr_type(struct device *dev,
2561 struct device_attribute *attr, char *buf)
2562{
2563 struct serial_struct tmp;
2564 struct tty_port *port = dev_get_drvdata(dev);
2565
2566 uart_get_info(port, &tmp);
2567 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.type);
2568}
2569static ssize_t uart_get_attr_line(struct device *dev,
2570 struct device_attribute *attr, char *buf)
2571{
2572 struct serial_struct tmp;
2573 struct tty_port *port = dev_get_drvdata(dev);
2574
2575 uart_get_info(port, &tmp);
2576 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.line);
2577}
2578
2579static ssize_t uart_get_attr_port(struct device *dev,
2580 struct device_attribute *attr, char *buf)
2581{
2582 struct serial_struct tmp;
2583 struct tty_port *port = dev_get_drvdata(dev);
Andrew Mortonfd985e12012-11-26 15:47:15 -08002584 unsigned long ioaddr;
Alan Cox373bac42012-10-29 15:20:40 +00002585
2586 uart_get_info(port, &tmp);
Andrew Mortonfd985e12012-11-26 15:47:15 -08002587 ioaddr = tmp.port;
2588 if (HIGH_BITS_OFFSET)
2589 ioaddr |= (unsigned long)tmp.port_high << HIGH_BITS_OFFSET;
2590 return snprintf(buf, PAGE_SIZE, "0x%lX\n", ioaddr);
Alan Cox373bac42012-10-29 15:20:40 +00002591}
2592
2593static ssize_t uart_get_attr_irq(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.irq);
2601}
2602
2603static ssize_t uart_get_attr_flags(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);
2608
2609 uart_get_info(port, &tmp);
2610 return snprintf(buf, PAGE_SIZE, "0x%X\n", tmp.flags);
2611}
2612
2613static ssize_t uart_get_attr_xmit_fifo_size(struct device *dev,
2614 struct device_attribute *attr, char *buf)
2615{
2616 struct serial_struct tmp;
2617 struct tty_port *port = dev_get_drvdata(dev);
2618
2619 uart_get_info(port, &tmp);
2620 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.xmit_fifo_size);
2621}
2622
2623
2624static ssize_t uart_get_attr_close_delay(struct device *dev,
2625 struct device_attribute *attr, char *buf)
2626{
2627 struct serial_struct tmp;
2628 struct tty_port *port = dev_get_drvdata(dev);
2629
2630 uart_get_info(port, &tmp);
2631 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.close_delay);
2632}
2633
2634
2635static ssize_t uart_get_attr_closing_wait(struct device *dev,
2636 struct device_attribute *attr, char *buf)
2637{
2638 struct serial_struct tmp;
2639 struct tty_port *port = dev_get_drvdata(dev);
2640
2641 uart_get_info(port, &tmp);
2642 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.closing_wait);
2643}
2644
2645static ssize_t uart_get_attr_custom_divisor(struct device *dev,
2646 struct device_attribute *attr, char *buf)
2647{
2648 struct serial_struct tmp;
2649 struct tty_port *port = dev_get_drvdata(dev);
2650
2651 uart_get_info(port, &tmp);
2652 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.custom_divisor);
2653}
2654
2655static ssize_t uart_get_attr_io_type(struct device *dev,
2656 struct device_attribute *attr, char *buf)
2657{
2658 struct serial_struct tmp;
2659 struct tty_port *port = dev_get_drvdata(dev);
2660
2661 uart_get_info(port, &tmp);
2662 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.io_type);
2663}
2664
2665static ssize_t uart_get_attr_iomem_base(struct device *dev,
2666 struct device_attribute *attr, char *buf)
2667{
2668 struct serial_struct tmp;
2669 struct tty_port *port = dev_get_drvdata(dev);
2670
2671 uart_get_info(port, &tmp);
2672 return snprintf(buf, PAGE_SIZE, "0x%lX\n", (unsigned long)tmp.iomem_base);
2673}
2674
2675static ssize_t uart_get_attr_iomem_reg_shift(struct device *dev,
2676 struct device_attribute *attr, char *buf)
2677{
2678 struct serial_struct tmp;
2679 struct tty_port *port = dev_get_drvdata(dev);
2680
2681 uart_get_info(port, &tmp);
2682 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.iomem_reg_shift);
2683}
2684
2685static DEVICE_ATTR(type, S_IRUSR | S_IRGRP, uart_get_attr_type, NULL);
2686static DEVICE_ATTR(line, S_IRUSR | S_IRGRP, uart_get_attr_line, NULL);
2687static DEVICE_ATTR(port, S_IRUSR | S_IRGRP, uart_get_attr_port, NULL);
2688static DEVICE_ATTR(irq, S_IRUSR | S_IRGRP, uart_get_attr_irq, NULL);
2689static DEVICE_ATTR(flags, S_IRUSR | S_IRGRP, uart_get_attr_flags, NULL);
2690static DEVICE_ATTR(xmit_fifo_size, S_IRUSR | S_IRGRP, uart_get_attr_xmit_fifo_size, NULL);
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002691static DEVICE_ATTR(uartclk, S_IRUSR | S_IRGRP, uart_get_attr_uartclk, NULL);
Alan Cox373bac42012-10-29 15:20:40 +00002692static DEVICE_ATTR(close_delay, S_IRUSR | S_IRGRP, uart_get_attr_close_delay, NULL);
2693static DEVICE_ATTR(closing_wait, S_IRUSR | S_IRGRP, uart_get_attr_closing_wait, NULL);
2694static DEVICE_ATTR(custom_divisor, S_IRUSR | S_IRGRP, uart_get_attr_custom_divisor, NULL);
2695static DEVICE_ATTR(io_type, S_IRUSR | S_IRGRP, uart_get_attr_io_type, NULL);
2696static DEVICE_ATTR(iomem_base, S_IRUSR | S_IRGRP, uart_get_attr_iomem_base, NULL);
2697static DEVICE_ATTR(iomem_reg_shift, S_IRUSR | S_IRGRP, uart_get_attr_iomem_reg_shift, NULL);
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002698
2699static struct attribute *tty_dev_attrs[] = {
Alan Cox373bac42012-10-29 15:20:40 +00002700 &dev_attr_type.attr,
2701 &dev_attr_line.attr,
2702 &dev_attr_port.attr,
2703 &dev_attr_irq.attr,
2704 &dev_attr_flags.attr,
2705 &dev_attr_xmit_fifo_size.attr,
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002706 &dev_attr_uartclk.attr,
Alan Cox373bac42012-10-29 15:20:40 +00002707 &dev_attr_close_delay.attr,
2708 &dev_attr_closing_wait.attr,
2709 &dev_attr_custom_divisor.attr,
2710 &dev_attr_io_type.attr,
2711 &dev_attr_iomem_base.attr,
2712 &dev_attr_iomem_reg_shift.attr,
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002713 NULL,
2714 };
2715
Tomas Hlavacekb1b79912012-09-06 23:17:47 +02002716static const struct attribute_group tty_dev_attr_group = {
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002717 .attrs = tty_dev_attrs,
2718 };
2719
Linus Torvalds1da177e2005-04-16 15:20:36 -07002720/**
2721 * uart_add_one_port - attach a driver-defined port structure
2722 * @drv: pointer to the uart low level driver structure for this port
Randy Dunlap1b9894f2009-09-21 11:12:03 -07002723 * @uport: uart port structure to use for this port.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002724 *
2725 * This allows the driver to register its own uart_port structure
2726 * with the core driver. The main purpose is to allow the low
2727 * level uart drivers to expand uart_port, rather than having yet
2728 * more levels of structures.
2729 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002730int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002731{
2732 struct uart_state *state;
Alan Coxa2bceae2009-09-19 13:13:31 -07002733 struct tty_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002734 int ret = 0;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002735 struct device *tty_dev;
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002736 int num_groups;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002737
2738 BUG_ON(in_interrupt());
2739
Alan Coxa2bceae2009-09-19 13:13:31 -07002740 if (uport->line >= drv->nr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002741 return -EINVAL;
2742
Alan Coxa2bceae2009-09-19 13:13:31 -07002743 state = drv->state + uport->line;
2744 port = &state->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002745
Arjan van de Venf392ecf2006-01-12 18:44:32 +00002746 mutex_lock(&port_mutex);
Alan Coxa2bceae2009-09-19 13:13:31 -07002747 mutex_lock(&port->mutex);
Alan Coxebd2c8f2009-09-19 13:13:28 -07002748 if (state->uart_port) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002749 ret = -EINVAL;
2750 goto out;
2751 }
2752
Peter Hurley2b702b92014-10-16 16:54:25 -04002753 /* Link the port to the driver state table and vice versa */
Peter Hurley9ed19422016-04-09 18:56:34 -07002754 atomic_set(&state->refcount, 1);
2755 init_waitqueue_head(&state->remove_wait);
Alan Coxa2bceae2009-09-19 13:13:31 -07002756 state->uart_port = uport;
Alan Coxa2bceae2009-09-19 13:13:31 -07002757 uport->state = state;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002758
Peter Hurley2b702b92014-10-16 16:54:25 -04002759 state->pm_state = UART_PM_STATE_UNDEFINED;
2760 uport->cons = drv->cons;
Peter Hurley959801f2015-02-24 14:25:00 -05002761 uport->minor = drv->tty_driver->minor_start + uport->line;
Peter Hurley2b702b92014-10-16 16:54:25 -04002762
Russell King976ecd12005-07-03 21:05:45 +01002763 /*
2764 * If this port is a console, then the spinlock is already
2765 * initialised.
2766 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002767 if (!(uart_console(uport) && (uport->cons->flags & CON_ENABLED))) {
2768 spin_lock_init(&uport->lock);
2769 lockdep_set_class(&uport->lock, &port_lock_key);
Ingo Molnar13e83592006-07-03 00:25:03 -07002770 }
Grant Likelya208ffd2014-03-27 18:29:46 -07002771 if (uport->cons && uport->dev)
2772 of_console_check(uport->dev->of_node, uport->cons->name, uport->line);
Russell King976ecd12005-07-03 21:05:45 +01002773
Alan Coxa2bceae2009-09-19 13:13:31 -07002774 uart_configure_port(drv, state, uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002775
Geert Uytterhoeven4dda8642016-10-28 07:07:47 -05002776 port->console = uart_console(uport);
2777
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002778 num_groups = 2;
2779 if (uport->attr_group)
2780 num_groups++;
2781
Yoshihiro YUNOMAEc2b703b2014-07-23 06:06:22 +00002782 uport->tty_groups = kcalloc(num_groups, sizeof(*uport->tty_groups),
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002783 GFP_KERNEL);
2784 if (!uport->tty_groups) {
2785 ret = -ENOMEM;
2786 goto out;
2787 }
2788 uport->tty_groups[0] = &tty_dev_attr_group;
2789 if (uport->attr_group)
2790 uport->tty_groups[1] = uport->attr_group;
2791
Linus Torvalds1da177e2005-04-16 15:20:36 -07002792 /*
2793 * Register the port whether it's detected or not. This allows
Geert Uytterhoeven015355b2014-03-11 11:23:36 +01002794 * setserial to be used to alter this port's parameters.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002795 */
Tomas Hlavacekb1b79912012-09-06 23:17:47 +02002796 tty_dev = tty_port_register_device_attr(port, drv->tty_driver,
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002797 uport->line, uport->dev, port, uport->tty_groups);
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002798 if (likely(!IS_ERR(tty_dev))) {
Simon Glass77359832012-01-19 11:28:56 -08002799 device_set_wakeup_capable(tty_dev, 1);
2800 } else {
Sudip Mukherjee2f2dafe2014-09-01 20:49:43 +05302801 dev_err(uport->dev, "Cannot register tty device on line %d\n",
Alan Coxa2bceae2009-09-19 13:13:31 -07002802 uport->line);
Simon Glass77359832012-01-19 11:28:56 -08002803 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002804
2805 /*
Russell King68ac64c2006-04-30 11:13:50 +01002806 * Ensure UPF_DEAD is not set.
2807 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002808 uport->flags &= ~UPF_DEAD;
Russell King68ac64c2006-04-30 11:13:50 +01002809
Linus Torvalds1da177e2005-04-16 15:20:36 -07002810 out:
Alan Coxa2bceae2009-09-19 13:13:31 -07002811 mutex_unlock(&port->mutex);
Arjan van de Venf392ecf2006-01-12 18:44:32 +00002812 mutex_unlock(&port_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002813
2814 return ret;
2815}
2816
2817/**
2818 * uart_remove_one_port - detach a driver defined port structure
2819 * @drv: pointer to the uart low level driver structure for this port
Randy Dunlap1b9894f2009-09-21 11:12:03 -07002820 * @uport: uart port structure for this port
Linus Torvalds1da177e2005-04-16 15:20:36 -07002821 *
2822 * This unhooks (and hangs up) the specified port structure from the
2823 * core driver. No further calls will be made to the low-level code
2824 * for this port.
2825 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002826int uart_remove_one_port(struct uart_driver *drv, struct uart_port *uport)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002827{
Alan Coxa2bceae2009-09-19 13:13:31 -07002828 struct uart_state *state = drv->state + uport->line;
2829 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07002830 struct uart_port *uart_port;
Geert Uytterhoeven4c6d5b42014-03-17 14:10:58 +01002831 struct tty_struct *tty;
Chen Gangb342dd52012-12-27 15:51:31 +08002832 int ret = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002833
2834 BUG_ON(in_interrupt());
2835
Arjan van de Venf392ecf2006-01-12 18:44:32 +00002836 mutex_lock(&port_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002837
2838 /*
Russell King68ac64c2006-04-30 11:13:50 +01002839 * Mark the port "dead" - this prevents any opens from
2840 * succeeding while we shut down the port.
2841 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002842 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07002843 uart_port = uart_port_check(state);
2844 if (uart_port != uport)
2845 dev_alert(uport->dev, "Removing wrong port: %p != %p\n",
2846 uart_port, uport);
2847
2848 if (!uart_port) {
Chen Gangb342dd52012-12-27 15:51:31 +08002849 mutex_unlock(&port->mutex);
2850 ret = -EINVAL;
2851 goto out;
2852 }
Alan Coxa2bceae2009-09-19 13:13:31 -07002853 uport->flags |= UPF_DEAD;
2854 mutex_unlock(&port->mutex);
Russell King68ac64c2006-04-30 11:13:50 +01002855
2856 /*
Greg Kroah-Hartmanaa4148c2005-06-20 21:15:16 -07002857 * Remove the devices from the tty layer
Linus Torvalds1da177e2005-04-16 15:20:36 -07002858 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002859 tty_unregister_device(drv->tty_driver, uport->line);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002860
Geert Uytterhoeven4c6d5b42014-03-17 14:10:58 +01002861 tty = tty_port_tty_get(port);
2862 if (tty) {
Alan Coxa2bceae2009-09-19 13:13:31 -07002863 tty_vhangup(port->tty);
Geert Uytterhoeven4c6d5b42014-03-17 14:10:58 +01002864 tty_kref_put(tty);
2865 }
Russell King68ac64c2006-04-30 11:13:50 +01002866
2867 /*
Geert Uytterhoeven5f5c9ae2014-02-28 14:21:32 +01002868 * If the port is used as a console, unregister it
2869 */
2870 if (uart_console(uport))
2871 unregister_console(uport->cons);
2872
2873 /*
Russell King68ac64c2006-04-30 11:13:50 +01002874 * Free the port IO and memory resources, if any.
2875 */
Fabio Estevama7cfaf12016-05-20 01:59:54 -03002876 if (uport->type != PORT_UNKNOWN && uport->ops->release_port)
Alan Coxa2bceae2009-09-19 13:13:31 -07002877 uport->ops->release_port(uport);
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002878 kfree(uport->tty_groups);
Russell King68ac64c2006-04-30 11:13:50 +01002879
2880 /*
2881 * Indicate that there isn't a port here anymore.
2882 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002883 uport->type = PORT_UNKNOWN;
Russell King68ac64c2006-04-30 11:13:50 +01002884
Peter Hurley4047b372016-04-09 18:56:33 -07002885 mutex_lock(&port->mutex);
Peter Hurley9ed19422016-04-09 18:56:34 -07002886 WARN_ON(atomic_dec_return(&state->refcount) < 0);
2887 wait_event(state->remove_wait, !atomic_read(&state->refcount));
Alan Coxebd2c8f2009-09-19 13:13:28 -07002888 state->uart_port = NULL;
Peter Hurley4047b372016-04-09 18:56:33 -07002889 mutex_unlock(&port->mutex);
Chen Gangb342dd52012-12-27 15:51:31 +08002890out:
Arjan van de Venf392ecf2006-01-12 18:44:32 +00002891 mutex_unlock(&port_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002892
Chen Gangb342dd52012-12-27 15:51:31 +08002893 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002894}
2895
2896/*
2897 * Are the two ports equivalent?
2898 */
2899int uart_match_port(struct uart_port *port1, struct uart_port *port2)
2900{
2901 if (port1->iotype != port2->iotype)
2902 return 0;
2903
2904 switch (port1->iotype) {
2905 case UPIO_PORT:
2906 return (port1->iobase == port2->iobase);
2907 case UPIO_HUB6:
2908 return (port1->iobase == port2->iobase) &&
2909 (port1->hub6 == port2->hub6);
2910 case UPIO_MEM:
Masahiro Yamadabd94c402015-10-28 12:46:05 +09002911 case UPIO_MEM16:
Sergei Shtylyovd21b55d2006-08-28 19:49:03 +04002912 case UPIO_MEM32:
Kevin Cernekee3ffb1a82014-11-12 12:53:59 -08002913 case UPIO_MEM32BE:
Sergei Shtylyovd21b55d2006-08-28 19:49:03 +04002914 case UPIO_AU:
2915 case UPIO_TSI:
Benjamin Herrenschmidt1624f002006-01-04 18:09:44 +00002916 return (port1->mapbase == port2->mapbase);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002917 }
2918 return 0;
2919}
2920EXPORT_SYMBOL(uart_match_port);
2921
Jiri Slaby027d7da2011-11-09 21:33:43 +01002922/**
2923 * uart_handle_dcd_change - handle a change of carrier detect state
2924 * @uport: uart_port structure for the open port
2925 * @status: new carrier detect status, nonzero if active
Peter Hurley4d90bb12014-09-10 15:06:23 -04002926 *
2927 * Caller must hold uport->lock
Jiri Slaby027d7da2011-11-09 21:33:43 +01002928 */
2929void uart_handle_dcd_change(struct uart_port *uport, unsigned int status)
2930{
George Spelvin42381572013-02-10 04:44:30 -05002931 struct tty_port *port = &uport->state->port;
Alan Cox43eca0a2012-09-19 15:35:46 +01002932 struct tty_struct *tty = port->tty;
Peter Hurleyc9932572014-09-02 17:39:21 -04002933 struct tty_ldisc *ld;
Jiri Slaby027d7da2011-11-09 21:33:43 +01002934
Peter Hurley4d90bb12014-09-10 15:06:23 -04002935 lockdep_assert_held_once(&uport->lock);
2936
Peter Hurleyc9932572014-09-02 17:39:21 -04002937 if (tty) {
2938 ld = tty_ldisc_ref(tty);
2939 if (ld) {
2940 if (ld->ops->dcd_change)
2941 ld->ops->dcd_change(tty, status);
2942 tty_ldisc_deref(ld);
2943 }
George Spelvin42381572013-02-10 04:44:30 -05002944 }
Jiri Slaby027d7da2011-11-09 21:33:43 +01002945
2946 uport->icount.dcd++;
Jiri Slaby027d7da2011-11-09 21:33:43 +01002947
Peter Hurley299245a2014-09-10 15:06:24 -04002948 if (uart_dcd_enabled(uport)) {
Jiri Slaby027d7da2011-11-09 21:33:43 +01002949 if (status)
2950 wake_up_interruptible(&port->open_wait);
Alan Cox43eca0a2012-09-19 15:35:46 +01002951 else if (tty)
2952 tty_hangup(tty);
Jiri Slaby027d7da2011-11-09 21:33:43 +01002953 }
Jiri Slaby027d7da2011-11-09 21:33:43 +01002954}
2955EXPORT_SYMBOL_GPL(uart_handle_dcd_change);
2956
2957/**
2958 * uart_handle_cts_change - handle a change of clear-to-send state
2959 * @uport: uart_port structure for the open port
2960 * @status: new clear to send status, nonzero if active
Peter Hurley4d90bb12014-09-10 15:06:23 -04002961 *
2962 * Caller must hold uport->lock
Jiri Slaby027d7da2011-11-09 21:33:43 +01002963 */
2964void uart_handle_cts_change(struct uart_port *uport, unsigned int status)
2965{
Peter Hurley4d90bb12014-09-10 15:06:23 -04002966 lockdep_assert_held_once(&uport->lock);
2967
Jiri Slaby027d7da2011-11-09 21:33:43 +01002968 uport->icount.cts++;
2969
Peter Hurley391f93f2015-01-25 14:44:51 -05002970 if (uart_softcts_mode(uport)) {
Peter Hurleyd01f4d12014-09-10 15:06:26 -04002971 if (uport->hw_stopped) {
Jiri Slaby027d7da2011-11-09 21:33:43 +01002972 if (status) {
Peter Hurleyd01f4d12014-09-10 15:06:26 -04002973 uport->hw_stopped = 0;
Jiri Slaby027d7da2011-11-09 21:33:43 +01002974 uport->ops->start_tx(uport);
2975 uart_write_wakeup(uport);
2976 }
2977 } else {
2978 if (!status) {
Peter Hurleyd01f4d12014-09-10 15:06:26 -04002979 uport->hw_stopped = 1;
Jiri Slaby027d7da2011-11-09 21:33:43 +01002980 uport->ops->stop_tx(uport);
2981 }
2982 }
Peter Hurley391f93f2015-01-25 14:44:51 -05002983
Jiri Slaby027d7da2011-11-09 21:33:43 +01002984 }
2985}
2986EXPORT_SYMBOL_GPL(uart_handle_cts_change);
2987
Jiri Slabycf755252011-11-09 21:33:47 +01002988/**
2989 * uart_insert_char - push a char to the uart layer
2990 *
2991 * User is responsible to call tty_flip_buffer_push when they are done with
2992 * insertion.
2993 *
2994 * @port: corresponding port
2995 * @status: state of the serial port RX buffer (LSR for 8250)
2996 * @overrun: mask of overrun bits in @status
2997 * @ch: character to push
2998 * @flag: flag for the character (see TTY_NORMAL and friends)
2999 */
Jiri Slaby027d7da2011-11-09 21:33:43 +01003000void uart_insert_char(struct uart_port *port, unsigned int status,
3001 unsigned int overrun, unsigned int ch, unsigned int flag)
3002{
Jiri Slaby92a19f92013-01-03 15:53:03 +01003003 struct tty_port *tport = &port->state->port;
Jiri Slaby027d7da2011-11-09 21:33:43 +01003004
3005 if ((status & port->ignore_status_mask & ~overrun) == 0)
Jiri Slaby92a19f92013-01-03 15:53:03 +01003006 if (tty_insert_flip_char(tport, ch, flag) == 0)
Corbindabfb352012-05-23 09:37:31 -05003007 ++port->icount.buf_overrun;
Jiri Slaby027d7da2011-11-09 21:33:43 +01003008
3009 /*
3010 * Overrun is special. Since it's reported immediately,
3011 * it doesn't affect the current character.
3012 */
3013 if (status & ~port->ignore_status_mask & overrun)
Jiri Slaby92a19f92013-01-03 15:53:03 +01003014 if (tty_insert_flip_char(tport, 0, TTY_OVERRUN) == 0)
Corbindabfb352012-05-23 09:37:31 -05003015 ++port->icount.buf_overrun;
Jiri Slaby027d7da2011-11-09 21:33:43 +01003016}
3017EXPORT_SYMBOL_GPL(uart_insert_char);
3018
Linus Torvalds1da177e2005-04-16 15:20:36 -07003019EXPORT_SYMBOL(uart_write_wakeup);
3020EXPORT_SYMBOL(uart_register_driver);
3021EXPORT_SYMBOL(uart_unregister_driver);
3022EXPORT_SYMBOL(uart_suspend_port);
3023EXPORT_SYMBOL(uart_resume_port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003024EXPORT_SYMBOL(uart_add_one_port);
3025EXPORT_SYMBOL(uart_remove_one_port);
3026
3027MODULE_DESCRIPTION("Serial driver core");
3028MODULE_LICENSE("GPL");