blob: 48afdffaae16afdb1cac0111a9c1f8a3c2ee8fe3 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 * Driver core for serial ports
3 *
4 * Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
5 *
6 * Copyright 1999 ARM Limited
7 * Copyright (C) 2000-2001 Deep Blue Solutions Ltd.
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 */
Linus Torvalds1da177e2005-04-16 15:20:36 -070023#include <linux/module.h>
24#include <linux/tty.h>
Jiri Slaby027d7da2011-11-09 21:33:43 +010025#include <linux/tty_flip.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070026#include <linux/slab.h>
27#include <linux/init.h>
28#include <linux/console.h>
Grant Likelya208ffd2014-03-27 18:29:46 -070029#include <linux/of.h>
Alexey Dobriyand196a942009-03-31 15:19:21 -070030#include <linux/proc_fs.h>
31#include <linux/seq_file.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070032#include <linux/device.h>
33#include <linux/serial.h> /* for serial_state and serial_icounter_struct */
Alan Coxccce6de2009-09-19 13:13:30 -070034#include <linux/serial_core.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070035#include <linux/delay.h>
Arjan van de Venf392ecf2006-01-12 18:44:32 +000036#include <linux/mutex.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070037
38#include <asm/irq.h>
39#include <asm/uaccess.h>
40
Linus Torvalds1da177e2005-04-16 15:20:36 -070041/*
42 * This is used to lock changes in serial line configuration.
43 */
Arjan van de Venf392ecf2006-01-12 18:44:32 +000044static DEFINE_MUTEX(port_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -070045
Ingo Molnar13e83592006-07-03 00:25:03 -070046/*
47 * lockdep: port->lock is initialized in two places, but we
48 * want only one lock-class:
49 */
50static struct lock_class_key port_lock_key;
51
Linus Torvalds1da177e2005-04-16 15:20:36 -070052#define HIGH_BITS_OFFSET ((sizeof(long)-sizeof(int))*8)
53
Alan Cox19225132010-06-01 22:52:51 +020054static void uart_change_speed(struct tty_struct *tty, struct uart_state *state,
Alan Coxa46c9992008-02-08 04:18:53 -080055 struct ktermios *old_termios);
Jiri Slaby1f33a512011-07-14 14:35:10 +020056static void uart_wait_until_sent(struct tty_struct *tty, int timeout);
Linus Walleij6f538fe2012-12-07 11:36:08 +010057static void uart_change_pm(struct uart_state *state,
58 enum uart_pm_state pm_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -070059
Jiri Slabyb922e192011-11-09 21:33:51 +010060static void uart_port_shutdown(struct tty_port *port);
61
Peter Hurley299245a2014-09-10 15:06:24 -040062static int uart_dcd_enabled(struct uart_port *uport)
63{
Peter Hurleyd4260b52014-10-16 14:19:47 -040064 return !!(uport->status & UPSTAT_DCD_ENABLE);
Peter Hurley299245a2014-09-10 15:06:24 -040065}
66
Peter Hurley9ed19422016-04-09 18:56:34 -070067static inline struct uart_port *uart_port_ref(struct uart_state *state)
68{
69 if (atomic_add_unless(&state->refcount, 1, 0))
70 return state->uart_port;
71 return NULL;
72}
73
74static inline void uart_port_deref(struct uart_port *uport)
75{
76 if (uport && atomic_dec_and_test(&uport->state->refcount))
77 wake_up(&uport->state->remove_wait);
78}
79
80#define uart_port_lock(state, flags) \
81 ({ \
82 struct uart_port *__uport = uart_port_ref(state); \
83 if (__uport) \
84 spin_lock_irqsave(&__uport->lock, flags); \
85 __uport; \
86 })
87
88#define uart_port_unlock(uport, flags) \
89 ({ \
90 struct uart_port *__uport = uport; \
91 if (__uport) \
92 spin_unlock_irqrestore(&__uport->lock, flags); \
93 uart_port_deref(__uport); \
94 })
95
Peter Hurley4047b372016-04-09 18:56:33 -070096static inline struct uart_port *uart_port_check(struct uart_state *state)
97{
Peter Hurley7da4b8b2016-05-03 14:01:51 -070098 lockdep_assert_held(&state->port.mutex);
Peter Hurley4047b372016-04-09 18:56:33 -070099 return state->uart_port;
100}
101
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102/*
103 * This routine is used by the interrupt handler to schedule processing in
104 * the software interrupt portion of the driver.
105 */
106void uart_write_wakeup(struct uart_port *port)
107{
Alan Coxebd2c8f2009-09-19 13:13:28 -0700108 struct uart_state *state = port->state;
Pavel Machekd5f735e2006-03-07 21:55:20 -0800109 /*
110 * This means you called this function _after_ the port was
111 * closed. No cookie for you.
112 */
Alan Coxebd2c8f2009-09-19 13:13:28 -0700113 BUG_ON(!state);
Rob Herringd0f4bce2016-10-28 07:07:48 -0500114 tty_port_tty_wakeup(&state->port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700115}
116
117static void uart_stop(struct tty_struct *tty)
118{
119 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700120 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700121 unsigned long flags;
122
Peter Hurley9ed19422016-04-09 18:56:34 -0700123 port = uart_port_lock(state, flags);
124 if (port)
125 port->ops->stop_tx(port);
126 uart_port_unlock(port, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700127}
128
129static void __uart_start(struct tty_struct *tty)
130{
131 struct uart_state *state = tty->driver_data;
Alan Coxebd2c8f2009-09-19 13:13:28 -0700132 struct uart_port *port = state->uart_port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700133
San Mehat47f5e052009-07-29 20:21:28 -0700134 if (port && port->ops->wake_peer)
135 port->ops->wake_peer(port);
136
Peter Hurley9ed19422016-04-09 18:56:34 -0700137 if (port && !uart_tx_stopped(port))
Russell Kingb129a8c2005-08-31 10:12:14 +0100138 port->ops->start_tx(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700139}
140
141static void uart_start(struct tty_struct *tty)
142{
143 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700144 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700145 unsigned long flags;
146
Peter Hurley9ed19422016-04-09 18:56:34 -0700147 port = uart_port_lock(state, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700148 __uart_start(tty);
Peter Hurley9ed19422016-04-09 18:56:34 -0700149 uart_port_unlock(port, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700150}
151
Denys Vlasenkof4581ca2015-10-27 17:40:01 +0100152static void
Linus Torvalds1da177e2005-04-16 15:20:36 -0700153uart_update_mctrl(struct uart_port *port, unsigned int set, unsigned int clear)
154{
155 unsigned long flags;
156 unsigned int old;
157
158 spin_lock_irqsave(&port->lock, flags);
159 old = port->mctrl;
160 port->mctrl = (old & ~clear) | set;
161 if (old != port->mctrl)
162 port->ops->set_mctrl(port, port->mctrl);
163 spin_unlock_irqrestore(&port->lock, flags);
164}
165
Alan Coxa46c9992008-02-08 04:18:53 -0800166#define uart_set_mctrl(port, set) uart_update_mctrl(port, set, 0)
167#define uart_clear_mctrl(port, clear) uart_update_mctrl(port, 0, clear)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700168
169/*
170 * Startup the port. This will be called once per open. All calls
Alan Coxdf4f4dd2008-07-16 21:53:50 +0100171 * will be serialised by the per-port mutex.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700172 */
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100173static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
174 int init_hw)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700175{
Peter Hurley4047b372016-04-09 18:56:33 -0700176 struct uart_port *uport = uart_port_check(state);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700177 unsigned long page;
Tycho Andersene5147bb2018-07-06 10:24:57 -0600178 unsigned long flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700179 int retval = 0;
180
Alan Cox46d57a42009-09-19 13:13:29 -0700181 if (uport->type == PORT_UNKNOWN)
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100182 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700183
184 /*
Thomas Pfaff7deb39e2014-04-23 12:33:22 +0200185 * Make sure the device is in D0 state.
186 */
187 uart_change_pm(state, UART_PM_STATE_ON);
188
189 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700190 * Initialise and allocate the transmit and temporary
191 * buffer.
192 */
Tycho Andersene5147bb2018-07-06 10:24:57 -0600193 page = get_zeroed_page(GFP_KERNEL);
194 if (!page)
195 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700196
Tycho Andersene5147bb2018-07-06 10:24:57 -0600197 uart_port_lock(state, flags);
198 if (!state->xmit.buf) {
Alan Coxebd2c8f2009-09-19 13:13:28 -0700199 state->xmit.buf = (unsigned char *) page;
200 uart_circ_clear(&state->xmit);
Sergey Senozhatsky80c8e522018-12-13 13:58:39 +0900201 uart_port_unlock(uport, flags);
Tycho Andersene5147bb2018-07-06 10:24:57 -0600202 } else {
Sergey Senozhatsky80c8e522018-12-13 13:58:39 +0900203 uart_port_unlock(uport, flags);
204 /*
205 * Do not free() the page under the port lock, see
206 * uart_shutdown().
207 */
Tycho Andersene5147bb2018-07-06 10:24:57 -0600208 free_page(page);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700209 }
210
Alan Cox46d57a42009-09-19 13:13:29 -0700211 retval = uport->ops->startup(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700212 if (retval == 0) {
Jiri Slabyc7d7abf2011-03-30 00:10:55 +0200213 if (uart_console(uport) && uport->cons->cflag) {
Alan Coxadc8d742012-07-14 15:31:47 +0100214 tty->termios.c_cflag = uport->cons->cflag;
Jiri Slabyc7d7abf2011-03-30 00:10:55 +0200215 uport->cons->cflag = 0;
216 }
217 /*
218 * Initialise the hardware port settings.
219 */
220 uart_change_speed(tty, state, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700221
Peter Hurley9db276f2016-01-10 20:36:15 -0800222 /*
223 * Setup the RTS and DTR signals once the
224 * port is open and ready to respond.
225 */
226 if (init_hw && C_BAUD(tty))
227 uart_set_mctrl(uport, TIOCM_RTS | TIOCM_DTR);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700228 }
229
Jiri Slaby00551972011-08-17 13:48:15 +0200230 /*
231 * This is to allow setserial on this port. People may want to set
232 * port/irq/type and then reconfigure the port properly if it failed
233 * now.
234 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700235 if (retval && capable(CAP_SYS_ADMIN))
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100236 return 1;
237
238 return retval;
239}
240
241static int uart_startup(struct tty_struct *tty, struct uart_state *state,
242 int init_hw)
243{
244 struct tty_port *port = &state->port;
245 int retval;
246
Peter Hurleyd41861c2016-04-09 17:53:25 -0700247 if (tty_port_initialized(port))
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100248 return 0;
249
Jiri Slabyc0d92be2011-11-09 21:34:14 +0100250 retval = uart_port_startup(tty, state, init_hw);
Rob Herringb3b57642016-08-22 17:39:09 -0500251 if (retval)
252 set_bit(TTY_IO_ERROR, &tty->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700253
254 return retval;
255}
256
257/*
258 * This routine will shutdown a serial port; interrupts are disabled, and
259 * DTR is dropped if the hangup on close termio flag is on. Calls to
260 * uart_shutdown are serialised by the per-port semaphore.
Peter Hurleyaf224ca2016-04-09 18:56:35 -0700261 *
262 * uport == NULL if uart_port has already been removed
Linus Torvalds1da177e2005-04-16 15:20:36 -0700263 */
Alan Cox19225132010-06-01 22:52:51 +0200264static void uart_shutdown(struct tty_struct *tty, struct uart_state *state)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700265{
Peter Hurley4047b372016-04-09 18:56:33 -0700266 struct uart_port *uport = uart_port_check(state);
Alan Coxbdc04e32009-09-19 13:13:31 -0700267 struct tty_port *port = &state->port;
Tycho Andersene5147bb2018-07-06 10:24:57 -0600268 unsigned long flags = 0;
Sergey Senozhatsky80c8e522018-12-13 13:58:39 +0900269 char *xmit_buf = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700270
Russell Kingee31b332005-11-13 15:28:51 +0000271 /*
272 * Set the TTY IO error marker
273 */
Alan Coxf7519282009-01-02 13:49:21 +0000274 if (tty)
275 set_bit(TTY_IO_ERROR, &tty->flags);
Russell Kingee31b332005-11-13 15:28:51 +0000276
Peter Hurleyd41861c2016-04-09 17:53:25 -0700277 if (tty_port_initialized(port)) {
278 tty_port_set_initialized(port, 0);
279
Russell Kingee31b332005-11-13 15:28:51 +0000280 /*
281 * Turn off DTR and RTS early.
282 */
Peter Hurleyaf224ca2016-04-09 18:56:35 -0700283 if (uport && uart_console(uport) && tty)
Peter Hurleyae84db92014-07-09 09:21:14 -0400284 uport->cons->cflag = tty->termios.c_cflag;
285
Peter Hurley9db276f2016-01-10 20:36:15 -0800286 if (!tty || C_HUPCL(tty))
Alan Coxccce6de2009-09-19 13:13:30 -0700287 uart_clear_mctrl(uport, TIOCM_DTR | TIOCM_RTS);
Russell Kingee31b332005-11-13 15:28:51 +0000288
Jiri Slabyb922e192011-11-09 21:33:51 +0100289 uart_port_shutdown(port);
Russell Kingee31b332005-11-13 15:28:51 +0000290 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700291
292 /*
Doug Andersond208a3b2011-10-19 11:52:01 -0700293 * It's possible for shutdown to be called after suspend if we get
294 * a DCD drop (hangup) at just the right time. Clear suspended bit so
295 * we don't try to resume a port that has been shutdown.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700296 */
Peter Hurley80f02d52016-04-09 17:53:24 -0700297 tty_port_set_suspended(port, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700298
299 /*
Sergey Senozhatsky80c8e522018-12-13 13:58:39 +0900300 * Do not free() the transmit buffer page under the port lock since
301 * this can create various circular locking scenarios. For instance,
302 * console driver may need to allocate/free a debug object, which
303 * can endup in printk() recursion.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700304 */
Tycho Andersene5147bb2018-07-06 10:24:57 -0600305 uart_port_lock(state, flags);
Sergey Senozhatsky80c8e522018-12-13 13:58:39 +0900306 xmit_buf = state->xmit.buf;
307 state->xmit.buf = NULL;
Tycho Andersene5147bb2018-07-06 10:24:57 -0600308 uart_port_unlock(uport, flags);
Sergey Senozhatsky80c8e522018-12-13 13:58:39 +0900309
310 if (xmit_buf)
311 free_page((unsigned long)xmit_buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700312}
313
314/**
315 * uart_update_timeout - update per-port FIFO timeout.
316 * @port: uart_port structure describing the port
317 * @cflag: termios cflag value
318 * @baud: speed of the port
319 *
320 * Set the port FIFO timeout value. The @cflag value should
321 * reflect the actual hardware settings.
322 */
323void
324uart_update_timeout(struct uart_port *port, unsigned int cflag,
325 unsigned int baud)
326{
327 unsigned int bits;
328
329 /* byte size and parity */
330 switch (cflag & CSIZE) {
331 case CS5:
332 bits = 7;
333 break;
334 case CS6:
335 bits = 8;
336 break;
337 case CS7:
338 bits = 9;
339 break;
340 default:
341 bits = 10;
Alan Coxa46c9992008-02-08 04:18:53 -0800342 break; /* CS8 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700343 }
344
345 if (cflag & CSTOPB)
346 bits++;
347 if (cflag & PARENB)
348 bits++;
349
350 /*
351 * The total number of bits to be transmitted in the fifo.
352 */
353 bits = bits * port->fifosize;
354
355 /*
356 * Figure the timeout to send the above number of bits.
357 * Add .02 seconds of slop
358 */
359 port->timeout = (HZ * bits) / baud + HZ/50;
360}
361
362EXPORT_SYMBOL(uart_update_timeout);
363
364/**
365 * uart_get_baud_rate - return baud rate for a particular port
366 * @port: uart_port structure describing the port in question.
367 * @termios: desired termios settings.
368 * @old: old termios (or NULL)
369 * @min: minimum acceptable baud rate
370 * @max: maximum acceptable baud rate
371 *
372 * Decode the termios structure into a numeric baud rate,
373 * taking account of the magic 38400 baud rate (with spd_*
374 * flags), and mapping the %B0 rate to 9600 baud.
375 *
376 * If the new baud rate is invalid, try the old termios setting.
377 * If it's still invalid, we try 9600 baud.
378 *
379 * Update the @termios structure to reflect the baud rate
Alan Coxeb424fd2008-04-28 02:14:07 -0700380 * we're actually going to be using. Don't do this for the case
381 * where B0 is requested ("hang up").
Linus Torvalds1da177e2005-04-16 15:20:36 -0700382 */
383unsigned int
Alan Cox606d0992006-12-08 02:38:45 -0800384uart_get_baud_rate(struct uart_port *port, struct ktermios *termios,
385 struct ktermios *old, unsigned int min, unsigned int max)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700386{
Joakim Nordellf10a2232015-06-08 14:56:51 +0200387 unsigned int try;
388 unsigned int baud;
389 unsigned int altbaud;
Alan Coxeb424fd2008-04-28 02:14:07 -0700390 int hung_up = 0;
Russell King0077d452006-01-21 23:03:28 +0000391 upf_t flags = port->flags & UPF_SPD_MASK;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700392
Joakim Nordellf10a2232015-06-08 14:56:51 +0200393 switch (flags) {
394 case UPF_SPD_HI:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700395 altbaud = 57600;
Joakim Nordellf10a2232015-06-08 14:56:51 +0200396 break;
397 case UPF_SPD_VHI:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700398 altbaud = 115200;
Joakim Nordellf10a2232015-06-08 14:56:51 +0200399 break;
400 case UPF_SPD_SHI:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700401 altbaud = 230400;
Joakim Nordellf10a2232015-06-08 14:56:51 +0200402 break;
403 case UPF_SPD_WARP:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700404 altbaud = 460800;
Joakim Nordellf10a2232015-06-08 14:56:51 +0200405 break;
406 default:
407 altbaud = 38400;
408 break;
409 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700410
411 for (try = 0; try < 2; try++) {
412 baud = tty_termios_baud_rate(termios);
413
414 /*
415 * The spd_hi, spd_vhi, spd_shi, spd_warp kludge...
416 * Die! Die! Die!
417 */
Peter Hurley547039e2014-10-16 13:46:38 -0400418 if (try == 0 && baud == 38400)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700419 baud = altbaud;
420
421 /*
422 * Special case: B0 rate.
423 */
Alan Coxeb424fd2008-04-28 02:14:07 -0700424 if (baud == 0) {
425 hung_up = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700426 baud = 9600;
Alan Coxeb424fd2008-04-28 02:14:07 -0700427 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700428
429 if (baud >= min && baud <= max)
430 return baud;
431
432 /*
433 * Oops, the quotient was zero. Try again with
434 * the old baud rate if possible.
435 */
436 termios->c_cflag &= ~CBAUD;
437 if (old) {
Alan Cox6d4d67b2008-02-04 22:27:53 -0800438 baud = tty_termios_baud_rate(old);
Alan Coxeb424fd2008-04-28 02:14:07 -0700439 if (!hung_up)
440 tty_termios_encode_baud_rate(termios,
441 baud, baud);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700442 old = NULL;
443 continue;
444 }
445
446 /*
Alan Cox16ae2a82010-01-04 16:26:21 +0000447 * As a last resort, if the range cannot be met then clip to
448 * the nearest chip supported rate.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700449 */
Alan Cox16ae2a82010-01-04 16:26:21 +0000450 if (!hung_up) {
451 if (baud <= min)
452 tty_termios_encode_baud_rate(termios,
453 min + 1, min + 1);
454 else
455 tty_termios_encode_baud_rate(termios,
456 max - 1, max - 1);
457 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700458 }
Alan Cox16ae2a82010-01-04 16:26:21 +0000459 /* Should never happen */
460 WARN_ON(1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700461 return 0;
462}
463
464EXPORT_SYMBOL(uart_get_baud_rate);
465
466/**
467 * uart_get_divisor - return uart clock divisor
468 * @port: uart_port structure describing the port.
469 * @baud: desired baud rate
470 *
471 * Calculate the uart clock divisor for the port.
472 */
473unsigned int
474uart_get_divisor(struct uart_port *port, unsigned int baud)
475{
476 unsigned int quot;
477
478 /*
479 * Old custom speed handling.
480 */
481 if (baud == 38400 && (port->flags & UPF_SPD_MASK) == UPF_SPD_CUST)
482 quot = port->custom_divisor;
483 else
Uwe Kleine-König97d24632011-12-20 11:47:44 +0100484 quot = DIV_ROUND_CLOSEST(port->uartclk, 16 * baud);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700485
486 return quot;
487}
488
489EXPORT_SYMBOL(uart_get_divisor);
490
Peter Hurley7c8ab962014-10-16 16:54:20 -0400491/* Caller holds port mutex */
Alan Cox19225132010-06-01 22:52:51 +0200492static void uart_change_speed(struct tty_struct *tty, struct uart_state *state,
493 struct ktermios *old_termios)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700494{
Peter Hurley4047b372016-04-09 18:56:33 -0700495 struct uart_port *uport = uart_port_check(state);
Alan Cox606d0992006-12-08 02:38:45 -0800496 struct ktermios *termios;
Peter Hurley391f93f2015-01-25 14:44:51 -0500497 int hw_stopped;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700498
499 /*
500 * If we have no tty, termios, or the port does not exist,
501 * then we can't set the parameters for this port.
502 */
Alan Coxadc8d742012-07-14 15:31:47 +0100503 if (!tty || uport->type == PORT_UNKNOWN)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700504 return;
505
Alan Coxadc8d742012-07-14 15:31:47 +0100506 termios = &tty->termios;
Peter Hurleyc18b55f2014-06-16 09:17:09 -0400507 uport->ops->set_termios(uport, termios, old_termios);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700508
509 /*
Peter Hurley299245a2014-09-10 15:06:24 -0400510 * Set modem status enables based on termios cflag
Linus Torvalds1da177e2005-04-16 15:20:36 -0700511 */
Peter Hurley299245a2014-09-10 15:06:24 -0400512 spin_lock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700513 if (termios->c_cflag & CRTSCTS)
Peter Hurley299245a2014-09-10 15:06:24 -0400514 uport->status |= UPSTAT_CTS_ENABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700515 else
Peter Hurley299245a2014-09-10 15:06:24 -0400516 uport->status &= ~UPSTAT_CTS_ENABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700517
518 if (termios->c_cflag & CLOCAL)
Peter Hurley299245a2014-09-10 15:06:24 -0400519 uport->status &= ~UPSTAT_DCD_ENABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700520 else
Peter Hurley299245a2014-09-10 15:06:24 -0400521 uport->status |= UPSTAT_DCD_ENABLE;
Peter Hurley391f93f2015-01-25 14:44:51 -0500522
523 /* reset sw-assisted CTS flow control based on (possibly) new mode */
524 hw_stopped = uport->hw_stopped;
525 uport->hw_stopped = uart_softcts_mode(uport) &&
526 !(uport->ops->get_mctrl(uport) & TIOCM_CTS);
527 if (uport->hw_stopped) {
528 if (!hw_stopped)
529 uport->ops->stop_tx(uport);
530 } else {
531 if (hw_stopped)
532 __uart_start(tty);
533 }
Peter Hurley299245a2014-09-10 15:06:24 -0400534 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700535}
536
Peter Hurleyf5291ec2016-01-10 20:23:55 -0800537static int uart_put_char(struct tty_struct *tty, unsigned char c)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700538{
Peter Hurleyf5291ec2016-01-10 20:23:55 -0800539 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700540 struct uart_port *port;
Peter Hurleyf5291ec2016-01-10 20:23:55 -0800541 struct circ_buf *circ;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700542 unsigned long flags;
Alan Cox23d22ce2008-04-30 00:54:11 -0700543 int ret = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700544
Peter Hurleyf5291ec2016-01-10 20:23:55 -0800545 circ = &state->xmit;
Peter Hurley9ed19422016-04-09 18:56:34 -0700546 port = uart_port_lock(state, flags);
Samir Virmanib7bd4a22019-01-16 10:28:07 -0800547 if (!circ->buf) {
548 uart_port_unlock(port, flags);
549 return 0;
550 }
551
Peter Hurley9ed19422016-04-09 18:56:34 -0700552 if (port && uart_circ_chars_free(circ) != 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700553 circ->buf[circ->head] = c;
554 circ->head = (circ->head + 1) & (UART_XMIT_SIZE - 1);
Alan Cox23d22ce2008-04-30 00:54:11 -0700555 ret = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700556 }
Peter Hurley9ed19422016-04-09 18:56:34 -0700557 uart_port_unlock(port, flags);
Alan Cox23d22ce2008-04-30 00:54:11 -0700558 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700559}
560
Linus Torvalds1da177e2005-04-16 15:20:36 -0700561static void uart_flush_chars(struct tty_struct *tty)
562{
563 uart_start(tty);
564}
565
Alan Cox19225132010-06-01 22:52:51 +0200566static int uart_write(struct tty_struct *tty,
567 const unsigned char *buf, int count)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700568{
569 struct uart_state *state = tty->driver_data;
Pavel Machekd5f735e2006-03-07 21:55:20 -0800570 struct uart_port *port;
571 struct circ_buf *circ;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700572 unsigned long flags;
573 int c, ret = 0;
574
Pavel Machekd5f735e2006-03-07 21:55:20 -0800575 /*
576 * This means you called this function _after_ the port was
577 * closed. No cookie for you.
578 */
Alan Coxf7519282009-01-02 13:49:21 +0000579 if (!state) {
Pavel Machekd5f735e2006-03-07 21:55:20 -0800580 WARN_ON(1);
581 return -EL3HLT;
582 }
583
Peter Hurley9ed19422016-04-09 18:56:34 -0700584 port = uart_port_lock(state, flags);
Samir Virmanib7bd4a22019-01-16 10:28:07 -0800585 circ = &state->xmit;
586 if (!circ->buf) {
587 uart_port_unlock(port, flags);
588 return 0;
589 }
590
Peter Hurley9ed19422016-04-09 18:56:34 -0700591 while (port) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700592 c = CIRC_SPACE_TO_END(circ->head, circ->tail, UART_XMIT_SIZE);
593 if (count < c)
594 c = count;
595 if (c <= 0)
596 break;
597 memcpy(circ->buf + circ->head, buf, c);
598 circ->head = (circ->head + c) & (UART_XMIT_SIZE - 1);
599 buf += c;
600 count -= c;
601 ret += c;
602 }
Peter Hurley64dbee32014-10-16 16:54:26 -0400603
604 __uart_start(tty);
Peter Hurley9ed19422016-04-09 18:56:34 -0700605 uart_port_unlock(port, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700606 return ret;
607}
608
609static int uart_write_room(struct tty_struct *tty)
610{
611 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700612 struct uart_port *port;
Alan Coxf34d7a52008-04-30 00:54:13 -0700613 unsigned long flags;
614 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700615
Peter Hurley9ed19422016-04-09 18:56:34 -0700616 port = uart_port_lock(state, flags);
Alan Coxebd2c8f2009-09-19 13:13:28 -0700617 ret = uart_circ_chars_free(&state->xmit);
Peter Hurley9ed19422016-04-09 18:56:34 -0700618 uart_port_unlock(port, flags);
Alan Coxf34d7a52008-04-30 00:54:13 -0700619 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700620}
621
622static int uart_chars_in_buffer(struct tty_struct *tty)
623{
624 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700625 struct uart_port *port;
Alan Coxf34d7a52008-04-30 00:54:13 -0700626 unsigned long flags;
627 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700628
Peter Hurley9ed19422016-04-09 18:56:34 -0700629 port = uart_port_lock(state, flags);
Alan Coxebd2c8f2009-09-19 13:13:28 -0700630 ret = uart_circ_chars_pending(&state->xmit);
Peter Hurley9ed19422016-04-09 18:56:34 -0700631 uart_port_unlock(port, flags);
Alan Coxf34d7a52008-04-30 00:54:13 -0700632 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700633}
634
635static void uart_flush_buffer(struct tty_struct *tty)
636{
637 struct uart_state *state = tty->driver_data;
Tetsuo Handa55d7b682008-05-06 20:42:27 -0700638 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700639 unsigned long flags;
640
Pavel Machekd5f735e2006-03-07 21:55:20 -0800641 /*
642 * This means you called this function _after_ the port was
643 * closed. No cookie for you.
644 */
Alan Coxf7519282009-01-02 13:49:21 +0000645 if (!state) {
Pavel Machekd5f735e2006-03-07 21:55:20 -0800646 WARN_ON(1);
647 return;
648 }
649
Jiri Slabyeb3a1e12007-05-06 14:48:52 -0700650 pr_debug("uart_flush_buffer(%d) called\n", tty->index);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700651
Peter Hurley9ed19422016-04-09 18:56:34 -0700652 port = uart_port_lock(state, flags);
653 if (!port)
654 return;
Alan Coxebd2c8f2009-09-19 13:13:28 -0700655 uart_circ_clear(&state->xmit);
Haavard Skinnemoen6bb0e3a2008-07-16 21:52:36 +0100656 if (port->ops->flush_buffer)
657 port->ops->flush_buffer(port);
Peter Hurley9ed19422016-04-09 18:56:34 -0700658 uart_port_unlock(port, flags);
Rob Herringd0f4bce2016-10-28 07:07:48 -0500659 tty_port_tty_wakeup(&state->port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700660}
661
662/*
663 * This function is used to send a high-priority XON/XOFF character to
664 * the device
665 */
666static void uart_send_xchar(struct tty_struct *tty, char ch)
667{
668 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700669 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700670 unsigned long flags;
671
Peter Hurley9ed19422016-04-09 18:56:34 -0700672 port = uart_port_ref(state);
673 if (!port)
674 return;
675
Linus Torvalds1da177e2005-04-16 15:20:36 -0700676 if (port->ops->send_xchar)
677 port->ops->send_xchar(port, ch);
678 else {
Peter Hurleyc235ccc2014-09-02 17:39:13 -0400679 spin_lock_irqsave(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700680 port->x_char = ch;
Peter Hurleyc235ccc2014-09-02 17:39:13 -0400681 if (ch)
Russell Kingb129a8c2005-08-31 10:12:14 +0100682 port->ops->start_tx(port);
Peter Hurleyc235ccc2014-09-02 17:39:13 -0400683 spin_unlock_irqrestore(&port->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700684 }
Peter Hurley9ed19422016-04-09 18:56:34 -0700685 uart_port_deref(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700686}
687
688static void uart_throttle(struct tty_struct *tty)
689{
690 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700691 struct uart_port *port;
Peter Hurley391f93f2015-01-25 14:44:51 -0500692 upstat_t mask = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700693
Peter Hurley9ed19422016-04-09 18:56:34 -0700694 port = uart_port_ref(state);
695 if (!port)
696 return;
697
Linus Torvalds1da177e2005-04-16 15:20:36 -0700698 if (I_IXOFF(tty))
Peter Hurley391f93f2015-01-25 14:44:51 -0500699 mask |= UPSTAT_AUTOXOFF;
Peter Hurley9db276f2016-01-10 20:36:15 -0800700 if (C_CRTSCTS(tty))
Peter Hurley391f93f2015-01-25 14:44:51 -0500701 mask |= UPSTAT_AUTORTS;
Russell King9aba8d5b2012-04-17 17:23:14 +0100702
Peter Hurley391f93f2015-01-25 14:44:51 -0500703 if (port->status & mask) {
Russell King9aba8d5b2012-04-17 17:23:14 +0100704 port->ops->throttle(port);
Peter Hurley391f93f2015-01-25 14:44:51 -0500705 mask &= ~port->status;
Russell King9aba8d5b2012-04-17 17:23:14 +0100706 }
707
Peter Hurley391f93f2015-01-25 14:44:51 -0500708 if (mask & UPSTAT_AUTORTS)
Russell King9aba8d5b2012-04-17 17:23:14 +0100709 uart_clear_mctrl(port, TIOCM_RTS);
Peter Hurleyb4749b92016-01-10 20:24:02 -0800710
711 if (mask & UPSTAT_AUTOXOFF)
712 uart_send_xchar(tty, STOP_CHAR(tty));
Peter Hurley9ed19422016-04-09 18:56:34 -0700713
714 uart_port_deref(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700715}
716
717static void uart_unthrottle(struct tty_struct *tty)
718{
719 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -0700720 struct uart_port *port;
Peter Hurley391f93f2015-01-25 14:44:51 -0500721 upstat_t mask = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700722
Greg Kroah-Hartmand13ed612019-01-31 17:43:16 +0800723 if (!state)
724 return;
725
Peter Hurley9ed19422016-04-09 18:56:34 -0700726 port = uart_port_ref(state);
727 if (!port)
728 return;
729
Russell King9aba8d5b2012-04-17 17:23:14 +0100730 if (I_IXOFF(tty))
Peter Hurley391f93f2015-01-25 14:44:51 -0500731 mask |= UPSTAT_AUTOXOFF;
Peter Hurley9db276f2016-01-10 20:36:15 -0800732 if (C_CRTSCTS(tty))
Peter Hurley391f93f2015-01-25 14:44:51 -0500733 mask |= UPSTAT_AUTORTS;
Russell King9aba8d5b2012-04-17 17:23:14 +0100734
Peter Hurley391f93f2015-01-25 14:44:51 -0500735 if (port->status & mask) {
Russell King9aba8d5b2012-04-17 17:23:14 +0100736 port->ops->unthrottle(port);
Peter Hurley391f93f2015-01-25 14:44:51 -0500737 mask &= ~port->status;
Russell King9aba8d5b2012-04-17 17:23:14 +0100738 }
739
Peter Hurley391f93f2015-01-25 14:44:51 -0500740 if (mask & UPSTAT_AUTORTS)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700741 uart_set_mctrl(port, TIOCM_RTS);
Peter Hurleyb4749b92016-01-10 20:24:02 -0800742
743 if (mask & UPSTAT_AUTOXOFF)
744 uart_send_xchar(tty, START_CHAR(tty));
Peter Hurley9ed19422016-04-09 18:56:34 -0700745
746 uart_port_deref(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700747}
748
Peter Hurley4047b372016-04-09 18:56:33 -0700749static int uart_get_info(struct tty_port *port, struct serial_struct *retinfo)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700750{
Alan Cox9f109692012-10-29 15:20:25 +0000751 struct uart_state *state = container_of(port, struct uart_state, port);
Peter Hurley4047b372016-04-09 18:56:33 -0700752 struct uart_port *uport;
753 int ret = -ENODEV;
Alan Cox7ba2e762012-09-04 16:34:45 +0100754
Fengguang Wu37cd0c92012-09-06 10:27:51 +0800755 memset(retinfo, 0, sizeof(*retinfo));
Alan Cox7ba2e762012-09-04 16:34:45 +0100756
Peter Hurley3abe8c72016-01-10 20:23:56 -0800757 /*
758 * Ensure the state we copy is consistent and no hardware changes
759 * occur as we go
760 */
761 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -0700762 uport = uart_port_check(state);
763 if (!uport)
764 goto out;
765
Alan Cox7ba2e762012-09-04 16:34:45 +0100766 retinfo->type = uport->type;
767 retinfo->line = uport->line;
768 retinfo->port = uport->iobase;
769 if (HIGH_BITS_OFFSET)
770 retinfo->port_high = (long) uport->iobase >> HIGH_BITS_OFFSET;
771 retinfo->irq = uport->irq;
772 retinfo->flags = uport->flags;
773 retinfo->xmit_fifo_size = uport->fifosize;
774 retinfo->baud_base = uport->uartclk / 16;
775 retinfo->close_delay = jiffies_to_msecs(port->close_delay) / 10;
776 retinfo->closing_wait = port->closing_wait == ASYNC_CLOSING_WAIT_NONE ?
777 ASYNC_CLOSING_WAIT_NONE :
778 jiffies_to_msecs(port->closing_wait) / 10;
779 retinfo->custom_divisor = uport->custom_divisor;
780 retinfo->hub6 = uport->hub6;
781 retinfo->io_type = uport->iotype;
782 retinfo->iomem_reg_shift = uport->regshift;
783 retinfo->iomem_base = (void *)(unsigned long)uport->mapbase;
Peter Hurley4047b372016-04-09 18:56:33 -0700784
785 ret = 0;
786out:
Alan Coxa2bceae2009-09-19 13:13:31 -0700787 mutex_unlock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -0700788 return ret;
Alan Cox9f109692012-10-29 15:20:25 +0000789}
790
791static int uart_get_info_user(struct tty_port *port,
792 struct serial_struct __user *retinfo)
793{
794 struct serial_struct tmp;
Peter Hurley3abe8c72016-01-10 20:23:56 -0800795
Peter Hurley4047b372016-04-09 18:56:33 -0700796 if (uart_get_info(port, &tmp) < 0)
797 return -EIO;
Alan Coxf34d7a52008-04-30 00:54:13 -0700798
Linus Torvalds1da177e2005-04-16 15:20:36 -0700799 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
800 return -EFAULT;
801 return 0;
802}
803
Alan Cox7ba2e762012-09-04 16:34:45 +0100804static int uart_set_info(struct tty_struct *tty, struct tty_port *port,
805 struct uart_state *state,
806 struct serial_struct *new_info)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700807{
Peter Hurley4047b372016-04-09 18:56:33 -0700808 struct uart_port *uport = uart_port_check(state);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700809 unsigned long new_port;
Russell King0077d452006-01-21 23:03:28 +0000810 unsigned int change_irq, change_port, closing_wait;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700811 unsigned int old_custom_divisor, close_delay;
Russell King0077d452006-01-21 23:03:28 +0000812 upf_t old_flags, new_flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700813 int retval = 0;
814
Peter Hurley4047b372016-04-09 18:56:33 -0700815 if (!uport)
816 return -EIO;
817
Alan Cox7ba2e762012-09-04 16:34:45 +0100818 new_port = new_info->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700819 if (HIGH_BITS_OFFSET)
Alan Cox7ba2e762012-09-04 16:34:45 +0100820 new_port += (unsigned long) new_info->port_high << HIGH_BITS_OFFSET;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700821
Alan Cox7ba2e762012-09-04 16:34:45 +0100822 new_info->irq = irq_canonicalize(new_info->irq);
823 close_delay = msecs_to_jiffies(new_info->close_delay * 10);
824 closing_wait = new_info->closing_wait == ASYNC_CLOSING_WAIT_NONE ?
Jiri Slaby4cb0fbf2011-11-09 21:33:45 +0100825 ASYNC_CLOSING_WAIT_NONE :
Alan Cox7ba2e762012-09-04 16:34:45 +0100826 msecs_to_jiffies(new_info->closing_wait * 10);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700827
Linus Torvalds1da177e2005-04-16 15:20:36 -0700828
Alan Cox46d57a42009-09-19 13:13:29 -0700829 change_irq = !(uport->flags & UPF_FIXED_PORT)
Alan Cox7ba2e762012-09-04 16:34:45 +0100830 && new_info->irq != uport->irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700831
832 /*
833 * Since changing the 'type' of the port changes its resource
834 * allocations, we should treat type changes the same as
835 * IO port changes.
836 */
Alan Cox46d57a42009-09-19 13:13:29 -0700837 change_port = !(uport->flags & UPF_FIXED_PORT)
838 && (new_port != uport->iobase ||
Alan Cox7ba2e762012-09-04 16:34:45 +0100839 (unsigned long)new_info->iomem_base != uport->mapbase ||
840 new_info->hub6 != uport->hub6 ||
841 new_info->io_type != uport->iotype ||
842 new_info->iomem_reg_shift != uport->regshift ||
843 new_info->type != uport->type);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700844
Alan Cox46d57a42009-09-19 13:13:29 -0700845 old_flags = uport->flags;
Alan Cox7ba2e762012-09-04 16:34:45 +0100846 new_flags = new_info->flags;
Alan Cox46d57a42009-09-19 13:13:29 -0700847 old_custom_divisor = uport->custom_divisor;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700848
849 if (!capable(CAP_SYS_ADMIN)) {
850 retval = -EPERM;
851 if (change_irq || change_port ||
Alan Cox7ba2e762012-09-04 16:34:45 +0100852 (new_info->baud_base != uport->uartclk / 16) ||
Alan Cox46d57a42009-09-19 13:13:29 -0700853 (close_delay != port->close_delay) ||
854 (closing_wait != port->closing_wait) ||
Alan Cox7ba2e762012-09-04 16:34:45 +0100855 (new_info->xmit_fifo_size &&
856 new_info->xmit_fifo_size != uport->fifosize) ||
Russell King0077d452006-01-21 23:03:28 +0000857 (((new_flags ^ old_flags) & ~UPF_USR_MASK) != 0))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700858 goto exit;
Alan Cox46d57a42009-09-19 13:13:29 -0700859 uport->flags = ((uport->flags & ~UPF_USR_MASK) |
Russell King0077d452006-01-21 23:03:28 +0000860 (new_flags & UPF_USR_MASK));
Alan Cox7ba2e762012-09-04 16:34:45 +0100861 uport->custom_divisor = new_info->custom_divisor;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700862 goto check_and_exit;
863 }
864
865 /*
866 * Ask the low level driver to verify the settings.
867 */
Alan Cox46d57a42009-09-19 13:13:29 -0700868 if (uport->ops->verify_port)
Alan Cox7ba2e762012-09-04 16:34:45 +0100869 retval = uport->ops->verify_port(uport, new_info);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700870
Alan Cox7ba2e762012-09-04 16:34:45 +0100871 if ((new_info->irq >= nr_irqs) || (new_info->irq < 0) ||
872 (new_info->baud_base < 9600))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700873 retval = -EINVAL;
874
875 if (retval)
876 goto exit;
877
878 if (change_port || change_irq) {
879 retval = -EBUSY;
880
881 /*
882 * Make sure that we are the sole user of this port.
883 */
Alan Coxb58d13a2009-09-19 13:13:32 -0700884 if (tty_port_users(port) > 1)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700885 goto exit;
886
887 /*
888 * We need to shutdown the serial port at the old
889 * port/type/irq combination.
890 */
Alan Cox19225132010-06-01 22:52:51 +0200891 uart_shutdown(tty, state);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700892 }
893
894 if (change_port) {
895 unsigned long old_iobase, old_mapbase;
896 unsigned int old_type, old_iotype, old_hub6, old_shift;
897
Alan Cox46d57a42009-09-19 13:13:29 -0700898 old_iobase = uport->iobase;
899 old_mapbase = uport->mapbase;
900 old_type = uport->type;
901 old_hub6 = uport->hub6;
902 old_iotype = uport->iotype;
903 old_shift = uport->regshift;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700904
905 /*
906 * Free and release old regions
907 */
Fabio Estevama7cfaf12016-05-20 01:59:54 -0300908 if (old_type != PORT_UNKNOWN && uport->ops->release_port)
Alan Cox46d57a42009-09-19 13:13:29 -0700909 uport->ops->release_port(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700910
Alan Cox46d57a42009-09-19 13:13:29 -0700911 uport->iobase = new_port;
Alan Cox7ba2e762012-09-04 16:34:45 +0100912 uport->type = new_info->type;
913 uport->hub6 = new_info->hub6;
914 uport->iotype = new_info->io_type;
915 uport->regshift = new_info->iomem_reg_shift;
916 uport->mapbase = (unsigned long)new_info->iomem_base;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700917
918 /*
919 * Claim and map the new regions
920 */
Fabio Estevama7cfaf12016-05-20 01:59:54 -0300921 if (uport->type != PORT_UNKNOWN && uport->ops->request_port) {
Alan Cox46d57a42009-09-19 13:13:29 -0700922 retval = uport->ops->request_port(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700923 } else {
924 /* Always success - Jean II */
925 retval = 0;
926 }
927
928 /*
929 * If we fail to request resources for the
930 * new port, try to restore the old settings.
931 */
Thomas Pfaff7deb39e2014-04-23 12:33:22 +0200932 if (retval) {
Alan Cox46d57a42009-09-19 13:13:29 -0700933 uport->iobase = old_iobase;
934 uport->type = old_type;
935 uport->hub6 = old_hub6;
936 uport->iotype = old_iotype;
937 uport->regshift = old_shift;
938 uport->mapbase = old_mapbase;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700939
Thomas Pfaff7deb39e2014-04-23 12:33:22 +0200940 if (old_type != PORT_UNKNOWN) {
941 retval = uport->ops->request_port(uport);
942 /*
943 * If we failed to restore the old settings,
944 * we fail like this.
945 */
946 if (retval)
947 uport->type = PORT_UNKNOWN;
948
949 /*
950 * We failed anyway.
951 */
952 retval = -EBUSY;
953 }
954
Alan Coxa46c9992008-02-08 04:18:53 -0800955 /* Added to return the correct error -Ram Gupta */
956 goto exit;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700957 }
958 }
959
David Gibsonabb4a232007-05-06 14:48:49 -0700960 if (change_irq)
Alan Cox7ba2e762012-09-04 16:34:45 +0100961 uport->irq = new_info->irq;
Alan Cox46d57a42009-09-19 13:13:29 -0700962 if (!(uport->flags & UPF_FIXED_PORT))
Alan Cox7ba2e762012-09-04 16:34:45 +0100963 uport->uartclk = new_info->baud_base * 16;
Alan Cox46d57a42009-09-19 13:13:29 -0700964 uport->flags = (uport->flags & ~UPF_CHANGE_MASK) |
Russell King0077d452006-01-21 23:03:28 +0000965 (new_flags & UPF_CHANGE_MASK);
Alan Cox7ba2e762012-09-04 16:34:45 +0100966 uport->custom_divisor = new_info->custom_divisor;
Alan Cox46d57a42009-09-19 13:13:29 -0700967 port->close_delay = close_delay;
968 port->closing_wait = closing_wait;
Alan Cox7ba2e762012-09-04 16:34:45 +0100969 if (new_info->xmit_fifo_size)
970 uport->fifosize = new_info->xmit_fifo_size;
Jiri Slabyd6c53c02013-01-03 15:53:05 +0100971 port->low_latency = (uport->flags & UPF_LOW_LATENCY) ? 1 : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700972
973 check_and_exit:
974 retval = 0;
Alan Cox46d57a42009-09-19 13:13:29 -0700975 if (uport->type == PORT_UNKNOWN)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700976 goto exit;
Peter Hurleyd41861c2016-04-09 17:53:25 -0700977 if (tty_port_initialized(port)) {
Alan Cox46d57a42009-09-19 13:13:29 -0700978 if (((old_flags ^ uport->flags) & UPF_SPD_MASK) ||
979 old_custom_divisor != uport->custom_divisor) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700980 /*
981 * If they're setting up a custom divisor or speed,
982 * instead of clearing it, then bitch about it. No
983 * need to rate-limit; it's CAP_SYS_ADMIN only.
984 */
Alan Cox46d57a42009-09-19 13:13:29 -0700985 if (uport->flags & UPF_SPD_MASK) {
Sudip Mukherjee2f2dafe2014-09-01 20:49:43 +0530986 dev_notice(uport->dev,
987 "%s sets custom speed on %s. This is deprecated.\n",
988 current->comm,
Rasmus Villemoes429b4742015-03-31 15:55:59 +0200989 tty_name(port->tty));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700990 }
Alan Cox19225132010-06-01 22:52:51 +0200991 uart_change_speed(tty, state, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700992 }
Rob Herringb3b57642016-08-22 17:39:09 -0500993 } else {
Alan Cox19225132010-06-01 22:52:51 +0200994 retval = uart_startup(tty, state, 1);
Sebastian Andrzej Siewiorffcf1672018-01-11 18:57:26 +0100995 if (retval == 0)
996 tty_port_set_initialized(port, true);
Rob Herringb3b57642016-08-22 17:39:09 -0500997 if (retval > 0)
998 retval = 0;
999 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001000 exit:
Alan Cox7ba2e762012-09-04 16:34:45 +01001001 return retval;
1002}
1003
1004static int uart_set_info_user(struct tty_struct *tty, struct uart_state *state,
1005 struct serial_struct __user *newinfo)
1006{
1007 struct serial_struct new_serial;
1008 struct tty_port *port = &state->port;
1009 int retval;
1010
1011 if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
1012 return -EFAULT;
1013
1014 /*
1015 * This semaphore protects port->count. It is also
1016 * very useful to prevent opens. Also, take the
1017 * port configuration semaphore to make sure that a
1018 * module insertion/removal doesn't change anything
1019 * under us.
1020 */
1021 mutex_lock(&port->mutex);
1022 retval = uart_set_info(tty, port, state, &new_serial);
Alan Coxa2bceae2009-09-19 13:13:31 -07001023 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001024 return retval;
1025}
1026
Alan Cox19225132010-06-01 22:52:51 +02001027/**
1028 * uart_get_lsr_info - get line status register info
1029 * @tty: tty associated with the UART
1030 * @state: UART being queried
1031 * @value: returned modem value
Linus Torvalds1da177e2005-04-16 15:20:36 -07001032 */
Alan Cox19225132010-06-01 22:52:51 +02001033static int uart_get_lsr_info(struct tty_struct *tty,
1034 struct uart_state *state, unsigned int __user *value)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001035{
Peter Hurley4047b372016-04-09 18:56:33 -07001036 struct uart_port *uport = uart_port_check(state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001037 unsigned int result;
1038
Alan Cox46d57a42009-09-19 13:13:29 -07001039 result = uport->ops->tx_empty(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001040
1041 /*
1042 * If we're about to load something into the transmit
1043 * register, we'll pretend the transmitter isn't empty to
1044 * avoid a race condition (depending on when the transmit
1045 * interrupt happens).
1046 */
Alan Cox46d57a42009-09-19 13:13:29 -07001047 if (uport->x_char ||
Alan Coxebd2c8f2009-09-19 13:13:28 -07001048 ((uart_circ_chars_pending(&state->xmit) > 0) &&
Peter Hurleyd01f4d12014-09-10 15:06:26 -04001049 !uart_tx_stopped(uport)))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001050 result &= ~TIOCSER_TEMT;
Alan Coxa46c9992008-02-08 04:18:53 -08001051
Linus Torvalds1da177e2005-04-16 15:20:36 -07001052 return put_user(result, value);
1053}
1054
Alan Cox60b33c12011-02-14 16:26:14 +00001055static int uart_tiocmget(struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001056{
1057 struct uart_state *state = tty->driver_data;
Alan Coxa2bceae2009-09-19 13:13:31 -07001058 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001059 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001060 int result = -EIO;
1061
Alan Coxa2bceae2009-09-19 13:13:31 -07001062 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001063 uport = uart_port_check(state);
1064 if (!uport)
1065 goto out;
1066
Peter Hurley18900ca2016-04-09 17:06:48 -07001067 if (!tty_io_error(tty)) {
Alan Cox46d57a42009-09-19 13:13:29 -07001068 result = uport->mctrl;
Alan Cox46d57a42009-09-19 13:13:29 -07001069 spin_lock_irq(&uport->lock);
1070 result |= uport->ops->get_mctrl(uport);
1071 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001072 }
Peter Hurley4047b372016-04-09 18:56:33 -07001073out:
Alan Coxa2bceae2009-09-19 13:13:31 -07001074 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001075 return result;
1076}
1077
1078static int
Alan Cox20b9d172011-02-14 16:26:50 +00001079uart_tiocmset(struct tty_struct *tty, unsigned int set, unsigned int clear)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001080{
1081 struct uart_state *state = tty->driver_data;
Alan Coxa2bceae2009-09-19 13:13:31 -07001082 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001083 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001084 int ret = -EIO;
1085
Alan Coxa2bceae2009-09-19 13:13:31 -07001086 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001087 uport = uart_port_check(state);
1088 if (!uport)
1089 goto out;
1090
Peter Hurley18900ca2016-04-09 17:06:48 -07001091 if (!tty_io_error(tty)) {
Alan Cox46d57a42009-09-19 13:13:29 -07001092 uart_update_mctrl(uport, set, clear);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001093 ret = 0;
1094 }
Peter Hurley4047b372016-04-09 18:56:33 -07001095out:
Alan Coxa2bceae2009-09-19 13:13:31 -07001096 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001097 return ret;
1098}
1099
Alan Cox9e989662008-07-22 11:18:03 +01001100static int uart_break_ctl(struct tty_struct *tty, int break_state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001101{
1102 struct uart_state *state = tty->driver_data;
Alan Coxa2bceae2009-09-19 13:13:31 -07001103 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001104 struct uart_port *uport;
1105 int ret = -EIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001106
Alan Coxa2bceae2009-09-19 13:13:31 -07001107 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001108 uport = uart_port_check(state);
1109 if (!uport)
1110 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001111
Alan Cox46d57a42009-09-19 13:13:29 -07001112 if (uport->type != PORT_UNKNOWN)
1113 uport->ops->break_ctl(uport, break_state);
Peter Hurley4047b372016-04-09 18:56:33 -07001114 ret = 0;
1115out:
Alan Coxa2bceae2009-09-19 13:13:31 -07001116 mutex_unlock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001117 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001118}
1119
Alan Cox19225132010-06-01 22:52:51 +02001120static int uart_do_autoconfig(struct tty_struct *tty,struct uart_state *state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001121{
Alan Coxa2bceae2009-09-19 13:13:31 -07001122 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001123 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001124 int flags, ret;
1125
1126 if (!capable(CAP_SYS_ADMIN))
1127 return -EPERM;
1128
1129 /*
1130 * Take the per-port semaphore. This prevents count from
1131 * changing, and hence any extra opens of the port while
1132 * we're auto-configuring.
1133 */
Alan Coxa2bceae2009-09-19 13:13:31 -07001134 if (mutex_lock_interruptible(&port->mutex))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001135 return -ERESTARTSYS;
1136
Peter Hurley4047b372016-04-09 18:56:33 -07001137 uport = uart_port_check(state);
1138 if (!uport) {
1139 ret = -EIO;
1140 goto out;
1141 }
1142
Linus Torvalds1da177e2005-04-16 15:20:36 -07001143 ret = -EBUSY;
Alan Coxb58d13a2009-09-19 13:13:32 -07001144 if (tty_port_users(port) == 1) {
Alan Cox19225132010-06-01 22:52:51 +02001145 uart_shutdown(tty, state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001146
1147 /*
1148 * If we already have a port type configured,
1149 * we must release its resources.
1150 */
Fabio Estevama7cfaf12016-05-20 01:59:54 -03001151 if (uport->type != PORT_UNKNOWN && uport->ops->release_port)
Alan Cox46d57a42009-09-19 13:13:29 -07001152 uport->ops->release_port(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001153
1154 flags = UART_CONFIG_TYPE;
Alan Cox46d57a42009-09-19 13:13:29 -07001155 if (uport->flags & UPF_AUTO_IRQ)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001156 flags |= UART_CONFIG_IRQ;
1157
1158 /*
1159 * This will claim the ports resources if
1160 * a port is found.
1161 */
Alan Cox46d57a42009-09-19 13:13:29 -07001162 uport->ops->config_port(uport, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163
Alan Cox19225132010-06-01 22:52:51 +02001164 ret = uart_startup(tty, state, 1);
Sebastian Andrzej Siewiorfbe1ad92018-02-03 12:27:23 +01001165 if (ret == 0)
1166 tty_port_set_initialized(port, true);
Rob Herringb3b57642016-08-22 17:39:09 -05001167 if (ret > 0)
1168 ret = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001169 }
Peter Hurley4047b372016-04-09 18:56:33 -07001170out:
Alan Coxa2bceae2009-09-19 13:13:31 -07001171 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001172 return ret;
1173}
1174
Alexander Shiyan1fdc3102014-06-03 18:54:43 +04001175static void uart_enable_ms(struct uart_port *uport)
1176{
1177 /*
1178 * Force modem status interrupts on
1179 */
1180 if (uport->ops->enable_ms)
1181 uport->ops->enable_ms(uport);
1182}
1183
Linus Torvalds1da177e2005-04-16 15:20:36 -07001184/*
1185 * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
1186 * - mask passed in arg for lines of interest
1187 * (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
1188 * Caller should use TIOCGICOUNT to see which one it was
Alan Coxbdc04e32009-09-19 13:13:31 -07001189 *
1190 * FIXME: This wants extracting into a common all driver implementation
1191 * of TIOCMWAIT using tty_port.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001192 */
Peter Hurley9ed19422016-04-09 18:56:34 -07001193static int uart_wait_modem_status(struct uart_state *state, unsigned long arg)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001194{
Peter Hurley9ed19422016-04-09 18:56:34 -07001195 struct uart_port *uport;
Alan Coxbdc04e32009-09-19 13:13:31 -07001196 struct tty_port *port = &state->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001197 DECLARE_WAITQUEUE(wait, current);
1198 struct uart_icount cprev, cnow;
1199 int ret;
1200
1201 /*
1202 * note the counters on entry
1203 */
Peter Hurley9ed19422016-04-09 18:56:34 -07001204 uport = uart_port_ref(state);
1205 if (!uport)
1206 return -EIO;
Alan Cox46d57a42009-09-19 13:13:29 -07001207 spin_lock_irq(&uport->lock);
1208 memcpy(&cprev, &uport->icount, sizeof(struct uart_icount));
Alexander Shiyan1fdc3102014-06-03 18:54:43 +04001209 uart_enable_ms(uport);
Alan Cox46d57a42009-09-19 13:13:29 -07001210 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001211
Alan Coxbdc04e32009-09-19 13:13:31 -07001212 add_wait_queue(&port->delta_msr_wait, &wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001213 for (;;) {
Alan Cox46d57a42009-09-19 13:13:29 -07001214 spin_lock_irq(&uport->lock);
1215 memcpy(&cnow, &uport->icount, sizeof(struct uart_icount));
1216 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001217
1218 set_current_state(TASK_INTERRUPTIBLE);
1219
1220 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
1221 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
1222 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
1223 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts))) {
Alan Coxa46c9992008-02-08 04:18:53 -08001224 ret = 0;
1225 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001226 }
1227
1228 schedule();
1229
1230 /* see if a signal did it */
1231 if (signal_pending(current)) {
1232 ret = -ERESTARTSYS;
1233 break;
1234 }
1235
1236 cprev = cnow;
1237 }
Fabian Frederick97f9f702015-02-20 19:12:57 +01001238 __set_current_state(TASK_RUNNING);
Alan Coxbdc04e32009-09-19 13:13:31 -07001239 remove_wait_queue(&port->delta_msr_wait, &wait);
Peter Hurley9ed19422016-04-09 18:56:34 -07001240 uart_port_deref(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001241
1242 return ret;
1243}
1244
1245/*
1246 * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
1247 * Return: write counters to the user passed counter struct
1248 * NB: both 1->0 and 0->1 transitions are counted except for
1249 * RI where only 0->1 is counted.
1250 */
Alan Coxd281da72010-09-16 18:21:24 +01001251static int uart_get_icount(struct tty_struct *tty,
1252 struct serial_icounter_struct *icount)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001253{
Alan Coxd281da72010-09-16 18:21:24 +01001254 struct uart_state *state = tty->driver_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001255 struct uart_icount cnow;
Peter Hurley9ed19422016-04-09 18:56:34 -07001256 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001257
Peter Hurley9ed19422016-04-09 18:56:34 -07001258 uport = uart_port_ref(state);
1259 if (!uport)
1260 return -EIO;
Alan Cox46d57a42009-09-19 13:13:29 -07001261 spin_lock_irq(&uport->lock);
1262 memcpy(&cnow, &uport->icount, sizeof(struct uart_icount));
1263 spin_unlock_irq(&uport->lock);
Peter Hurley9ed19422016-04-09 18:56:34 -07001264 uart_port_deref(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001265
Alan Coxd281da72010-09-16 18:21:24 +01001266 icount->cts = cnow.cts;
1267 icount->dsr = cnow.dsr;
1268 icount->rng = cnow.rng;
1269 icount->dcd = cnow.dcd;
1270 icount->rx = cnow.rx;
1271 icount->tx = cnow.tx;
1272 icount->frame = cnow.frame;
1273 icount->overrun = cnow.overrun;
1274 icount->parity = cnow.parity;
1275 icount->brk = cnow.brk;
1276 icount->buf_overrun = cnow.buf_overrun;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001277
Alan Coxd281da72010-09-16 18:21:24 +01001278 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001279}
1280
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001281static int uart_get_rs485_config(struct uart_port *port,
1282 struct serial_rs485 __user *rs485)
1283{
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001284 unsigned long flags;
1285 struct serial_rs485 aux;
1286
1287 spin_lock_irqsave(&port->lock, flags);
1288 aux = port->rs485;
1289 spin_unlock_irqrestore(&port->lock, flags);
1290
1291 if (copy_to_user(rs485, &aux, sizeof(aux)))
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001292 return -EFAULT;
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001293
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001294 return 0;
1295}
1296
1297static int uart_set_rs485_config(struct uart_port *port,
1298 struct serial_rs485 __user *rs485_user)
1299{
1300 struct serial_rs485 rs485;
1301 int ret;
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001302 unsigned long flags;
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001303
1304 if (!port->rs485_config)
1305 return -ENOIOCTLCMD;
1306
1307 if (copy_from_user(&rs485, rs485_user, sizeof(*rs485_user)))
1308 return -EFAULT;
1309
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001310 spin_lock_irqsave(&port->lock, flags);
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001311 ret = port->rs485_config(port, &rs485);
Ricardo Ribalda Delgadobd737f82014-11-06 09:23:00 +01001312 spin_unlock_irqrestore(&port->lock, flags);
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001313 if (ret)
1314 return ret;
1315
1316 if (copy_to_user(rs485_user, &port->rs485, sizeof(port->rs485)))
1317 return -EFAULT;
1318
1319 return 0;
1320}
1321
Linus Torvalds1da177e2005-04-16 15:20:36 -07001322/*
Alan Coxe5238442008-04-30 00:53:28 -07001323 * Called via sys_ioctl. We can use spin_lock_irq() here.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001324 */
1325static int
Peter Hurley4047b372016-04-09 18:56:33 -07001326uart_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001327{
1328 struct uart_state *state = tty->driver_data;
Alan Coxa2bceae2009-09-19 13:13:31 -07001329 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07001330 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001331 void __user *uarg = (void __user *)arg;
1332 int ret = -ENOIOCTLCMD;
1333
Linus Torvalds1da177e2005-04-16 15:20:36 -07001334
1335 /*
1336 * These ioctls don't rely on the hardware to be present.
1337 */
1338 switch (cmd) {
1339 case TIOCGSERIAL:
Alan Cox9f109692012-10-29 15:20:25 +00001340 ret = uart_get_info_user(port, uarg);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001341 break;
1342
1343 case TIOCSSERIAL:
Peter Hurley7c8ab962014-10-16 16:54:20 -04001344 down_write(&tty->termios_rwsem);
Alan Cox7ba2e762012-09-04 16:34:45 +01001345 ret = uart_set_info_user(tty, state, uarg);
Peter Hurley7c8ab962014-10-16 16:54:20 -04001346 up_write(&tty->termios_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001347 break;
1348
1349 case TIOCSERCONFIG:
Peter Hurley7c8ab962014-10-16 16:54:20 -04001350 down_write(&tty->termios_rwsem);
Alan Cox19225132010-06-01 22:52:51 +02001351 ret = uart_do_autoconfig(tty, state);
Peter Hurley7c8ab962014-10-16 16:54:20 -04001352 up_write(&tty->termios_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001353 break;
1354
1355 case TIOCSERGWILD: /* obsolete */
1356 case TIOCSERSWILD: /* obsolete */
1357 ret = 0;
1358 break;
1359 }
1360
1361 if (ret != -ENOIOCTLCMD)
1362 goto out;
1363
Peter Hurley18900ca2016-04-09 17:06:48 -07001364 if (tty_io_error(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001365 ret = -EIO;
1366 goto out;
1367 }
1368
1369 /*
1370 * The following should only be used when hardware is present.
1371 */
1372 switch (cmd) {
1373 case TIOCMIWAIT:
1374 ret = uart_wait_modem_status(state, arg);
1375 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001376 }
1377
1378 if (ret != -ENOIOCTLCMD)
1379 goto out;
1380
Alan Coxa2bceae2009-09-19 13:13:31 -07001381 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07001382 uport = uart_port_check(state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001383
Peter Hurley4047b372016-04-09 18:56:33 -07001384 if (!uport || tty_io_error(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001385 ret = -EIO;
1386 goto out_up;
1387 }
1388
1389 /*
1390 * All these rely on hardware being present and need to be
1391 * protected against the tty being hung up.
1392 */
Ricardo Ribalda Delgadoa9c20a92014-11-06 09:22:59 +01001393
Linus Torvalds1da177e2005-04-16 15:20:36 -07001394 switch (cmd) {
Ricardo Ribalda Delgadoa9c20a92014-11-06 09:22:59 +01001395 case TIOCSERGETLSR: /* Get line status register */
1396 ret = uart_get_lsr_info(tty, state, uarg);
1397 break;
1398
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001399 case TIOCGRS485:
Peter Hurley4047b372016-04-09 18:56:33 -07001400 ret = uart_get_rs485_config(uport, uarg);
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001401 break;
1402
1403 case TIOCSRS485:
Peter Hurley4047b372016-04-09 18:56:33 -07001404 ret = uart_set_rs485_config(uport, uarg);
Ricardo Ribalda Delgadoa5f276f2014-11-06 22:46:13 +01001405 break;
Peter Hurley4047b372016-04-09 18:56:33 -07001406 default:
Alan Cox46d57a42009-09-19 13:13:29 -07001407 if (uport->ops->ioctl)
1408 ret = uport->ops->ioctl(uport, cmd, arg);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001409 break;
1410 }
Alan Coxf34d7a52008-04-30 00:54:13 -07001411out_up:
Alan Coxa2bceae2009-09-19 13:13:31 -07001412 mutex_unlock(&port->mutex);
Alan Coxf34d7a52008-04-30 00:54:13 -07001413out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001414 return ret;
1415}
1416
Linus Torvaldsedeb2802008-06-04 10:35:03 -07001417static void uart_set_ldisc(struct tty_struct *tty)
Alan Cox64e91592008-06-03 15:18:54 +01001418{
1419 struct uart_state *state = tty->driver_data;
Peter Hurley4047b372016-04-09 18:56:33 -07001420 struct uart_port *uport;
Alan Cox64e91592008-06-03 15:18:54 +01001421
Peter Hurley4047b372016-04-09 18:56:33 -07001422 mutex_lock(&state->port.mutex);
1423 uport = uart_port_check(state);
1424 if (uport && uport->ops->set_ldisc)
Peter Hurley732a84a2014-11-05 13:11:43 -05001425 uport->ops->set_ldisc(uport, &tty->termios);
Peter Hurley4047b372016-04-09 18:56:33 -07001426 mutex_unlock(&state->port.mutex);
Alan Cox64e91592008-06-03 15:18:54 +01001427}
1428
Alan Coxa46c9992008-02-08 04:18:53 -08001429static void uart_set_termios(struct tty_struct *tty,
1430 struct ktermios *old_termios)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001431{
1432 struct uart_state *state = tty->driver_data;
Peter Hurley4047b372016-04-09 18:56:33 -07001433 struct uart_port *uport;
Alan Coxadc8d742012-07-14 15:31:47 +01001434 unsigned int cflag = tty->termios.c_cflag;
Russell King2cbacaf2012-04-17 16:34:13 +01001435 unsigned int iflag_mask = IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK;
1436 bool sw_changed = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001437
Peter Hurley4047b372016-04-09 18:56:33 -07001438 mutex_lock(&state->port.mutex);
1439 uport = uart_port_check(state);
1440 if (!uport)
1441 goto out;
1442
Russell King2cbacaf2012-04-17 16:34:13 +01001443 /*
1444 * Drivers doing software flow control also need to know
1445 * about changes to these input settings.
1446 */
1447 if (uport->flags & UPF_SOFT_FLOW) {
1448 iflag_mask |= IXANY|IXON|IXOFF;
1449 sw_changed =
1450 tty->termios.c_cc[VSTART] != old_termios->c_cc[VSTART] ||
1451 tty->termios.c_cc[VSTOP] != old_termios->c_cc[VSTOP];
1452 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001453
1454 /*
1455 * These are the bits that are used to setup various
David Woodhouse20620d62007-08-22 14:01:11 -07001456 * flags in the low level driver. We can ignore the Bfoo
1457 * bits in c_cflag; c_[io]speed will always be set
1458 * appropriately by set_termios() in tty_ioctl.c
Linus Torvalds1da177e2005-04-16 15:20:36 -07001459 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001460 if ((cflag ^ old_termios->c_cflag) == 0 &&
Alan Coxadc8d742012-07-14 15:31:47 +01001461 tty->termios.c_ospeed == old_termios->c_ospeed &&
1462 tty->termios.c_ispeed == old_termios->c_ispeed &&
Russell King2cbacaf2012-04-17 16:34:13 +01001463 ((tty->termios.c_iflag ^ old_termios->c_iflag) & iflag_mask) == 0 &&
1464 !sw_changed) {
Peter Hurley4047b372016-04-09 18:56:33 -07001465 goto out;
Alan Coxe5238442008-04-30 00:53:28 -07001466 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001467
Alan Cox19225132010-06-01 22:52:51 +02001468 uart_change_speed(tty, state, old_termios);
Peter Hurleyc18b55f2014-06-16 09:17:09 -04001469 /* reload cflag from termios; port driver may have overriden flags */
1470 cflag = tty->termios.c_cflag;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001471
1472 /* Handle transition to B0 status */
1473 if ((old_termios->c_cflag & CBAUD) && !(cflag & CBAUD))
Russell Kingdec94e72012-09-24 11:13:15 +01001474 uart_clear_mctrl(uport, TIOCM_RTS | TIOCM_DTR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001475 /* Handle transition away from B0 status */
André Goddard Rosa82cb7ba2009-10-25 11:18:26 -02001476 else if (!(old_termios->c_cflag & CBAUD) && (cflag & CBAUD)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001477 unsigned int mask = TIOCM_DTR;
Peter Hurley97ef38b2016-04-09 17:11:36 -07001478 if (!(cflag & CRTSCTS) || !tty_throttled(tty))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001479 mask |= TIOCM_RTS;
Russell Kingdec94e72012-09-24 11:13:15 +01001480 uart_set_mctrl(uport, mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001481 }
Peter Hurley4047b372016-04-09 18:56:33 -07001482out:
1483 mutex_unlock(&state->port.mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001484}
1485
1486/*
Kevin Cernekeeef4f5272012-12-26 20:43:41 -08001487 * Calls to uart_close() are serialised via the tty_lock in
1488 * drivers/tty/tty_io.c:tty_release()
1489 * drivers/tty/tty_io.c:do_tty_hangup()
Linus Torvalds1da177e2005-04-16 15:20:36 -07001490 */
1491static void uart_close(struct tty_struct *tty, struct file *filp)
1492{
1493 struct uart_state *state = tty->driver_data;
Alan Cox46d57a42009-09-19 13:13:29 -07001494 struct tty_port *port;
Alan Coxa46c9992008-02-08 04:18:53 -08001495
Peter Hurley91b32f52014-10-16 16:54:27 -04001496 if (!state) {
1497 struct uart_driver *drv = tty->driver->driver_state;
1498
1499 state = drv->state + tty->index;
1500 port = &state->port;
1501 spin_lock_irq(&port->lock);
1502 --port->count;
1503 spin_unlock_irq(&port->lock);
Linus Torvaldseea7e172009-10-12 19:13:54 +02001504 return;
Peter Hurley91b32f52014-10-16 16:54:27 -04001505 }
Linus Torvaldseea7e172009-10-12 19:13:54 +02001506
Alan Cox46d57a42009-09-19 13:13:29 -07001507 port = &state->port;
Peter Hurley39b3d892016-01-10 20:23:57 -08001508 pr_debug("uart_close(%d) called\n", tty->index);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001509
Rob Herring761ed4a2016-08-22 17:39:10 -05001510 tty_port_close(tty->port, tty, filp);
1511}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001512
Rob Herring761ed4a2016-08-22 17:39:10 -05001513static void uart_tty_port_shutdown(struct tty_port *port)
1514{
1515 struct uart_state *state = container_of(port, struct uart_state, port);
1516 struct uart_port *uport = uart_port_check(state);
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001517
Linus Torvalds1da177e2005-04-16 15:20:36 -07001518 /*
1519 * At this point, we stop accepting input. To do this, we
1520 * disable the receive line status interrupts.
1521 */
Andy Shevchenkoa5a2b132016-09-13 00:23:42 +03001522 if (WARN(!uport, "detached port still initialized!\n"))
1523 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001524
Andy Shevchenkoa5a2b132016-09-13 00:23:42 +03001525 spin_lock_irq(&uport->lock);
Rob Herring761ed4a2016-08-22 17:39:10 -05001526 uport->ops->stop_rx(uport);
Rob Herring761ed4a2016-08-22 17:39:10 -05001527 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001528
Rob Herring761ed4a2016-08-22 17:39:10 -05001529 uart_port_shutdown(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001530
1531 /*
Rob Herring761ed4a2016-08-22 17:39:10 -05001532 * It's possible for shutdown to be called after suspend if we get
1533 * a DCD drop (hangup) at just the right time. Clear suspended bit so
1534 * we don't try to resume a port that has been shutdown.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001535 */
Rob Herring761ed4a2016-08-22 17:39:10 -05001536 tty_port_set_suspended(port, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001537
Rob Herring761ed4a2016-08-22 17:39:10 -05001538 uart_change_pm(state, UART_PM_STATE_OFF);
Peter Hurley2e758912014-10-16 16:54:19 -04001539
Linus Torvalds1da177e2005-04-16 15:20:36 -07001540}
1541
Jiri Slaby1f33a512011-07-14 14:35:10 +02001542static void uart_wait_until_sent(struct tty_struct *tty, int timeout)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001543{
Jiri Slaby1f33a512011-07-14 14:35:10 +02001544 struct uart_state *state = tty->driver_data;
Peter Hurley9ed19422016-04-09 18:56:34 -07001545 struct uart_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001546 unsigned long char_time, expire;
1547
Peter Hurley9ed19422016-04-09 18:56:34 -07001548 port = uart_port_ref(state);
1549 if (!port || port->type == PORT_UNKNOWN || port->fifosize == 0) {
1550 uart_port_deref(port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001551 return;
Peter Hurley9ed19422016-04-09 18:56:34 -07001552 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001553
1554 /*
1555 * Set the check interval to be 1/5 of the estimated time to
1556 * send a single character, and make it at least 1. The check
1557 * interval should also be less than the timeout.
1558 *
1559 * Note: we have to use pretty tight timings here to satisfy
1560 * the NIST-PCTS.
1561 */
1562 char_time = (port->timeout - HZ/50) / port->fifosize;
1563 char_time = char_time / 5;
1564 if (char_time == 0)
1565 char_time = 1;
1566 if (timeout && timeout < char_time)
1567 char_time = timeout;
1568
1569 /*
1570 * If the transmitter hasn't cleared in twice the approximate
1571 * amount of time to send the entire FIFO, it probably won't
1572 * ever clear. This assumes the UART isn't doing flow
1573 * control, which is currently the case. Hence, if it ever
1574 * takes longer than port->timeout, this is probably due to a
1575 * UART bug of some kind. So, we clamp the timeout parameter at
1576 * 2*port->timeout.
1577 */
1578 if (timeout == 0 || timeout > 2 * port->timeout)
1579 timeout = 2 * port->timeout;
1580
1581 expire = jiffies + timeout;
1582
Jiri Slabyeb3a1e12007-05-06 14:48:52 -07001583 pr_debug("uart_wait_until_sent(%d), jiffies=%lu, expire=%lu...\n",
Alan Coxa46c9992008-02-08 04:18:53 -08001584 port->line, jiffies, expire);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001585
1586 /*
1587 * Check whether the transmitter is empty every 'char_time'.
1588 * 'timeout' / 'expire' give us the maximum amount of time
1589 * we wait.
1590 */
1591 while (!port->ops->tx_empty(port)) {
1592 msleep_interruptible(jiffies_to_msecs(char_time));
1593 if (signal_pending(current))
1594 break;
1595 if (time_after(jiffies, expire))
1596 break;
1597 }
Peter Hurley9ed19422016-04-09 18:56:34 -07001598 uart_port_deref(port);
Arnd Bergmann20365212010-06-01 22:53:07 +02001599}
1600
Linus Torvalds1da177e2005-04-16 15:20:36 -07001601/*
Kevin Cernekeeef4f5272012-12-26 20:43:41 -08001602 * Calls to uart_hangup() are serialised by the tty_lock in
1603 * drivers/tty/tty_io.c:do_tty_hangup()
1604 * This runs from a workqueue and can sleep for a _short_ time only.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001605 */
1606static void uart_hangup(struct tty_struct *tty)
1607{
1608 struct uart_state *state = tty->driver_data;
Alan Cox46d57a42009-09-19 13:13:29 -07001609 struct tty_port *port = &state->port;
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001610 struct uart_port *uport;
Alan Cox61cd8a22010-06-01 22:52:57 +02001611 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001612
Peter Hurley39b3d892016-01-10 20:23:57 -08001613 pr_debug("uart_hangup(%d)\n", tty->index);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001614
Alan Coxa2bceae2009-09-19 13:13:31 -07001615 mutex_lock(&port->mutex);
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001616 uport = uart_port_check(state);
1617 WARN(!uport, "hangup of detached port!\n");
1618
Peter Hurley807c8d812016-04-09 17:53:22 -07001619 if (tty_port_active(port)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001620 uart_flush_buffer(tty);
Alan Cox19225132010-06-01 22:52:51 +02001621 uart_shutdown(tty, state);
Alan Cox61cd8a22010-06-01 22:52:57 +02001622 spin_lock_irqsave(&port->lock, flags);
Alan Cox91312cd2009-09-19 13:13:29 -07001623 port->count = 0;
Alan Cox61cd8a22010-06-01 22:52:57 +02001624 spin_unlock_irqrestore(&port->lock, flags);
Peter Hurley807c8d812016-04-09 17:53:22 -07001625 tty_port_set_active(port, 0);
Alan Cox7b014782009-09-19 13:13:33 -07001626 tty_port_tty_set(port, NULL);
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001627 if (uport && !uart_console(uport))
Geert Uytterhoevenbf903c02014-03-27 11:40:39 +01001628 uart_change_pm(state, UART_PM_STATE_OFF);
Alan Cox46d57a42009-09-19 13:13:29 -07001629 wake_up_interruptible(&port->open_wait);
Alan Coxbdc04e32009-09-19 13:13:31 -07001630 wake_up_interruptible(&port->delta_msr_wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001631 }
Alan Coxa2bceae2009-09-19 13:13:31 -07001632 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001633}
1634
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001635/* uport == NULL if uart_port has already been removed */
Jiri Slaby0b1db832011-11-09 21:33:50 +01001636static void uart_port_shutdown(struct tty_port *port)
1637{
Jiri Slabyb922e192011-11-09 21:33:51 +01001638 struct uart_state *state = container_of(port, struct uart_state, port);
Peter Hurley4047b372016-04-09 18:56:33 -07001639 struct uart_port *uport = uart_port_check(state);
Jiri Slabyb922e192011-11-09 21:33:51 +01001640
1641 /*
1642 * clear delta_msr_wait queue to avoid mem leaks: we may free
1643 * the irq here so the queue might never be woken up. Note
1644 * that we won't end up waiting on delta_msr_wait again since
1645 * any outstanding file descriptors should be pointing at
1646 * hung_up_tty_fops now.
1647 */
1648 wake_up_interruptible(&port->delta_msr_wait);
1649
1650 /*
1651 * Free the IRQ and disable the port.
1652 */
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001653 if (uport)
1654 uport->ops->shutdown(uport);
Jiri Slabyb922e192011-11-09 21:33:51 +01001655
1656 /*
1657 * Ensure that the IRQ handler isn't running on another CPU.
1658 */
Peter Hurleyaf224ca2016-04-09 18:56:35 -07001659 if (uport)
1660 synchronize_irq(uport->irq);
Jiri Slaby0b1db832011-11-09 21:33:50 +01001661}
1662
Alan Coxde0c8cb2010-06-01 22:52:58 +02001663static int uart_carrier_raised(struct tty_port *port)
1664{
1665 struct uart_state *state = container_of(port, struct uart_state, port);
Peter Hurley9ed19422016-04-09 18:56:34 -07001666 struct uart_port *uport;
Alan Coxde0c8cb2010-06-01 22:52:58 +02001667 int mctrl;
Peter Hurley9ed19422016-04-09 18:56:34 -07001668
1669 uport = uart_port_ref(state);
1670 /*
1671 * Should never observe uport == NULL since checks for hangup should
1672 * abort the tty_port_block_til_ready() loop before checking for carrier
1673 * raised -- but report carrier raised if it does anyway so open will
1674 * continue and not sleep
1675 */
1676 if (WARN_ON(!uport))
1677 return 1;
Alan Coxde0c8cb2010-06-01 22:52:58 +02001678 spin_lock_irq(&uport->lock);
Alexander Shiyan1fdc3102014-06-03 18:54:43 +04001679 uart_enable_ms(uport);
Alan Coxde0c8cb2010-06-01 22:52:58 +02001680 mctrl = uport->ops->get_mctrl(uport);
1681 spin_unlock_irq(&uport->lock);
Peter Hurley9ed19422016-04-09 18:56:34 -07001682 uart_port_deref(uport);
Alan Coxde0c8cb2010-06-01 22:52:58 +02001683 if (mctrl & TIOCM_CAR)
1684 return 1;
1685 return 0;
1686}
1687
1688static void uart_dtr_rts(struct tty_port *port, int onoff)
1689{
1690 struct uart_state *state = container_of(port, struct uart_state, port);
Peter Hurley9ed19422016-04-09 18:56:34 -07001691 struct uart_port *uport;
1692
1693 uport = uart_port_ref(state);
1694 if (!uport)
1695 return;
Alan Cox24fcc7c2010-06-01 22:52:59 +02001696
Jiri Slaby6f5c24a2011-03-30 00:10:57 +02001697 if (onoff)
Alan Coxde0c8cb2010-06-01 22:52:58 +02001698 uart_set_mctrl(uport, TIOCM_DTR | TIOCM_RTS);
1699 else
1700 uart_clear_mctrl(uport, TIOCM_DTR | TIOCM_RTS);
Peter Hurley9ed19422016-04-09 18:56:34 -07001701
1702 uart_port_deref(uport);
Alan Coxde0c8cb2010-06-01 22:52:58 +02001703}
1704
Linus Torvalds1da177e2005-04-16 15:20:36 -07001705/*
Kevin Cernekeeef4f5272012-12-26 20:43:41 -08001706 * Calls to uart_open are serialised by the tty_lock in
1707 * drivers/tty/tty_io.c:tty_open()
Linus Torvalds1da177e2005-04-16 15:20:36 -07001708 * Note that if this fails, then uart_close() _will_ be called.
1709 *
1710 * In time, we want to scrap the "opening nonpresent ports"
1711 * behaviour and implement an alternative way for setserial
1712 * to set base addresses/ports/types. This will allow us to
1713 * get rid of a certain amount of extra tests.
1714 */
1715static int uart_open(struct tty_struct *tty, struct file *filp)
1716{
Jiri Slabyabad73a2019-04-17 10:58:53 +02001717 struct uart_state *state = tty->driver_data;
1718 int retval;
Rob Herringb3b57642016-08-22 17:39:09 -05001719
1720 retval = tty_port_open(&state->port, tty, filp);
1721 if (retval > 0)
1722 retval = 0;
1723
1724 return retval;
1725}
1726
1727static int uart_port_activate(struct tty_port *port, struct tty_struct *tty)
1728{
1729 struct uart_state *state = container_of(port, struct uart_state, port);
1730 struct uart_port *uport;
Serge Semin47807592019-05-08 13:44:41 +03001731 int ret;
Rob Herringb3b57642016-08-22 17:39:09 -05001732
1733 uport = uart_port_check(state);
1734 if (!uport || uport->flags & UPF_DEAD)
1735 return -ENXIO;
1736
Peter Hurley4047b372016-04-09 18:56:33 -07001737 port->low_latency = (uport->flags & UPF_LOW_LATENCY) ? 1 : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001738
1739 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001740 * Start up the serial port.
1741 */
Serge Semin47807592019-05-08 13:44:41 +03001742 ret = uart_startup(tty, state, 0);
1743 if (ret > 0)
1744 tty_port_set_active(port, 1);
1745
1746 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001747}
1748
1749static const char *uart_type(struct uart_port *port)
1750{
1751 const char *str = NULL;
1752
1753 if (port->ops->type)
1754 str = port->ops->type(port);
1755
1756 if (!str)
1757 str = "unknown";
1758
1759 return str;
1760}
1761
1762#ifdef CONFIG_PROC_FS
1763
Alexey Dobriyand196a942009-03-31 15:19:21 -07001764static void uart_line_info(struct seq_file *m, struct uart_driver *drv, int i)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001765{
1766 struct uart_state *state = drv->state + i;
Alan Coxa2bceae2009-09-19 13:13:31 -07001767 struct tty_port *port = &state->port;
Linus Walleij6f538fe2012-12-07 11:36:08 +01001768 enum uart_pm_state pm_state;
Peter Hurley4047b372016-04-09 18:56:33 -07001769 struct uart_port *uport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001770 char stat_buf[32];
1771 unsigned int status;
Alexey Dobriyand196a942009-03-31 15:19:21 -07001772 int mmio;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001773
Peter Hurley4047b372016-04-09 18:56:33 -07001774 mutex_lock(&port->mutex);
1775 uport = uart_port_check(state);
Alan Coxa2bceae2009-09-19 13:13:31 -07001776 if (!uport)
Peter Hurley4047b372016-04-09 18:56:33 -07001777 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001778
Alan Coxa2bceae2009-09-19 13:13:31 -07001779 mmio = uport->iotype >= UPIO_MEM;
Alexey Dobriyand196a942009-03-31 15:19:21 -07001780 seq_printf(m, "%d: uart:%s %s%08llX irq:%d",
Alan Coxa2bceae2009-09-19 13:13:31 -07001781 uport->line, uart_type(uport),
Sergei Shtylyov6c6a2332006-09-04 00:04:20 +04001782 mmio ? "mmio:0x" : "port:",
Alan Coxa2bceae2009-09-19 13:13:31 -07001783 mmio ? (unsigned long long)uport->mapbase
1784 : (unsigned long long)uport->iobase,
1785 uport->irq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001786
Alan Coxa2bceae2009-09-19 13:13:31 -07001787 if (uport->type == PORT_UNKNOWN) {
Alexey Dobriyand196a942009-03-31 15:19:21 -07001788 seq_putc(m, '\n');
Peter Hurley4047b372016-04-09 18:56:33 -07001789 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001790 }
1791
Alan Coxa46c9992008-02-08 04:18:53 -08001792 if (capable(CAP_SYS_ADMIN)) {
George G. Davis3689a0e2007-02-14 00:33:06 -08001793 pm_state = state->pm_state;
Linus Walleij6f538fe2012-12-07 11:36:08 +01001794 if (pm_state != UART_PM_STATE_ON)
1795 uart_change_pm(state, UART_PM_STATE_ON);
Alan Coxa2bceae2009-09-19 13:13:31 -07001796 spin_lock_irq(&uport->lock);
1797 status = uport->ops->get_mctrl(uport);
1798 spin_unlock_irq(&uport->lock);
Linus Walleij6f538fe2012-12-07 11:36:08 +01001799 if (pm_state != UART_PM_STATE_ON)
George G. Davis3689a0e2007-02-14 00:33:06 -08001800 uart_change_pm(state, pm_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001801
Alexey Dobriyand196a942009-03-31 15:19:21 -07001802 seq_printf(m, " tx:%d rx:%d",
Alan Coxa2bceae2009-09-19 13:13:31 -07001803 uport->icount.tx, uport->icount.rx);
1804 if (uport->icount.frame)
Peter Hurley968af292016-01-10 20:24:01 -08001805 seq_printf(m, " fe:%d", uport->icount.frame);
Alan Coxa2bceae2009-09-19 13:13:31 -07001806 if (uport->icount.parity)
Peter Hurley968af292016-01-10 20:24:01 -08001807 seq_printf(m, " pe:%d", uport->icount.parity);
Alan Coxa2bceae2009-09-19 13:13:31 -07001808 if (uport->icount.brk)
Peter Hurley968af292016-01-10 20:24:01 -08001809 seq_printf(m, " brk:%d", uport->icount.brk);
Alan Coxa2bceae2009-09-19 13:13:31 -07001810 if (uport->icount.overrun)
Peter Hurley968af292016-01-10 20:24:01 -08001811 seq_printf(m, " oe:%d", uport->icount.overrun);
Alan Coxa46c9992008-02-08 04:18:53 -08001812
1813#define INFOBIT(bit, str) \
Alan Coxa2bceae2009-09-19 13:13:31 -07001814 if (uport->mctrl & (bit)) \
Linus Torvalds1da177e2005-04-16 15:20:36 -07001815 strncat(stat_buf, (str), sizeof(stat_buf) - \
1816 strlen(stat_buf) - 2)
Alan Coxa46c9992008-02-08 04:18:53 -08001817#define STATBIT(bit, str) \
Linus Torvalds1da177e2005-04-16 15:20:36 -07001818 if (status & (bit)) \
1819 strncat(stat_buf, (str), sizeof(stat_buf) - \
1820 strlen(stat_buf) - 2)
1821
1822 stat_buf[0] = '\0';
1823 stat_buf[1] = '\0';
1824 INFOBIT(TIOCM_RTS, "|RTS");
1825 STATBIT(TIOCM_CTS, "|CTS");
1826 INFOBIT(TIOCM_DTR, "|DTR");
1827 STATBIT(TIOCM_DSR, "|DSR");
1828 STATBIT(TIOCM_CAR, "|CD");
1829 STATBIT(TIOCM_RNG, "|RI");
1830 if (stat_buf[0])
1831 stat_buf[0] = ' ';
Alan Coxa46c9992008-02-08 04:18:53 -08001832
Alexey Dobriyand196a942009-03-31 15:19:21 -07001833 seq_puts(m, stat_buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001834 }
Alexey Dobriyand196a942009-03-31 15:19:21 -07001835 seq_putc(m, '\n');
Linus Torvalds1da177e2005-04-16 15:20:36 -07001836#undef STATBIT
1837#undef INFOBIT
Peter Hurley4047b372016-04-09 18:56:33 -07001838out:
1839 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001840}
1841
Alexey Dobriyand196a942009-03-31 15:19:21 -07001842static int uart_proc_show(struct seq_file *m, void *v)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001843{
Alexey Dobriyan833bb302009-04-02 01:30:04 +04001844 struct tty_driver *ttydrv = m->private;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001845 struct uart_driver *drv = ttydrv->driver_state;
Alexey Dobriyand196a942009-03-31 15:19:21 -07001846 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001847
Peter Hurley968af292016-01-10 20:24:01 -08001848 seq_printf(m, "serinfo:1.0 driver%s%s revision:%s\n", "", "", "");
Alexey Dobriyand196a942009-03-31 15:19:21 -07001849 for (i = 0; i < drv->nr; i++)
1850 uart_line_info(m, drv, i);
1851 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001852}
Alexey Dobriyand196a942009-03-31 15:19:21 -07001853
1854static int uart_proc_open(struct inode *inode, struct file *file)
1855{
Al Virod9dda782013-03-31 18:16:14 -04001856 return single_open(file, uart_proc_show, PDE_DATA(inode));
Alexey Dobriyand196a942009-03-31 15:19:21 -07001857}
1858
1859static const struct file_operations uart_proc_fops = {
1860 .owner = THIS_MODULE,
1861 .open = uart_proc_open,
1862 .read = seq_read,
1863 .llseek = seq_lseek,
1864 .release = single_release,
1865};
Linus Torvalds1da177e2005-04-16 15:20:36 -07001866#endif
1867
Andrew Morton4a1b5502008-03-07 15:51:16 -08001868#if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(CONFIG_CONSOLE_POLL)
Peter Hurley1cfe42b2015-03-09 16:27:13 -04001869/**
Russell Kingd3587882006-03-20 20:00:09 +00001870 * uart_console_write - write a console message to a serial port
1871 * @port: the port to write the message
1872 * @s: array of characters
1873 * @count: number of characters in string to write
Peter Hurley10afbe32015-04-11 10:05:07 -04001874 * @putchar: function to write character to port
Russell Kingd3587882006-03-20 20:00:09 +00001875 */
1876void uart_console_write(struct uart_port *port, const char *s,
1877 unsigned int count,
1878 void (*putchar)(struct uart_port *, int))
1879{
1880 unsigned int i;
1881
1882 for (i = 0; i < count; i++, s++) {
1883 if (*s == '\n')
1884 putchar(port, '\r');
1885 putchar(port, *s);
1886 }
1887}
1888EXPORT_SYMBOL_GPL(uart_console_write);
1889
1890/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001891 * Check whether an invalid uart number has been specified, and
1892 * if so, search for the first available port that does have
1893 * console support.
1894 */
1895struct uart_port * __init
1896uart_get_console(struct uart_port *ports, int nr, struct console *co)
1897{
1898 int idx = co->index;
1899
1900 if (idx < 0 || idx >= nr || (ports[idx].iobase == 0 &&
1901 ports[idx].membase == NULL))
1902 for (idx = 0; idx < nr; idx++)
1903 if (ports[idx].iobase != 0 ||
1904 ports[idx].membase != NULL)
1905 break;
1906
1907 co->index = idx;
1908
1909 return ports + idx;
1910}
1911
1912/**
Peter Hurley73abaf82015-03-01 11:05:46 -05001913 * uart_parse_earlycon - Parse earlycon options
1914 * @p: ptr to 2nd field (ie., just beyond '<name>,')
1915 * @iotype: ptr for decoded iotype (out)
1916 * @addr: ptr for decoded mapbase/iobase (out)
1917 * @options: ptr for <options> field; NULL if not present (out)
1918 *
1919 * Decodes earlycon kernel command line parameters of the form
Masahiro Yamadabd94c402015-10-28 12:46:05 +09001920 * earlycon=<name>,io|mmio|mmio16|mmio32|mmio32be|mmio32native,<addr>,<options>
1921 * console=<name>,io|mmio|mmio16|mmio32|mmio32be|mmio32native,<addr>,<options>
Peter Hurley73abaf82015-03-01 11:05:46 -05001922 *
1923 * The optional form
1924 * earlycon=<name>,0x<addr>,<options>
1925 * console=<name>,0x<addr>,<options>
1926 * is also accepted; the returned @iotype will be UPIO_MEM.
1927 *
Alexander Sverdlin8b2303d2016-09-12 13:29:29 +02001928 * Returns 0 on success or -EINVAL on failure
Peter Hurley73abaf82015-03-01 11:05:46 -05001929 */
Alexander Sverdlin46e36682016-09-02 13:20:21 +02001930int uart_parse_earlycon(char *p, unsigned char *iotype, resource_size_t *addr,
Peter Hurley73abaf82015-03-01 11:05:46 -05001931 char **options)
1932{
1933 if (strncmp(p, "mmio,", 5) == 0) {
1934 *iotype = UPIO_MEM;
1935 p += 5;
Masahiro Yamadabd94c402015-10-28 12:46:05 +09001936 } else if (strncmp(p, "mmio16,", 7) == 0) {
1937 *iotype = UPIO_MEM16;
1938 p += 7;
Peter Hurley73abaf82015-03-01 11:05:46 -05001939 } else if (strncmp(p, "mmio32,", 7) == 0) {
1940 *iotype = UPIO_MEM32;
1941 p += 7;
Noam Camus6e63be32015-05-25 06:54:28 +03001942 } else if (strncmp(p, "mmio32be,", 9) == 0) {
1943 *iotype = UPIO_MEM32BE;
1944 p += 9;
Max Filippovd215d802015-09-22 15:20:32 +03001945 } else if (strncmp(p, "mmio32native,", 13) == 0) {
1946 *iotype = IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) ?
1947 UPIO_MEM32BE : UPIO_MEM32;
1948 p += 13;
Peter Hurley73abaf82015-03-01 11:05:46 -05001949 } else if (strncmp(p, "io,", 3) == 0) {
1950 *iotype = UPIO_PORT;
1951 p += 3;
1952 } else if (strncmp(p, "0x", 2) == 0) {
1953 *iotype = UPIO_MEM;
1954 } else {
1955 return -EINVAL;
1956 }
1957
Alexander Sverdlin8b2303d2016-09-12 13:29:29 +02001958 /*
1959 * Before you replace it with kstrtoull(), think about options separator
1960 * (',') it will not tolerate
1961 */
1962 *addr = simple_strtoull(p, NULL, 0);
Peter Hurley73abaf82015-03-01 11:05:46 -05001963 p = strchr(p, ',');
1964 if (p)
1965 p++;
1966
1967 *options = p;
1968 return 0;
1969}
1970EXPORT_SYMBOL_GPL(uart_parse_earlycon);
1971
1972/**
Geert Uytterhoeven02088ca2014-03-11 11:23:35 +01001973 * uart_parse_options - Parse serial port baud/parity/bits/flow control.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001974 * @options: pointer to option string
1975 * @baud: pointer to an 'int' variable for the baud rate.
1976 * @parity: pointer to an 'int' variable for the parity.
1977 * @bits: pointer to an 'int' variable for the number of data bits.
1978 * @flow: pointer to an 'int' variable for the flow control character.
1979 *
1980 * uart_parse_options decodes a string containing the serial console
1981 * options. The format of the string is <baud><parity><bits><flow>,
1982 * eg: 115200n8r
1983 */
Jason Wesself2d937f2008-04-17 20:05:37 +02001984void
Linus Torvalds1da177e2005-04-16 15:20:36 -07001985uart_parse_options(char *options, int *baud, int *parity, int *bits, int *flow)
1986{
1987 char *s = options;
1988
1989 *baud = simple_strtoul(s, NULL, 10);
1990 while (*s >= '0' && *s <= '9')
1991 s++;
1992 if (*s)
1993 *parity = *s++;
1994 if (*s)
1995 *bits = *s++ - '0';
1996 if (*s)
1997 *flow = *s;
1998}
Jason Wesself2d937f2008-04-17 20:05:37 +02001999EXPORT_SYMBOL_GPL(uart_parse_options);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002000
Linus Torvalds1da177e2005-04-16 15:20:36 -07002001/**
2002 * uart_set_options - setup the serial console parameters
2003 * @port: pointer to the serial ports uart_port structure
2004 * @co: console pointer
2005 * @baud: baud rate
2006 * @parity: parity character - 'n' (none), 'o' (odd), 'e' (even)
2007 * @bits: number of data bits
2008 * @flow: flow control character - 'r' (rts)
2009 */
Jason Wesself2d937f2008-04-17 20:05:37 +02002010int
Linus Torvalds1da177e2005-04-16 15:20:36 -07002011uart_set_options(struct uart_port *port, struct console *co,
2012 int baud, int parity, int bits, int flow)
2013{
Alan Cox606d0992006-12-08 02:38:45 -08002014 struct ktermios termios;
Alan Cox149b36e2007-10-18 01:24:16 -07002015 static struct ktermios dummy;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002016
Russell King976ecd12005-07-03 21:05:45 +01002017 /*
2018 * Ensure that the serial console lock is initialised
2019 * early.
Randy Witt42b6a1b2013-10-17 16:56:47 -04002020 * If this port is a console, then the spinlock is already
2021 * initialised.
Russell King976ecd12005-07-03 21:05:45 +01002022 */
Randy Witt42b6a1b2013-10-17 16:56:47 -04002023 if (!(uart_console(port) && (port->cons->flags & CON_ENABLED))) {
2024 spin_lock_init(&port->lock);
2025 lockdep_set_class(&port->lock, &port_lock_key);
2026 }
Russell King976ecd12005-07-03 21:05:45 +01002027
Alan Cox606d0992006-12-08 02:38:45 -08002028 memset(&termios, 0, sizeof(struct ktermios));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002029
Jeffy Chenba47f972016-01-04 15:54:46 +08002030 termios.c_cflag |= CREAD | HUPCL | CLOCAL;
2031 tty_termios_encode_baud_rate(&termios, baud, baud);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002032
2033 if (bits == 7)
2034 termios.c_cflag |= CS7;
2035 else
2036 termios.c_cflag |= CS8;
2037
2038 switch (parity) {
2039 case 'o': case 'O':
2040 termios.c_cflag |= PARODD;
2041 /*fall through*/
2042 case 'e': case 'E':
2043 termios.c_cflag |= PARENB;
2044 break;
2045 }
2046
2047 if (flow == 'r')
2048 termios.c_cflag |= CRTSCTS;
2049
Yinghai Lu79492682007-07-15 23:37:25 -07002050 /*
2051 * some uarts on other side don't support no flow control.
2052 * So we set * DTR in host uart to make them happy
2053 */
2054 port->mctrl |= TIOCM_DTR;
2055
Alan Cox149b36e2007-10-18 01:24:16 -07002056 port->ops->set_termios(port, &termios, &dummy);
Jason Wesself2d937f2008-04-17 20:05:37 +02002057 /*
2058 * Allow the setting of the UART parameters with a NULL console
2059 * too:
2060 */
2061 if (co)
2062 co->cflag = termios.c_cflag;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002063
2064 return 0;
2065}
Jason Wesself2d937f2008-04-17 20:05:37 +02002066EXPORT_SYMBOL_GPL(uart_set_options);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002067#endif /* CONFIG_SERIAL_CORE_CONSOLE */
2068
Jiri Slabycf755252011-11-09 21:33:47 +01002069/**
2070 * uart_change_pm - set power state of the port
2071 *
2072 * @state: port descriptor
2073 * @pm_state: new state
2074 *
2075 * Locking: port->mutex has to be held
2076 */
Linus Walleij6f538fe2012-12-07 11:36:08 +01002077static void uart_change_pm(struct uart_state *state,
2078 enum uart_pm_state pm_state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002079{
Peter Hurley4047b372016-04-09 18:56:33 -07002080 struct uart_port *port = uart_port_check(state);
Andrew Victor1281e362006-05-16 11:28:49 +01002081
2082 if (state->pm_state != pm_state) {
Peter Hurley4047b372016-04-09 18:56:33 -07002083 if (port && port->ops->pm)
Andrew Victor1281e362006-05-16 11:28:49 +01002084 port->ops->pm(port, pm_state, state->pm_state);
2085 state->pm_state = pm_state;
2086 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002087}
2088
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002089struct uart_match {
2090 struct uart_port *port;
2091 struct uart_driver *driver;
2092};
2093
2094static int serial_match_port(struct device *dev, void *data)
2095{
2096 struct uart_match *match = data;
Guennadi Liakhovetski7ca796f2008-07-04 09:59:28 -07002097 struct tty_driver *tty_drv = match->driver->tty_driver;
2098 dev_t devt = MKDEV(tty_drv->major, tty_drv->minor_start) +
2099 match->port->line;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002100
2101 return dev->devt == devt; /* Actually, only one tty per port */
2102}
2103
Alan Coxccce6de2009-09-19 13:13:30 -07002104int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002105{
Alan Coxccce6de2009-09-19 13:13:30 -07002106 struct uart_state *state = drv->state + uport->line;
2107 struct tty_port *port = &state->port;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002108 struct device *tty_dev;
Alan Coxccce6de2009-09-19 13:13:30 -07002109 struct uart_match match = {uport, drv};
Linus Torvalds1da177e2005-04-16 15:20:36 -07002110
Alan Coxa2bceae2009-09-19 13:13:31 -07002111 mutex_lock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002112
Alan Coxccce6de2009-09-19 13:13:30 -07002113 tty_dev = device_find_child(uport->dev, &match, serial_match_port);
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002114 if (device_may_wakeup(tty_dev)) {
Govindraj.R3f960db2010-12-16 18:12:47 +05302115 if (!enable_irq_wake(uport->irq))
2116 uport->irq_wake = 1;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002117 put_device(tty_dev);
Alan Coxa2bceae2009-09-19 13:13:31 -07002118 mutex_unlock(&port->mutex);
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002119 return 0;
2120 }
Federico Vaga5a65dcc2013-04-15 16:01:07 +02002121 put_device(tty_dev);
2122
Peter Hurleyb164c972015-01-22 12:24:25 -05002123 /* Nothing to do if the console is not suspending */
2124 if (!console_suspend_enabled && uart_console(uport))
2125 goto unlock;
2126
2127 uport->suspended = 1;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002128
Peter Hurleyd41861c2016-04-09 17:53:25 -07002129 if (tty_port_initialized(port)) {
Alan Coxccce6de2009-09-19 13:13:30 -07002130 const struct uart_ops *ops = uport->ops;
Russell Kingc8c6bfa2008-02-04 22:27:52 -08002131 int tries;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002132
Peter Hurley80f02d52016-04-09 17:53:24 -07002133 tty_port_set_suspended(port, 1);
Peter Hurleyd41861c2016-04-09 17:53:25 -07002134 tty_port_set_initialized(port, 0);
Russell Kinga6b93a92006-10-01 17:17:40 +01002135
Peter Hurleyb164c972015-01-22 12:24:25 -05002136 spin_lock_irq(&uport->lock);
2137 ops->stop_tx(uport);
2138 ops->set_mctrl(uport, 0);
2139 ops->stop_rx(uport);
2140 spin_unlock_irq(&uport->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002141
2142 /*
2143 * Wait for the transmitter to empty.
2144 */
Alan Coxccce6de2009-09-19 13:13:30 -07002145 for (tries = 3; !ops->tx_empty(uport) && tries; tries--)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002146 msleep(10);
Russell Kingc8c6bfa2008-02-04 22:27:52 -08002147 if (!tries)
Sudip Mukherjee2f2dafe2014-09-01 20:49:43 +05302148 dev_err(uport->dev, "%s%d: Unable to drain transmitter\n",
2149 drv->dev_name,
2150 drv->tty_driver->name_base + uport->line);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002151
Peter Hurleyb164c972015-01-22 12:24:25 -05002152 ops->shutdown(uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002153 }
2154
2155 /*
2156 * Disable the console device before suspending.
2157 */
Peter Hurleyb164c972015-01-22 12:24:25 -05002158 if (uart_console(uport))
Alan Coxccce6de2009-09-19 13:13:30 -07002159 console_stop(uport->cons);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002160
Peter Hurleyb164c972015-01-22 12:24:25 -05002161 uart_change_pm(state, UART_PM_STATE_OFF);
2162unlock:
Alan Coxa2bceae2009-09-19 13:13:31 -07002163 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002164
2165 return 0;
2166}
2167
Alan Coxccce6de2009-09-19 13:13:30 -07002168int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002169{
Alan Coxccce6de2009-09-19 13:13:30 -07002170 struct uart_state *state = drv->state + uport->line;
2171 struct tty_port *port = &state->port;
Arjan van de Ven03a74dc2008-05-23 13:04:49 -07002172 struct device *tty_dev;
Alan Coxccce6de2009-09-19 13:13:30 -07002173 struct uart_match match = {uport, drv};
Deepak Saxenaba15ab02009-09-19 13:13:33 -07002174 struct ktermios termios;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002175
Alan Coxa2bceae2009-09-19 13:13:31 -07002176 mutex_lock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002177
Alan Coxccce6de2009-09-19 13:13:30 -07002178 tty_dev = device_find_child(uport->dev, &match, serial_match_port);
2179 if (!uport->suspended && device_may_wakeup(tty_dev)) {
Govindraj.R3f960db2010-12-16 18:12:47 +05302180 if (uport->irq_wake) {
2181 disable_irq_wake(uport->irq);
2182 uport->irq_wake = 0;
2183 }
Federico Vaga5a65dcc2013-04-15 16:01:07 +02002184 put_device(tty_dev);
Alan Coxa2bceae2009-09-19 13:13:31 -07002185 mutex_unlock(&port->mutex);
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002186 return 0;
2187 }
Federico Vaga5a65dcc2013-04-15 16:01:07 +02002188 put_device(tty_dev);
Alan Coxccce6de2009-09-19 13:13:30 -07002189 uport->suspended = 0;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002190
Linus Torvalds1da177e2005-04-16 15:20:36 -07002191 /*
2192 * Re-enable the console device after suspending.
2193 */
Yin Kangkai5933a162011-01-30 11:15:30 +08002194 if (uart_console(uport)) {
Jason Wang891b9dd2010-08-21 15:14:42 +08002195 /*
2196 * First try to use the console cflag setting.
2197 */
2198 memset(&termios, 0, sizeof(struct ktermios));
2199 termios.c_cflag = uport->cons->cflag;
2200
2201 /*
2202 * If that's unset, use the tty termios setting.
2203 */
Alan Coxadc8d742012-07-14 15:31:47 +01002204 if (port->tty && termios.c_cflag == 0)
2205 termios = port->tty->termios;
Jason Wang891b9dd2010-08-21 15:14:42 +08002206
Ning Jiang94abc562011-09-05 16:28:18 +08002207 if (console_suspend_enabled)
Linus Walleij6f538fe2012-12-07 11:36:08 +01002208 uart_change_pm(state, UART_PM_STATE_ON);
Alan Coxccce6de2009-09-19 13:13:30 -07002209 uport->ops->set_termios(uport, &termios, NULL);
Yin Kangkai5933a162011-01-30 11:15:30 +08002210 if (console_suspend_enabled)
2211 console_start(uport->cons);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002212 }
2213
Peter Hurley80f02d52016-04-09 17:53:24 -07002214 if (tty_port_suspended(port)) {
Alan Coxccce6de2009-09-19 13:13:30 -07002215 const struct uart_ops *ops = uport->ops;
Russell Kingee31b332005-11-13 15:28:51 +00002216 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002217
Linus Walleij6f538fe2012-12-07 11:36:08 +01002218 uart_change_pm(state, UART_PM_STATE_ON);
Alan Coxccce6de2009-09-19 13:13:30 -07002219 spin_lock_irq(&uport->lock);
2220 ops->set_mctrl(uport, 0);
2221 spin_unlock_irq(&uport->lock);
Stanislav Brabec4547be72009-12-02 16:20:56 +01002222 if (console_suspend_enabled || !uart_console(uport)) {
Alan Cox19225132010-06-01 22:52:51 +02002223 /* Protected by port mutex for now */
2224 struct tty_struct *tty = port->tty;
Stanislav Brabec4547be72009-12-02 16:20:56 +01002225 ret = ops->startup(uport);
2226 if (ret == 0) {
Alan Cox19225132010-06-01 22:52:51 +02002227 if (tty)
2228 uart_change_speed(tty, state, NULL);
Stanislav Brabec4547be72009-12-02 16:20:56 +01002229 spin_lock_irq(&uport->lock);
2230 ops->set_mctrl(uport, uport->mctrl);
2231 ops->start_tx(uport);
2232 spin_unlock_irq(&uport->lock);
Peter Hurleyd41861c2016-04-09 17:53:25 -07002233 tty_port_set_initialized(port, 1);
Stanislav Brabec4547be72009-12-02 16:20:56 +01002234 } else {
2235 /*
2236 * Failed to resume - maybe hardware went away?
2237 * Clear the "initialized" flag so we won't try
2238 * to call the low level drivers shutdown method.
2239 */
Alan Cox19225132010-06-01 22:52:51 +02002240 uart_shutdown(tty, state);
Stanislav Brabec4547be72009-12-02 16:20:56 +01002241 }
Russell Kingee31b332005-11-13 15:28:51 +00002242 }
Russell Kinga6b93a92006-10-01 17:17:40 +01002243
Peter Hurley80f02d52016-04-09 17:53:24 -07002244 tty_port_set_suspended(port, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002245 }
2246
Alan Coxa2bceae2009-09-19 13:13:31 -07002247 mutex_unlock(&port->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002248
2249 return 0;
2250}
2251
2252static inline void
2253uart_report_port(struct uart_driver *drv, struct uart_port *port)
2254{
Russell King30b7a3b2005-09-03 15:30:21 +01002255 char address[64];
2256
Linus Torvalds1da177e2005-04-16 15:20:36 -07002257 switch (port->iotype) {
2258 case UPIO_PORT:
Andrew Morton9bde10a2008-10-13 10:35:42 +01002259 snprintf(address, sizeof(address), "I/O 0x%lx", port->iobase);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002260 break;
2261 case UPIO_HUB6:
Russell King30b7a3b2005-09-03 15:30:21 +01002262 snprintf(address, sizeof(address),
Andrew Morton9bde10a2008-10-13 10:35:42 +01002263 "I/O 0x%lx offset 0x%x", port->iobase, port->hub6);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002264 break;
2265 case UPIO_MEM:
Masahiro Yamadabd94c402015-10-28 12:46:05 +09002266 case UPIO_MEM16:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002267 case UPIO_MEM32:
Kevin Cernekee3ffb1a82014-11-12 12:53:59 -08002268 case UPIO_MEM32BE:
Pantelis Antoniou21c614a2005-11-06 09:07:03 +00002269 case UPIO_AU:
Zang Roy-r619113be91ec2006-06-30 02:29:58 -07002270 case UPIO_TSI:
Russell King30b7a3b2005-09-03 15:30:21 +01002271 snprintf(address, sizeof(address),
Josh Boyer4f640ef2007-07-23 18:43:44 -07002272 "MMIO 0x%llx", (unsigned long long)port->mapbase);
Russell King30b7a3b2005-09-03 15:30:21 +01002273 break;
2274 default:
2275 strlcpy(address, "*unknown*", sizeof(address));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002276 break;
2277 }
Russell King30b7a3b2005-09-03 15:30:21 +01002278
James Bottomley68ed7e12015-01-02 10:05:13 -08002279 printk(KERN_INFO "%s%s%s%d at %s (irq = %d, base_baud = %d) is a %s\n",
2280 port->dev ? dev_name(port->dev) : "",
2281 port->dev ? ": " : "",
David S. Miller84408382008-10-13 10:45:26 +01002282 drv->dev_name,
2283 drv->tty_driver->name_base + port->line,
Kees Cook7d12b972013-07-12 13:07:39 -07002284 address, port->irq, port->uartclk / 16, uart_type(port));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002285}
2286
2287static void
2288uart_configure_port(struct uart_driver *drv, struct uart_state *state,
2289 struct uart_port *port)
2290{
2291 unsigned int flags;
2292
2293 /*
2294 * If there isn't a port here, don't do anything further.
2295 */
2296 if (!port->iobase && !port->mapbase && !port->membase)
2297 return;
2298
2299 /*
2300 * Now do the auto configuration stuff. Note that config_port
2301 * is expected to claim the resources and map the port for us.
2302 */
David Daney8e23fcc2009-01-02 13:49:54 +00002303 flags = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002304 if (port->flags & UPF_AUTO_IRQ)
2305 flags |= UART_CONFIG_IRQ;
2306 if (port->flags & UPF_BOOT_AUTOCONF) {
David Daney8e23fcc2009-01-02 13:49:54 +00002307 if (!(port->flags & UPF_FIXED_TYPE)) {
2308 port->type = PORT_UNKNOWN;
2309 flags |= UART_CONFIG_TYPE;
2310 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002311 port->ops->config_port(port, flags);
2312 }
2313
2314 if (port->type != PORT_UNKNOWN) {
2315 unsigned long flags;
2316
2317 uart_report_port(drv, port);
2318
George G. Davis3689a0e2007-02-14 00:33:06 -08002319 /* Power up port for set_mctrl() */
Linus Walleij6f538fe2012-12-07 11:36:08 +01002320 uart_change_pm(state, UART_PM_STATE_ON);
George G. Davis3689a0e2007-02-14 00:33:06 -08002321
Linus Torvalds1da177e2005-04-16 15:20:36 -07002322 /*
2323 * Ensure that the modem control lines are de-activated.
Yinghai Luc3e46422008-02-04 22:27:46 -08002324 * keep the DTR setting that is set in uart_set_options()
Linus Torvalds1da177e2005-04-16 15:20:36 -07002325 * We probably don't need a spinlock around this, but
2326 */
2327 spin_lock_irqsave(&port->lock, flags);
Yinghai Luc3e46422008-02-04 22:27:46 -08002328 port->ops->set_mctrl(port, port->mctrl & TIOCM_DTR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002329 spin_unlock_irqrestore(&port->lock, flags);
2330
2331 /*
Russell King97d97222007-09-01 21:25:09 +01002332 * If this driver supports console, and it hasn't been
2333 * successfully registered yet, try to re-register it.
2334 * It may be that the port was not available.
2335 */
2336 if (port->cons && !(port->cons->flags & CON_ENABLED))
2337 register_console(port->cons);
2338
2339 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002340 * Power down all ports by default, except the
2341 * console if we have one.
2342 */
2343 if (!uart_console(port))
Linus Walleij6f538fe2012-12-07 11:36:08 +01002344 uart_change_pm(state, UART_PM_STATE_OFF);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002345 }
2346}
2347
Jason Wesself2d937f2008-04-17 20:05:37 +02002348#ifdef CONFIG_CONSOLE_POLL
2349
2350static int uart_poll_init(struct tty_driver *driver, int line, char *options)
2351{
2352 struct uart_driver *drv = driver->driver_state;
2353 struct uart_state *state = drv->state + line;
Peter Hurley49c02302016-04-09 18:56:32 -07002354 struct tty_port *tport;
Jason Wesself2d937f2008-04-17 20:05:37 +02002355 struct uart_port *port;
2356 int baud = 9600;
2357 int bits = 8;
2358 int parity = 'n';
2359 int flow = 'n';
Peter Hurley49c02302016-04-09 18:56:32 -07002360 int ret = 0;
Jason Wesself2d937f2008-04-17 20:05:37 +02002361
Peter Hurley49c02302016-04-09 18:56:32 -07002362 if (!state)
Jason Wesself2d937f2008-04-17 20:05:37 +02002363 return -1;
2364
Peter Hurley49c02302016-04-09 18:56:32 -07002365 tport = &state->port;
2366 mutex_lock(&tport->mutex);
2367
Peter Hurley4047b372016-04-09 18:56:33 -07002368 port = uart_port_check(state);
2369 if (!port || !(port->ops->poll_get_char && port->ops->poll_put_char)) {
Peter Hurley49c02302016-04-09 18:56:32 -07002370 ret = -1;
2371 goto out;
2372 }
Jason Wesself2d937f2008-04-17 20:05:37 +02002373
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002374 if (port->ops->poll_init) {
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002375 /*
Peter Hurleyd41861c2016-04-09 17:53:25 -07002376 * We don't set initialized as we only initialized the hw,
2377 * e.g. state->xmit is still uninitialized.
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002378 */
Peter Hurleyd41861c2016-04-09 17:53:25 -07002379 if (!tty_port_initialized(tport))
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002380 ret = port->ops->poll_init(port);
Anton Vorontsovc7f3e702012-09-24 14:27:53 -07002381 }
2382
Peter Hurley49c02302016-04-09 18:56:32 -07002383 if (!ret && options) {
Jason Wesself2d937f2008-04-17 20:05:37 +02002384 uart_parse_options(options, &baud, &parity, &bits, &flow);
Peter Hurley49c02302016-04-09 18:56:32 -07002385 ret = uart_set_options(port, NULL, baud, parity, bits, flow);
Jason Wesself2d937f2008-04-17 20:05:37 +02002386 }
Peter Hurley49c02302016-04-09 18:56:32 -07002387out:
2388 mutex_unlock(&tport->mutex);
2389 return ret;
Jason Wesself2d937f2008-04-17 20:05:37 +02002390}
2391
2392static int uart_poll_get_char(struct tty_driver *driver, int line)
2393{
2394 struct uart_driver *drv = driver->driver_state;
2395 struct uart_state *state = drv->state + line;
2396 struct uart_port *port;
Peter Hurley9ed19422016-04-09 18:56:34 -07002397 int ret = -1;
Jason Wesself2d937f2008-04-17 20:05:37 +02002398
Peter Hurley9ed19422016-04-09 18:56:34 -07002399 if (state) {
2400 port = uart_port_ref(state);
2401 if (port)
2402 ret = port->ops->poll_get_char(port);
2403 uart_port_deref(port);
2404 }
2405 return ret;
Jason Wesself2d937f2008-04-17 20:05:37 +02002406}
2407
2408static void uart_poll_put_char(struct tty_driver *driver, int line, char ch)
2409{
2410 struct uart_driver *drv = driver->driver_state;
2411 struct uart_state *state = drv->state + line;
2412 struct uart_port *port;
2413
Peter Hurley9ed19422016-04-09 18:56:34 -07002414 port = uart_port_ref(state);
2415 if (!port)
2416 return;
Doug Andersonc7d44a02014-04-21 10:06:43 -07002417
2418 if (ch == '\n')
2419 port->ops->poll_put_char(port, '\r');
Jason Wesself2d937f2008-04-17 20:05:37 +02002420 port->ops->poll_put_char(port, ch);
Peter Hurley9ed19422016-04-09 18:56:34 -07002421 uart_port_deref(port);
Jason Wesself2d937f2008-04-17 20:05:37 +02002422}
2423#endif
2424
Jiri Slabyabad73a2019-04-17 10:58:53 +02002425static int uart_install(struct tty_driver *driver, struct tty_struct *tty)
2426{
2427 struct uart_driver *drv = driver->driver_state;
2428 struct uart_state *state = drv->state + tty->index;
2429
2430 tty->driver_data = state;
2431
2432 return tty_standard_install(driver, tty);
2433}
2434
Jeff Dikeb68e31d2006-10-02 02:17:18 -07002435static const struct tty_operations uart_ops = {
Jiri Slabyabad73a2019-04-17 10:58:53 +02002436 .install = uart_install,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002437 .open = uart_open,
2438 .close = uart_close,
2439 .write = uart_write,
2440 .put_char = uart_put_char,
2441 .flush_chars = uart_flush_chars,
2442 .write_room = uart_write_room,
2443 .chars_in_buffer= uart_chars_in_buffer,
2444 .flush_buffer = uart_flush_buffer,
2445 .ioctl = uart_ioctl,
2446 .throttle = uart_throttle,
2447 .unthrottle = uart_unthrottle,
2448 .send_xchar = uart_send_xchar,
2449 .set_termios = uart_set_termios,
Alan Cox64e91592008-06-03 15:18:54 +01002450 .set_ldisc = uart_set_ldisc,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002451 .stop = uart_stop,
2452 .start = uart_start,
2453 .hangup = uart_hangup,
2454 .break_ctl = uart_break_ctl,
2455 .wait_until_sent= uart_wait_until_sent,
2456#ifdef CONFIG_PROC_FS
Alexey Dobriyand196a942009-03-31 15:19:21 -07002457 .proc_fops = &uart_proc_fops,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002458#endif
2459 .tiocmget = uart_tiocmget,
2460 .tiocmset = uart_tiocmset,
Alan Coxd281da72010-09-16 18:21:24 +01002461 .get_icount = uart_get_icount,
Jason Wesself2d937f2008-04-17 20:05:37 +02002462#ifdef CONFIG_CONSOLE_POLL
2463 .poll_init = uart_poll_init,
2464 .poll_get_char = uart_poll_get_char,
2465 .poll_put_char = uart_poll_put_char,
2466#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07002467};
2468
Alan Coxde0c8cb2010-06-01 22:52:58 +02002469static const struct tty_port_operations uart_port_ops = {
2470 .carrier_raised = uart_carrier_raised,
2471 .dtr_rts = uart_dtr_rts,
Rob Herringb3b57642016-08-22 17:39:09 -05002472 .activate = uart_port_activate,
Rob Herring761ed4a2016-08-22 17:39:10 -05002473 .shutdown = uart_tty_port_shutdown,
Alan Coxde0c8cb2010-06-01 22:52:58 +02002474};
2475
Linus Torvalds1da177e2005-04-16 15:20:36 -07002476/**
2477 * uart_register_driver - register a driver with the uart core layer
2478 * @drv: low level driver structure
2479 *
2480 * Register a uart driver with the core driver. We in turn register
2481 * with the tty layer, and initialise the core driver per-port state.
2482 *
2483 * We have a proc file in /proc/tty/driver which is named after the
2484 * normal driver.
2485 *
2486 * drv->port should be NULL, and the per-port structures should be
2487 * registered using uart_add_one_port after this call has succeeded.
2488 */
2489int uart_register_driver(struct uart_driver *drv)
2490{
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002491 struct tty_driver *normal;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002492 int i, retval;
2493
2494 BUG_ON(drv->state);
2495
2496 /*
2497 * Maybe we should be using a slab cache for this, especially if
2498 * we have a large number of ports to handle.
2499 */
Burman Yan8f31bb32007-02-14 00:33:07 -08002500 drv->state = kzalloc(sizeof(struct uart_state) * drv->nr, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002501 if (!drv->state)
2502 goto out;
2503
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002504 normal = alloc_tty_driver(drv->nr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002505 if (!normal)
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002506 goto out_kfree;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002507
2508 drv->tty_driver = normal;
2509
Linus Torvalds1da177e2005-04-16 15:20:36 -07002510 normal->driver_name = drv->driver_name;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002511 normal->name = drv->dev_name;
2512 normal->major = drv->major;
2513 normal->minor_start = drv->minor;
2514 normal->type = TTY_DRIVER_TYPE_SERIAL;
2515 normal->subtype = SERIAL_TYPE_NORMAL;
2516 normal->init_termios = tty_std_termios;
2517 normal->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
Alan Cox606d0992006-12-08 02:38:45 -08002518 normal->init_termios.c_ispeed = normal->init_termios.c_ospeed = 9600;
Greg Kroah-Hartman331b8312005-06-20 21:15:16 -07002519 normal->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002520 normal->driver_state = drv;
2521 tty_set_operations(normal, &uart_ops);
2522
2523 /*
2524 * Initialise the UART state(s).
2525 */
2526 for (i = 0; i < drv->nr; i++) {
2527 struct uart_state *state = drv->state + i;
Alan Coxa2bceae2009-09-19 13:13:31 -07002528 struct tty_port *port = &state->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002529
Alan Coxa2bceae2009-09-19 13:13:31 -07002530 tty_port_init(port);
Alan Coxde0c8cb2010-06-01 22:52:58 +02002531 port->ops = &uart_port_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002532 }
2533
2534 retval = tty_register_driver(normal);
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002535 if (retval >= 0)
2536 return retval;
2537
Jiri Slaby191c5f12012-11-15 09:49:56 +01002538 for (i = 0; i < drv->nr; i++)
2539 tty_port_destroy(&drv->state[i].port);
André Goddard Rosa9e845ab2009-10-25 11:16:32 -02002540 put_tty_driver(normal);
2541out_kfree:
2542 kfree(drv->state);
2543out:
2544 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002545}
2546
2547/**
2548 * uart_unregister_driver - remove a driver from the uart core layer
2549 * @drv: low level driver structure
2550 *
2551 * Remove all references to a driver from the core driver. The low
2552 * level driver must have removed all its ports via the
2553 * uart_remove_one_port() if it registered them with uart_add_one_port().
2554 * (ie, drv->port == NULL)
2555 */
2556void uart_unregister_driver(struct uart_driver *drv)
2557{
2558 struct tty_driver *p = drv->tty_driver;
Jiri Slaby191c5f12012-11-15 09:49:56 +01002559 unsigned int i;
2560
Linus Torvalds1da177e2005-04-16 15:20:36 -07002561 tty_unregister_driver(p);
2562 put_tty_driver(p);
Jiri Slaby191c5f12012-11-15 09:49:56 +01002563 for (i = 0; i < drv->nr; i++)
2564 tty_port_destroy(&drv->state[i].port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002565 kfree(drv->state);
Alan Cox1e66cded2012-05-14 14:51:22 +01002566 drv->state = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002567 drv->tty_driver = NULL;
2568}
2569
2570struct tty_driver *uart_console_device(struct console *co, int *index)
2571{
2572 struct uart_driver *p = co->data;
2573 *index = co->index;
2574 return p->tty_driver;
2575}
2576
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002577static ssize_t uart_get_attr_uartclk(struct device *dev,
2578 struct device_attribute *attr, char *buf)
2579{
Alan Coxbebe73e2012-10-29 15:19:57 +00002580 struct serial_struct tmp;
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002581 struct tty_port *port = dev_get_drvdata(dev);
Tomas Hlavacekb1b79912012-09-06 23:17:47 +02002582
Alan Cox9f109692012-10-29 15:20:25 +00002583 uart_get_info(port, &tmp);
Alan Coxbebe73e2012-10-29 15:19:57 +00002584 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.baud_base * 16);
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002585}
2586
Alan Cox373bac42012-10-29 15:20:40 +00002587static ssize_t uart_get_attr_type(struct device *dev,
2588 struct device_attribute *attr, char *buf)
2589{
2590 struct serial_struct tmp;
2591 struct tty_port *port = dev_get_drvdata(dev);
2592
2593 uart_get_info(port, &tmp);
2594 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.type);
2595}
2596static ssize_t uart_get_attr_line(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, "%d\n", tmp.line);
2604}
2605
2606static ssize_t uart_get_attr_port(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);
Andrew Mortonfd985e12012-11-26 15:47:15 -08002611 unsigned long ioaddr;
Alan Cox373bac42012-10-29 15:20:40 +00002612
2613 uart_get_info(port, &tmp);
Andrew Mortonfd985e12012-11-26 15:47:15 -08002614 ioaddr = tmp.port;
2615 if (HIGH_BITS_OFFSET)
2616 ioaddr |= (unsigned long)tmp.port_high << HIGH_BITS_OFFSET;
2617 return snprintf(buf, PAGE_SIZE, "0x%lX\n", ioaddr);
Alan Cox373bac42012-10-29 15:20:40 +00002618}
2619
2620static ssize_t uart_get_attr_irq(struct device *dev,
2621 struct device_attribute *attr, char *buf)
2622{
2623 struct serial_struct tmp;
2624 struct tty_port *port = dev_get_drvdata(dev);
2625
2626 uart_get_info(port, &tmp);
2627 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.irq);
2628}
2629
2630static ssize_t uart_get_attr_flags(struct device *dev,
2631 struct device_attribute *attr, char *buf)
2632{
2633 struct serial_struct tmp;
2634 struct tty_port *port = dev_get_drvdata(dev);
2635
2636 uart_get_info(port, &tmp);
2637 return snprintf(buf, PAGE_SIZE, "0x%X\n", tmp.flags);
2638}
2639
2640static ssize_t uart_get_attr_xmit_fifo_size(struct device *dev,
2641 struct device_attribute *attr, char *buf)
2642{
2643 struct serial_struct tmp;
2644 struct tty_port *port = dev_get_drvdata(dev);
2645
2646 uart_get_info(port, &tmp);
2647 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.xmit_fifo_size);
2648}
2649
2650
2651static ssize_t uart_get_attr_close_delay(struct device *dev,
2652 struct device_attribute *attr, char *buf)
2653{
2654 struct serial_struct tmp;
2655 struct tty_port *port = dev_get_drvdata(dev);
2656
2657 uart_get_info(port, &tmp);
2658 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.close_delay);
2659}
2660
2661
2662static ssize_t uart_get_attr_closing_wait(struct device *dev,
2663 struct device_attribute *attr, char *buf)
2664{
2665 struct serial_struct tmp;
2666 struct tty_port *port = dev_get_drvdata(dev);
2667
2668 uart_get_info(port, &tmp);
2669 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.closing_wait);
2670}
2671
2672static ssize_t uart_get_attr_custom_divisor(struct device *dev,
2673 struct device_attribute *attr, char *buf)
2674{
2675 struct serial_struct tmp;
2676 struct tty_port *port = dev_get_drvdata(dev);
2677
2678 uart_get_info(port, &tmp);
2679 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.custom_divisor);
2680}
2681
2682static ssize_t uart_get_attr_io_type(struct device *dev,
2683 struct device_attribute *attr, char *buf)
2684{
2685 struct serial_struct tmp;
2686 struct tty_port *port = dev_get_drvdata(dev);
2687
2688 uart_get_info(port, &tmp);
2689 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.io_type);
2690}
2691
2692static ssize_t uart_get_attr_iomem_base(struct device *dev,
2693 struct device_attribute *attr, char *buf)
2694{
2695 struct serial_struct tmp;
2696 struct tty_port *port = dev_get_drvdata(dev);
2697
2698 uart_get_info(port, &tmp);
2699 return snprintf(buf, PAGE_SIZE, "0x%lX\n", (unsigned long)tmp.iomem_base);
2700}
2701
2702static ssize_t uart_get_attr_iomem_reg_shift(struct device *dev,
2703 struct device_attribute *attr, char *buf)
2704{
2705 struct serial_struct tmp;
2706 struct tty_port *port = dev_get_drvdata(dev);
2707
2708 uart_get_info(port, &tmp);
2709 return snprintf(buf, PAGE_SIZE, "%d\n", tmp.iomem_reg_shift);
2710}
2711
2712static DEVICE_ATTR(type, S_IRUSR | S_IRGRP, uart_get_attr_type, NULL);
2713static DEVICE_ATTR(line, S_IRUSR | S_IRGRP, uart_get_attr_line, NULL);
2714static DEVICE_ATTR(port, S_IRUSR | S_IRGRP, uart_get_attr_port, NULL);
2715static DEVICE_ATTR(irq, S_IRUSR | S_IRGRP, uart_get_attr_irq, NULL);
2716static DEVICE_ATTR(flags, S_IRUSR | S_IRGRP, uart_get_attr_flags, NULL);
2717static DEVICE_ATTR(xmit_fifo_size, S_IRUSR | S_IRGRP, uart_get_attr_xmit_fifo_size, NULL);
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002718static DEVICE_ATTR(uartclk, S_IRUSR | S_IRGRP, uart_get_attr_uartclk, NULL);
Alan Cox373bac42012-10-29 15:20:40 +00002719static DEVICE_ATTR(close_delay, S_IRUSR | S_IRGRP, uart_get_attr_close_delay, NULL);
2720static DEVICE_ATTR(closing_wait, S_IRUSR | S_IRGRP, uart_get_attr_closing_wait, NULL);
2721static DEVICE_ATTR(custom_divisor, S_IRUSR | S_IRGRP, uart_get_attr_custom_divisor, NULL);
2722static DEVICE_ATTR(io_type, S_IRUSR | S_IRGRP, uart_get_attr_io_type, NULL);
2723static DEVICE_ATTR(iomem_base, S_IRUSR | S_IRGRP, uart_get_attr_iomem_base, NULL);
2724static DEVICE_ATTR(iomem_reg_shift, S_IRUSR | S_IRGRP, uart_get_attr_iomem_reg_shift, NULL);
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002725
2726static struct attribute *tty_dev_attrs[] = {
Alan Cox373bac42012-10-29 15:20:40 +00002727 &dev_attr_type.attr,
2728 &dev_attr_line.attr,
2729 &dev_attr_port.attr,
2730 &dev_attr_irq.attr,
2731 &dev_attr_flags.attr,
2732 &dev_attr_xmit_fifo_size.attr,
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002733 &dev_attr_uartclk.attr,
Alan Cox373bac42012-10-29 15:20:40 +00002734 &dev_attr_close_delay.attr,
2735 &dev_attr_closing_wait.attr,
2736 &dev_attr_custom_divisor.attr,
2737 &dev_attr_io_type.attr,
2738 &dev_attr_iomem_base.attr,
2739 &dev_attr_iomem_reg_shift.attr,
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002740 NULL,
2741 };
2742
Tomas Hlavacekb1b79912012-09-06 23:17:47 +02002743static const struct attribute_group tty_dev_attr_group = {
Tomas Hlavacek6915c0e2012-09-06 03:17:18 +02002744 .attrs = tty_dev_attrs,
2745 };
2746
Linus Torvalds1da177e2005-04-16 15:20:36 -07002747/**
2748 * uart_add_one_port - attach a driver-defined port structure
2749 * @drv: pointer to the uart low level driver structure for this port
Randy Dunlap1b9894f2009-09-21 11:12:03 -07002750 * @uport: uart port structure to use for this port.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002751 *
2752 * This allows the driver to register its own uart_port structure
2753 * with the core driver. The main purpose is to allow the low
2754 * level uart drivers to expand uart_port, rather than having yet
2755 * more levels of structures.
2756 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002757int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002758{
2759 struct uart_state *state;
Alan Coxa2bceae2009-09-19 13:13:31 -07002760 struct tty_port *port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002761 int ret = 0;
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002762 struct device *tty_dev;
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002763 int num_groups;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002764
2765 BUG_ON(in_interrupt());
2766
Alan Coxa2bceae2009-09-19 13:13:31 -07002767 if (uport->line >= drv->nr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002768 return -EINVAL;
2769
Alan Coxa2bceae2009-09-19 13:13:31 -07002770 state = drv->state + uport->line;
2771 port = &state->port;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002772
Arjan van de Venf392ecf2006-01-12 18:44:32 +00002773 mutex_lock(&port_mutex);
Alan Coxa2bceae2009-09-19 13:13:31 -07002774 mutex_lock(&port->mutex);
Alan Coxebd2c8f2009-09-19 13:13:28 -07002775 if (state->uart_port) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002776 ret = -EINVAL;
2777 goto out;
2778 }
2779
Peter Hurley2b702b92014-10-16 16:54:25 -04002780 /* Link the port to the driver state table and vice versa */
Peter Hurley9ed19422016-04-09 18:56:34 -07002781 atomic_set(&state->refcount, 1);
2782 init_waitqueue_head(&state->remove_wait);
Alan Coxa2bceae2009-09-19 13:13:31 -07002783 state->uart_port = uport;
Alan Coxa2bceae2009-09-19 13:13:31 -07002784 uport->state = state;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002785
Peter Hurley2b702b92014-10-16 16:54:25 -04002786 state->pm_state = UART_PM_STATE_UNDEFINED;
2787 uport->cons = drv->cons;
Peter Hurley959801f2015-02-24 14:25:00 -05002788 uport->minor = drv->tty_driver->minor_start + uport->line;
Peter Hurley2b702b92014-10-16 16:54:25 -04002789
Russell King976ecd12005-07-03 21:05:45 +01002790 /*
2791 * If this port is a console, then the spinlock is already
2792 * initialised.
2793 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002794 if (!(uart_console(uport) && (uport->cons->flags & CON_ENABLED))) {
2795 spin_lock_init(&uport->lock);
2796 lockdep_set_class(&uport->lock, &port_lock_key);
Ingo Molnar13e83592006-07-03 00:25:03 -07002797 }
Grant Likelya208ffd2014-03-27 18:29:46 -07002798 if (uport->cons && uport->dev)
2799 of_console_check(uport->dev->of_node, uport->cons->name, uport->line);
Russell King976ecd12005-07-03 21:05:45 +01002800
Alan Coxa2bceae2009-09-19 13:13:31 -07002801 uart_configure_port(drv, state, uport);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002802
Geert Uytterhoeven4dda8642016-10-28 07:07:47 -05002803 port->console = uart_console(uport);
2804
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002805 num_groups = 2;
2806 if (uport->attr_group)
2807 num_groups++;
2808
Yoshihiro YUNOMAEc2b703b2014-07-23 06:06:22 +00002809 uport->tty_groups = kcalloc(num_groups, sizeof(*uport->tty_groups),
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002810 GFP_KERNEL);
2811 if (!uport->tty_groups) {
2812 ret = -ENOMEM;
2813 goto out;
2814 }
2815 uport->tty_groups[0] = &tty_dev_attr_group;
2816 if (uport->attr_group)
2817 uport->tty_groups[1] = uport->attr_group;
2818
Linus Torvalds1da177e2005-04-16 15:20:36 -07002819 /*
2820 * Register the port whether it's detected or not. This allows
Geert Uytterhoeven015355b2014-03-11 11:23:36 +01002821 * setserial to be used to alter this port's parameters.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002822 */
Tomas Hlavacekb1b79912012-09-06 23:17:47 +02002823 tty_dev = tty_port_register_device_attr(port, drv->tty_driver,
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002824 uport->line, uport->dev, port, uport->tty_groups);
Guennadi Liakhovetskib3b708f2007-10-16 01:24:02 -07002825 if (likely(!IS_ERR(tty_dev))) {
Simon Glass77359832012-01-19 11:28:56 -08002826 device_set_wakeup_capable(tty_dev, 1);
2827 } else {
Sudip Mukherjee2f2dafe2014-09-01 20:49:43 +05302828 dev_err(uport->dev, "Cannot register tty device on line %d\n",
Alan Coxa2bceae2009-09-19 13:13:31 -07002829 uport->line);
Simon Glass77359832012-01-19 11:28:56 -08002830 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002831
2832 /*
Russell King68ac64c2006-04-30 11:13:50 +01002833 * Ensure UPF_DEAD is not set.
2834 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002835 uport->flags &= ~UPF_DEAD;
Russell King68ac64c2006-04-30 11:13:50 +01002836
Linus Torvalds1da177e2005-04-16 15:20:36 -07002837 out:
Alan Coxa2bceae2009-09-19 13:13:31 -07002838 mutex_unlock(&port->mutex);
Arjan van de Venf392ecf2006-01-12 18:44:32 +00002839 mutex_unlock(&port_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002840
2841 return ret;
2842}
2843
2844/**
2845 * uart_remove_one_port - detach a driver defined port structure
2846 * @drv: pointer to the uart low level driver structure for this port
Randy Dunlap1b9894f2009-09-21 11:12:03 -07002847 * @uport: uart port structure for this port
Linus Torvalds1da177e2005-04-16 15:20:36 -07002848 *
2849 * This unhooks (and hangs up) the specified port structure from the
2850 * core driver. No further calls will be made to the low-level code
2851 * for this port.
2852 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002853int uart_remove_one_port(struct uart_driver *drv, struct uart_port *uport)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002854{
Alan Coxa2bceae2009-09-19 13:13:31 -07002855 struct uart_state *state = drv->state + uport->line;
2856 struct tty_port *port = &state->port;
Peter Hurley4047b372016-04-09 18:56:33 -07002857 struct uart_port *uart_port;
Geert Uytterhoeven4c6d5b42014-03-17 14:10:58 +01002858 struct tty_struct *tty;
Chen Gangb342dd52012-12-27 15:51:31 +08002859 int ret = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002860
2861 BUG_ON(in_interrupt());
2862
Arjan van de Venf392ecf2006-01-12 18:44:32 +00002863 mutex_lock(&port_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002864
2865 /*
Russell King68ac64c2006-04-30 11:13:50 +01002866 * Mark the port "dead" - this prevents any opens from
2867 * succeeding while we shut down the port.
2868 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002869 mutex_lock(&port->mutex);
Peter Hurley4047b372016-04-09 18:56:33 -07002870 uart_port = uart_port_check(state);
2871 if (uart_port != uport)
2872 dev_alert(uport->dev, "Removing wrong port: %p != %p\n",
2873 uart_port, uport);
2874
2875 if (!uart_port) {
Chen Gangb342dd52012-12-27 15:51:31 +08002876 mutex_unlock(&port->mutex);
2877 ret = -EINVAL;
2878 goto out;
2879 }
Alan Coxa2bceae2009-09-19 13:13:31 -07002880 uport->flags |= UPF_DEAD;
2881 mutex_unlock(&port->mutex);
Russell King68ac64c2006-04-30 11:13:50 +01002882
2883 /*
Greg Kroah-Hartmanaa4148c2005-06-20 21:15:16 -07002884 * Remove the devices from the tty layer
Linus Torvalds1da177e2005-04-16 15:20:36 -07002885 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002886 tty_unregister_device(drv->tty_driver, uport->line);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002887
Geert Uytterhoeven4c6d5b42014-03-17 14:10:58 +01002888 tty = tty_port_tty_get(port);
2889 if (tty) {
Alan Coxa2bceae2009-09-19 13:13:31 -07002890 tty_vhangup(port->tty);
Geert Uytterhoeven4c6d5b42014-03-17 14:10:58 +01002891 tty_kref_put(tty);
2892 }
Russell King68ac64c2006-04-30 11:13:50 +01002893
2894 /*
Geert Uytterhoeven5f5c9ae2014-02-28 14:21:32 +01002895 * If the port is used as a console, unregister it
2896 */
2897 if (uart_console(uport))
2898 unregister_console(uport->cons);
2899
2900 /*
Russell King68ac64c2006-04-30 11:13:50 +01002901 * Free the port IO and memory resources, if any.
2902 */
Fabio Estevama7cfaf12016-05-20 01:59:54 -03002903 if (uport->type != PORT_UNKNOWN && uport->ops->release_port)
Alan Coxa2bceae2009-09-19 13:13:31 -07002904 uport->ops->release_port(uport);
Greg Kroah-Hartman266dcff2014-07-16 01:19:34 +00002905 kfree(uport->tty_groups);
Russell King68ac64c2006-04-30 11:13:50 +01002906
2907 /*
2908 * Indicate that there isn't a port here anymore.
2909 */
Alan Coxa2bceae2009-09-19 13:13:31 -07002910 uport->type = PORT_UNKNOWN;
Russell King68ac64c2006-04-30 11:13:50 +01002911
Peter Hurley4047b372016-04-09 18:56:33 -07002912 mutex_lock(&port->mutex);
Peter Hurley9ed19422016-04-09 18:56:34 -07002913 WARN_ON(atomic_dec_return(&state->refcount) < 0);
2914 wait_event(state->remove_wait, !atomic_read(&state->refcount));
Alan Coxebd2c8f2009-09-19 13:13:28 -07002915 state->uart_port = NULL;
Peter Hurley4047b372016-04-09 18:56:33 -07002916 mutex_unlock(&port->mutex);
Chen Gangb342dd52012-12-27 15:51:31 +08002917out:
Arjan van de Venf392ecf2006-01-12 18:44:32 +00002918 mutex_unlock(&port_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002919
Chen Gangb342dd52012-12-27 15:51:31 +08002920 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002921}
2922
2923/*
2924 * Are the two ports equivalent?
2925 */
2926int uart_match_port(struct uart_port *port1, struct uart_port *port2)
2927{
2928 if (port1->iotype != port2->iotype)
2929 return 0;
2930
2931 switch (port1->iotype) {
2932 case UPIO_PORT:
2933 return (port1->iobase == port2->iobase);
2934 case UPIO_HUB6:
2935 return (port1->iobase == port2->iobase) &&
2936 (port1->hub6 == port2->hub6);
2937 case UPIO_MEM:
Masahiro Yamadabd94c402015-10-28 12:46:05 +09002938 case UPIO_MEM16:
Sergei Shtylyovd21b55d2006-08-28 19:49:03 +04002939 case UPIO_MEM32:
Kevin Cernekee3ffb1a82014-11-12 12:53:59 -08002940 case UPIO_MEM32BE:
Sergei Shtylyovd21b55d2006-08-28 19:49:03 +04002941 case UPIO_AU:
2942 case UPIO_TSI:
Benjamin Herrenschmidt1624f002006-01-04 18:09:44 +00002943 return (port1->mapbase == port2->mapbase);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002944 }
2945 return 0;
2946}
2947EXPORT_SYMBOL(uart_match_port);
2948
Jiri Slaby027d7da2011-11-09 21:33:43 +01002949/**
2950 * uart_handle_dcd_change - handle a change of carrier detect state
2951 * @uport: uart_port structure for the open port
2952 * @status: new carrier detect status, nonzero if active
Peter Hurley4d90bb12014-09-10 15:06:23 -04002953 *
2954 * Caller must hold uport->lock
Jiri Slaby027d7da2011-11-09 21:33:43 +01002955 */
2956void uart_handle_dcd_change(struct uart_port *uport, unsigned int status)
2957{
George Spelvin42381572013-02-10 04:44:30 -05002958 struct tty_port *port = &uport->state->port;
Alan Cox43eca0a2012-09-19 15:35:46 +01002959 struct tty_struct *tty = port->tty;
Peter Hurleyc9932572014-09-02 17:39:21 -04002960 struct tty_ldisc *ld;
Jiri Slaby027d7da2011-11-09 21:33:43 +01002961
Peter Hurley4d90bb12014-09-10 15:06:23 -04002962 lockdep_assert_held_once(&uport->lock);
2963
Peter Hurleyc9932572014-09-02 17:39:21 -04002964 if (tty) {
2965 ld = tty_ldisc_ref(tty);
2966 if (ld) {
2967 if (ld->ops->dcd_change)
2968 ld->ops->dcd_change(tty, status);
2969 tty_ldisc_deref(ld);
2970 }
George Spelvin42381572013-02-10 04:44:30 -05002971 }
Jiri Slaby027d7da2011-11-09 21:33:43 +01002972
2973 uport->icount.dcd++;
Jiri Slaby027d7da2011-11-09 21:33:43 +01002974
Peter Hurley299245a2014-09-10 15:06:24 -04002975 if (uart_dcd_enabled(uport)) {
Jiri Slaby027d7da2011-11-09 21:33:43 +01002976 if (status)
2977 wake_up_interruptible(&port->open_wait);
Alan Cox43eca0a2012-09-19 15:35:46 +01002978 else if (tty)
2979 tty_hangup(tty);
Jiri Slaby027d7da2011-11-09 21:33:43 +01002980 }
Jiri Slaby027d7da2011-11-09 21:33:43 +01002981}
2982EXPORT_SYMBOL_GPL(uart_handle_dcd_change);
2983
2984/**
2985 * uart_handle_cts_change - handle a change of clear-to-send state
2986 * @uport: uart_port structure for the open port
2987 * @status: new clear to send status, nonzero if active
Peter Hurley4d90bb12014-09-10 15:06:23 -04002988 *
2989 * Caller must hold uport->lock
Jiri Slaby027d7da2011-11-09 21:33:43 +01002990 */
2991void uart_handle_cts_change(struct uart_port *uport, unsigned int status)
2992{
Peter Hurley4d90bb12014-09-10 15:06:23 -04002993 lockdep_assert_held_once(&uport->lock);
2994
Jiri Slaby027d7da2011-11-09 21:33:43 +01002995 uport->icount.cts++;
2996
Peter Hurley391f93f2015-01-25 14:44:51 -05002997 if (uart_softcts_mode(uport)) {
Peter Hurleyd01f4d12014-09-10 15:06:26 -04002998 if (uport->hw_stopped) {
Jiri Slaby027d7da2011-11-09 21:33:43 +01002999 if (status) {
Peter Hurleyd01f4d12014-09-10 15:06:26 -04003000 uport->hw_stopped = 0;
Jiri Slaby027d7da2011-11-09 21:33:43 +01003001 uport->ops->start_tx(uport);
3002 uart_write_wakeup(uport);
3003 }
3004 } else {
3005 if (!status) {
Peter Hurleyd01f4d12014-09-10 15:06:26 -04003006 uport->hw_stopped = 1;
Jiri Slaby027d7da2011-11-09 21:33:43 +01003007 uport->ops->stop_tx(uport);
3008 }
3009 }
Peter Hurley391f93f2015-01-25 14:44:51 -05003010
Jiri Slaby027d7da2011-11-09 21:33:43 +01003011 }
3012}
3013EXPORT_SYMBOL_GPL(uart_handle_cts_change);
3014
Jiri Slabycf755252011-11-09 21:33:47 +01003015/**
3016 * uart_insert_char - push a char to the uart layer
3017 *
3018 * User is responsible to call tty_flip_buffer_push when they are done with
3019 * insertion.
3020 *
3021 * @port: corresponding port
3022 * @status: state of the serial port RX buffer (LSR for 8250)
3023 * @overrun: mask of overrun bits in @status
3024 * @ch: character to push
3025 * @flag: flag for the character (see TTY_NORMAL and friends)
3026 */
Jiri Slaby027d7da2011-11-09 21:33:43 +01003027void uart_insert_char(struct uart_port *port, unsigned int status,
3028 unsigned int overrun, unsigned int ch, unsigned int flag)
3029{
Jiri Slaby92a19f92013-01-03 15:53:03 +01003030 struct tty_port *tport = &port->state->port;
Jiri Slaby027d7da2011-11-09 21:33:43 +01003031
3032 if ((status & port->ignore_status_mask & ~overrun) == 0)
Jiri Slaby92a19f92013-01-03 15:53:03 +01003033 if (tty_insert_flip_char(tport, ch, flag) == 0)
Corbindabfb352012-05-23 09:37:31 -05003034 ++port->icount.buf_overrun;
Jiri Slaby027d7da2011-11-09 21:33:43 +01003035
3036 /*
3037 * Overrun is special. Since it's reported immediately,
3038 * it doesn't affect the current character.
3039 */
3040 if (status & ~port->ignore_status_mask & overrun)
Jiri Slaby92a19f92013-01-03 15:53:03 +01003041 if (tty_insert_flip_char(tport, 0, TTY_OVERRUN) == 0)
Corbindabfb352012-05-23 09:37:31 -05003042 ++port->icount.buf_overrun;
Jiri Slaby027d7da2011-11-09 21:33:43 +01003043}
3044EXPORT_SYMBOL_GPL(uart_insert_char);
3045
Linus Torvalds1da177e2005-04-16 15:20:36 -07003046EXPORT_SYMBOL(uart_write_wakeup);
3047EXPORT_SYMBOL(uart_register_driver);
3048EXPORT_SYMBOL(uart_unregister_driver);
3049EXPORT_SYMBOL(uart_suspend_port);
3050EXPORT_SYMBOL(uart_resume_port);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003051EXPORT_SYMBOL(uart_add_one_port);
3052EXPORT_SYMBOL(uart_remove_one_port);
3053
3054MODULE_DESCRIPTION("Serial driver core");
3055MODULE_LICENSE("GPL");