blob: 839cee47dc27d3abbff3265987dffaad624fd565 [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;
178 int retval = 0;
179
Alan Cox46d57a42009-09-19 13:13:29 -0700180 if (uport->type == PORT_UNKNOWN)
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100181 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700182
183 /*
Thomas Pfaff7deb39e2014-04-23 12:33:22 +0200184 * Make sure the device is in D0 state.
185 */
186 uart_change_pm(state, UART_PM_STATE_ON);
187
188 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700189 * Initialise and allocate the transmit and temporary
190 * buffer.
191 */
Alan Coxebd2c8f2009-09-19 13:13:28 -0700192 if (!state->xmit.buf) {
Alan Coxdf4f4dd2008-07-16 21:53:50 +0100193 /* This is protected by the per port mutex */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700194 page = get_zeroed_page(GFP_KERNEL);
195 if (!page)
196 return -ENOMEM;
197
Alan Coxebd2c8f2009-09-19 13:13:28 -0700198 state->xmit.buf = (unsigned char *) page;
199 uart_circ_clear(&state->xmit);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700200 }
201
Alan Cox46d57a42009-09-19 13:13:29 -0700202 retval = uport->ops->startup(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700203 if (retval == 0) {
Jiri Slabyc7d7abf2011-03-30 00:10:55 +0200204 if (uart_console(uport) && uport->cons->cflag) {
Alan Coxadc8d742012-07-14 15:31:47 +0100205 tty->termios.c_cflag = uport->cons->cflag;
Jiri Slabyc7d7abf2011-03-30 00:10:55 +0200206 uport->cons->cflag = 0;
207 }
208 /*
209 * Initialise the hardware port settings.
210 */
211 uart_change_speed(tty, state, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700212
Peter Hurley9db276f2016-01-10 20:36:15 -0800213 /*
214 * Setup the RTS and DTR signals once the
215 * port is open and ready to respond.
216 */
217 if (init_hw && C_BAUD(tty))
218 uart_set_mctrl(uport, TIOCM_RTS | TIOCM_DTR);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700219 }
220
Jiri Slaby00551972011-08-17 13:48:15 +0200221 /*
222 * This is to allow setserial on this port. People may want to set
223 * port/irq/type and then reconfigure the port properly if it failed
224 * now.
225 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700226 if (retval && capable(CAP_SYS_ADMIN))
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100227 return 1;
228
229 return retval;
230}
231
232static int uart_startup(struct tty_struct *tty, struct uart_state *state,
233 int init_hw)
234{
235 struct tty_port *port = &state->port;
236 int retval;
237
Peter Hurleyd41861c2016-04-09 17:53:25 -0700238 if (tty_port_initialized(port))
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100239 return 0;
240
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100241 retval = uart_port_startup(tty, state, init_hw);
Rob Herringb3b57642016-08-22 17:39:09 -0500242 if (retval)
243 set_bit(TTY_IO_ERROR, &tty->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700244
245 return retval;
246}
247
248/*
249 * This routine will shutdown a serial port; interrupts are disabled, and
250 * DTR is dropped if the hangup on close termio flag is on. Calls to
251 * uart_shutdown are serialised by the per-port semaphore.
Peter Hurleyaf224ca2016-04-09 18:56:35 -0700252 *
253 * uport == NULL if uart_port has already been removed
Linus Torvalds1da177e2005-04-16 15:20:36 -0700254 */
Alan Cox19225132010-06-01 22:52:51 +0200255static void uart_shutdown(struct tty_struct *tty, struct uart_state *state)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700256{
Peter Hurley4047b372016-04-09 18:56:33 -0700257 struct uart_port *uport = uart_port_check(state);
Alan Coxbdc04e32009-09-19 13:13:31 -0700258 struct tty_port *port = &state->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700259
Russell Kingee31b332005-11-13 15:28:51 +0000260 /*
261 * Set the TTY IO error marker
262 */
Alan Coxf7519282009-01-02 13:49:21 +0000263 if (tty)
264 set_bit(TTY_IO_ERROR, &tty->flags);
Russell Kingee31b332005-11-13 15:28:51 +0000265
Peter Hurleyd41861c2016-04-09 17:53:25 -0700266 if (tty_port_initialized(port)) {
267 tty_port_set_initialized(port, 0);
268
Russell Kingee31b332005-11-13 15:28:51 +0000269 /*
270 * Turn off DTR and RTS early.
271 */
Peter Hurleyaf224ca2016-04-09 18:56:35 -0700272 if (uport && uart_console(uport) && tty)
Peter Hurleyae84db92014-07-09 09:21:14 -0400273 uport->cons->cflag = tty->termios.c_cflag;
274
Peter Hurley9db276f2016-01-10 20:36:15 -0800275 if (!tty || C_HUPCL(tty))
Alan Coxccce6de2009-09-19 13:13:30 -0700276 uart_clear_mctrl(uport, TIOCM_DTR | TIOCM_RTS);
Russell Kingee31b332005-11-13 15:28:51 +0000277
Jiri Slabyb922e192011-11-09 21:33:51 +0100278 uart_port_shutdown(port);
Russell Kingee31b332005-11-13 15:28:51 +0000279 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700280
281 /*
Doug Andersond208a3b2011-10-19 11:52:01 -0700282 * It's possible for shutdown to be called after suspend if we get
283 * a DCD drop (hangup) at just the right time. Clear suspended bit so
284 * we don't try to resume a port that has been shutdown.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700285 */
Peter Hurley80f02d52016-04-09 17:53:24 -0700286 tty_port_set_suspended(port, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700287
288 /*
289 * Free the transmit buffer page.
290 */
Alan Coxebd2c8f2009-09-19 13:13:28 -0700291 if (state->xmit.buf) {
292 free_page((unsigned long)state->xmit.buf);
293 state->xmit.buf = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700294 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700295}
296
297/**
298 * uart_update_timeout - update per-port FIFO timeout.
299 * @port: uart_port structure describing the port
300 * @cflag: termios cflag value
301 * @baud: speed of the port
302 *
303 * Set the port FIFO timeout value. The @cflag value should
304 * reflect the actual hardware settings.
305 */
306void
307uart_update_timeout(struct uart_port *port, unsigned int cflag,
308 unsigned int baud)
309{
310 unsigned int bits;
311
312 /* byte size and parity */
313 switch (cflag & CSIZE) {
314 case CS5:
315 bits = 7;
316 break;
317 case CS6:
318 bits = 8;
319 break;
320 case CS7:
321 bits = 9;
322 break;
323 default:
324 bits = 10;
Alan Coxa46c9992008-02-08 04:18:53 -0800325 break; /* CS8 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700326 }
327
328 if (cflag & CSTOPB)
329 bits++;
330 if (cflag & PARENB)
331 bits++;
332
333 /*
334 * The total number of bits to be transmitted in the fifo.
335 */
336 bits = bits * port->fifosize;
337
338 /*
339 * Figure the timeout to send the above number of bits.
340 * Add .02 seconds of slop
341 */
342 port->timeout = (HZ * bits) / baud + HZ/50;
343}
344
345EXPORT_SYMBOL(uart_update_timeout);
346
347/**
348 * uart_get_baud_rate - return baud rate for a particular port
349 * @port: uart_port structure describing the port in question.
350 * @termios: desired termios settings.
351 * @old: old termios (or NULL)
352 * @min: minimum acceptable baud rate
353 * @max: maximum acceptable baud rate
354 *
355 * Decode the termios structure into a numeric baud rate,
356 * taking account of the magic 38400 baud rate (with spd_*
357 * flags), and mapping the %B0 rate to 9600 baud.
358 *
359 * If the new baud rate is invalid, try the old termios setting.
360 * If it's still invalid, we try 9600 baud.
361 *
362 * Update the @termios structure to reflect the baud rate
Alan Coxeb424fd2008-04-28 02:14:07 -0700363 * we're actually going to be using. Don't do this for the case
364 * where B0 is requested ("hang up").
Linus Torvalds1da177e2005-04-16 15:20:36 -0700365 */
366unsigned int
Alan Cox606d0992006-12-08 02:38:45 -0800367uart_get_baud_rate(struct uart_port *port, struct ktermios *termios,
368 struct ktermios *old, unsigned int min, unsigned int max)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700369{
Joakim Nordellf10a2232015-06-08 14:56:51 +0200370 unsigned int try;
371 unsigned int baud;
372 unsigned int altbaud;
Alan Coxeb424fd2008-04-28 02:14:07 -0700373 int hung_up = 0;
Russell King0077d452006-01-21 23:03:28 +0000374 upf_t flags = port->flags & UPF_SPD_MASK;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700375
Joakim Nordellf10a2232015-06-08 14:56:51 +0200376 switch (flags) {
377 case UPF_SPD_HI:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700378 altbaud = 57600;
Joakim Nordellf10a2232015-06-08 14:56:51 +0200379 break;
380 case UPF_SPD_VHI:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700381 altbaud = 115200;
Joakim Nordellf10a2232015-06-08 14:56:51 +0200382 break;
383 case UPF_SPD_SHI:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700384 altbaud = 230400;
Joakim Nordellf10a2232015-06-08 14:56:51 +0200385 break;
386 case UPF_SPD_WARP:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700387 altbaud = 460800;
Joakim Nordellf10a2232015-06-08 14:56:51 +0200388 break;
389 default:
390 altbaud = 38400;
391 break;
392 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700393
394 for (try = 0; try < 2; try++) {
395 baud = tty_termios_baud_rate(termios);
396
397 /*
398 * The spd_hi, spd_vhi, spd_shi, spd_warp kludge...
399 * Die! Die! Die!
400 */
Peter Hurley547039e2014-10-16 13:46:38 -0400401 if (try == 0 && baud == 38400)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700402 baud = altbaud;
403
404 /*
405 * Special case: B0 rate.
406 */
Alan Coxeb424fd2008-04-28 02:14:07 -0700407 if (baud == 0) {
408 hung_up = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700409 baud = 9600;
Alan Coxeb424fd2008-04-28 02:14:07 -0700410 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700411
412 if (baud >= min && baud <= max)
413 return baud;
414
415 /*
416 * Oops, the quotient was zero. Try again with
417 * the old baud rate if possible.
418 */
419 termios->c_cflag &= ~CBAUD;
420 if (old) {
Alan Cox6d4d67b2008-02-04 22:27:53 -0800421 baud = tty_termios_baud_rate(old);
Alan Coxeb424fd2008-04-28 02:14:07 -0700422 if (!hung_up)
423 tty_termios_encode_baud_rate(termios,
424 baud, baud);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700425 old = NULL;
426 continue;
427 }
428
429 /*
Alan Cox16ae2a82010-01-04 16:26:21 +0000430 * As a last resort, if the range cannot be met then clip to
431 * the nearest chip supported rate.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700432 */
Alan Cox16ae2a82010-01-04 16:26:21 +0000433 if (!hung_up) {
434 if (baud <= min)
435 tty_termios_encode_baud_rate(termios,
436 min + 1, min + 1);
437 else
438 tty_termios_encode_baud_rate(termios,
439 max - 1, max - 1);
440 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700441 }
Alan Cox16ae2a82010-01-04 16:26:21 +0000442 /* Should never happen */
443 WARN_ON(1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700444 return 0;
445}
446
447EXPORT_SYMBOL(uart_get_baud_rate);
448
449/**
450 * uart_get_divisor - return uart clock divisor
451 * @port: uart_port structure describing the port.
452 * @baud: desired baud rate
453 *
454 * Calculate the uart clock divisor for the port.
455 */
456unsigned int
457uart_get_divisor(struct uart_port *port, unsigned int baud)
458{
459 unsigned int quot;
460
461 /*
462 * Old custom speed handling.
463 */
464 if (baud == 38400 && (port->flags & UPF_SPD_MASK) == UPF_SPD_CUST)
465 quot = port->custom_divisor;
466 else
Uwe Kleine-König97d24632011-12-20 11:47:44 +0100467 quot = DIV_ROUND_CLOSEST(port->uartclk, 16 * baud);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700468
469 return quot;
470}
471
472EXPORT_SYMBOL(uart_get_divisor);
473
Peter Hurley7c8ab962014-10-16 16:54:20 -0400474/* Caller holds port mutex */
Alan Cox19225132010-06-01 22:52:51 +0200475static void uart_change_speed(struct tty_struct *tty, struct uart_state *state,
476 struct ktermios *old_termios)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700477{
Peter Hurley4047b372016-04-09 18:56:33 -0700478 struct uart_port *uport = uart_port_check(state);
Alan Cox606d0992006-12-08 02:38:45 -0800479 struct ktermios *termios;
Peter Hurley391f93f2015-01-25 14:44:51 -0500480 int hw_stopped;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700481
482 /*
483 * If we have no tty, termios, or the port does not exist,
484 * then we can't set the parameters for this port.
485 */
Alan Coxadc8d742012-07-14 15:31:47 +0100486 if (!tty || uport->type == PORT_UNKNOWN)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700487 return;
488
Alan Coxadc8d742012-07-14 15:31:47 +0100489 termios = &tty->termios;
Peter Hurleyc18b55f2014-06-16 09:17:09 -0400490 uport->ops->set_termios(uport, termios, old_termios);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700491
492 /*
Peter Hurley299245a2014-09-10 15:06:24 -0400493 * Set modem status enables based on termios cflag
Linus Torvalds1da177e2005-04-16 15:20:36 -0700494 */
Peter Hurley299245a2014-09-10 15:06:24 -0400495 spin_lock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700496 if (termios->c_cflag & CRTSCTS)
Peter Hurley299245a2014-09-10 15:06:24 -0400497 uport->status |= UPSTAT_CTS_ENABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700498 else
Peter Hurley299245a2014-09-10 15:06:24 -0400499 uport->status &= ~UPSTAT_CTS_ENABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700500
501 if (termios->c_cflag & CLOCAL)
Peter Hurley299245a2014-09-10 15:06:24 -0400502 uport->status &= ~UPSTAT_DCD_ENABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700503 else
Peter Hurley299245a2014-09-10 15:06:24 -0400504 uport->status |= UPSTAT_DCD_ENABLE;
Peter Hurley391f93f2015-01-25 14:44:51 -0500505
506 /* reset sw-assisted CTS flow control based on (possibly) new mode */
507 hw_stopped = uport->hw_stopped;
508 uport->hw_stopped = uart_softcts_mode(uport) &&
509 !(uport->ops->get_mctrl(uport) & TIOCM_CTS);
510 if (uport->hw_stopped) {
511 if (!hw_stopped)
512 uport->ops->stop_tx(uport);
513 } else {
514 if (hw_stopped)
515 __uart_start(tty);
516 }
Peter Hurley299245a2014-09-10 15:06:24 -0400517 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700518}
519
Peter Hurleyf5291ec2016-01-10 20:23:55 -0800520static int uart_put_char(struct tty_struct *tty, unsigned char c)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700521{
Peter Hurleyf5291ec2016-01-10 20:23:55 -0800522 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700523 struct uart_port *port;
Peter Hurleyf5291ec2016-01-10 20:23:55 -0800524 struct circ_buf *circ;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700525 unsigned long flags;
Alan Cox23d22ce2008-04-30 00:54:11 -0700526 int ret = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700527
Peter Hurleyf5291ec2016-01-10 20:23:55 -0800528 circ = &state->xmit;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700529 if (!circ->buf)
Alan Cox23d22ce2008-04-30 00:54:11 -0700530 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700531
Peter Hurley9ed19422016-04-09 18:56:34 -0700532 port = uart_port_lock(state, flags);
533 if (port && uart_circ_chars_free(circ) != 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700534 circ->buf[circ->head] = c;
535 circ->head = (circ->head + 1) & (UART_XMIT_SIZE - 1);
Alan Cox23d22ce2008-04-30 00:54:11 -0700536 ret = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700537 }
Peter Hurley9ed19422016-04-09 18:56:34 -0700538 uart_port_unlock(port, flags);
Alan Cox23d22ce2008-04-30 00:54:11 -0700539 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700540}
541
Linus Torvalds1da177e2005-04-16 15:20:36 -0700542static void uart_flush_chars(struct tty_struct *tty)
543{
544 uart_start(tty);
545}
546
Alan Cox19225132010-06-01 22:52:51 +0200547static int uart_write(struct tty_struct *tty,
548 const unsigned char *buf, int count)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700549{
550 struct uart_state *state = tty->driver_data;
Pavel Machekd5f735e2006-03-07 21:55:20 -0800551 struct uart_port *port;
552 struct circ_buf *circ;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700553 unsigned long flags;
554 int c, ret = 0;
555
Pavel Machekd5f735e2006-03-07 21:55:20 -0800556 /*
557 * This means you called this function _after_ the port was
558 * closed. No cookie for you.
559 */
Alan Coxf7519282009-01-02 13:49:21 +0000560 if (!state) {
Pavel Machekd5f735e2006-03-07 21:55:20 -0800561 WARN_ON(1);
562 return -EL3HLT;
563 }
564
Alan Coxebd2c8f2009-09-19 13:13:28 -0700565 circ = &state->xmit;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700566 if (!circ->buf)
567 return 0;
568
Peter Hurley9ed19422016-04-09 18:56:34 -0700569 port = uart_port_lock(state, flags);
570 while (port) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700571 c = CIRC_SPACE_TO_END(circ->head, circ->tail, UART_XMIT_SIZE);
572 if (count < c)
573 c = count;
574 if (c <= 0)
575 break;
576 memcpy(circ->buf + circ->head, buf, c);
577 circ->head = (circ->head + c) & (UART_XMIT_SIZE - 1);
578 buf += c;
579 count -= c;
580 ret += c;
581 }
Peter Hurley64dbee32014-10-16 16:54:26 -0400582
583 __uart_start(tty);
Peter Hurley9ed19422016-04-09 18:56:34 -0700584 uart_port_unlock(port, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700585 return ret;
586}
587
588static int uart_write_room(struct tty_struct *tty)
589{
590 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700591 struct uart_port *port;
Alan Coxf34d7a52008-04-30 00:54:13 -0700592 unsigned long flags;
593 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700594
Peter Hurley9ed19422016-04-09 18:56:34 -0700595 port = uart_port_lock(state, flags);
Alan Coxebd2c8f2009-09-19 13:13:28 -0700596 ret = uart_circ_chars_free(&state->xmit);
Peter Hurley9ed19422016-04-09 18:56:34 -0700597 uart_port_unlock(port, flags);
Alan Coxf34d7a52008-04-30 00:54:13 -0700598 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700599}
600
601static int uart_chars_in_buffer(struct tty_struct *tty)
602{
603 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700604 struct uart_port *port;
Alan Coxf34d7a52008-04-30 00:54:13 -0700605 unsigned long flags;
606 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700607
Peter Hurley9ed19422016-04-09 18:56:34 -0700608 port = uart_port_lock(state, flags);
Alan Coxebd2c8f2009-09-19 13:13:28 -0700609 ret = uart_circ_chars_pending(&state->xmit);
Peter Hurley9ed19422016-04-09 18:56:34 -0700610 uart_port_unlock(port, flags);
Alan Coxf34d7a52008-04-30 00:54:13 -0700611 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700612}
613
614static void uart_flush_buffer(struct tty_struct *tty)
615{
616 struct uart_state *state = tty->driver_data;
Tetsuo Handa55d7b682008-05-06 20:42:27 -0700617 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700618 unsigned long flags;
619
Pavel Machekd5f735e2006-03-07 21:55:20 -0800620 /*
621 * This means you called this function _after_ the port was
622 * closed. No cookie for you.
623 */
Alan Coxf7519282009-01-02 13:49:21 +0000624 if (!state) {
Pavel Machekd5f735e2006-03-07 21:55:20 -0800625 WARN_ON(1);
626 return;
627 }
628
Jiri Slabyeb3a1e12007-05-06 14:48:52 -0700629 pr_debug("uart_flush_buffer(%d) called\n", tty->index);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700630
Peter Hurley9ed19422016-04-09 18:56:34 -0700631 port = uart_port_lock(state, flags);
632 if (!port)
633 return;
Alan Coxebd2c8f2009-09-19 13:13:28 -0700634 uart_circ_clear(&state->xmit);
Haavard Skinnemoen6bb0e3a2008-07-16 21:52:36 +0100635 if (port->ops->flush_buffer)
636 port->ops->flush_buffer(port);
Peter Hurley9ed19422016-04-09 18:56:34 -0700637 uart_port_unlock(port, flags);
Rob Herringd0f4bce2016-10-28 07:07:48 -0500638 tty_port_tty_wakeup(&state->port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700639}
640
641/*
642 * This function is used to send a high-priority XON/XOFF character to
643 * the device
644 */
645static void uart_send_xchar(struct tty_struct *tty, char ch)
646{
647 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700648 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700649 unsigned long flags;
650
Peter Hurley9ed19422016-04-09 18:56:34 -0700651 port = uart_port_ref(state);
652 if (!port)
653 return;
654
Linus Torvalds1da177e2005-04-16 15:20:36 -0700655 if (port->ops->send_xchar)
656 port->ops->send_xchar(port, ch);
657 else {
Peter Hurleyc235ccc2014-09-02 17:39:13 -0400658 spin_lock_irqsave(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700659 port->x_char = ch;
Peter Hurleyc235ccc2014-09-02 17:39:13 -0400660 if (ch)
Russell Kingb129a8c2005-08-31 10:12:14 +0100661 port->ops->start_tx(port);
Peter Hurleyc235ccc2014-09-02 17:39:13 -0400662 spin_unlock_irqrestore(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700663 }
Peter Hurley9ed19422016-04-09 18:56:34 -0700664 uart_port_deref(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700665}
666
667static void uart_throttle(struct tty_struct *tty)
668{
669 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700670 struct uart_port *port;
Peter Hurley391f93f2015-01-25 14:44:51 -0500671 upstat_t mask = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700672
Peter Hurley9ed19422016-04-09 18:56:34 -0700673 port = uart_port_ref(state);
674 if (!port)
675 return;
676
Linus Torvalds1da177e2005-04-16 15:20:36 -0700677 if (I_IXOFF(tty))
Peter Hurley391f93f2015-01-25 14:44:51 -0500678 mask |= UPSTAT_AUTOXOFF;
Peter Hurley9db276f2016-01-10 20:36:15 -0800679 if (C_CRTSCTS(tty))
Peter Hurley391f93f2015-01-25 14:44:51 -0500680 mask |= UPSTAT_AUTORTS;
Russell King9aba8d5b2012-04-17 17:23:14 +0100681
Peter Hurley391f93f2015-01-25 14:44:51 -0500682 if (port->status & mask) {
Russell King9aba8d5b2012-04-17 17:23:14 +0100683 port->ops->throttle(port);
Peter Hurley391f93f2015-01-25 14:44:51 -0500684 mask &= ~port->status;
Russell King9aba8d5b2012-04-17 17:23:14 +0100685 }
686
Peter Hurley391f93f2015-01-25 14:44:51 -0500687 if (mask & UPSTAT_AUTORTS)
Russell King9aba8d5b2012-04-17 17:23:14 +0100688 uart_clear_mctrl(port, TIOCM_RTS);
Peter Hurleyb4749b92016-01-10 20:24:02 -0800689
690 if (mask & UPSTAT_AUTOXOFF)
691 uart_send_xchar(tty, STOP_CHAR(tty));
Peter Hurley9ed19422016-04-09 18:56:34 -0700692
693 uart_port_deref(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700694}
695
696static void uart_unthrottle(struct tty_struct *tty)
697{
698 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700699 struct uart_port *port;
Peter Hurley391f93f2015-01-25 14:44:51 -0500700 upstat_t mask = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700701
Peter Hurley9ed19422016-04-09 18:56:34 -0700702 port = uart_port_ref(state);
703 if (!port)
704 return;
705
Russell King9aba8d5b2012-04-17 17:23:14 +0100706 if (I_IXOFF(tty))
Peter Hurley391f93f2015-01-25 14:44:51 -0500707 mask |= UPSTAT_AUTOXOFF;
Peter Hurley9db276f2016-01-10 20:36:15 -0800708 if (C_CRTSCTS(tty))
Peter Hurley391f93f2015-01-25 14:44:51 -0500709 mask |= UPSTAT_AUTORTS;
Russell King9aba8d5b2012-04-17 17:23:14 +0100710
Peter Hurley391f93f2015-01-25 14:44:51 -0500711 if (port->status & mask) {
Russell King9aba8d5b2012-04-17 17:23:14 +0100712 port->ops->unthrottle(port);
Peter Hurley391f93f2015-01-25 14:44:51 -0500713 mask &= ~port->status;
Russell King9aba8d5b2012-04-17 17:23:14 +0100714 }
715
Peter Hurley391f93f2015-01-25 14:44:51 -0500716 if (mask & UPSTAT_AUTORTS)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700717 uart_set_mctrl(port, TIOCM_RTS);
Peter Hurleyb4749b92016-01-10 20:24:02 -0800718
719 if (mask & UPSTAT_AUTOXOFF)
720 uart_send_xchar(tty, START_CHAR(tty));
Peter Hurley9ed19422016-04-09 18:56:34 -0700721
722 uart_port_deref(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700723}
724
Peter Hurley4047b372016-04-09 18:56:33 -0700725static int uart_get_info(struct tty_port *port, struct serial_struct *retinfo)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700726{
Alan Cox9f109692012-10-29 15:20:25 +0000727 struct uart_state *state = container_of(port, struct uart_state, port);
Peter Hurley4047b372016-04-09 18:56:33 -0700728 struct uart_port *uport;
729 int ret = -ENODEV;
Alan Cox7ba2e762012-09-04 16:34:45 +0100730
Fengguang Wu37cd0c92012-09-06 10:27:51 +0800731 memset(retinfo, 0, sizeof(*retinfo));
Alan Cox7ba2e762012-09-04 16:34:45 +0100732
Peter Hurley3abe8c72016-01-10 20:23:56 -0800733 /*
734 * Ensure the state we copy is consistent and no hardware changes
735 * occur as we go
736 */
737 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -0700738 uport = uart_port_check(state);
739 if (!uport)
740 goto out;
741
Alan Cox7ba2e762012-09-04 16:34:45 +0100742 retinfo->type = uport->type;
743 retinfo->line = uport->line;
744 retinfo->port = uport->iobase;
745 if (HIGH_BITS_OFFSET)
746 retinfo->port_high = (long) uport->iobase >> HIGH_BITS_OFFSET;
747 retinfo->irq = uport->irq;
748 retinfo->flags = uport->flags;
749 retinfo->xmit_fifo_size = uport->fifosize;
750 retinfo->baud_base = uport->uartclk / 16;
751 retinfo->close_delay = jiffies_to_msecs(port->close_delay) / 10;
752 retinfo->closing_wait = port->closing_wait == ASYNC_CLOSING_WAIT_NONE ?
753 ASYNC_CLOSING_WAIT_NONE :
754 jiffies_to_msecs(port->closing_wait) / 10;
755 retinfo->custom_divisor = uport->custom_divisor;
756 retinfo->hub6 = uport->hub6;
757 retinfo->io_type = uport->iotype;
758 retinfo->iomem_reg_shift = uport->regshift;
759 retinfo->iomem_base = (void *)(unsigned long)uport->mapbase;
Peter Hurley4047b372016-04-09 18:56:33 -0700760
761 ret = 0;
762out:
Alan Coxa2bceae2009-09-19 13:13:31 -0700763 mutex_unlock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -0700764 return ret;
Alan Cox9f109692012-10-29 15:20:25 +0000765}
766
767static int uart_get_info_user(struct tty_port *port,
768 struct serial_struct __user *retinfo)
769{
770 struct serial_struct tmp;
Peter Hurley3abe8c72016-01-10 20:23:56 -0800771
Peter Hurley4047b372016-04-09 18:56:33 -0700772 if (uart_get_info(port, &tmp) < 0)
773 return -EIO;
Alan Coxf34d7a52008-04-30 00:54:13 -0700774
Linus Torvalds1da177e2005-04-16 15:20:36 -0700775 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
776 return -EFAULT;
777 return 0;
778}
779
Alan Cox7ba2e762012-09-04 16:34:45 +0100780static int uart_set_info(struct tty_struct *tty, struct tty_port *port,
781 struct uart_state *state,
782 struct serial_struct *new_info)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700783{
Peter Hurley4047b372016-04-09 18:56:33 -0700784 struct uart_port *uport = uart_port_check(state);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700785 unsigned long new_port;
Russell King0077d452006-01-21 23:03:28 +0000786 unsigned int change_irq, change_port, closing_wait;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700787 unsigned int old_custom_divisor, close_delay;
Russell King0077d452006-01-21 23:03:28 +0000788 upf_t old_flags, new_flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700789 int retval = 0;
790
Peter Hurley4047b372016-04-09 18:56:33 -0700791 if (!uport)
792 return -EIO;
793
Alan Cox7ba2e762012-09-04 16:34:45 +0100794 new_port = new_info->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700795 if (HIGH_BITS_OFFSET)
Alan Cox7ba2e762012-09-04 16:34:45 +0100796 new_port += (unsigned long) new_info->port_high << HIGH_BITS_OFFSET;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700797
Alan Cox7ba2e762012-09-04 16:34:45 +0100798 new_info->irq = irq_canonicalize(new_info->irq);
799 close_delay = msecs_to_jiffies(new_info->close_delay * 10);
800 closing_wait = new_info->closing_wait == ASYNC_CLOSING_WAIT_NONE ?
Jiri Slaby4cb0fbf2011-11-09 21:33:45 +0100801 ASYNC_CLOSING_WAIT_NONE :
Alan Cox7ba2e762012-09-04 16:34:45 +0100802 msecs_to_jiffies(new_info->closing_wait * 10);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700803
Linus Torvalds1da177e2005-04-16 15:20:36 -0700804
Alan Cox46d57a42009-09-19 13:13:29 -0700805 change_irq = !(uport->flags & UPF_FIXED_PORT)
Alan Cox7ba2e762012-09-04 16:34:45 +0100806 && new_info->irq != uport->irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700807
808 /*
809 * Since changing the 'type' of the port changes its resource
810 * allocations, we should treat type changes the same as
811 * IO port changes.
812 */
Alan Cox46d57a42009-09-19 13:13:29 -0700813 change_port = !(uport->flags & UPF_FIXED_PORT)
814 && (new_port != uport->iobase ||
Alan Cox7ba2e762012-09-04 16:34:45 +0100815 (unsigned long)new_info->iomem_base != uport->mapbase ||
816 new_info->hub6 != uport->hub6 ||
817 new_info->io_type != uport->iotype ||
818 new_info->iomem_reg_shift != uport->regshift ||
819 new_info->type != uport->type);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700820
Alan Cox46d57a42009-09-19 13:13:29 -0700821 old_flags = uport->flags;
Alan Cox7ba2e762012-09-04 16:34:45 +0100822 new_flags = new_info->flags;
Alan Cox46d57a42009-09-19 13:13:29 -0700823 old_custom_divisor = uport->custom_divisor;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700824
825 if (!capable(CAP_SYS_ADMIN)) {
826 retval = -EPERM;
827 if (change_irq || change_port ||
Alan Cox7ba2e762012-09-04 16:34:45 +0100828 (new_info->baud_base != uport->uartclk / 16) ||
Alan Cox46d57a42009-09-19 13:13:29 -0700829 (close_delay != port->close_delay) ||
830 (closing_wait != port->closing_wait) ||
Alan Cox7ba2e762012-09-04 16:34:45 +0100831 (new_info->xmit_fifo_size &&
832 new_info->xmit_fifo_size != uport->fifosize) ||
Russell King0077d452006-01-21 23:03:28 +0000833 (((new_flags ^ old_flags) & ~UPF_USR_MASK) != 0))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700834 goto exit;
Alan Cox46d57a42009-09-19 13:13:29 -0700835 uport->flags = ((uport->flags & ~UPF_USR_MASK) |
Russell King0077d452006-01-21 23:03:28 +0000836 (new_flags & UPF_USR_MASK));
Alan Cox7ba2e762012-09-04 16:34:45 +0100837 uport->custom_divisor = new_info->custom_divisor;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700838 goto check_and_exit;
839 }
840
841 /*
842 * Ask the low level driver to verify the settings.
843 */
Alan Cox46d57a42009-09-19 13:13:29 -0700844 if (uport->ops->verify_port)
Alan Cox7ba2e762012-09-04 16:34:45 +0100845 retval = uport->ops->verify_port(uport, new_info);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700846
Alan Cox7ba2e762012-09-04 16:34:45 +0100847 if ((new_info->irq >= nr_irqs) || (new_info->irq < 0) ||
848 (new_info->baud_base < 9600))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700849 retval = -EINVAL;
850
851 if (retval)
852 goto exit;
853
854 if (change_port || change_irq) {
855 retval = -EBUSY;
856
857 /*
858 * Make sure that we are the sole user of this port.
859 */
Alan Coxb58d13a2009-09-19 13:13:32 -0700860 if (tty_port_users(port) > 1)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700861 goto exit;
862
863 /*
864 * We need to shutdown the serial port at the old
865 * port/type/irq combination.
866 */
Alan Cox19225132010-06-01 22:52:51 +0200867 uart_shutdown(tty, state);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700868 }
869
870 if (change_port) {
871 unsigned long old_iobase, old_mapbase;
872 unsigned int old_type, old_iotype, old_hub6, old_shift;
873
Alan Cox46d57a42009-09-19 13:13:29 -0700874 old_iobase = uport->iobase;
875 old_mapbase = uport->mapbase;
876 old_type = uport->type;
877 old_hub6 = uport->hub6;
878 old_iotype = uport->iotype;
879 old_shift = uport->regshift;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700880
881 /*
882 * Free and release old regions
883 */
Fabio Estevama7cfaf12016-05-20 01:59:54 -0300884 if (old_type != PORT_UNKNOWN && uport->ops->release_port)
Alan Cox46d57a42009-09-19 13:13:29 -0700885 uport->ops->release_port(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700886
Alan Cox46d57a42009-09-19 13:13:29 -0700887 uport->iobase = new_port;
Alan Cox7ba2e762012-09-04 16:34:45 +0100888 uport->type = new_info->type;
889 uport->hub6 = new_info->hub6;
890 uport->iotype = new_info->io_type;
891 uport->regshift = new_info->iomem_reg_shift;
892 uport->mapbase = (unsigned long)new_info->iomem_base;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700893
894 /*
895 * Claim and map the new regions
896 */
Fabio Estevama7cfaf12016-05-20 01:59:54 -0300897 if (uport->type != PORT_UNKNOWN && uport->ops->request_port) {
Alan Cox46d57a42009-09-19 13:13:29 -0700898 retval = uport->ops->request_port(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700899 } else {
900 /* Always success - Jean II */
901 retval = 0;
902 }
903
904 /*
905 * If we fail to request resources for the
906 * new port, try to restore the old settings.
907 */
Thomas Pfaff7deb39e2014-04-23 12:33:22 +0200908 if (retval) {
Alan Cox46d57a42009-09-19 13:13:29 -0700909 uport->iobase = old_iobase;
910 uport->type = old_type;
911 uport->hub6 = old_hub6;
912 uport->iotype = old_iotype;
913 uport->regshift = old_shift;
914 uport->mapbase = old_mapbase;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700915
Thomas Pfaff7deb39e2014-04-23 12:33:22 +0200916 if (old_type != PORT_UNKNOWN) {
917 retval = uport->ops->request_port(uport);
918 /*
919 * If we failed to restore the old settings,
920 * we fail like this.
921 */
922 if (retval)
923 uport->type = PORT_UNKNOWN;
924
925 /*
926 * We failed anyway.
927 */
928 retval = -EBUSY;
929 }
930
Alan Coxa46c9992008-02-08 04:18:53 -0800931 /* Added to return the correct error -Ram Gupta */
932 goto exit;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700933 }
934 }
935
David Gibsonabb4a232007-05-06 14:48:49 -0700936 if (change_irq)
Alan Cox7ba2e762012-09-04 16:34:45 +0100937 uport->irq = new_info->irq;
Alan Cox46d57a42009-09-19 13:13:29 -0700938 if (!(uport->flags & UPF_FIXED_PORT))
Alan Cox7ba2e762012-09-04 16:34:45 +0100939 uport->uartclk = new_info->baud_base * 16;
Alan Cox46d57a42009-09-19 13:13:29 -0700940 uport->flags = (uport->flags & ~UPF_CHANGE_MASK) |
Russell King0077d452006-01-21 23:03:28 +0000941 (new_flags & UPF_CHANGE_MASK);
Alan Cox7ba2e762012-09-04 16:34:45 +0100942 uport->custom_divisor = new_info->custom_divisor;
Alan Cox46d57a42009-09-19 13:13:29 -0700943 port->close_delay = close_delay;
944 port->closing_wait = closing_wait;
Alan Cox7ba2e762012-09-04 16:34:45 +0100945 if (new_info->xmit_fifo_size)
946 uport->fifosize = new_info->xmit_fifo_size;
Jiri Slabyd6c53c02013-01-03 15:53:05 +0100947 port->low_latency = (uport->flags & UPF_LOW_LATENCY) ? 1 : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700948
949 check_and_exit:
950 retval = 0;
Alan Cox46d57a42009-09-19 13:13:29 -0700951 if (uport->type == PORT_UNKNOWN)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700952 goto exit;
Peter Hurleyd41861c2016-04-09 17:53:25 -0700953 if (tty_port_initialized(port)) {
Alan Cox46d57a42009-09-19 13:13:29 -0700954 if (((old_flags ^ uport->flags) & UPF_SPD_MASK) ||
955 old_custom_divisor != uport->custom_divisor) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700956 /*
957 * If they're setting up a custom divisor or speed,
958 * instead of clearing it, then bitch about it. No
959 * need to rate-limit; it's CAP_SYS_ADMIN only.
960 */
Alan Cox46d57a42009-09-19 13:13:29 -0700961 if (uport->flags & UPF_SPD_MASK) {
Sudip Mukherjee2f2dafe2014-09-01 20:49:43 +0530962 dev_notice(uport->dev,
963 "%s sets custom speed on %s. This is deprecated.\n",
964 current->comm,
Rasmus Villemoes429b4742015-03-31 15:55:59 +0200965 tty_name(port->tty));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700966 }
Alan Cox19225132010-06-01 22:52:51 +0200967 uart_change_speed(tty, state, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700968 }
Rob Herringb3b57642016-08-22 17:39:09 -0500969 } else {
Alan Cox19225132010-06-01 22:52:51 +0200970 retval = uart_startup(tty, state, 1);
Sebastian Andrzej Siewiorffcf1672018-01-11 18:57:26 +0100971 if (retval == 0)
972 tty_port_set_initialized(port, true);
Rob Herringb3b57642016-08-22 17:39:09 -0500973 if (retval > 0)
974 retval = 0;
975 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700976 exit:
Alan Cox7ba2e762012-09-04 16:34:45 +0100977 return retval;
978}
979
980static int uart_set_info_user(struct tty_struct *tty, struct uart_state *state,
981 struct serial_struct __user *newinfo)
982{
983 struct serial_struct new_serial;
984 struct tty_port *port = &state->port;
985 int retval;
986
987 if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
988 return -EFAULT;
989
990 /*
991 * This semaphore protects port->count. It is also
992 * very useful to prevent opens. Also, take the
993 * port configuration semaphore to make sure that a
994 * module insertion/removal doesn't change anything
995 * under us.
996 */
997 mutex_lock(&port->mutex);
998 retval = uart_set_info(tty, port, state, &new_serial);
Alan Coxa2bceae2009-09-19 13:13:31 -0700999 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001000 return retval;
1001}
1002
Alan Cox19225132010-06-01 22:52:51 +02001003/**
1004 * uart_get_lsr_info - get line status register info
1005 * @tty: tty associated with the UART
1006 * @state: UART being queried
1007 * @value: returned modem value
Linus Torvalds1da177e2005-04-16 15:20:36 -07001008 */
Alan Cox19225132010-06-01 22:52:51 +02001009static int uart_get_lsr_info(struct tty_struct *tty,
1010 struct uart_state *state, unsigned int __user *value)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001011{
Peter Hurley4047b372016-04-09 18:56:33 -07001012 struct uart_port *uport = uart_port_check(state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001013 unsigned int result;
1014
Alan Cox46d57a42009-09-19 13:13:29 -07001015 result = uport->ops->tx_empty(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001016
1017 /*
1018 * If we're about to load something into the transmit
1019 * register, we'll pretend the transmitter isn't empty to
1020 * avoid a race condition (depending on when the transmit
1021 * interrupt happens).
1022 */
Alan Cox46d57a42009-09-19 13:13:29 -07001023 if (uport->x_char ||
Alan Coxebd2c8f2009-09-19 13:13:28 -07001024 ((uart_circ_chars_pending(&state->xmit) > 0) &&
Peter Hurleyd01f4d12014-09-10 15:06:26 -04001025 !uart_tx_stopped(uport)))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001026 result &= ~TIOCSER_TEMT;
Alan Coxa46c9992008-02-08 04:18:53 -08001027
Linus Torvalds1da177e2005-04-16 15:20:36 -07001028 return put_user(result, value);
1029}
1030
Alan Cox60b33c12011-02-14 16:26:14 +00001031static int uart_tiocmget(struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001032{
1033 struct uart_state *state = tty->driver_data;
Alan Coxa2bceae2009-09-19 13:13:31 -07001034 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001035 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001036 int result = -EIO;
1037
Alan Coxa2bceae2009-09-19 13:13:31 -07001038 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001039 uport = uart_port_check(state);
1040 if (!uport)
1041 goto out;
1042
Peter Hurley18900ca2016-04-09 17:06:48 -07001043 if (!tty_io_error(tty)) {
Alan Cox46d57a42009-09-19 13:13:29 -07001044 result = uport->mctrl;
Alan Cox46d57a42009-09-19 13:13:29 -07001045 spin_lock_irq(&uport->lock);
1046 result |= uport->ops->get_mctrl(uport);
1047 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001048 }
Peter Hurley4047b372016-04-09 18:56:33 -07001049out:
Alan Coxa2bceae2009-09-19 13:13:31 -07001050 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001051 return result;
1052}
1053
1054static int
Alan Cox20b9d172011-02-14 16:26:50 +00001055uart_tiocmset(struct tty_struct *tty, unsigned int set, unsigned int clear)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001056{
1057 struct uart_state *state = tty->driver_data;
Alan Coxa2bceae2009-09-19 13:13:31 -07001058 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001059 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001060 int ret = -EIO;
1061
Alan Coxa2bceae2009-09-19 13:13:31 -07001062 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001063 uport = uart_port_check(state);
1064 if (!uport)
1065 goto out;
1066
Peter Hurley18900ca2016-04-09 17:06:48 -07001067 if (!tty_io_error(tty)) {
Alan Cox46d57a42009-09-19 13:13:29 -07001068 uart_update_mctrl(uport, set, clear);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001069 ret = 0;
1070 }
Peter Hurley4047b372016-04-09 18:56:33 -07001071out:
Alan Coxa2bceae2009-09-19 13:13:31 -07001072 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001073 return ret;
1074}
1075
Alan Cox9e989662008-07-22 11:18:03 +01001076static int uart_break_ctl(struct tty_struct *tty, int break_state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001077{
1078 struct uart_state *state = tty->driver_data;
Alan Coxa2bceae2009-09-19 13:13:31 -07001079 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001080 struct uart_port *uport;
1081 int ret = -EIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001082
Alan Coxa2bceae2009-09-19 13:13:31 -07001083 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001084 uport = uart_port_check(state);
1085 if (!uport)
1086 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001087
Alan Cox46d57a42009-09-19 13:13:29 -07001088 if (uport->type != PORT_UNKNOWN)
1089 uport->ops->break_ctl(uport, break_state);
Peter Hurley4047b372016-04-09 18:56:33 -07001090 ret = 0;
1091out:
Alan Coxa2bceae2009-09-19 13:13:31 -07001092 mutex_unlock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001093 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001094}
1095
Alan Cox19225132010-06-01 22:52:51 +02001096static int uart_do_autoconfig(struct tty_struct *tty,struct uart_state *state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001097{
Alan Coxa2bceae2009-09-19 13:13:31 -07001098 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001099 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001100 int flags, ret;
1101
1102 if (!capable(CAP_SYS_ADMIN))
1103 return -EPERM;
1104
1105 /*
1106 * Take the per-port semaphore. This prevents count from
1107 * changing, and hence any extra opens of the port while
1108 * we're auto-configuring.
1109 */
Alan Coxa2bceae2009-09-19 13:13:31 -07001110 if (mutex_lock_interruptible(&port->mutex))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001111 return -ERESTARTSYS;
1112
Peter Hurley4047b372016-04-09 18:56:33 -07001113 uport = uart_port_check(state);
1114 if (!uport) {
1115 ret = -EIO;
1116 goto out;
1117 }
1118
Linus Torvalds1da177e2005-04-16 15:20:36 -07001119 ret = -EBUSY;
Alan Coxb58d13a2009-09-19 13:13:32 -07001120 if (tty_port_users(port) == 1) {
Alan Cox19225132010-06-01 22:52:51 +02001121 uart_shutdown(tty, state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001122
1123 /*
1124 * If we already have a port type configured,
1125 * we must release its resources.
1126 */
Fabio Estevama7cfaf12016-05-20 01:59:54 -03001127 if (uport->type != PORT_UNKNOWN && uport->ops->release_port)
Alan Cox46d57a42009-09-19 13:13:29 -07001128 uport->ops->release_port(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001129
1130 flags = UART_CONFIG_TYPE;
Alan Cox46d57a42009-09-19 13:13:29 -07001131 if (uport->flags & UPF_AUTO_IRQ)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001132 flags |= UART_CONFIG_IRQ;
1133
1134 /*
1135 * This will claim the ports resources if
1136 * a port is found.
1137 */
Alan Cox46d57a42009-09-19 13:13:29 -07001138 uport->ops->config_port(uport, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001139
Alan Cox19225132010-06-01 22:52:51 +02001140 ret = uart_startup(tty, state, 1);
Sebastian Andrzej Siewiorfbe1ad92018-02-03 12:27:23 +01001141 if (ret == 0)
1142 tty_port_set_initialized(port, true);
Rob Herringb3b57642016-08-22 17:39:09 -05001143 if (ret > 0)
1144 ret = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001145 }
Peter Hurley4047b372016-04-09 18:56:33 -07001146out:
Alan Coxa2bceae2009-09-19 13:13:31 -07001147 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001148 return ret;
1149}
1150
Alexander Shiyan1fdc3102014-06-03 18:54:43 +04001151static void uart_enable_ms(struct uart_port *uport)
1152{
1153 /*
1154 * Force modem status interrupts on
1155 */
1156 if (uport->ops->enable_ms)
1157 uport->ops->enable_ms(uport);
1158}
1159
Linus Torvalds1da177e2005-04-16 15:20:36 -07001160/*
1161 * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
1162 * - mask passed in arg for lines of interest
1163 * (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
1164 * Caller should use TIOCGICOUNT to see which one it was
Alan Coxbdc04e32009-09-19 13:13:31 -07001165 *
1166 * FIXME: This wants extracting into a common all driver implementation
1167 * of TIOCMWAIT using tty_port.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001168 */
Peter Hurley9ed19422016-04-09 18:56:34 -07001169static int uart_wait_modem_status(struct uart_state *state, unsigned long arg)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001170{
Peter Hurley9ed19422016-04-09 18:56:34 -07001171 struct uart_port *uport;
Alan Coxbdc04e32009-09-19 13:13:31 -07001172 struct tty_port *port = &state->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001173 DECLARE_WAITQUEUE(wait, current);
1174 struct uart_icount cprev, cnow;
1175 int ret;
1176
1177 /*
1178 * note the counters on entry
1179 */
Peter Hurley9ed19422016-04-09 18:56:34 -07001180 uport = uart_port_ref(state);
1181 if (!uport)
1182 return -EIO;
Alan Cox46d57a42009-09-19 13:13:29 -07001183 spin_lock_irq(&uport->lock);
1184 memcpy(&cprev, &uport->icount, sizeof(struct uart_icount));
Alexander Shiyan1fdc3102014-06-03 18:54:43 +04001185 uart_enable_ms(uport);
Alan Cox46d57a42009-09-19 13:13:29 -07001186 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001187
Alan Coxbdc04e32009-09-19 13:13:31 -07001188 add_wait_queue(&port->delta_msr_wait, &wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001189 for (;;) {
Alan Cox46d57a42009-09-19 13:13:29 -07001190 spin_lock_irq(&uport->lock);
1191 memcpy(&cnow, &uport->icount, sizeof(struct uart_icount));
1192 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001193
1194 set_current_state(TASK_INTERRUPTIBLE);
1195
1196 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
1197 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
1198 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
1199 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts))) {
Alan Coxa46c9992008-02-08 04:18:53 -08001200 ret = 0;
1201 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001202 }
1203
1204 schedule();
1205
1206 /* see if a signal did it */
1207 if (signal_pending(current)) {
1208 ret = -ERESTARTSYS;
1209 break;
1210 }
1211
1212 cprev = cnow;
1213 }
Fabian Frederick97f9f702015-02-20 19:12:57 +01001214 __set_current_state(TASK_RUNNING);
Alan Coxbdc04e32009-09-19 13:13:31 -07001215 remove_wait_queue(&port->delta_msr_wait, &wait);
Peter Hurley9ed19422016-04-09 18:56:34 -07001216 uart_port_deref(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001217
1218 return ret;
1219}
1220
1221/*
1222 * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
1223 * Return: write counters to the user passed counter struct
1224 * NB: both 1->0 and 0->1 transitions are counted except for
1225 * RI where only 0->1 is counted.
1226 */
Alan Coxd281da72010-09-16 18:21:24 +01001227static int uart_get_icount(struct tty_struct *tty,
1228 struct serial_icounter_struct *icount)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001229{
Alan Coxd281da72010-09-16 18:21:24 +01001230 struct uart_state *state = tty->driver_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001231 struct uart_icount cnow;
Peter Hurley9ed19422016-04-09 18:56:34 -07001232 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001233
Peter Hurley9ed19422016-04-09 18:56:34 -07001234 uport = uart_port_ref(state);
1235 if (!uport)
1236 return -EIO;
Alan Cox46d57a42009-09-19 13:13:29 -07001237 spin_lock_irq(&uport->lock);
1238 memcpy(&cnow, &uport->icount, sizeof(struct uart_icount));
1239 spin_unlock_irq(&uport->lock);
Peter Hurley9ed19422016-04-09 18:56:34 -07001240 uart_port_deref(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001241
Alan Coxd281da72010-09-16 18:21:24 +01001242 icount->cts = cnow.cts;
1243 icount->dsr = cnow.dsr;
1244 icount->rng = cnow.rng;
1245 icount->dcd = cnow.dcd;
1246 icount->rx = cnow.rx;
1247 icount->tx = cnow.tx;
1248 icount->frame = cnow.frame;
1249 icount->overrun = cnow.overrun;
1250 icount->parity = cnow.parity;
1251 icount->brk = cnow.brk;
1252 icount->buf_overrun = cnow.buf_overrun;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001253
Alan Coxd281da72010-09-16 18:21:24 +01001254 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001255}
1256
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001257static int uart_get_rs485_config(struct uart_port *port,
1258 struct serial_rs485 __user *rs485)
1259{
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001260 unsigned long flags;
1261 struct serial_rs485 aux;
1262
1263 spin_lock_irqsave(&port->lock, flags);
1264 aux = port->rs485;
1265 spin_unlock_irqrestore(&port->lock, flags);
1266
1267 if (copy_to_user(rs485, &aux, sizeof(aux)))
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001268 return -EFAULT;
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001269
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001270 return 0;
1271}
1272
1273static int uart_set_rs485_config(struct uart_port *port,
1274 struct serial_rs485 __user *rs485_user)
1275{
1276 struct serial_rs485 rs485;
1277 int ret;
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001278 unsigned long flags;
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001279
1280 if (!port->rs485_config)
1281 return -ENOIOCTLCMD;
1282
1283 if (copy_from_user(&rs485, rs485_user, sizeof(*rs485_user)))
1284 return -EFAULT;
1285
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001286 spin_lock_irqsave(&port->lock, flags);
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001287 ret = port->rs485_config(port, &rs485);
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001288 spin_unlock_irqrestore(&port->lock, flags);
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001289 if (ret)
1290 return ret;
1291
1292 if (copy_to_user(rs485_user, &port->rs485, sizeof(port->rs485)))
1293 return -EFAULT;
1294
1295 return 0;
1296}
1297
Linus Torvalds1da177e2005-04-16 15:20:36 -07001298/*
Alan Coxe5238442008-04-30 00:53:28 -07001299 * Called via sys_ioctl. We can use spin_lock_irq() here.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001300 */
1301static int
Peter Hurley4047b372016-04-09 18:56:33 -07001302uart_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001303{
1304 struct uart_state *state = tty->driver_data;
Alan Coxa2bceae2009-09-19 13:13:31 -07001305 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001306 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001307 void __user *uarg = (void __user *)arg;
1308 int ret = -ENOIOCTLCMD;
1309
Linus Torvalds1da177e2005-04-16 15:20:36 -07001310
1311 /*
1312 * These ioctls don't rely on the hardware to be present.
1313 */
1314 switch (cmd) {
1315 case TIOCGSERIAL:
Alan Cox9f109692012-10-29 15:20:25 +00001316 ret = uart_get_info_user(port, uarg);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001317 break;
1318
1319 case TIOCSSERIAL:
Peter Hurley7c8ab962014-10-16 16:54:20 -04001320 down_write(&tty->termios_rwsem);
Alan Cox7ba2e762012-09-04 16:34:45 +01001321 ret = uart_set_info_user(tty, state, uarg);
Peter Hurley7c8ab962014-10-16 16:54:20 -04001322 up_write(&tty->termios_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001323 break;
1324
1325 case TIOCSERCONFIG:
Peter Hurley7c8ab962014-10-16 16:54:20 -04001326 down_write(&tty->termios_rwsem);
Alan Cox19225132010-06-01 22:52:51 +02001327 ret = uart_do_autoconfig(tty, state);
Peter Hurley7c8ab962014-10-16 16:54:20 -04001328 up_write(&tty->termios_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001329 break;
1330
1331 case TIOCSERGWILD: /* obsolete */
1332 case TIOCSERSWILD: /* obsolete */
1333 ret = 0;
1334 break;
1335 }
1336
1337 if (ret != -ENOIOCTLCMD)
1338 goto out;
1339
Peter Hurley18900ca2016-04-09 17:06:48 -07001340 if (tty_io_error(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001341 ret = -EIO;
1342 goto out;
1343 }
1344
1345 /*
1346 * The following should only be used when hardware is present.
1347 */
1348 switch (cmd) {
1349 case TIOCMIWAIT:
1350 ret = uart_wait_modem_status(state, arg);
1351 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001352 }
1353
1354 if (ret != -ENOIOCTLCMD)
1355 goto out;
1356
Alan Coxa2bceae2009-09-19 13:13:31 -07001357 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001358 uport = uart_port_check(state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001359
Peter Hurley4047b372016-04-09 18:56:33 -07001360 if (!uport || tty_io_error(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001361 ret = -EIO;
1362 goto out_up;
1363 }
1364
1365 /*
1366 * All these rely on hardware being present and need to be
1367 * protected against the tty being hung up.
1368 */
Ricardo Ribalda Delgadoa9c20a92014-11-06 09:22:59 +01001369
Linus Torvalds1da177e2005-04-16 15:20:36 -07001370 switch (cmd) {
Ricardo Ribalda Delgadoa9c20a92014-11-06 09:22:59 +01001371 case TIOCSERGETLSR: /* Get line status register */
1372 ret = uart_get_lsr_info(tty, state, uarg);
1373 break;
1374
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001375 case TIOCGRS485:
Peter Hurley4047b372016-04-09 18:56:33 -07001376 ret = uart_get_rs485_config(uport, uarg);
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001377 break;
1378
1379 case TIOCSRS485:
Peter Hurley4047b372016-04-09 18:56:33 -07001380 ret = uart_set_rs485_config(uport, uarg);
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001381 break;
Peter Hurley4047b372016-04-09 18:56:33 -07001382 default:
Alan Cox46d57a42009-09-19 13:13:29 -07001383 if (uport->ops->ioctl)
1384 ret = uport->ops->ioctl(uport, cmd, arg);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001385 break;
1386 }
Alan Coxf34d7a52008-04-30 00:54:13 -07001387out_up:
Alan Coxa2bceae2009-09-19 13:13:31 -07001388 mutex_unlock(&port->mutex);
Alan Coxf34d7a52008-04-30 00:54:13 -07001389out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001390 return ret;
1391}
1392
Linus Torvaldsedeb2802008-06-04 10:35:03 -07001393static void uart_set_ldisc(struct tty_struct *tty)
Alan Cox64e91592008-06-03 15:18:54 +01001394{
1395 struct uart_state *state = tty->driver_data;
Peter Hurley4047b372016-04-09 18:56:33 -07001396 struct uart_port *uport;
Alan Cox64e91592008-06-03 15:18:54 +01001397
Peter Hurley4047b372016-04-09 18:56:33 -07001398 mutex_lock(&state->port.mutex);
1399 uport = uart_port_check(state);
1400 if (uport && uport->ops->set_ldisc)
Peter Hurley732a84a2014-11-05 13:11:43 -05001401 uport->ops->set_ldisc(uport, &tty->termios);
Peter Hurley4047b372016-04-09 18:56:33 -07001402 mutex_unlock(&state->port.mutex);
Alan Cox64e91592008-06-03 15:18:54 +01001403}
1404
Alan Coxa46c9992008-02-08 04:18:53 -08001405static void uart_set_termios(struct tty_struct *tty,
1406 struct ktermios *old_termios)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001407{
1408 struct uart_state *state = tty->driver_data;
Peter Hurley4047b372016-04-09 18:56:33 -07001409 struct uart_port *uport;
Alan Coxadc8d742012-07-14 15:31:47 +01001410 unsigned int cflag = tty->termios.c_cflag;
Russell King2cbacaf2012-04-17 16:34:13 +01001411 unsigned int iflag_mask = IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK;
1412 bool sw_changed = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001413
Peter Hurley4047b372016-04-09 18:56:33 -07001414 mutex_lock(&state->port.mutex);
1415 uport = uart_port_check(state);
1416 if (!uport)
1417 goto out;
1418
Russell King2cbacaf2012-04-17 16:34:13 +01001419 /*
1420 * Drivers doing software flow control also need to know
1421 * about changes to these input settings.
1422 */
1423 if (uport->flags & UPF_SOFT_FLOW) {
1424 iflag_mask |= IXANY|IXON|IXOFF;
1425 sw_changed =
1426 tty->termios.c_cc[VSTART] != old_termios->c_cc[VSTART] ||
1427 tty->termios.c_cc[VSTOP] != old_termios->c_cc[VSTOP];
1428 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001429
1430 /*
1431 * These are the bits that are used to setup various
David Woodhouse20620d62007-08-22 14:01:11 -07001432 * flags in the low level driver. We can ignore the Bfoo
1433 * bits in c_cflag; c_[io]speed will always be set
1434 * appropriately by set_termios() in tty_ioctl.c
Linus Torvalds1da177e2005-04-16 15:20:36 -07001435 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001436 if ((cflag ^ old_termios->c_cflag) == 0 &&
Alan Coxadc8d742012-07-14 15:31:47 +01001437 tty->termios.c_ospeed == old_termios->c_ospeed &&
1438 tty->termios.c_ispeed == old_termios->c_ispeed &&
Russell King2cbacaf2012-04-17 16:34:13 +01001439 ((tty->termios.c_iflag ^ old_termios->c_iflag) & iflag_mask) == 0 &&
1440 !sw_changed) {
Peter Hurley4047b372016-04-09 18:56:33 -07001441 goto out;
Alan Coxe5238442008-04-30 00:53:28 -07001442 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001443
Alan Cox19225132010-06-01 22:52:51 +02001444 uart_change_speed(tty, state, old_termios);
Peter Hurleyc18b55f2014-06-16 09:17:09 -04001445 /* reload cflag from termios; port driver may have overriden flags */
1446 cflag = tty->termios.c_cflag;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001447
1448 /* Handle transition to B0 status */
1449 if ((old_termios->c_cflag & CBAUD) && !(cflag & CBAUD))
Russell Kingdec94e72012-09-24 11:13:15 +01001450 uart_clear_mctrl(uport, TIOCM_RTS | TIOCM_DTR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001451 /* Handle transition away from B0 status */
André Goddard Rosa82cb7ba2009-10-25 11:18:26 -02001452 else if (!(old_termios->c_cflag & CBAUD) && (cflag & CBAUD)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001453 unsigned int mask = TIOCM_DTR;
Peter Hurley97ef38b2016-04-09 17:11:36 -07001454 if (!(cflag & CRTSCTS) || !tty_throttled(tty))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001455 mask |= TIOCM_RTS;
Russell Kingdec94e72012-09-24 11:13:15 +01001456 uart_set_mctrl(uport, mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001457 }
Peter Hurley4047b372016-04-09 18:56:33 -07001458out:
1459 mutex_unlock(&state->port.mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001460}
1461
1462/*
Kevin Cernekeeef4f5272012-12-26 20:43:41 -08001463 * Calls to uart_close() are serialised via the tty_lock in
1464 * drivers/tty/tty_io.c:tty_release()
1465 * drivers/tty/tty_io.c:do_tty_hangup()
Linus Torvalds1da177e2005-04-16 15:20:36 -07001466 */
1467static void uart_close(struct tty_struct *tty, struct file *filp)
1468{
1469 struct uart_state *state = tty->driver_data;
Alan Cox46d57a42009-09-19 13:13:29 -07001470 struct tty_port *port;
Alan Coxa46c9992008-02-08 04:18:53 -08001471
Peter Hurley91b32f52014-10-16 16:54:27 -04001472 if (!state) {
1473 struct uart_driver *drv = tty->driver->driver_state;
1474
1475 state = drv->state + tty->index;
1476 port = &state->port;
1477 spin_lock_irq(&port->lock);
1478 --port->count;
1479 spin_unlock_irq(&port->lock);
Linus Torvaldseea7e172009-10-12 19:13:54 +02001480 return;
Peter Hurley91b32f52014-10-16 16:54:27 -04001481 }
Linus Torvaldseea7e172009-10-12 19:13:54 +02001482
Alan Cox46d57a42009-09-19 13:13:29 -07001483 port = &state->port;
Peter Hurley39b3d892016-01-10 20:23:57 -08001484 pr_debug("uart_close(%d) called\n", tty->index);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001485
Rob Herring761ed4a2016-08-22 17:39:10 -05001486 tty_port_close(tty->port, tty, filp);
1487}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001488
Rob Herring761ed4a2016-08-22 17:39:10 -05001489static void uart_tty_port_shutdown(struct tty_port *port)
1490{
1491 struct uart_state *state = container_of(port, struct uart_state, port);
1492 struct uart_port *uport = uart_port_check(state);
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001493
Linus Torvalds1da177e2005-04-16 15:20:36 -07001494 /*
1495 * At this point, we stop accepting input. To do this, we
1496 * disable the receive line status interrupts.
1497 */
Andy Shevchenkoa5a2b132016-09-13 00:23:42 +03001498 if (WARN(!uport, "detached port still initialized!\n"))
1499 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001500
Andy Shevchenkoa5a2b132016-09-13 00:23:42 +03001501 spin_lock_irq(&uport->lock);
Rob Herring761ed4a2016-08-22 17:39:10 -05001502 uport->ops->stop_rx(uport);
Rob Herring761ed4a2016-08-22 17:39:10 -05001503 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001504
Rob Herring761ed4a2016-08-22 17:39:10 -05001505 uart_port_shutdown(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001506
1507 /*
Rob Herring761ed4a2016-08-22 17:39:10 -05001508 * It's possible for shutdown to be called after suspend if we get
1509 * a DCD drop (hangup) at just the right time. Clear suspended bit so
1510 * we don't try to resume a port that has been shutdown.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001511 */
Rob Herring761ed4a2016-08-22 17:39:10 -05001512 tty_port_set_suspended(port, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001513
Rob Herring761ed4a2016-08-22 17:39:10 -05001514 uart_change_pm(state, UART_PM_STATE_OFF);
Peter Hurley2e758912014-10-16 16:54:19 -04001515
Linus Torvalds1da177e2005-04-16 15:20:36 -07001516}
1517
Jiri Slaby1f33a512011-07-14 14:35:10 +02001518static void uart_wait_until_sent(struct tty_struct *tty, int timeout)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001519{
Jiri Slaby1f33a512011-07-14 14:35:10 +02001520 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -07001521 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001522 unsigned long char_time, expire;
1523
Peter Hurley9ed19422016-04-09 18:56:34 -07001524 port = uart_port_ref(state);
1525 if (!port || port->type == PORT_UNKNOWN || port->fifosize == 0) {
1526 uart_port_deref(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001527 return;
Peter Hurley9ed19422016-04-09 18:56:34 -07001528 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001529
1530 /*
1531 * Set the check interval to be 1/5 of the estimated time to
1532 * send a single character, and make it at least 1. The check
1533 * interval should also be less than the timeout.
1534 *
1535 * Note: we have to use pretty tight timings here to satisfy
1536 * the NIST-PCTS.
1537 */
1538 char_time = (port->timeout - HZ/50) / port->fifosize;
1539 char_time = char_time / 5;
1540 if (char_time == 0)
1541 char_time = 1;
1542 if (timeout && timeout < char_time)
1543 char_time = timeout;
1544
1545 /*
1546 * If the transmitter hasn't cleared in twice the approximate
1547 * amount of time to send the entire FIFO, it probably won't
1548 * ever clear. This assumes the UART isn't doing flow
1549 * control, which is currently the case. Hence, if it ever
1550 * takes longer than port->timeout, this is probably due to a
1551 * UART bug of some kind. So, we clamp the timeout parameter at
1552 * 2*port->timeout.
1553 */
1554 if (timeout == 0 || timeout > 2 * port->timeout)
1555 timeout = 2 * port->timeout;
1556
1557 expire = jiffies + timeout;
1558
Jiri Slabyeb3a1e12007-05-06 14:48:52 -07001559 pr_debug("uart_wait_until_sent(%d), jiffies=%lu, expire=%lu...\n",
Alan Coxa46c9992008-02-08 04:18:53 -08001560 port->line, jiffies, expire);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001561
1562 /*
1563 * Check whether the transmitter is empty every 'char_time'.
1564 * 'timeout' / 'expire' give us the maximum amount of time
1565 * we wait.
1566 */
1567 while (!port->ops->tx_empty(port)) {
1568 msleep_interruptible(jiffies_to_msecs(char_time));
1569 if (signal_pending(current))
1570 break;
1571 if (time_after(jiffies, expire))
1572 break;
1573 }
Peter Hurley9ed19422016-04-09 18:56:34 -07001574 uart_port_deref(port);
Arnd Bergmann20365212010-06-01 22:53:07 +02001575}
1576
Linus Torvalds1da177e2005-04-16 15:20:36 -07001577/*
Kevin Cernekeeef4f5272012-12-26 20:43:41 -08001578 * Calls to uart_hangup() are serialised by the tty_lock in
1579 * drivers/tty/tty_io.c:do_tty_hangup()
1580 * This runs from a workqueue and can sleep for a _short_ time only.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001581 */
1582static void uart_hangup(struct tty_struct *tty)
1583{
1584 struct uart_state *state = tty->driver_data;
Alan Cox46d57a42009-09-19 13:13:29 -07001585 struct tty_port *port = &state->port;
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001586 struct uart_port *uport;
Alan Cox61cd8a22010-06-01 22:52:57 +02001587 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001588
Peter Hurley39b3d892016-01-10 20:23:57 -08001589 pr_debug("uart_hangup(%d)\n", tty->index);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001590
Alan Coxa2bceae2009-09-19 13:13:31 -07001591 mutex_lock(&port->mutex);
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001592 uport = uart_port_check(state);
1593 WARN(!uport, "hangup of detached port!\n");
1594
Peter Hurley807c8d812016-04-09 17:53:22 -07001595 if (tty_port_active(port)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001596 uart_flush_buffer(tty);
Alan Cox19225132010-06-01 22:52:51 +02001597 uart_shutdown(tty, state);
Alan Cox61cd8a22010-06-01 22:52:57 +02001598 spin_lock_irqsave(&port->lock, flags);
Alan Cox91312cd2009-09-19 13:13:29 -07001599 port->count = 0;
Alan Cox61cd8a22010-06-01 22:52:57 +02001600 spin_unlock_irqrestore(&port->lock, flags);
Peter Hurley807c8d812016-04-09 17:53:22 -07001601 tty_port_set_active(port, 0);
Alan Cox7b014782009-09-19 13:13:33 -07001602 tty_port_tty_set(port, NULL);
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001603 if (uport && !uart_console(uport))
Geert Uytterhoevenbf903c02014-03-27 11:40:39 +01001604 uart_change_pm(state, UART_PM_STATE_OFF);
Alan Cox46d57a42009-09-19 13:13:29 -07001605 wake_up_interruptible(&port->open_wait);
Alan Coxbdc04e32009-09-19 13:13:31 -07001606 wake_up_interruptible(&port->delta_msr_wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001607 }
Alan Coxa2bceae2009-09-19 13:13:31 -07001608 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001609}
1610
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001611/* uport == NULL if uart_port has already been removed */
Jiri Slaby0b1db832011-11-09 21:33:50 +01001612static void uart_port_shutdown(struct tty_port *port)
1613{
Jiri Slabyb922e192011-11-09 21:33:51 +01001614 struct uart_state *state = container_of(port, struct uart_state, port);
Peter Hurley4047b372016-04-09 18:56:33 -07001615 struct uart_port *uport = uart_port_check(state);
Jiri Slabyb922e192011-11-09 21:33:51 +01001616
1617 /*
1618 * clear delta_msr_wait queue to avoid mem leaks: we may free
1619 * the irq here so the queue might never be woken up. Note
1620 * that we won't end up waiting on delta_msr_wait again since
1621 * any outstanding file descriptors should be pointing at
1622 * hung_up_tty_fops now.
1623 */
1624 wake_up_interruptible(&port->delta_msr_wait);
1625
1626 /*
1627 * Free the IRQ and disable the port.
1628 */
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001629 if (uport)
1630 uport->ops->shutdown(uport);
Jiri Slabyb922e192011-11-09 21:33:51 +01001631
1632 /*
1633 * Ensure that the IRQ handler isn't running on another CPU.
1634 */
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001635 if (uport)
1636 synchronize_irq(uport->irq);
Jiri Slaby0b1db832011-11-09 21:33:50 +01001637}
1638
Alan Coxde0c8cb2010-06-01 22:52:58 +02001639static int uart_carrier_raised(struct tty_port *port)
1640{
1641 struct uart_state *state = container_of(port, struct uart_state, port);
Peter Hurley9ed19422016-04-09 18:56:34 -07001642 struct uart_port *uport;
Alan Coxde0c8cb2010-06-01 22:52:58 +02001643 int mctrl;
Peter Hurley9ed19422016-04-09 18:56:34 -07001644
1645 uport = uart_port_ref(state);
1646 /*
1647 * Should never observe uport == NULL since checks for hangup should
1648 * abort the tty_port_block_til_ready() loop before checking for carrier
1649 * raised -- but report carrier raised if it does anyway so open will
1650 * continue and not sleep
1651 */
1652 if (WARN_ON(!uport))
1653 return 1;
Alan Coxde0c8cb2010-06-01 22:52:58 +02001654 spin_lock_irq(&uport->lock);
Alexander Shiyan1fdc3102014-06-03 18:54:43 +04001655 uart_enable_ms(uport);
Alan Coxde0c8cb2010-06-01 22:52:58 +02001656 mctrl = uport->ops->get_mctrl(uport);
1657 spin_unlock_irq(&uport->lock);
Peter Hurley9ed19422016-04-09 18:56:34 -07001658 uart_port_deref(uport);
Alan Coxde0c8cb2010-06-01 22:52:58 +02001659 if (mctrl & TIOCM_CAR)
1660 return 1;
1661 return 0;
1662}
1663
1664static void uart_dtr_rts(struct tty_port *port, int onoff)
1665{
1666 struct uart_state *state = container_of(port, struct uart_state, port);
Peter Hurley9ed19422016-04-09 18:56:34 -07001667 struct uart_port *uport;
1668
1669 uport = uart_port_ref(state);
1670 if (!uport)
1671 return;
Alan Cox24fcc7c2010-06-01 22:52:59 +02001672
Jiri Slaby6f5c24a2011-03-30 00:10:57 +02001673 if (onoff)
Alan Coxde0c8cb2010-06-01 22:52:58 +02001674 uart_set_mctrl(uport, TIOCM_DTR | TIOCM_RTS);
1675 else
1676 uart_clear_mctrl(uport, TIOCM_DTR | TIOCM_RTS);
Peter Hurley9ed19422016-04-09 18:56:34 -07001677
1678 uart_port_deref(uport);
Alan Coxde0c8cb2010-06-01 22:52:58 +02001679}
1680
Linus Torvalds1da177e2005-04-16 15:20:36 -07001681/*
Kevin Cernekeeef4f5272012-12-26 20:43:41 -08001682 * Calls to uart_open are serialised by the tty_lock in
1683 * drivers/tty/tty_io.c:tty_open()
Linus Torvalds1da177e2005-04-16 15:20:36 -07001684 * Note that if this fails, then uart_close() _will_ be called.
1685 *
1686 * In time, we want to scrap the "opening nonpresent ports"
1687 * behaviour and implement an alternative way for setserial
1688 * to set base addresses/ports/types. This will allow us to
1689 * get rid of a certain amount of extra tests.
1690 */
1691static int uart_open(struct tty_struct *tty, struct file *filp)
1692{
Peter Hurley5e388022016-01-10 20:24:00 -08001693 struct uart_driver *drv = tty->driver->driver_state;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001694 int retval, line = tty->index;
Jiri Slaby1c7b13c2011-11-09 21:33:49 +01001695 struct uart_state *state = drv->state + line;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001696
Linus Torvalds1da177e2005-04-16 15:20:36 -07001697 tty->driver_data = state;
Rob Herringb3b57642016-08-22 17:39:09 -05001698
1699 retval = tty_port_open(&state->port, tty, filp);
1700 if (retval > 0)
1701 retval = 0;
1702
1703 return retval;
1704}
1705
1706static int uart_port_activate(struct tty_port *port, struct tty_struct *tty)
1707{
1708 struct uart_state *state = container_of(port, struct uart_state, port);
1709 struct uart_port *uport;
1710
1711 uport = uart_port_check(state);
1712 if (!uport || uport->flags & UPF_DEAD)
1713 return -ENXIO;
1714
Peter Hurley4047b372016-04-09 18:56:33 -07001715 port->low_latency = (uport->flags & UPF_LOW_LATENCY) ? 1 : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001716
1717 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001718 * Start up the serial port.
1719 */
Rob Herringb3b57642016-08-22 17:39:09 -05001720 return uart_startup(tty, state, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001721}
1722
1723static const char *uart_type(struct uart_port *port)
1724{
1725 const char *str = NULL;
1726
1727 if (port->ops->type)
1728 str = port->ops->type(port);
1729
1730 if (!str)
1731 str = "unknown";
1732
1733 return str;
1734}
1735
1736#ifdef CONFIG_PROC_FS
1737
Alexey Dobriyand196a942009-03-31 15:19:21 -07001738static void uart_line_info(struct seq_file *m, struct uart_driver *drv, int i)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001739{
1740 struct uart_state *state = drv->state + i;
Alan Coxa2bceae2009-09-19 13:13:31 -07001741 struct tty_port *port = &state->port;
Linus Walleij6f538fe2012-12-07 11:36:08 +01001742 enum uart_pm_state pm_state;
Peter Hurley4047b372016-04-09 18:56:33 -07001743 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001744 char stat_buf[32];
1745 unsigned int status;
Alexey Dobriyand196a942009-03-31 15:19:21 -07001746 int mmio;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001747
Peter Hurley4047b372016-04-09 18:56:33 -07001748 mutex_lock(&port->mutex);
1749 uport = uart_port_check(state);
Alan Coxa2bceae2009-09-19 13:13:31 -07001750 if (!uport)
Peter Hurley4047b372016-04-09 18:56:33 -07001751 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001752
Alan Coxa2bceae2009-09-19 13:13:31 -07001753 mmio = uport->iotype >= UPIO_MEM;
Alexey Dobriyand196a942009-03-31 15:19:21 -07001754 seq_printf(m, "%d: uart:%s %s%08llX irq:%d",
Alan Coxa2bceae2009-09-19 13:13:31 -07001755 uport->line, uart_type(uport),
Sergei Shtylyov6c6a2332006-09-04 00:04:20 +04001756 mmio ? "mmio:0x" : "port:",
Alan Coxa2bceae2009-09-19 13:13:31 -07001757 mmio ? (unsigned long long)uport->mapbase
1758 : (unsigned long long)uport->iobase,
1759 uport->irq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001760
Alan Coxa2bceae2009-09-19 13:13:31 -07001761 if (uport->type == PORT_UNKNOWN) {
Alexey Dobriyand196a942009-03-31 15:19:21 -07001762 seq_putc(m, '\n');
Peter Hurley4047b372016-04-09 18:56:33 -07001763 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001764 }
1765
Alan Coxa46c9992008-02-08 04:18:53 -08001766 if (capable(CAP_SYS_ADMIN)) {
George G. Davis3689a0e2007-02-14 00:33:06 -08001767 pm_state = state->pm_state;
Linus Walleij6f538fe2012-12-07 11:36:08 +01001768 if (pm_state != UART_PM_STATE_ON)
1769 uart_change_pm(state, UART_PM_STATE_ON);
Alan Coxa2bceae2009-09-19 13:13:31 -07001770 spin_lock_irq(&uport->lock);
1771 status = uport->ops->get_mctrl(uport);
1772 spin_unlock_irq(&uport->lock);
Linus Walleij6f538fe2012-12-07 11:36:08 +01001773 if (pm_state != UART_PM_STATE_ON)
George G. Davis3689a0e2007-02-14 00:33:06 -08001774 uart_change_pm(state, pm_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001775
Alexey Dobriyand196a942009-03-31 15:19:21 -07001776 seq_printf(m, " tx:%d rx:%d",
Alan Coxa2bceae2009-09-19 13:13:31 -07001777 uport->icount.tx, uport->icount.rx);
1778 if (uport->icount.frame)
Peter Hurley968af292016-01-10 20:24:01 -08001779 seq_printf(m, " fe:%d", uport->icount.frame);
Alan Coxa2bceae2009-09-19 13:13:31 -07001780 if (uport->icount.parity)
Peter Hurley968af292016-01-10 20:24:01 -08001781 seq_printf(m, " pe:%d", uport->icount.parity);
Alan Coxa2bceae2009-09-19 13:13:31 -07001782 if (uport->icount.brk)
Peter Hurley968af292016-01-10 20:24:01 -08001783 seq_printf(m, " brk:%d", uport->icount.brk);
Alan Coxa2bceae2009-09-19 13:13:31 -07001784 if (uport->icount.overrun)
Peter Hurley968af292016-01-10 20:24:01 -08001785 seq_printf(m, " oe:%d", uport->icount.overrun);
Alan Coxa46c9992008-02-08 04:18:53 -08001786
1787#define INFOBIT(bit, str) \
Alan Coxa2bceae2009-09-19 13:13:31 -07001788 if (uport->mctrl & (bit)) \
Linus Torvalds1da177e2005-04-16 15:20:36 -07001789 strncat(stat_buf, (str), sizeof(stat_buf) - \
1790 strlen(stat_buf) - 2)
Alan Coxa46c9992008-02-08 04:18:53 -08001791#define STATBIT(bit, str) \
Linus Torvalds1da177e2005-04-16 15:20:36 -07001792 if (status & (bit)) \
1793 strncat(stat_buf, (str), sizeof(stat_buf) - \
1794 strlen(stat_buf) - 2)
1795
1796 stat_buf[0] = '\0';
1797 stat_buf[1] = '\0';
1798 INFOBIT(TIOCM_RTS, "|RTS");
1799 STATBIT(TIOCM_CTS, "|CTS");
1800 INFOBIT(TIOCM_DTR, "|DTR");
1801 STATBIT(TIOCM_DSR, "|DSR");
1802 STATBIT(TIOCM_CAR, "|CD");
1803 STATBIT(TIOCM_RNG, "|RI");
1804 if (stat_buf[0])
1805 stat_buf[0] = ' ';
Alan Coxa46c9992008-02-08 04:18:53 -08001806
Alexey Dobriyand196a942009-03-31 15:19:21 -07001807 seq_puts(m, stat_buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001808 }
Alexey Dobriyand196a942009-03-31 15:19:21 -07001809 seq_putc(m, '\n');
Linus Torvalds1da177e2005-04-16 15:20:36 -07001810#undef STATBIT
1811#undef INFOBIT
Peter Hurley4047b372016-04-09 18:56:33 -07001812out:
1813 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001814}
1815
Alexey Dobriyand196a942009-03-31 15:19:21 -07001816static int uart_proc_show(struct seq_file *m, void *v)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001817{
Alexey Dobriyan833bb302009-04-02 01:30:04 +04001818 struct tty_driver *ttydrv = m->private;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001819 struct uart_driver *drv = ttydrv->driver_state;
Alexey Dobriyand196a942009-03-31 15:19:21 -07001820 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001821
Peter Hurley968af292016-01-10 20:24:01 -08001822 seq_printf(m, "serinfo:1.0 driver%s%s revision:%s\n", "", "", "");
Alexey Dobriyand196a942009-03-31 15:19:21 -07001823 for (i = 0; i < drv->nr; i++)
1824 uart_line_info(m, drv, i);
1825 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001826}
Alexey Dobriyand196a942009-03-31 15:19:21 -07001827
1828static int uart_proc_open(struct inode *inode, struct file *file)
1829{
Al Virod9dda782013-03-31 18:16:14 -04001830 return single_open(file, uart_proc_show, PDE_DATA(inode));
Alexey Dobriyand196a942009-03-31 15:19:21 -07001831}
1832
1833static const struct file_operations uart_proc_fops = {
1834 .owner = THIS_MODULE,
1835 .open = uart_proc_open,
1836 .read = seq_read,
1837 .llseek = seq_lseek,
1838 .release = single_release,
1839};
Linus Torvalds1da177e2005-04-16 15:20:36 -07001840#endif
1841
Andrew Morton4a1b5502008-03-07 15:51:16 -08001842#if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(CONFIG_CONSOLE_POLL)
Peter Hurley1cfe42b2015-03-09 16:27:13 -04001843/**
Russell Kingd3587882006-03-20 20:00:09 +00001844 * uart_console_write - write a console message to a serial port
1845 * @port: the port to write the message
1846 * @s: array of characters
1847 * @count: number of characters in string to write
Peter Hurley10afbe32015-04-11 10:05:07 -04001848 * @putchar: function to write character to port
Russell Kingd3587882006-03-20 20:00:09 +00001849 */
1850void uart_console_write(struct uart_port *port, const char *s,
1851 unsigned int count,
1852 void (*putchar)(struct uart_port *, int))
1853{
1854 unsigned int i;
1855
1856 for (i = 0; i < count; i++, s++) {
1857 if (*s == '\n')
1858 putchar(port, '\r');
1859 putchar(port, *s);
1860 }
1861}
1862EXPORT_SYMBOL_GPL(uart_console_write);
1863
1864/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001865 * Check whether an invalid uart number has been specified, and
1866 * if so, search for the first available port that does have
1867 * console support.
1868 */
1869struct uart_port * __init
1870uart_get_console(struct uart_port *ports, int nr, struct console *co)
1871{
1872 int idx = co->index;
1873
1874 if (idx < 0 || idx >= nr || (ports[idx].iobase == 0 &&
1875 ports[idx].membase == NULL))
1876 for (idx = 0; idx < nr; idx++)
1877 if (ports[idx].iobase != 0 ||
1878 ports[idx].membase != NULL)
1879 break;
1880
1881 co->index = idx;
1882
1883 return ports + idx;
1884}
1885
1886/**
Peter Hurley73abaf82015-03-01 11:05:46 -05001887 * uart_parse_earlycon - Parse earlycon options
1888 * @p: ptr to 2nd field (ie., just beyond '<name>,')
1889 * @iotype: ptr for decoded iotype (out)
1890 * @addr: ptr for decoded mapbase/iobase (out)
1891 * @options: ptr for <options> field; NULL if not present (out)
1892 *
1893 * Decodes earlycon kernel command line parameters of the form
Masahiro Yamadabd94c402015-10-28 12:46:05 +09001894 * earlycon=<name>,io|mmio|mmio16|mmio32|mmio32be|mmio32native,<addr>,<options>
1895 * console=<name>,io|mmio|mmio16|mmio32|mmio32be|mmio32native,<addr>,<options>
Peter Hurley73abaf82015-03-01 11:05:46 -05001896 *
1897 * The optional form
1898 * earlycon=<name>,0x<addr>,<options>
1899 * console=<name>,0x<addr>,<options>
1900 * is also accepted; the returned @iotype will be UPIO_MEM.
1901 *
Alexander Sverdlin8b2303d2016-09-12 13:29:29 +02001902 * Returns 0 on success or -EINVAL on failure
Peter Hurley73abaf82015-03-01 11:05:46 -05001903 */
Alexander Sverdlin46e36682016-09-02 13:20:21 +02001904int uart_parse_earlycon(char *p, unsigned char *iotype, resource_size_t *addr,
Peter Hurley73abaf82015-03-01 11:05:46 -05001905 char **options)
1906{
1907 if (strncmp(p, "mmio,", 5) == 0) {
1908 *iotype = UPIO_MEM;
1909 p += 5;
Masahiro Yamadabd94c402015-10-28 12:46:05 +09001910 } else if (strncmp(p, "mmio16,", 7) == 0) {
1911 *iotype = UPIO_MEM16;
1912 p += 7;
Peter Hurley73abaf82015-03-01 11:05:46 -05001913 } else if (strncmp(p, "mmio32,", 7) == 0) {
1914 *iotype = UPIO_MEM32;
1915 p += 7;
Noam Camus6e63be32015-05-25 06:54:28 +03001916 } else if (strncmp(p, "mmio32be,", 9) == 0) {
1917 *iotype = UPIO_MEM32BE;
1918 p += 9;
Max Filippovd215d802015-09-22 15:20:32 +03001919 } else if (strncmp(p, "mmio32native,", 13) == 0) {
1920 *iotype = IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) ?
1921 UPIO_MEM32BE : UPIO_MEM32;
1922 p += 13;
Peter Hurley73abaf82015-03-01 11:05:46 -05001923 } else if (strncmp(p, "io,", 3) == 0) {
1924 *iotype = UPIO_PORT;
1925 p += 3;
1926 } else if (strncmp(p, "0x", 2) == 0) {
1927 *iotype = UPIO_MEM;
1928 } else {
1929 return -EINVAL;
1930 }
1931
Alexander Sverdlin8b2303d2016-09-12 13:29:29 +02001932 /*
1933 * Before you replace it with kstrtoull(), think about options separator
1934 * (',') it will not tolerate
1935 */
1936 *addr = simple_strtoull(p, NULL, 0);
Peter Hurley73abaf82015-03-01 11:05:46 -05001937 p = strchr(p, ',');
1938 if (p)
1939 p++;
1940
1941 *options = p;
1942 return 0;
1943}
1944EXPORT_SYMBOL_GPL(uart_parse_earlycon);
1945
1946/**
Geert Uytterhoeven02088ca2014-03-11 11:23:35 +01001947 * uart_parse_options - Parse serial port baud/parity/bits/flow control.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001948 * @options: pointer to option string
1949 * @baud: pointer to an 'int' variable for the baud rate.
1950 * @parity: pointer to an 'int' variable for the parity.
1951 * @bits: pointer to an 'int' variable for the number of data bits.
1952 * @flow: pointer to an 'int' variable for the flow control character.
1953 *
1954 * uart_parse_options decodes a string containing the serial console
1955 * options. The format of the string is <baud><parity><bits><flow>,
1956 * eg: 115200n8r
1957 */
Jason Wesself2d937f2008-04-17 20:05:37 +02001958void
Linus Torvalds1da177e2005-04-16 15:20:36 -07001959uart_parse_options(char *options, int *baud, int *parity, int *bits, int *flow)
1960{
1961 char *s = options;
1962
1963 *baud = simple_strtoul(s, NULL, 10);
1964 while (*s >= '0' && *s <= '9')
1965 s++;
1966 if (*s)
1967 *parity = *s++;
1968 if (*s)
1969 *bits = *s++ - '0';
1970 if (*s)
1971 *flow = *s;
1972}
Jason Wesself2d937f2008-04-17 20:05:37 +02001973EXPORT_SYMBOL_GPL(uart_parse_options);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001974
Linus Torvalds1da177e2005-04-16 15:20:36 -07001975/**
1976 * uart_set_options - setup the serial console parameters
1977 * @port: pointer to the serial ports uart_port structure
1978 * @co: console pointer
1979 * @baud: baud rate
1980 * @parity: parity character - 'n' (none), 'o' (odd), 'e' (even)
1981 * @bits: number of data bits
1982 * @flow: flow control character - 'r' (rts)
1983 */
Jason Wesself2d937f2008-04-17 20:05:37 +02001984int
Linus Torvalds1da177e2005-04-16 15:20:36 -07001985uart_set_options(struct uart_port *port, struct console *co,
1986 int baud, int parity, int bits, int flow)
1987{
Alan Cox606d0992006-12-08 02:38:45 -08001988 struct ktermios termios;
Alan Cox149b36e2007-10-18 01:24:16 -07001989 static struct ktermios dummy;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001990
Russell King976ecd12005-07-03 21:05:45 +01001991 /*
1992 * Ensure that the serial console lock is initialised
1993 * early.
Randy Witt42b6a1b2013-10-17 16:56:47 -04001994 * If this port is a console, then the spinlock is already
1995 * initialised.
Russell King976ecd12005-07-03 21:05:45 +01001996 */
Randy Witt42b6a1b2013-10-17 16:56:47 -04001997 if (!(uart_console(port) && (port->cons->flags & CON_ENABLED))) {
1998 spin_lock_init(&port->lock);
1999 lockdep_set_class(&port->lock, &port_lock_key);
2000 }
Russell King976ecd12005-07-03 21:05:45 +01002001
Alan Cox606d0992006-12-08 02:38:45 -08002002 memset(&termios, 0, sizeof(struct ktermios));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002003
Jeffy Chenba47f972016-01-04 15:54:46 +08002004 termios.c_cflag |= CREAD | HUPCL | CLOCAL;
2005 tty_termios_encode_baud_rate(&termios, baud, baud);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002006
2007 if (bits == 7)
2008 termios.c_cflag |= CS7;
2009 else
2010 termios.c_cflag |= CS8;
2011
2012 switch (parity) {
2013 case 'o': case 'O':
2014 termios.c_cflag |= PARODD;
2015 /*fall through*/
2016 case 'e': case 'E':
2017 termios.c_cflag |= PARENB;
2018 break;
2019 }
2020
2021 if (flow == 'r')
2022 termios.c_cflag |= CRTSCTS;
2023
Yinghai Lu79492682007-07-15 23:37:25 -07002024 /*
2025 * some uarts on other side don't support no flow control.
2026 * So we set * DTR in host uart to make them happy
2027 */
2028 port->mctrl |= TIOCM_DTR;
2029
Alan Cox149b36e2007-10-18 01:24:16 -07002030 port->ops->set_termios(port, &termios, &dummy);
Jason Wesself2d937f2008-04-17 20:05:37 +02002031 /*
2032 * Allow the setting of the UART parameters with a NULL console
2033 * too:
2034 */
2035 if (co)
2036 co->cflag = termios.c_cflag;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002037
2038 return 0;
2039}
Jason Wesself2d937f2008-04-17 20:05:37 +02002040EXPORT_SYMBOL_GPL(uart_set_options);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002041#endif /* CONFIG_SERIAL_CORE_CONSOLE */
2042
Jiri Slabycf755252011-11-09 21:33:47 +01002043/**
2044 * uart_change_pm - set power state of the port
2045 *
2046 * @state: port descriptor
2047 * @pm_state: new state
2048 *
2049 * Locking: port->mutex has to be held
2050 */
Linus Walleij6f538fe2012-12-07 11:36:08 +01002051static void uart_change_pm(struct uart_state *state,
2052 enum uart_pm_state pm_state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002053{
Peter Hurley4047b372016-04-09 18:56:33 -07002054 struct uart_port *port = uart_port_check(state);
Andrew Victor1281e362006-05-16 11:28:49 +01002055
2056 if (state->pm_state != pm_state) {
Peter Hurley4047b372016-04-09 18:56:33 -07002057 if (port && port->ops->pm)
Andrew Victor1281e362006-05-16 11:28:49 +01002058 port->ops->pm(port, pm_state, state->pm_state);
2059 state->pm_state = pm_state;
2060 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002061}
2062
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002063struct uart_match {
2064 struct uart_port *port;
2065 struct uart_driver *driver;
2066};
2067
2068static int serial_match_port(struct device *dev, void *data)
2069{
2070 struct uart_match *match = data;
Guennadi Liakhovetski7ca796f2008-07-04 09:59:28 -07002071 struct tty_driver *tty_drv = match->driver->tty_driver;
2072 dev_t devt = MKDEV(tty_drv->major, tty_drv->minor_start) +
2073 match->port->line;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002074
2075 return dev->devt == devt; /* Actually, only one tty per port */
2076}
2077
Alan Coxccce6de2009-09-19 13:13:30 -07002078int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002079{
Alan Coxccce6de2009-09-19 13:13:30 -07002080 struct uart_state *state = drv->state + uport->line;
2081 struct tty_port *port = &state->port;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002082 struct device *tty_dev;
Alan Coxccce6de2009-09-19 13:13:30 -07002083 struct uart_match match = {uport, drv};
Linus Torvalds1da177e2005-04-16 15:20:36 -07002084
Alan Coxa2bceae2009-09-19 13:13:31 -07002085 mutex_lock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002086
Alan Coxccce6de2009-09-19 13:13:30 -07002087 tty_dev = device_find_child(uport->dev, &match, serial_match_port);
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002088 if (device_may_wakeup(tty_dev)) {
Govindraj.R3f960db2010-12-16 18:12:47 +05302089 if (!enable_irq_wake(uport->irq))
2090 uport->irq_wake = 1;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002091 put_device(tty_dev);
Alan Coxa2bceae2009-09-19 13:13:31 -07002092 mutex_unlock(&port->mutex);
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002093 return 0;
2094 }
Federico Vaga5a65dcc2013-04-15 16:01:07 +02002095 put_device(tty_dev);
2096
Peter Hurleyb164c972015-01-22 12:24:25 -05002097 /* Nothing to do if the console is not suspending */
2098 if (!console_suspend_enabled && uart_console(uport))
2099 goto unlock;
2100
2101 uport->suspended = 1;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002102
Peter Hurleyd41861c2016-04-09 17:53:25 -07002103 if (tty_port_initialized(port)) {
Alan Coxccce6de2009-09-19 13:13:30 -07002104 const struct uart_ops *ops = uport->ops;
Russell Kingc8c6bfa2008-02-04 22:27:52 -08002105 int tries;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002106
Peter Hurley80f02d52016-04-09 17:53:24 -07002107 tty_port_set_suspended(port, 1);
Peter Hurleyd41861c2016-04-09 17:53:25 -07002108 tty_port_set_initialized(port, 0);
Russell Kinga6b93a92006-10-01 17:17:40 +01002109
Peter Hurleyb164c972015-01-22 12:24:25 -05002110 spin_lock_irq(&uport->lock);
2111 ops->stop_tx(uport);
2112 ops->set_mctrl(uport, 0);
2113 ops->stop_rx(uport);
2114 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002115
2116 /*
2117 * Wait for the transmitter to empty.
2118 */
Alan Coxccce6de2009-09-19 13:13:30 -07002119 for (tries = 3; !ops->tx_empty(uport) && tries; tries--)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002120 msleep(10);
Russell Kingc8c6bfa2008-02-04 22:27:52 -08002121 if (!tries)
Sudip Mukherjee2f2dafe2014-09-01 20:49:43 +05302122 dev_err(uport->dev, "%s%d: Unable to drain transmitter\n",
2123 drv->dev_name,
2124 drv->tty_driver->name_base + uport->line);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002125
Peter Hurleyb164c972015-01-22 12:24:25 -05002126 ops->shutdown(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002127 }
2128
2129 /*
2130 * Disable the console device before suspending.
2131 */
Peter Hurleyb164c972015-01-22 12:24:25 -05002132 if (uart_console(uport))
Alan Coxccce6de2009-09-19 13:13:30 -07002133 console_stop(uport->cons);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002134
Peter Hurleyb164c972015-01-22 12:24:25 -05002135 uart_change_pm(state, UART_PM_STATE_OFF);
2136unlock:
Alan Coxa2bceae2009-09-19 13:13:31 -07002137 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002138
2139 return 0;
2140}
2141
Alan Coxccce6de2009-09-19 13:13:30 -07002142int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002143{
Alan Coxccce6de2009-09-19 13:13:30 -07002144 struct uart_state *state = drv->state + uport->line;
2145 struct tty_port *port = &state->port;
Arjan van de Ven03a74dc2008-05-23 13:04:49 -07002146 struct device *tty_dev;
Alan Coxccce6de2009-09-19 13:13:30 -07002147 struct uart_match match = {uport, drv};
Deepak Saxenaba15ab02009-09-19 13:13:33 -07002148 struct ktermios termios;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002149
Alan Coxa2bceae2009-09-19 13:13:31 -07002150 mutex_lock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002151
Alan Coxccce6de2009-09-19 13:13:30 -07002152 tty_dev = device_find_child(uport->dev, &match, serial_match_port);
2153 if (!uport->suspended && device_may_wakeup(tty_dev)) {
Govindraj.R3f960db2010-12-16 18:12:47 +05302154 if (uport->irq_wake) {
2155 disable_irq_wake(uport->irq);
2156 uport->irq_wake = 0;
2157 }
Federico Vaga5a65dcc2013-04-15 16:01:07 +02002158 put_device(tty_dev);
Alan Coxa2bceae2009-09-19 13:13:31 -07002159 mutex_unlock(&port->mutex);
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002160 return 0;
2161 }
Federico Vaga5a65dcc2013-04-15 16:01:07 +02002162 put_device(tty_dev);
Alan Coxccce6de2009-09-19 13:13:30 -07002163 uport->suspended = 0;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002164
Linus Torvalds1da177e2005-04-16 15:20:36 -07002165 /*
2166 * Re-enable the console device after suspending.
2167 */
Yin Kangkai5933a162011-01-30 11:15:30 +08002168 if (uart_console(uport)) {
Jason Wang891b9dd2010-08-21 15:14:42 +08002169 /*
2170 * First try to use the console cflag setting.
2171 */
2172 memset(&termios, 0, sizeof(struct ktermios));
2173 termios.c_cflag = uport->cons->cflag;
2174
2175 /*
2176 * If that's unset, use the tty termios setting.
2177 */
Alan Coxadc8d742012-07-14 15:31:47 +01002178 if (port->tty && termios.c_cflag == 0)
2179 termios = port->tty->termios;
Jason Wang891b9dd2010-08-21 15:14:42 +08002180
Ning Jiang94abc562011-09-05 16:28:18 +08002181 if (console_suspend_enabled)
Linus Walleij6f538fe2012-12-07 11:36:08 +01002182 uart_change_pm(state, UART_PM_STATE_ON);
Alan Coxccce6de2009-09-19 13:13:30 -07002183 uport->ops->set_termios(uport, &termios, NULL);
Yin Kangkai5933a162011-01-30 11:15:30 +08002184 if (console_suspend_enabled)
2185 console_start(uport->cons);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002186 }
2187
Peter Hurley80f02d52016-04-09 17:53:24 -07002188 if (tty_port_suspended(port)) {
Alan Coxccce6de2009-09-19 13:13:30 -07002189 const struct uart_ops *ops = uport->ops;
Russell Kingee31b332005-11-13 15:28:51 +00002190 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002191
Linus Walleij6f538fe2012-12-07 11:36:08 +01002192 uart_change_pm(state, UART_PM_STATE_ON);
Alan Coxccce6de2009-09-19 13:13:30 -07002193 spin_lock_irq(&uport->lock);
2194 ops->set_mctrl(uport, 0);
2195 spin_unlock_irq(&uport->lock);
Stanislav Brabec4547be72009-12-02 16:20:56 +01002196 if (console_suspend_enabled || !uart_console(uport)) {
Alan Cox19225132010-06-01 22:52:51 +02002197 /* Protected by port mutex for now */
2198 struct tty_struct *tty = port->tty;
Stanislav Brabec4547be72009-12-02 16:20:56 +01002199 ret = ops->startup(uport);
2200 if (ret == 0) {
Alan Cox19225132010-06-01 22:52:51 +02002201 if (tty)
2202 uart_change_speed(tty, state, NULL);
Stanislav Brabec4547be72009-12-02 16:20:56 +01002203 spin_lock_irq(&uport->lock);
2204 ops->set_mctrl(uport, uport->mctrl);
2205 ops->start_tx(uport);
2206 spin_unlock_irq(&uport->lock);
Peter Hurleyd41861c2016-04-09 17:53:25 -07002207 tty_port_set_initialized(port, 1);
Stanislav Brabec4547be72009-12-02 16:20:56 +01002208 } else {
2209 /*
2210 * Failed to resume - maybe hardware went away?
2211 * Clear the "initialized" flag so we won't try
2212 * to call the low level drivers shutdown method.
2213 */
Alan Cox19225132010-06-01 22:52:51 +02002214 uart_shutdown(tty, state);
Stanislav Brabec4547be72009-12-02 16:20:56 +01002215 }
Russell Kingee31b332005-11-13 15:28:51 +00002216 }
Russell Kinga6b93a92006-10-01 17:17:40 +01002217
Peter Hurley80f02d52016-04-09 17:53:24 -07002218 tty_port_set_suspended(port, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002219 }
2220
Alan Coxa2bceae2009-09-19 13:13:31 -07002221 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002222
2223 return 0;
2224}
2225
2226static inline void
2227uart_report_port(struct uart_driver *drv, struct uart_port *port)
2228{
Russell King30b7a3b2005-09-03 15:30:21 +01002229 char address[64];
2230
Linus Torvalds1da177e2005-04-16 15:20:36 -07002231 switch (port->iotype) {
2232 case UPIO_PORT:
Andrew Morton9bde10a2008-10-13 10:35:42 +01002233 snprintf(address, sizeof(address), "I/O 0x%lx", port->iobase);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002234 break;
2235 case UPIO_HUB6:
Russell King30b7a3b2005-09-03 15:30:21 +01002236 snprintf(address, sizeof(address),
Andrew Morton9bde10a2008-10-13 10:35:42 +01002237 "I/O 0x%lx offset 0x%x", port->iobase, port->hub6);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002238 break;
2239 case UPIO_MEM:
Masahiro Yamadabd94c402015-10-28 12:46:05 +09002240 case UPIO_MEM16:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002241 case UPIO_MEM32:
Kevin Cernekee3ffb1a82014-11-12 12:53:59 -08002242 case UPIO_MEM32BE:
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00002243 case UPIO_AU:
Zang Roy-r619113be91ec2006-06-30 02:29:58 -07002244 case UPIO_TSI:
Russell King30b7a3b2005-09-03 15:30:21 +01002245 snprintf(address, sizeof(address),
Josh Boyer4f640ef2007-07-23 18:43:44 -07002246 "MMIO 0x%llx", (unsigned long long)port->mapbase);
Russell King30b7a3b2005-09-03 15:30:21 +01002247 break;
2248 default:
2249 strlcpy(address, "*unknown*", sizeof(address));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002250 break;
2251 }
Russell King30b7a3b2005-09-03 15:30:21 +01002252
James Bottomley68ed7e12015-01-02 10:05:13 -08002253 printk(KERN_INFO "%s%s%s%d at %s (irq = %d, base_baud = %d) is a %s\n",
2254 port->dev ? dev_name(port->dev) : "",
2255 port->dev ? ": " : "",
David S. Miller84408382008-10-13 10:45:26 +01002256 drv->dev_name,
2257 drv->tty_driver->name_base + port->line,
Kees Cook7d12b972013-07-12 13:07:39 -07002258 address, port->irq, port->uartclk / 16, uart_type(port));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002259}
2260
2261static void
2262uart_configure_port(struct uart_driver *drv, struct uart_state *state,
2263 struct uart_port *port)
2264{
2265 unsigned int flags;
2266
2267 /*
2268 * If there isn't a port here, don't do anything further.
2269 */
2270 if (!port->iobase && !port->mapbase && !port->membase)
2271 return;
2272
2273 /*
2274 * Now do the auto configuration stuff. Note that config_port
2275 * is expected to claim the resources and map the port for us.
2276 */
David Daney8e23fcc2009-01-02 13:49:54 +00002277 flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002278 if (port->flags & UPF_AUTO_IRQ)
2279 flags |= UART_CONFIG_IRQ;
2280 if (port->flags & UPF_BOOT_AUTOCONF) {
David Daney8e23fcc2009-01-02 13:49:54 +00002281 if (!(port->flags & UPF_FIXED_TYPE)) {
2282 port->type = PORT_UNKNOWN;
2283 flags |= UART_CONFIG_TYPE;
2284 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002285 port->ops->config_port(port, flags);
2286 }
2287
2288 if (port->type != PORT_UNKNOWN) {
2289 unsigned long flags;
2290
2291 uart_report_port(drv, port);
2292
George G. Davis3689a0e2007-02-14 00:33:06 -08002293 /* Power up port for set_mctrl() */
Linus Walleij6f538fe2012-12-07 11:36:08 +01002294 uart_change_pm(state, UART_PM_STATE_ON);
George G. Davis3689a0e2007-02-14 00:33:06 -08002295
Linus Torvalds1da177e2005-04-16 15:20:36 -07002296 /*
2297 * Ensure that the modem control lines are de-activated.
Yinghai Luc3e46422008-02-04 22:27:46 -08002298 * keep the DTR setting that is set in uart_set_options()
Linus Torvalds1da177e2005-04-16 15:20:36 -07002299 * We probably don't need a spinlock around this, but
2300 */
2301 spin_lock_irqsave(&port->lock, flags);
Yinghai Luc3e46422008-02-04 22:27:46 -08002302 port->ops->set_mctrl(port, port->mctrl & TIOCM_DTR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002303 spin_unlock_irqrestore(&port->lock, flags);
2304
2305 /*
Russell King97d97222007-09-01 21:25:09 +01002306 * If this driver supports console, and it hasn't been
2307 * successfully registered yet, try to re-register it.
2308 * It may be that the port was not available.
2309 */
2310 if (port->cons && !(port->cons->flags & CON_ENABLED))
2311 register_console(port->cons);
2312
2313 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002314 * Power down all ports by default, except the
2315 * console if we have one.
2316 */
2317 if (!uart_console(port))
Linus Walleij6f538fe2012-12-07 11:36:08 +01002318 uart_change_pm(state, UART_PM_STATE_OFF);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002319 }
2320}
2321
Jason Wesself2d937f2008-04-17 20:05:37 +02002322#ifdef CONFIG_CONSOLE_POLL
2323
2324static int uart_poll_init(struct tty_driver *driver, int line, char *options)
2325{
2326 struct uart_driver *drv = driver->driver_state;
2327 struct uart_state *state = drv->state + line;
Peter Hurley49c02302016-04-09 18:56:32 -07002328 struct tty_port *tport;
Jason Wesself2d937f2008-04-17 20:05:37 +02002329 struct uart_port *port;
2330 int baud = 9600;
2331 int bits = 8;
2332 int parity = 'n';
2333 int flow = 'n';
Peter Hurley49c02302016-04-09 18:56:32 -07002334 int ret = 0;
Jason Wesself2d937f2008-04-17 20:05:37 +02002335
Peter Hurley49c02302016-04-09 18:56:32 -07002336 if (!state)
Jason Wesself2d937f2008-04-17 20:05:37 +02002337 return -1;
2338
Peter Hurley49c02302016-04-09 18:56:32 -07002339 tport = &state->port;
2340 mutex_lock(&tport->mutex);
2341
Peter Hurley4047b372016-04-09 18:56:33 -07002342 port = uart_port_check(state);
2343 if (!port || !(port->ops->poll_get_char && port->ops->poll_put_char)) {
Peter Hurley49c02302016-04-09 18:56:32 -07002344 ret = -1;
2345 goto out;
2346 }
Jason Wesself2d937f2008-04-17 20:05:37 +02002347
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002348 if (port->ops->poll_init) {
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002349 /*
Peter Hurleyd41861c2016-04-09 17:53:25 -07002350 * We don't set initialized as we only initialized the hw,
2351 * e.g. state->xmit is still uninitialized.
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002352 */
Peter Hurleyd41861c2016-04-09 17:53:25 -07002353 if (!tty_port_initialized(tport))
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002354 ret = port->ops->poll_init(port);
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002355 }
2356
Peter Hurley49c02302016-04-09 18:56:32 -07002357 if (!ret && options) {
Jason Wesself2d937f2008-04-17 20:05:37 +02002358 uart_parse_options(options, &baud, &parity, &bits, &flow);
Peter Hurley49c02302016-04-09 18:56:32 -07002359 ret = uart_set_options(port, NULL, baud, parity, bits, flow);
Jason Wesself2d937f2008-04-17 20:05:37 +02002360 }
Peter Hurley49c02302016-04-09 18:56:32 -07002361out:
2362 mutex_unlock(&tport->mutex);
2363 return ret;
Jason Wesself2d937f2008-04-17 20:05:37 +02002364}
2365
2366static int uart_poll_get_char(struct tty_driver *driver, int line)
2367{
2368 struct uart_driver *drv = driver->driver_state;
2369 struct uart_state *state = drv->state + line;
2370 struct uart_port *port;
Peter Hurley9ed19422016-04-09 18:56:34 -07002371 int ret = -1;
Jason Wesself2d937f2008-04-17 20:05:37 +02002372
Peter Hurley9ed19422016-04-09 18:56:34 -07002373 if (state) {
2374 port = uart_port_ref(state);
2375 if (port)
2376 ret = port->ops->poll_get_char(port);
2377 uart_port_deref(port);
2378 }
2379 return ret;
Jason Wesself2d937f2008-04-17 20:05:37 +02002380}
2381
2382static void uart_poll_put_char(struct tty_driver *driver, int line, char ch)
2383{
2384 struct uart_driver *drv = driver->driver_state;
2385 struct uart_state *state = drv->state + line;
2386 struct uart_port *port;
2387
Peter Hurley9ed19422016-04-09 18:56:34 -07002388 if (!state)
Jason Wesself2d937f2008-04-17 20:05:37 +02002389 return;
2390
Peter Hurley9ed19422016-04-09 18:56:34 -07002391 port = uart_port_ref(state);
2392 if (!port)
2393 return;
Doug Andersonc7d44a02014-04-21 10:06:43 -07002394
2395 if (ch == '\n')
2396 port->ops->poll_put_char(port, '\r');
Jason Wesself2d937f2008-04-17 20:05:37 +02002397 port->ops->poll_put_char(port, ch);
Peter Hurley9ed19422016-04-09 18:56:34 -07002398 uart_port_deref(port);
Jason Wesself2d937f2008-04-17 20:05:37 +02002399}
2400#endif
2401
Jeff Dikeb68e31d2006-10-02 02:17:18 -07002402static const struct tty_operations uart_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002403 .open = uart_open,
2404 .close = uart_close,
2405 .write = uart_write,
2406 .put_char = uart_put_char,
2407 .flush_chars = uart_flush_chars,
2408 .write_room = uart_write_room,
2409 .chars_in_buffer= uart_chars_in_buffer,
2410 .flush_buffer = uart_flush_buffer,
2411 .ioctl = uart_ioctl,
2412 .throttle = uart_throttle,
2413 .unthrottle = uart_unthrottle,
2414 .send_xchar = uart_send_xchar,
2415 .set_termios = uart_set_termios,
Alan Cox64e91592008-06-03 15:18:54 +01002416 .set_ldisc = uart_set_ldisc,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002417 .stop = uart_stop,
2418 .start = uart_start,
2419 .hangup = uart_hangup,
2420 .break_ctl = uart_break_ctl,
2421 .wait_until_sent= uart_wait_until_sent,
2422#ifdef CONFIG_PROC_FS
Alexey Dobriyand196a942009-03-31 15:19:21 -07002423 .proc_fops = &uart_proc_fops,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002424#endif
2425 .tiocmget = uart_tiocmget,
2426 .tiocmset = uart_tiocmset,
Alan Coxd281da72010-09-16 18:21:24 +01002427 .get_icount = uart_get_icount,
Jason Wesself2d937f2008-04-17 20:05:37 +02002428#ifdef CONFIG_CONSOLE_POLL
2429 .poll_init = uart_poll_init,
2430 .poll_get_char = uart_poll_get_char,
2431 .poll_put_char = uart_poll_put_char,
2432#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07002433};
2434
Alan Coxde0c8cb2010-06-01 22:52:58 +02002435static const struct tty_port_operations uart_port_ops = {
2436 .carrier_raised = uart_carrier_raised,
2437 .dtr_rts = uart_dtr_rts,
Rob Herringb3b57642016-08-22 17:39:09 -05002438 .activate = uart_port_activate,
Rob Herring761ed4a2016-08-22 17:39:10 -05002439 .shutdown = uart_tty_port_shutdown,
Alan Coxde0c8cb2010-06-01 22:52:58 +02002440};
2441
Linus Torvalds1da177e2005-04-16 15:20:36 -07002442/**
2443 * uart_register_driver - register a driver with the uart core layer
2444 * @drv: low level driver structure
2445 *
2446 * Register a uart driver with the core driver. We in turn register
2447 * with the tty layer, and initialise the core driver per-port state.
2448 *
2449 * We have a proc file in /proc/tty/driver which is named after the
2450 * normal driver.
2451 *
2452 * drv->port should be NULL, and the per-port structures should be
2453 * registered using uart_add_one_port after this call has succeeded.
2454 */
2455int uart_register_driver(struct uart_driver *drv)
2456{
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002457 struct tty_driver *normal;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002458 int i, retval;
2459
2460 BUG_ON(drv->state);
2461
2462 /*
2463 * Maybe we should be using a slab cache for this, especially if
2464 * we have a large number of ports to handle.
2465 */
Burman Yan8f31bb32007-02-14 00:33:07 -08002466 drv->state = kzalloc(sizeof(struct uart_state) * drv->nr, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002467 if (!drv->state)
2468 goto out;
2469
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002470 normal = alloc_tty_driver(drv->nr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002471 if (!normal)
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002472 goto out_kfree;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002473
2474 drv->tty_driver = normal;
2475
Linus Torvalds1da177e2005-04-16 15:20:36 -07002476 normal->driver_name = drv->driver_name;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002477 normal->name = drv->dev_name;
2478 normal->major = drv->major;
2479 normal->minor_start = drv->minor;
2480 normal->type = TTY_DRIVER_TYPE_SERIAL;
2481 normal->subtype = SERIAL_TYPE_NORMAL;
2482 normal->init_termios = tty_std_termios;
2483 normal->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
Alan Cox606d0992006-12-08 02:38:45 -08002484 normal->init_termios.c_ispeed = normal->init_termios.c_ospeed = 9600;
Greg Kroah-Hartman331b8312005-06-20 21:15:16 -07002485 normal->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002486 normal->driver_state = drv;
2487 tty_set_operations(normal, &uart_ops);
2488
2489 /*
2490 * Initialise the UART state(s).
2491 */
2492 for (i = 0; i < drv->nr; i++) {
2493 struct uart_state *state = drv->state + i;
Alan Coxa2bceae2009-09-19 13:13:31 -07002494 struct tty_port *port = &state->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002495
Alan Coxa2bceae2009-09-19 13:13:31 -07002496 tty_port_init(port);
Alan Coxde0c8cb2010-06-01 22:52:58 +02002497 port->ops = &uart_port_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002498 }
2499
2500 retval = tty_register_driver(normal);
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002501 if (retval >= 0)
2502 return retval;
2503
Jiri Slaby191c5f12012-11-15 09:49:56 +01002504 for (i = 0; i < drv->nr; i++)
2505 tty_port_destroy(&drv->state[i].port);
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002506 put_tty_driver(normal);
2507out_kfree:
2508 kfree(drv->state);
2509out:
2510 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002511}
2512
2513/**
2514 * uart_unregister_driver - remove a driver from the uart core layer
2515 * @drv: low level driver structure
2516 *
2517 * Remove all references to a driver from the core driver. The low
2518 * level driver must have removed all its ports via the
2519 * uart_remove_one_port() if it registered them with uart_add_one_port().
2520 * (ie, drv->port == NULL)
2521 */
2522void uart_unregister_driver(struct uart_driver *drv)
2523{
2524 struct tty_driver *p = drv->tty_driver;
Jiri Slaby191c5f12012-11-15 09:49:56 +01002525 unsigned int i;
2526
Linus Torvalds1da177e2005-04-16 15:20:36 -07002527 tty_unregister_driver(p);
2528 put_tty_driver(p);
Jiri Slaby191c5f12012-11-15 09:49:56 +01002529 for (i = 0; i < drv->nr; i++)
2530 tty_port_destroy(&drv->state[i].port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002531 kfree(drv->state);
Alan Cox1e66cded2012-05-14 14:51:22 +01002532 drv->state = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002533 drv->tty_driver = NULL;
2534}
2535
2536struct tty_driver *uart_console_device(struct console *co, int *index)
2537{
2538 struct uart_driver *p = co->data;
2539 *index = co->index;
2540 return p->tty_driver;
2541}
2542
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002543static ssize_t uart_get_attr_uartclk(struct device *dev,
2544 struct device_attribute *attr, char *buf)
2545{
Alan Coxbebe73e2012-10-29 15:19:57 +00002546 struct serial_struct tmp;
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002547 struct tty_port *port = dev_get_drvdata(dev);
Tomas Hlavacekb1b79912012-09-06 23:17:47 +02002548
Alan Cox9f109692012-10-29 15:20:25 +00002549 uart_get_info(port, &tmp);
Alan Coxbebe73e2012-10-29 15:19:57 +00002550 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.baud_base * 16);
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002551}
2552
Alan Cox373bac42012-10-29 15:20:40 +00002553static ssize_t uart_get_attr_type(struct device *dev,
2554 struct device_attribute *attr, char *buf)
2555{
2556 struct serial_struct tmp;
2557 struct tty_port *port = dev_get_drvdata(dev);
2558
2559 uart_get_info(port, &tmp);
2560 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.type);
2561}
2562static ssize_t uart_get_attr_line(struct device *dev,
2563 struct device_attribute *attr, char *buf)
2564{
2565 struct serial_struct tmp;
2566 struct tty_port *port = dev_get_drvdata(dev);
2567
2568 uart_get_info(port, &tmp);
2569 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.line);
2570}
2571
2572static ssize_t uart_get_attr_port(struct device *dev,
2573 struct device_attribute *attr, char *buf)
2574{
2575 struct serial_struct tmp;
2576 struct tty_port *port = dev_get_drvdata(dev);
Andrew Mortonfd985e12012-11-26 15:47:15 -08002577 unsigned long ioaddr;
Alan Cox373bac42012-10-29 15:20:40 +00002578
2579 uart_get_info(port, &tmp);
Andrew Mortonfd985e12012-11-26 15:47:15 -08002580 ioaddr = tmp.port;
2581 if (HIGH_BITS_OFFSET)
2582 ioaddr |= (unsigned long)tmp.port_high << HIGH_BITS_OFFSET;
2583 return snprintf(buf, PAGE_SIZE, "0x%lX\n", ioaddr);
Alan Cox373bac42012-10-29 15:20:40 +00002584}
2585
2586static ssize_t uart_get_attr_irq(struct device *dev,
2587 struct device_attribute *attr, char *buf)
2588{
2589 struct serial_struct tmp;
2590 struct tty_port *port = dev_get_drvdata(dev);
2591
2592 uart_get_info(port, &tmp);
2593 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.irq);
2594}
2595
2596static ssize_t uart_get_attr_flags(struct device *dev,
2597 struct device_attribute *attr, char *buf)
2598{
2599 struct serial_struct tmp;
2600 struct tty_port *port = dev_get_drvdata(dev);
2601
2602 uart_get_info(port, &tmp);
2603 return snprintf(buf, PAGE_SIZE, "0x%X\n", tmp.flags);
2604}
2605
2606static ssize_t uart_get_attr_xmit_fifo_size(struct device *dev,
2607 struct device_attribute *attr, char *buf)
2608{
2609 struct serial_struct tmp;
2610 struct tty_port *port = dev_get_drvdata(dev);
2611
2612 uart_get_info(port, &tmp);
2613 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.xmit_fifo_size);
2614}
2615
2616
2617static ssize_t uart_get_attr_close_delay(struct device *dev,
2618 struct device_attribute *attr, char *buf)
2619{
2620 struct serial_struct tmp;
2621 struct tty_port *port = dev_get_drvdata(dev);
2622
2623 uart_get_info(port, &tmp);
2624 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.close_delay);
2625}
2626
2627
2628static ssize_t uart_get_attr_closing_wait(struct device *dev,
2629 struct device_attribute *attr, char *buf)
2630{
2631 struct serial_struct tmp;
2632 struct tty_port *port = dev_get_drvdata(dev);
2633
2634 uart_get_info(port, &tmp);
2635 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.closing_wait);
2636}
2637
2638static ssize_t uart_get_attr_custom_divisor(struct device *dev,
2639 struct device_attribute *attr, char *buf)
2640{
2641 struct serial_struct tmp;
2642 struct tty_port *port = dev_get_drvdata(dev);
2643
2644 uart_get_info(port, &tmp);
2645 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.custom_divisor);
2646}
2647
2648static ssize_t uart_get_attr_io_type(struct device *dev,
2649 struct device_attribute *attr, char *buf)
2650{
2651 struct serial_struct tmp;
2652 struct tty_port *port = dev_get_drvdata(dev);
2653
2654 uart_get_info(port, &tmp);
2655 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.io_type);
2656}
2657
2658static ssize_t uart_get_attr_iomem_base(struct device *dev,
2659 struct device_attribute *attr, char *buf)
2660{
2661 struct serial_struct tmp;
2662 struct tty_port *port = dev_get_drvdata(dev);
2663
2664 uart_get_info(port, &tmp);
2665 return snprintf(buf, PAGE_SIZE, "0x%lX\n", (unsigned long)tmp.iomem_base);
2666}
2667
2668static ssize_t uart_get_attr_iomem_reg_shift(struct device *dev,
2669 struct device_attribute *attr, char *buf)
2670{
2671 struct serial_struct tmp;
2672 struct tty_port *port = dev_get_drvdata(dev);
2673
2674 uart_get_info(port, &tmp);
2675 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.iomem_reg_shift);
2676}
2677
2678static DEVICE_ATTR(type, S_IRUSR | S_IRGRP, uart_get_attr_type, NULL);
2679static DEVICE_ATTR(line, S_IRUSR | S_IRGRP, uart_get_attr_line, NULL);
2680static DEVICE_ATTR(port, S_IRUSR | S_IRGRP, uart_get_attr_port, NULL);
2681static DEVICE_ATTR(irq, S_IRUSR | S_IRGRP, uart_get_attr_irq, NULL);
2682static DEVICE_ATTR(flags, S_IRUSR | S_IRGRP, uart_get_attr_flags, NULL);
2683static DEVICE_ATTR(xmit_fifo_size, S_IRUSR | S_IRGRP, uart_get_attr_xmit_fifo_size, NULL);
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002684static DEVICE_ATTR(uartclk, S_IRUSR | S_IRGRP, uart_get_attr_uartclk, NULL);
Alan Cox373bac42012-10-29 15:20:40 +00002685static DEVICE_ATTR(close_delay, S_IRUSR | S_IRGRP, uart_get_attr_close_delay, NULL);
2686static DEVICE_ATTR(closing_wait, S_IRUSR | S_IRGRP, uart_get_attr_closing_wait, NULL);
2687static DEVICE_ATTR(custom_divisor, S_IRUSR | S_IRGRP, uart_get_attr_custom_divisor, NULL);
2688static DEVICE_ATTR(io_type, S_IRUSR | S_IRGRP, uart_get_attr_io_type, NULL);
2689static DEVICE_ATTR(iomem_base, S_IRUSR | S_IRGRP, uart_get_attr_iomem_base, NULL);
2690static DEVICE_ATTR(iomem_reg_shift, S_IRUSR | S_IRGRP, uart_get_attr_iomem_reg_shift, NULL);
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002691
2692static struct attribute *tty_dev_attrs[] = {
Alan Cox373bac42012-10-29 15:20:40 +00002693 &dev_attr_type.attr,
2694 &dev_attr_line.attr,
2695 &dev_attr_port.attr,
2696 &dev_attr_irq.attr,
2697 &dev_attr_flags.attr,
2698 &dev_attr_xmit_fifo_size.attr,
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002699 &dev_attr_uartclk.attr,
Alan Cox373bac42012-10-29 15:20:40 +00002700 &dev_attr_close_delay.attr,
2701 &dev_attr_closing_wait.attr,
2702 &dev_attr_custom_divisor.attr,
2703 &dev_attr_io_type.attr,
2704 &dev_attr_iomem_base.attr,
2705 &dev_attr_iomem_reg_shift.attr,
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002706 NULL,
2707 };
2708
Tomas Hlavacekb1b79912012-09-06 23:17:47 +02002709static const struct attribute_group tty_dev_attr_group = {
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002710 .attrs = tty_dev_attrs,
2711 };
2712
Linus Torvalds1da177e2005-04-16 15:20:36 -07002713/**
2714 * uart_add_one_port - attach a driver-defined port structure
2715 * @drv: pointer to the uart low level driver structure for this port
Randy Dunlap1b9894f2009-09-21 11:12:03 -07002716 * @uport: uart port structure to use for this port.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002717 *
2718 * This allows the driver to register its own uart_port structure
2719 * with the core driver. The main purpose is to allow the low
2720 * level uart drivers to expand uart_port, rather than having yet
2721 * more levels of structures.
2722 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002723int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002724{
2725 struct uart_state *state;
Alan Coxa2bceae2009-09-19 13:13:31 -07002726 struct tty_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002727 int ret = 0;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002728 struct device *tty_dev;
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002729 int num_groups;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002730
2731 BUG_ON(in_interrupt());
2732
Alan Coxa2bceae2009-09-19 13:13:31 -07002733 if (uport->line >= drv->nr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002734 return -EINVAL;
2735
Alan Coxa2bceae2009-09-19 13:13:31 -07002736 state = drv->state + uport->line;
2737 port = &state->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002738
Arjan van de Venf392ecf2006-01-12 18:44:32 +00002739 mutex_lock(&port_mutex);
Alan Coxa2bceae2009-09-19 13:13:31 -07002740 mutex_lock(&port->mutex);
Alan Coxebd2c8f2009-09-19 13:13:28 -07002741 if (state->uart_port) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002742 ret = -EINVAL;
2743 goto out;
2744 }
2745
Peter Hurley2b702b92014-10-16 16:54:25 -04002746 /* Link the port to the driver state table and vice versa */
Peter Hurley9ed19422016-04-09 18:56:34 -07002747 atomic_set(&state->refcount, 1);
2748 init_waitqueue_head(&state->remove_wait);
Alan Coxa2bceae2009-09-19 13:13:31 -07002749 state->uart_port = uport;
Alan Coxa2bceae2009-09-19 13:13:31 -07002750 uport->state = state;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002751
Peter Hurley2b702b92014-10-16 16:54:25 -04002752 state->pm_state = UART_PM_STATE_UNDEFINED;
2753 uport->cons = drv->cons;
Peter Hurley959801f2015-02-24 14:25:00 -05002754 uport->minor = drv->tty_driver->minor_start + uport->line;
Peter Hurley2b702b92014-10-16 16:54:25 -04002755
Russell King976ecd12005-07-03 21:05:45 +01002756 /*
2757 * If this port is a console, then the spinlock is already
2758 * initialised.
2759 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002760 if (!(uart_console(uport) && (uport->cons->flags & CON_ENABLED))) {
2761 spin_lock_init(&uport->lock);
2762 lockdep_set_class(&uport->lock, &port_lock_key);
Ingo Molnar13e83592006-07-03 00:25:03 -07002763 }
Grant Likelya208ffd2014-03-27 18:29:46 -07002764 if (uport->cons && uport->dev)
2765 of_console_check(uport->dev->of_node, uport->cons->name, uport->line);
Russell King976ecd12005-07-03 21:05:45 +01002766
Alan Coxa2bceae2009-09-19 13:13:31 -07002767 uart_configure_port(drv, state, uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002768
Geert Uytterhoeven4dda8642016-10-28 07:07:47 -05002769 port->console = uart_console(uport);
2770
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002771 num_groups = 2;
2772 if (uport->attr_group)
2773 num_groups++;
2774
Yoshihiro YUNOMAEc2b703b2014-07-23 06:06:22 +00002775 uport->tty_groups = kcalloc(num_groups, sizeof(*uport->tty_groups),
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002776 GFP_KERNEL);
2777 if (!uport->tty_groups) {
2778 ret = -ENOMEM;
2779 goto out;
2780 }
2781 uport->tty_groups[0] = &tty_dev_attr_group;
2782 if (uport->attr_group)
2783 uport->tty_groups[1] = uport->attr_group;
2784
Linus Torvalds1da177e2005-04-16 15:20:36 -07002785 /*
2786 * Register the port whether it's detected or not. This allows
Geert Uytterhoeven015355b2014-03-11 11:23:36 +01002787 * setserial to be used to alter this port's parameters.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002788 */
Tomas Hlavacekb1b79912012-09-06 23:17:47 +02002789 tty_dev = tty_port_register_device_attr(port, drv->tty_driver,
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002790 uport->line, uport->dev, port, uport->tty_groups);
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002791 if (likely(!IS_ERR(tty_dev))) {
Simon Glass77359832012-01-19 11:28:56 -08002792 device_set_wakeup_capable(tty_dev, 1);
2793 } else {
Sudip Mukherjee2f2dafe2014-09-01 20:49:43 +05302794 dev_err(uport->dev, "Cannot register tty device on line %d\n",
Alan Coxa2bceae2009-09-19 13:13:31 -07002795 uport->line);
Simon Glass77359832012-01-19 11:28:56 -08002796 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002797
2798 /*
Russell King68ac64c2006-04-30 11:13:50 +01002799 * Ensure UPF_DEAD is not set.
2800 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002801 uport->flags &= ~UPF_DEAD;
Russell King68ac64c2006-04-30 11:13:50 +01002802
Linus Torvalds1da177e2005-04-16 15:20:36 -07002803 out:
Alan Coxa2bceae2009-09-19 13:13:31 -07002804 mutex_unlock(&port->mutex);
Arjan van de Venf392ecf2006-01-12 18:44:32 +00002805 mutex_unlock(&port_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002806
2807 return ret;
2808}
2809
2810/**
2811 * uart_remove_one_port - detach a driver defined port structure
2812 * @drv: pointer to the uart low level driver structure for this port
Randy Dunlap1b9894f2009-09-21 11:12:03 -07002813 * @uport: uart port structure for this port
Linus Torvalds1da177e2005-04-16 15:20:36 -07002814 *
2815 * This unhooks (and hangs up) the specified port structure from the
2816 * core driver. No further calls will be made to the low-level code
2817 * for this port.
2818 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002819int uart_remove_one_port(struct uart_driver *drv, struct uart_port *uport)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002820{
Alan Coxa2bceae2009-09-19 13:13:31 -07002821 struct uart_state *state = drv->state + uport->line;
2822 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07002823 struct uart_port *uart_port;
Geert Uytterhoeven4c6d5b42014-03-17 14:10:58 +01002824 struct tty_struct *tty;
Chen Gangb342dd52012-12-27 15:51:31 +08002825 int ret = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002826
2827 BUG_ON(in_interrupt());
2828
Arjan van de Venf392ecf2006-01-12 18:44:32 +00002829 mutex_lock(&port_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002830
2831 /*
Russell King68ac64c2006-04-30 11:13:50 +01002832 * Mark the port "dead" - this prevents any opens from
2833 * succeeding while we shut down the port.
2834 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002835 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07002836 uart_port = uart_port_check(state);
2837 if (uart_port != uport)
2838 dev_alert(uport->dev, "Removing wrong port: %p != %p\n",
2839 uart_port, uport);
2840
2841 if (!uart_port) {
Chen Gangb342dd52012-12-27 15:51:31 +08002842 mutex_unlock(&port->mutex);
2843 ret = -EINVAL;
2844 goto out;
2845 }
Alan Coxa2bceae2009-09-19 13:13:31 -07002846 uport->flags |= UPF_DEAD;
2847 mutex_unlock(&port->mutex);
Russell King68ac64c2006-04-30 11:13:50 +01002848
2849 /*
Greg Kroah-Hartmanaa4148c2005-06-20 21:15:16 -07002850 * Remove the devices from the tty layer
Linus Torvalds1da177e2005-04-16 15:20:36 -07002851 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002852 tty_unregister_device(drv->tty_driver, uport->line);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002853
Geert Uytterhoeven4c6d5b42014-03-17 14:10:58 +01002854 tty = tty_port_tty_get(port);
2855 if (tty) {
Alan Coxa2bceae2009-09-19 13:13:31 -07002856 tty_vhangup(port->tty);
Geert Uytterhoeven4c6d5b42014-03-17 14:10:58 +01002857 tty_kref_put(tty);
2858 }
Russell King68ac64c2006-04-30 11:13:50 +01002859
2860 /*
Geert Uytterhoeven5f5c9ae2014-02-28 14:21:32 +01002861 * If the port is used as a console, unregister it
2862 */
2863 if (uart_console(uport))
2864 unregister_console(uport->cons);
2865
2866 /*
Russell King68ac64c2006-04-30 11:13:50 +01002867 * Free the port IO and memory resources, if any.
2868 */
Fabio Estevama7cfaf12016-05-20 01:59:54 -03002869 if (uport->type != PORT_UNKNOWN && uport->ops->release_port)
Alan Coxa2bceae2009-09-19 13:13:31 -07002870 uport->ops->release_port(uport);
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002871 kfree(uport->tty_groups);
Russell King68ac64c2006-04-30 11:13:50 +01002872
2873 /*
2874 * Indicate that there isn't a port here anymore.
2875 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002876 uport->type = PORT_UNKNOWN;
Russell King68ac64c2006-04-30 11:13:50 +01002877
Peter Hurley4047b372016-04-09 18:56:33 -07002878 mutex_lock(&port->mutex);
Peter Hurley9ed19422016-04-09 18:56:34 -07002879 WARN_ON(atomic_dec_return(&state->refcount) < 0);
2880 wait_event(state->remove_wait, !atomic_read(&state->refcount));
Alan Coxebd2c8f2009-09-19 13:13:28 -07002881 state->uart_port = NULL;
Peter Hurley4047b372016-04-09 18:56:33 -07002882 mutex_unlock(&port->mutex);
Chen Gangb342dd52012-12-27 15:51:31 +08002883out:
Arjan van de Venf392ecf2006-01-12 18:44:32 +00002884 mutex_unlock(&port_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002885
Chen Gangb342dd52012-12-27 15:51:31 +08002886 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002887}
2888
2889/*
2890 * Are the two ports equivalent?
2891 */
2892int uart_match_port(struct uart_port *port1, struct uart_port *port2)
2893{
2894 if (port1->iotype != port2->iotype)
2895 return 0;
2896
2897 switch (port1->iotype) {
2898 case UPIO_PORT:
2899 return (port1->iobase == port2->iobase);
2900 case UPIO_HUB6:
2901 return (port1->iobase == port2->iobase) &&
2902 (port1->hub6 == port2->hub6);
2903 case UPIO_MEM:
Masahiro Yamadabd94c402015-10-28 12:46:05 +09002904 case UPIO_MEM16:
Sergei Shtylyovd21b55d2006-08-28 19:49:03 +04002905 case UPIO_MEM32:
Kevin Cernekee3ffb1a82014-11-12 12:53:59 -08002906 case UPIO_MEM32BE:
Sergei Shtylyovd21b55d2006-08-28 19:49:03 +04002907 case UPIO_AU:
2908 case UPIO_TSI:
Benjamin Herrenschmidt1624f002006-01-04 18:09:44 +00002909 return (port1->mapbase == port2->mapbase);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002910 }
2911 return 0;
2912}
2913EXPORT_SYMBOL(uart_match_port);
2914
Jiri Slaby027d7da2011-11-09 21:33:43 +01002915/**
2916 * uart_handle_dcd_change - handle a change of carrier detect state
2917 * @uport: uart_port structure for the open port
2918 * @status: new carrier detect status, nonzero if active
Peter Hurley4d90bb12014-09-10 15:06:23 -04002919 *
2920 * Caller must hold uport->lock
Jiri Slaby027d7da2011-11-09 21:33:43 +01002921 */
2922void uart_handle_dcd_change(struct uart_port *uport, unsigned int status)
2923{
George Spelvin42381572013-02-10 04:44:30 -05002924 struct tty_port *port = &uport->state->port;
Alan Cox43eca0a2012-09-19 15:35:46 +01002925 struct tty_struct *tty = port->tty;
Peter Hurleyc9932572014-09-02 17:39:21 -04002926 struct tty_ldisc *ld;
Jiri Slaby027d7da2011-11-09 21:33:43 +01002927
Peter Hurley4d90bb12014-09-10 15:06:23 -04002928 lockdep_assert_held_once(&uport->lock);
2929
Peter Hurleyc9932572014-09-02 17:39:21 -04002930 if (tty) {
2931 ld = tty_ldisc_ref(tty);
2932 if (ld) {
2933 if (ld->ops->dcd_change)
2934 ld->ops->dcd_change(tty, status);
2935 tty_ldisc_deref(ld);
2936 }
George Spelvin42381572013-02-10 04:44:30 -05002937 }
Jiri Slaby027d7da2011-11-09 21:33:43 +01002938
2939 uport->icount.dcd++;
Jiri Slaby027d7da2011-11-09 21:33:43 +01002940
Peter Hurley299245a2014-09-10 15:06:24 -04002941 if (uart_dcd_enabled(uport)) {
Jiri Slaby027d7da2011-11-09 21:33:43 +01002942 if (status)
2943 wake_up_interruptible(&port->open_wait);
Alan Cox43eca0a2012-09-19 15:35:46 +01002944 else if (tty)
2945 tty_hangup(tty);
Jiri Slaby027d7da2011-11-09 21:33:43 +01002946 }
Jiri Slaby027d7da2011-11-09 21:33:43 +01002947}
2948EXPORT_SYMBOL_GPL(uart_handle_dcd_change);
2949
2950/**
2951 * uart_handle_cts_change - handle a change of clear-to-send state
2952 * @uport: uart_port structure for the open port
2953 * @status: new clear to send status, nonzero if active
Peter Hurley4d90bb12014-09-10 15:06:23 -04002954 *
2955 * Caller must hold uport->lock
Jiri Slaby027d7da2011-11-09 21:33:43 +01002956 */
2957void uart_handle_cts_change(struct uart_port *uport, unsigned int status)
2958{
Peter Hurley4d90bb12014-09-10 15:06:23 -04002959 lockdep_assert_held_once(&uport->lock);
2960
Jiri Slaby027d7da2011-11-09 21:33:43 +01002961 uport->icount.cts++;
2962
Peter Hurley391f93f2015-01-25 14:44:51 -05002963 if (uart_softcts_mode(uport)) {
Peter Hurleyd01f4d12014-09-10 15:06:26 -04002964 if (uport->hw_stopped) {
Jiri Slaby027d7da2011-11-09 21:33:43 +01002965 if (status) {
Peter Hurleyd01f4d12014-09-10 15:06:26 -04002966 uport->hw_stopped = 0;
Jiri Slaby027d7da2011-11-09 21:33:43 +01002967 uport->ops->start_tx(uport);
2968 uart_write_wakeup(uport);
2969 }
2970 } else {
2971 if (!status) {
Peter Hurleyd01f4d12014-09-10 15:06:26 -04002972 uport->hw_stopped = 1;
Jiri Slaby027d7da2011-11-09 21:33:43 +01002973 uport->ops->stop_tx(uport);
2974 }
2975 }
Peter Hurley391f93f2015-01-25 14:44:51 -05002976
Jiri Slaby027d7da2011-11-09 21:33:43 +01002977 }
2978}
2979EXPORT_SYMBOL_GPL(uart_handle_cts_change);
2980
Jiri Slabycf755252011-11-09 21:33:47 +01002981/**
2982 * uart_insert_char - push a char to the uart layer
2983 *
2984 * User is responsible to call tty_flip_buffer_push when they are done with
2985 * insertion.
2986 *
2987 * @port: corresponding port
2988 * @status: state of the serial port RX buffer (LSR for 8250)
2989 * @overrun: mask of overrun bits in @status
2990 * @ch: character to push
2991 * @flag: flag for the character (see TTY_NORMAL and friends)
2992 */
Jiri Slaby027d7da2011-11-09 21:33:43 +01002993void uart_insert_char(struct uart_port *port, unsigned int status,
2994 unsigned int overrun, unsigned int ch, unsigned int flag)
2995{
Jiri Slaby92a19f92013-01-03 15:53:03 +01002996 struct tty_port *tport = &port->state->port;
Jiri Slaby027d7da2011-11-09 21:33:43 +01002997
2998 if ((status & port->ignore_status_mask & ~overrun) == 0)
Jiri Slaby92a19f92013-01-03 15:53:03 +01002999 if (tty_insert_flip_char(tport, ch, flag) == 0)
Corbindabfb352012-05-23 09:37:31 -05003000 ++port->icount.buf_overrun;
Jiri Slaby027d7da2011-11-09 21:33:43 +01003001
3002 /*
3003 * Overrun is special. Since it's reported immediately,
3004 * it doesn't affect the current character.
3005 */
3006 if (status & ~port->ignore_status_mask & overrun)
Jiri Slaby92a19f92013-01-03 15:53:03 +01003007 if (tty_insert_flip_char(tport, 0, TTY_OVERRUN) == 0)
Corbindabfb352012-05-23 09:37:31 -05003008 ++port->icount.buf_overrun;
Jiri Slaby027d7da2011-11-09 21:33:43 +01003009}
3010EXPORT_SYMBOL_GPL(uart_insert_char);
3011
Linus Torvalds1da177e2005-04-16 15:20:36 -07003012EXPORT_SYMBOL(uart_write_wakeup);
3013EXPORT_SYMBOL(uart_register_driver);
3014EXPORT_SYMBOL(uart_unregister_driver);
3015EXPORT_SYMBOL(uart_suspend_port);
3016EXPORT_SYMBOL(uart_resume_port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003017EXPORT_SYMBOL(uart_add_one_port);
3018EXPORT_SYMBOL(uart_remove_one_port);
3019
3020MODULE_DESCRIPTION("Serial driver core");
3021MODULE_LICENSE("GPL");