serial_core.h 29.4 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0-or-later */
L
Linus Torvalds 已提交
2 3 4 5 6 7 8 9
/*
 *  linux/drivers/char/serial_core.h
 *
 *  Copyright (C) 2000 Deep Blue Solutions Ltd.
 */
#ifndef LINUX_SERIAL_CORE_H
#define LINUX_SERIAL_CORE_H

10
#include <linux/bitops.h>
11
#include <linux/compiler.h>
12
#include <linux/console.h>
L
Linus Torvalds 已提交
13 14 15 16 17
#include <linux/interrupt.h>
#include <linux/circ_buf.h>
#include <linux/spinlock.h>
#include <linux/sched.h>
#include <linux/tty.h>
18
#include <linux/mutex.h>
19
#include <linux/sysrq.h>
20
#include <uapi/linux/serial_core.h>
L
Linus Torvalds 已提交
21

22 23 24 25
#ifdef CONFIG_SERIAL_CORE_CONSOLE
#define uart_console(port) \
	((port)->cons && (port)->cons->index == (port)->line)
#else
26
#define uart_console(port)      ({ (void)port; 0; })
27 28
#endif

L
Linus Torvalds 已提交
29 30 31
struct uart_port;
struct serial_struct;
struct device;
32
struct gpio_desc;
L
Linus Torvalds 已提交
33

34 35 36
/**
 * struct uart_ops -- interface between serial_core and the driver
 *
37
 * This structure describes all the operations that can be done on the
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
 * physical hardware.
 *
 * @tx_empty: ``unsigned int ()(struct uart_port *port)``
 *
 *	This function tests whether the transmitter fifo and shifter for the
 *	@port is empty. If it is empty, this function should return
 *	%TIOCSER_TEMT, otherwise return 0. If the port does not support this
 *	operation, then it should return %TIOCSER_TEMT.
 *
 *	Locking: none.
 *	Interrupts: caller dependent.
 *	This call must not sleep
 *
 * @set_mctrl: ``void ()(struct uart_port *port, unsigned int mctrl)``
 *
 *	This function sets the modem control lines for @port to the state
 *	described by @mctrl. The relevant bits of @mctrl are:
 *
 *		- %TIOCM_RTS	RTS signal.
 *		- %TIOCM_DTR	DTR signal.
 *		- %TIOCM_OUT1	OUT1 signal.
 *		- %TIOCM_OUT2	OUT2 signal.
 *		- %TIOCM_LOOP	Set the port into loopback mode.
 *
 *	If the appropriate bit is set, the signal should be driven
 *	active.  If the bit is clear, the signal should be driven
 *	inactive.
 *
 *	Locking: @port->lock taken.
 *	Interrupts: locally disabled.
 *	This call must not sleep
 *
 * @get_mctrl: ``unsigned int ()(struct uart_port *port)``
 *
 *	Returns the current state of modem control inputs of @port. The state
 *	of the outputs should not be returned, since the core keeps track of
 *	their state. The state information should include:
 *
 *		- %TIOCM_CAR	state of DCD signal
 *		- %TIOCM_CTS	state of CTS signal
 *		- %TIOCM_DSR	state of DSR signal
 *		- %TIOCM_RI	state of RI signal
 *
 *	The bit is set if the signal is currently driven active.  If
 *	the port does not support CTS, DCD or DSR, the driver should
 *	indicate that the signal is permanently active. If RI is
 *	not available, the signal should not be indicated as active.
 *
 *	Locking: @port->lock taken.
 *	Interrupts: locally disabled.
 *	This call must not sleep
 *
 * @stop_tx: ``void ()(struct uart_port *port)``
 *
 *	Stop transmitting characters. This might be due to the CTS line
 *	becoming inactive or the tty layer indicating we want to stop
 *	transmission due to an %XOFF character.
 *
 *	The driver should stop transmitting characters as soon as possible.
 *
 *	Locking: @port->lock taken.
 *	Interrupts: locally disabled.
 *	This call must not sleep
 *
 * @start_tx: ``void ()(struct uart_port *port)``
 *
 *	Start transmitting characters.
 *
 *	Locking: @port->lock taken.
 *	Interrupts: locally disabled.
 *	This call must not sleep
 *
 * @throttle: ``void ()(struct uart_port *port)``
 *
 *	Notify the serial driver that input buffers for the line discipline are
 *	close to full, and it should somehow signal that no more characters
 *	should be sent to the serial port.
 *	This will be called only if hardware assisted flow control is enabled.
 *
 *	Locking: serialized with @unthrottle() and termios modification by the
 *	tty layer.
 *
 * @unthrottle: ``void ()(struct uart_port *port)``
 *
 *	Notify the serial driver that characters can now be sent to the serial
 *	port without fear of overrunning the input buffers of the line
 *	disciplines.
 *
 *	This will be called only if hardware assisted flow control is enabled.
 *
 *	Locking: serialized with @throttle() and termios modification by the
 *	tty layer.
 *
 * @send_xchar: ``void ()(struct uart_port *port, char ch)``
 *
 *	Transmit a high priority character, even if the port is stopped. This
 *	is used to implement XON/XOFF flow control and tcflow(). If the serial
 *	driver does not implement this function, the tty core will append the
 *	character to the circular buffer and then call start_tx() / stop_tx()
 *	to flush the data out.
 *
 *	Do not transmit if @ch == '\0' (%__DISABLED_CHAR).
 *
 *	Locking: none.
 *	Interrupts: caller dependent.
 *
144 145 146 147 148 149 150 151
 * @start_rx: ``void ()(struct uart_port *port)``
 *
 *	Start receiving characters.
 *
 *	Locking: @port->lock taken.
 *	Interrupts: locally disabled.
 *	This call must not sleep
 *
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371
 * @stop_rx: ``void ()(struct uart_port *port)``
 *
 *	Stop receiving characters; the @port is in the process of being closed.
 *
 *	Locking: @port->lock taken.
 *	Interrupts: locally disabled.
 *	This call must not sleep
 *
 * @enable_ms: ``void ()(struct uart_port *port)``
 *
 *	Enable the modem status interrupts.
 *
 *	This method may be called multiple times. Modem status interrupts
 *	should be disabled when the @shutdown() method is called.
 *
 *	Locking: @port->lock taken.
 *	Interrupts: locally disabled.
 *	This call must not sleep
 *
 * @break_ctl: ``void ()(struct uart_port *port, int ctl)``
 *
 *	Control the transmission of a break signal. If @ctl is nonzero, the
 *	break signal should be transmitted. The signal should be terminated
 *	when another call is made with a zero @ctl.
 *
 *	Locking: caller holds tty_port->mutex
 *
 * @startup: ``int ()(struct uart_port *port)``
 *
 *	Grab any interrupt resources and initialise any low level driver state.
 *	Enable the port for reception. It should not activate RTS nor DTR;
 *	this will be done via a separate call to @set_mctrl().
 *
 *	This method will only be called when the port is initially opened.
 *
 *	Locking: port_sem taken.
 *	Interrupts: globally disabled.
 *
 * @shutdown: ``void ()(struct uart_port *port)``
 *
 *	Disable the @port, disable any break condition that may be in effect,
 *	and free any interrupt resources. It should not disable RTS nor DTR;
 *	this will have already been done via a separate call to @set_mctrl().
 *
 *	Drivers must not access @port->state once this call has completed.
 *
 *	This method will only be called when there are no more users of this
 *	@port.
 *
 *	Locking: port_sem taken.
 *	Interrupts: caller dependent.
 *
 * @flush_buffer: ``void ()(struct uart_port *port)``
 *
 *	Flush any write buffers, reset any DMA state and stop any ongoing DMA
 *	transfers.
 *
 *	This will be called whenever the @port->state->xmit circular buffer is
 *	cleared.
 *
 *	Locking: @port->lock taken.
 *	Interrupts: locally disabled.
 *	This call must not sleep
 *
 * @set_termios: ``void ()(struct uart_port *port, struct ktermios *new,
 *			struct ktermios *old)``
 *
 *	Change the @port parameters, including word length, parity, stop bits.
 *	Update @port->read_status_mask and @port->ignore_status_mask to
 *	indicate the types of events we are interested in receiving. Relevant
 *	ktermios::c_cflag bits are:
 *
 *	- %CSIZE - word size
 *	- %CSTOPB - 2 stop bits
 *	- %PARENB - parity enable
 *	- %PARODD - odd parity (when %PARENB is in force)
 *	- %ADDRB - address bit (changed through uart_port::rs485_config()).
 *	- %CREAD - enable reception of characters (if not set, still receive
 *	  characters from the port, but throw them away).
 *	- %CRTSCTS - if set, enable CTS status change reporting.
 *	- %CLOCAL - if not set, enable modem status change reporting.
 *
 *	Relevant ktermios::c_iflag bits are:
 *
 *	- %INPCK - enable frame and parity error events to be passed to the TTY
 *	  layer.
 *	- %BRKINT / %PARMRK - both of these enable break events to be passed to
 *	  the TTY layer.
 *	- %IGNPAR - ignore parity and framing errors.
 *	- %IGNBRK - ignore break errors. If %IGNPAR is also set, ignore overrun
 *	  errors as well.
 *
 *	The interaction of the ktermios::c_iflag bits is as follows (parity
 *	error given as an example):
 *
 *	============ ======= ======= =========================================
 *	Parity error INPCK   IGNPAR
 *	============ ======= ======= =========================================
 *	n/a	     0	     n/a     character received, marked as %TTY_NORMAL
 *	None	     1	     n/a     character received, marked as %TTY_NORMAL
 *	Yes	     1	     0	     character received, marked as %TTY_PARITY
 *	Yes	     1	     1	     character discarded
 *	============ ======= ======= =========================================
 *
 *	Other flags may be used (eg, xon/xoff characters) if your hardware
 *	supports hardware "soft" flow control.
 *
 *	Locking: caller holds tty_port->mutex
 *	Interrupts: caller dependent.
 *	This call must not sleep
 *
 * @set_ldisc: ``void ()(struct uart_port *port, struct ktermios *termios)``
 *
 *	Notifier for discipline change. See
 *	Documentation/driver-api/tty/tty_ldisc.rst.
 *
 *	Locking: caller holds tty_port->mutex
 *
 * @pm: ``void ()(struct uart_port *port, unsigned int state,
 *		 unsigned int oldstate)``
 *
 *	Perform any power management related activities on the specified @port.
 *	@state indicates the new state (defined by enum uart_pm_state),
 *	@oldstate indicates the previous state.
 *
 *	This function should not be used to grab any resources.
 *
 *	This will be called when the @port is initially opened and finally
 *	closed, except when the @port is also the system console. This will
 *	occur even if %CONFIG_PM is not set.
 *
 *	Locking: none.
 *	Interrupts: caller dependent.
 *
 * @type: ``const char *()(struct uart_port *port)``
 *
 *	Return a pointer to a string constant describing the specified @port,
 *	or return %NULL, in which case the string 'unknown' is substituted.
 *
 *	Locking: none.
 *	Interrupts: caller dependent.
 *
 * @release_port: ``void ()(struct uart_port *port)``
 *
 *	Release any memory and IO region resources currently in use by the
 *	@port.
 *
 *	Locking: none.
 *	Interrupts: caller dependent.
 *
 * @request_port: ``int ()(struct uart_port *port)``
 *
 *	Request any memory and IO region resources required by the port. If any
 *	fail, no resources should be registered when this function returns, and
 *	it should return -%EBUSY on failure.
 *
 *	Locking: none.
 *	Interrupts: caller dependent.
 *
 * @config_port: ``void ()(struct uart_port *port, int type)``
 *
 *	Perform any autoconfiguration steps required for the @port. @type
 *	contains a bit mask of the required configuration. %UART_CONFIG_TYPE
 *	indicates that the port requires detection and identification.
 *	@port->type should be set to the type found, or %PORT_UNKNOWN if no
 *	port was detected.
 *
 *	%UART_CONFIG_IRQ indicates autoconfiguration of the interrupt signal,
 *	which should be probed using standard kernel autoprobing techniques.
 *	This is not necessary on platforms where ports have interrupts
 *	internally hard wired (eg, system on a chip implementations).
 *
 *	Locking: none.
 *	Interrupts: caller dependent.
 *
 * @verify_port: ``int ()(struct uart_port *port,
 *			struct serial_struct *serinfo)``
 *
 *	Verify the new serial port information contained within @serinfo is
 *	suitable for this port type.
 *
 *	Locking: none.
 *	Interrupts: caller dependent.
 *
 * @ioctl: ``int ()(struct uart_port *port, unsigned int cmd,
 *		unsigned long arg)``
 *
 *	Perform any port specific IOCTLs. IOCTL commands must be defined using
 *	the standard numbering system found in <asm/ioctl.h>.
 *
 *	Locking: none.
 *	Interrupts: caller dependent.
 *
 * @poll_init: ``int ()(struct uart_port *port)``
 *
 *	Called by kgdb to perform the minimal hardware initialization needed to
 *	support @poll_put_char() and @poll_get_char(). Unlike @startup(), this
 *	should not request interrupts.
 *
 *	Locking: %tty_mutex and tty_port->mutex taken.
 *	Interrupts: n/a.
 *
 * @poll_put_char: ``void ()(struct uart_port *port, unsigned char ch)``
 *
 *	Called by kgdb to write a single character @ch directly to the serial
 *	@port. It can and should block until there is space in the TX FIFO.
 *
 *	Locking: none.
 *	Interrupts: caller dependent.
 *	This call must not sleep
 *
 * @poll_get_char: ``int ()(struct uart_port *port)``
 *
 *	Called by kgdb to read a single character directly from the serial
 *	port. If data is available, it should be returned; otherwise the
 *	function should return %NO_POLL_CHAR immediately.
 *
 *	Locking: none.
 *	Interrupts: caller dependent.
 *	This call must not sleep
L
Linus Torvalds 已提交
372 373 374 375 376
 */
struct uart_ops {
	unsigned int	(*tx_empty)(struct uart_port *);
	void		(*set_mctrl)(struct uart_port *, unsigned int mctrl);
	unsigned int	(*get_mctrl)(struct uart_port *);
377 378
	void		(*stop_tx)(struct uart_port *);
	void		(*start_tx)(struct uart_port *);
379 380
	void		(*throttle)(struct uart_port *);
	void		(*unthrottle)(struct uart_port *);
L
Linus Torvalds 已提交
381 382
	void		(*send_xchar)(struct uart_port *, char ch);
	void		(*stop_rx)(struct uart_port *);
383
	void		(*start_rx)(struct uart_port *);
L
Linus Torvalds 已提交
384 385 386 387
	void		(*enable_ms)(struct uart_port *);
	void		(*break_ctl)(struct uart_port *, int ctl);
	int		(*startup)(struct uart_port *);
	void		(*shutdown)(struct uart_port *);
388
	void		(*flush_buffer)(struct uart_port *);
A
Alan Cox 已提交
389 390
	void		(*set_termios)(struct uart_port *, struct ktermios *new,
				       struct ktermios *old);
391
	void		(*set_ldisc)(struct uart_port *, struct ktermios *);
L
Linus Torvalds 已提交
392 393
	void		(*pm)(struct uart_port *, unsigned int state,
			      unsigned int oldstate);
394
	const char	*(*type)(struct uart_port *);
L
Linus Torvalds 已提交
395 396 397 398 399
	void		(*release_port)(struct uart_port *);
	int		(*request_port)(struct uart_port *);
	void		(*config_port)(struct uart_port *, int);
	int		(*verify_port)(struct uart_port *, struct serial_struct *);
	int		(*ioctl)(struct uart_port *, unsigned int, unsigned long);
J
Jason Wessel 已提交
400
#ifdef CONFIG_CONSOLE_POLL
401
	int		(*poll_init)(struct uart_port *);
402
	void		(*poll_put_char)(struct uart_port *, unsigned char);
J
Jason Wessel 已提交
403 404
	int		(*poll_get_char)(struct uart_port *);
#endif
L
Linus Torvalds 已提交
405 406
};

407
#define NO_POLL_CHAR		0x00ff0000
L
Linus Torvalds 已提交
408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424
#define UART_CONFIG_TYPE	(1 << 0)
#define UART_CONFIG_IRQ		(1 << 1)

struct uart_icount {
	__u32	cts;
	__u32	dsr;
	__u32	rng;
	__u32	dcd;
	__u32	rx;
	__u32	tx;
	__u32	frame;
	__u32	overrun;
	__u32	parity;
	__u32	brk;
	__u32	buf_overrun;
};

425 426
typedef unsigned int __bitwise upf_t;
typedef unsigned int __bitwise upstat_t;
427

L
Linus Torvalds 已提交
428 429
struct uart_port {
	spinlock_t		lock;			/* port lock */
430
	unsigned long		iobase;			/* in/out[bwl] */
L
Linus Torvalds 已提交
431
	unsigned char __iomem	*membase;		/* read/write[bwl] */
432 433
	unsigned int		(*serial_in)(struct uart_port *, int);
	void			(*serial_out)(struct uart_port *, int, int);
434 435 436
	void			(*set_termios)(struct uart_port *,
				               struct ktermios *new,
				               struct ktermios *old);
E
Ed Blake 已提交
437 438
	void			(*set_ldisc)(struct uart_port *,
					     struct ktermios *);
439
	unsigned int		(*get_mctrl)(struct uart_port *);
440
	void			(*set_mctrl)(struct uart_port *, unsigned int);
441 442 443 444 445 446 447
	unsigned int		(*get_divisor)(struct uart_port *,
					       unsigned int baud,
					       unsigned int *frac);
	void			(*set_divisor)(struct uart_port *,
					       unsigned int baud,
					       unsigned int quot,
					       unsigned int quot_frac);
448 449
	int			(*startup)(struct uart_port *port);
	void			(*shutdown)(struct uart_port *port);
450 451
	void			(*throttle)(struct uart_port *port);
	void			(*unthrottle)(struct uart_port *port);
452
	int			(*handle_irq)(struct uart_port *);
453 454
	void			(*pm)(struct uart_port *, unsigned int state,
				      unsigned int old);
455
	void			(*handle_break)(struct uart_port *);
456
	int			(*rs485_config)(struct uart_port *,
457
						struct ktermios *termios,
458
						struct serial_rs485 *rs485);
459 460
	int			(*iso7816_config)(struct uart_port *,
						  struct serial_iso7816 *iso7816);
L
Linus Torvalds 已提交
461
	unsigned int		irq;			/* irq number */
462
	unsigned long		irqflags;		/* irq flags  */
L
Linus Torvalds 已提交
463
	unsigned int		uartclk;		/* base uart clock */
464
	unsigned int		fifosize;		/* tx fifo size */
L
Linus Torvalds 已提交
465 466 467
	unsigned char		x_char;			/* xon/xoff char */
	unsigned char		regshift;		/* reg offset shift */
	unsigned char		iotype;			/* io access style */
468
	unsigned char		quirks;			/* internal quirks */
L
Linus Torvalds 已提交
469

470 471
#define UPIO_PORT		(SERIAL_IO_PORT)	/* 8b I/O port access */
#define UPIO_HUB6		(SERIAL_IO_HUB6)	/* Hub6 ISA card */
P
Peter Hurley 已提交
472
#define UPIO_MEM		(SERIAL_IO_MEM)		/* driver-specific */
473 474 475 476
#define UPIO_MEM32		(SERIAL_IO_MEM32)	/* 32b little endian */
#define UPIO_AU			(SERIAL_IO_AU)		/* Au1x00 and RT288x type IO */
#define UPIO_TSI		(SERIAL_IO_TSI)		/* Tsi108/109 type IO */
#define UPIO_MEM32BE		(SERIAL_IO_MEM32BE)	/* 32b big endian */
477
#define UPIO_MEM16		(SERIAL_IO_MEM16)	/* 16b little endian */
L
Linus Torvalds 已提交
478

479 480 481
	/* quirks must be updated while holding port mutex */
#define UPQ_NO_TXEN_TEST	BIT(0)

L
Linus Torvalds 已提交
482 483
	unsigned int		read_status_mask;	/* driver specific */
	unsigned int		ignore_status_mask;	/* driver specific */
A
Alan Cox 已提交
484
	struct uart_state	*state;			/* pointer to parent state */
L
Linus Torvalds 已提交
485 486 487
	struct uart_icount	icount;			/* statistics */

	struct console		*cons;			/* struct console, if any */
488
	/* flags must be updated while holding port mutex */
489 490
	upf_t			flags;

491 492 493 494 495 496
	/*
	 * These flags must be equivalent to the flags defined in
	 * include/uapi/linux/tty_flags.h which are the userspace definitions
	 * assigned from the serial_struct flags in uart_set_info()
	 * [for bit definitions in the UPF_CHANGE_MASK]
	 *
497
	 * Bits [0..ASYNCB_LAST_USER] are userspace defined/visible/changeable
498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515
	 * The remaining bits are serial-core specific and not modifiable by
	 * userspace.
	 */
#define UPF_FOURPORT		((__force upf_t) ASYNC_FOURPORT       /* 1  */ )
#define UPF_SAK			((__force upf_t) ASYNC_SAK            /* 2  */ )
#define UPF_SPD_HI		((__force upf_t) ASYNC_SPD_HI         /* 4  */ )
#define UPF_SPD_VHI		((__force upf_t) ASYNC_SPD_VHI        /* 5  */ )
#define UPF_SPD_CUST		((__force upf_t) ASYNC_SPD_CUST   /* 0x0030 */ )
#define UPF_SPD_WARP		((__force upf_t) ASYNC_SPD_WARP   /* 0x1010 */ )
#define UPF_SPD_MASK		((__force upf_t) ASYNC_SPD_MASK   /* 0x1030 */ )
#define UPF_SKIP_TEST		((__force upf_t) ASYNC_SKIP_TEST      /* 6  */ )
#define UPF_AUTO_IRQ		((__force upf_t) ASYNC_AUTO_IRQ       /* 7  */ )
#define UPF_HARDPPS_CD		((__force upf_t) ASYNC_HARDPPS_CD     /* 11 */ )
#define UPF_SPD_SHI		((__force upf_t) ASYNC_SPD_SHI        /* 12 */ )
#define UPF_LOW_LATENCY		((__force upf_t) ASYNC_LOW_LATENCY    /* 13 */ )
#define UPF_BUGGY_UART		((__force upf_t) ASYNC_BUGGY_UART     /* 14 */ )
#define UPF_MAGIC_MULTIPLIER	((__force upf_t) ASYNC_MAGIC_MULTIPLIER /* 16 */ )

516
#define UPF_NO_THRE_TEST	((__force upf_t) (1 << 19))
517 518 519 520
/* Port has hardware-assisted h/w flow control */
#define UPF_AUTO_CTS		((__force upf_t) (1 << 20))
#define UPF_AUTO_RTS		((__force upf_t) (1 << 21))
#define UPF_HARD_FLOW		((__force upf_t) (UPF_AUTO_CTS | UPF_AUTO_RTS))
521 522
/* Port has hardware-assisted s/w flow control */
#define UPF_SOFT_FLOW		((__force upf_t) (1 << 22))
523 524
#define UPF_CONS_FLOW		((__force upf_t) (1 << 23))
#define UPF_SHARE_IRQ		((__force upf_t) (1 << 24))
525
#define UPF_EXAR_EFR		((__force upf_t) (1 << 25))
526
#define UPF_BUG_THRE		((__force upf_t) (1 << 26))
527 528
/* The exact UART type is known and should not be probed.  */
#define UPF_FIXED_TYPE		((__force upf_t) (1 << 27))
529
#define UPF_BOOT_AUTOCONF	((__force upf_t) (1 << 28))
530
#define UPF_FIXED_PORT		((__force upf_t) (1 << 29))
531
#define UPF_DEAD		((__force upf_t) (1 << 30))
532 533
#define UPF_IOREMAP		((__force upf_t) (1 << 31))

534 535
#define __UPF_CHANGE_MASK	0x17fff
#define UPF_CHANGE_MASK		((__force upf_t) __UPF_CHANGE_MASK)
536
#define UPF_USR_MASK		((__force upf_t) (UPF_SPD_MASK|UPF_LOW_LATENCY))
L
Linus Torvalds 已提交
537

538 539 540 541
#if __UPF_CHANGE_MASK > ASYNC_FLAGS
#error Change mask not equivalent to userspace-visible bit defines
#endif

542 543 544 545
	/*
	 * Must hold termios_rwsem, port mutex and port lock to change;
	 * can hold any one lock to read.
	 */
546 547 548 549
	upstat_t		status;

#define UPSTAT_CTS_ENABLE	((__force upstat_t) (1 << 0))
#define UPSTAT_DCD_ENABLE	((__force upstat_t) (1 << 1))
550 551 552
#define UPSTAT_AUTORTS		((__force upstat_t) (1 << 2))
#define UPSTAT_AUTOCTS		((__force upstat_t) (1 << 3))
#define UPSTAT_AUTOXOFF		((__force upstat_t) (1 << 4))
553
#define UPSTAT_SYNC_FIFO	((__force upstat_t) (1 << 5))
554

555
	int			hw_stopped;		/* sw-assisted CTS flow state */
L
Linus Torvalds 已提交
556
	unsigned int		mctrl;			/* current modem ctrl settings */
557
	unsigned int		frame_time;		/* frame timing in ns */
L
Linus Torvalds 已提交
558
	unsigned int		type;			/* port type */
R
Russell King 已提交
559
	const struct uart_ops	*ops;
L
Linus Torvalds 已提交
560 561
	unsigned int		custom_divisor;
	unsigned int		line;			/* port index */
562
	unsigned int		minor;
563
	resource_size_t		mapbase;		/* for ioremap */
564
	resource_size_t		mapsize;
L
Linus Torvalds 已提交
565
	struct device		*dev;			/* parent device */
D
Dmitry Safonov 已提交
566 567 568

	unsigned long		sysrq;			/* sysrq timeout */
	unsigned int		sysrq_ch;		/* char for sysrq */
569
	unsigned char		has_sysrq;
570
	unsigned char		sysrq_seq;		/* index in sysrq_toggle_seq */
D
Dmitry Safonov 已提交
571

L
Linus Torvalds 已提交
572
	unsigned char		hub6;			/* this should be in the 8250 driver */
G
Guennadi Liakhovetski 已提交
573
	unsigned char		suspended;
574
	unsigned char		console_reinit;
575
	const char		*name;			/* port name */
576 577
	struct attribute_group	*attr_group;		/* port specific attributes */
	const struct attribute_group **tty_groups;	/* all attributes (serial core use only) */
578
	struct serial_rs485     rs485;
579
	struct serial_rs485	rs485_supported;	/* Supported mask for serial_rs485 */
580
	struct gpio_desc	*rs485_term_gpio;	/* enable RS485 bus termination */
581
	struct serial_iso7816   iso7816;
M
Marc St-Jean 已提交
582
	void			*private_data;		/* generic platform data pointer */
L
Linus Torvalds 已提交
583 584
};

585 586 587 588 589 590 591 592 593 594
static inline int serial_port_in(struct uart_port *up, int offset)
{
	return up->serial_in(up, offset);
}

static inline void serial_port_out(struct uart_port *up, int offset, int value)
{
	up->serial_out(up, offset, value);
}

595 596 597 598 599 600 601 602 603 604 605 606
/**
 * enum uart_pm_state - power states for UARTs
 * @UART_PM_STATE_ON: UART is powered, up and operational
 * @UART_PM_STATE_OFF: UART is powered off
 * @UART_PM_STATE_UNDEFINED: sentinel
 */
enum uart_pm_state {
	UART_PM_STATE_ON = 0,
	UART_PM_STATE_OFF = 3, /* number taken from ACPI */
	UART_PM_STATE_UNDEFINED,
};

A
Alan Cox 已提交
607 608 609 610
/*
 * This is the state information which is persistent across opens.
 */
struct uart_state {
A
Alan Cox 已提交
611
	struct tty_port		port;
A
Alan Cox 已提交
612

613
	enum uart_pm_state	pm_state;
L
Linus Torvalds 已提交
614 615
	struct circ_buf		xmit;

616 617
	atomic_t		refcount;
	wait_queue_head_t	remove_wait;
A
Alan Cox 已提交
618
	struct uart_port	*uart_port;
619 620 621 622 623
};

#define UART_XMIT_SIZE	PAGE_SIZE


L
Linus Torvalds 已提交
624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653
/* number of characters left in xmit buffer before we ask for more */
#define WAKEUP_CHARS		256

struct module;
struct tty_driver;

struct uart_driver {
	struct module		*owner;
	const char		*driver_name;
	const char		*dev_name;
	int			 major;
	int			 minor;
	int			 nr;
	struct console		*cons;

	/*
	 * these are private; the low level driver should not
	 * touch these; they should be initialised to NULL
	 */
	struct uart_state	*state;
	struct tty_driver	*tty_driver;
};

void uart_write_wakeup(struct uart_port *port);

/*
 * Baud rate helpers.
 */
void uart_update_timeout(struct uart_port *port, unsigned int cflag,
			 unsigned int baud);
A
Alan Cox 已提交
654 655
unsigned int uart_get_baud_rate(struct uart_port *port, struct ktermios *termios,
				struct ktermios *old, unsigned int min,
L
Linus Torvalds 已提交
656 657 658
				unsigned int max);
unsigned int uart_get_divisor(struct uart_port *port, unsigned int baud);

659 660 661 662 663 664 665 666 667 668 669 670 671
/*
 * Calculates FIFO drain time.
 */
static inline unsigned long uart_fifo_timeout(struct uart_port *port)
{
	u64 fifo_timeout = (u64)READ_ONCE(port->frame_time) * port->fifosize;

	/* Add .02 seconds of slop */
	fifo_timeout += 20 * NSEC_PER_MSEC;

	return max(nsecs_to_jiffies(fifo_timeout), 1UL);
}

672 673 674
/* Base timer interval for polling */
static inline int uart_poll_timeout(struct uart_port *port)
{
675
	int timeout = uart_fifo_timeout(port);
676 677 678 679

	return timeout > 6 ? (timeout / 2 - 2) : 1;
}

L
Linus Torvalds 已提交
680 681 682
/*
 * Console helpers.
 */
683 684 685 686 687 688 689
struct earlycon_device {
	struct console *con;
	struct uart_port port;
	char options[16];		/* e.g., 115200n8 */
	unsigned int baud;
};

690
struct earlycon_id {
691 692
	char	name[15];
	char	name_term;	/* In case compiler didn't '\0' term name */
693
	char	compatible[128];
694
	int	(*setup)(struct earlycon_device *, const char *options);
695
};
696

697 698
extern const struct earlycon_id __earlycon_table[];
extern const struct earlycon_id __earlycon_table_end[];
699

700 701 702 703 704 705
#if defined(CONFIG_SERIAL_EARLYCON) && !defined(MODULE)
#define EARLYCON_USED_OR_UNUSED	__used
#else
#define EARLYCON_USED_OR_UNUSED	__maybe_unused
#endif

706 707 708 709
#define OF_EARLYCON_DECLARE(_name, compat, fn)				\
	static const struct earlycon_id __UNIQUE_ID(__earlycon_##_name) \
		EARLYCON_USED_OR_UNUSED  __section("__earlycon_table")  \
		__aligned(__alignof__(struct earlycon_id))		\
710 711
		= { .name = __stringify(_name),				\
		    .compatible = compat,				\
712
		    .setup = fn }
713 714 715

#define EARLYCON_DECLARE(_name, fn)	OF_EARLYCON_DECLARE(_name, "", fn)

716
extern int of_setup_earlycon(const struct earlycon_id *match,
717
			     unsigned long node,
718
			     const char *options);
R
Rob Herring 已提交
719

720
#ifdef CONFIG_SERIAL_EARLYCON
721
extern bool earlycon_acpi_spcr_enable __initdata;
722 723
int setup_earlycon(char *buf);
#else
724
static const bool earlycon_acpi_spcr_enable EARLYCON_USED_OR_UNUSED;
725 726 727
static inline int setup_earlycon(char *buf) { return 0; }
#endif

728 729 730 731 732
static inline bool uart_console_enabled(struct uart_port *port)
{
	return uart_console(port) && (port->cons->flags & CON_ENABLED);
}

L
Linus Torvalds 已提交
733 734
struct uart_port *uart_get_console(struct uart_port *ports, int nr,
				   struct console *c);
735
int uart_parse_earlycon(char *p, unsigned char *iotype, resource_size_t *addr,
736
			char **options);
737
void uart_parse_options(const char *options, int *baud, int *parity, int *bits,
L
Linus Torvalds 已提交
738 739 740 741
			int *flow);
int uart_set_options(struct uart_port *port, struct console *co, int baud,
		     int parity, int bits, int flow);
struct tty_driver *uart_console_device(struct console *co, int *index);
742 743
void uart_console_write(struct uart_port *port, const char *s,
			unsigned int count,
744
			void (*putchar)(struct uart_port *, unsigned char));
L
Linus Torvalds 已提交
745 746 747 748 749 750 751 752

/*
 * Port/driver registration/removal
 */
int uart_register_driver(struct uart_driver *uart);
void uart_unregister_driver(struct uart_driver *uart);
int uart_add_one_port(struct uart_driver *reg, struct uart_port *port);
int uart_remove_one_port(struct uart_driver *reg, struct uart_port *port);
753 754
bool uart_match_port(const struct uart_port *port1,
		const struct uart_port *port2);
L
Linus Torvalds 已提交
755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770

/*
 * Power Management
 */
int uart_suspend_port(struct uart_driver *reg, struct uart_port *port);
int uart_resume_port(struct uart_driver *reg, struct uart_port *port);

#define uart_circ_empty(circ)		((circ)->head == (circ)->tail)
#define uart_circ_clear(circ)		((circ)->head = (circ)->tail = 0)

#define uart_circ_chars_pending(circ)	\
	(CIRC_CNT((circ)->head, (circ)->tail, UART_XMIT_SIZE))

#define uart_circ_chars_free(circ)	\
	(CIRC_SPACE((circ)->head, (circ)->tail, UART_XMIT_SIZE))

771 772
static inline int uart_tx_stopped(struct uart_port *port)
{
A
Alan Cox 已提交
773
	struct tty_struct *tty = port->state->port.tty;
774
	if ((tty && tty->flow.stopped) || port->hw_stopped)
775 776 777
		return 1;
	return 0;
}
L
Linus Torvalds 已提交
778

779 780
static inline bool uart_cts_enabled(struct uart_port *uport)
{
781
	return !!(uport->status & UPSTAT_CTS_ENABLE);
782 783
}

784 785 786 787 788 789 790
static inline bool uart_softcts_mode(struct uart_port *uport)
{
	upstat_t mask = UPSTAT_CTS_ENABLE | UPSTAT_AUTOCTS;

	return ((uport->status & mask) == UPSTAT_CTS_ENABLE);
}

L
Linus Torvalds 已提交
791 792 793
/*
 * The following are helper functions for the low level drivers.
 */
J
Jiri Slaby 已提交
794 795 796 797 798 799 800 801 802

extern void uart_handle_dcd_change(struct uart_port *uport,
		unsigned int status);
extern void uart_handle_cts_change(struct uart_port *uport,
		unsigned int status);

extern void uart_insert_char(struct uart_port *port, unsigned int status,
		 unsigned int overrun, unsigned int ch, unsigned int flag);

803 804
void uart_xchar_out(struct uart_port *uport, int offset);

805 806 807 808 809 810 811
#ifdef CONFIG_MAGIC_SYSRQ_SERIAL
#define SYSRQ_TIMEOUT	(HZ * 5)

bool uart_try_toggle_sysrq(struct uart_port *port, unsigned int ch);

static inline int uart_handle_sysrq_char(struct uart_port *port, unsigned int ch)
{
812
	if (!port->sysrq)
813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830
		return 0;

	if (ch && time_before(jiffies, port->sysrq)) {
		if (sysrq_mask()) {
			handle_sysrq(ch);
			port->sysrq = 0;
			return 1;
		}
		if (uart_try_toggle_sysrq(port, ch))
			return 1;
	}
	port->sysrq = 0;

	return 0;
}

static inline int uart_prepare_sysrq_char(struct uart_port *port, unsigned int ch)
{
831
	if (!port->sysrq)
832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847
		return 0;

	if (ch && time_before(jiffies, port->sysrq)) {
		if (sysrq_mask()) {
			port->sysrq_ch = ch;
			port->sysrq = 0;
			return 1;
		}
		if (uart_try_toggle_sysrq(port, ch))
			return 1;
	}
	port->sysrq = 0;

	return 0;
}

848
static inline void uart_unlock_and_check_sysrq(struct uart_port *port)
849 850 851 852
{
	int sysrq_ch;

	if (!port->has_sysrq) {
853
		spin_unlock(&port->lock);
854 855 856 857 858 859
		return;
	}

	sysrq_ch = port->sysrq_ch;
	port->sysrq_ch = 0;

860
	spin_unlock(&port->lock);
861 862 863 864

	if (sysrq_ch)
		handle_sysrq(sysrq_ch);
}
865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883

static inline void uart_unlock_and_check_sysrq_irqrestore(struct uart_port *port,
		unsigned long flags)
{
	int sysrq_ch;

	if (!port->has_sysrq) {
		spin_unlock_irqrestore(&port->lock, flags);
		return;
	}

	sysrq_ch = port->sysrq_ch;
	port->sysrq_ch = 0;

	spin_unlock_irqrestore(&port->lock, flags);

	if (sysrq_ch)
		handle_sysrq(sysrq_ch);
}
884 885 886 887 888 889 890 891 892
#else	/* CONFIG_MAGIC_SYSRQ_SERIAL */
static inline int uart_handle_sysrq_char(struct uart_port *port, unsigned int ch)
{
	return 0;
}
static inline int uart_prepare_sysrq_char(struct uart_port *port, unsigned int ch)
{
	return 0;
}
893
static inline void uart_unlock_and_check_sysrq(struct uart_port *port)
894
{
895
	spin_unlock(&port->lock);
896
}
897 898 899 900 901
static inline void uart_unlock_and_check_sysrq_irqrestore(struct uart_port *port,
		unsigned long flags)
{
	spin_unlock_irqrestore(&port->lock, flags);
}
902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926
#endif	/* CONFIG_MAGIC_SYSRQ_SERIAL */

/*
 * We do the SysRQ and SAK checking like this...
 */
static inline int uart_handle_break(struct uart_port *port)
{
	struct uart_state *state = port->state;

	if (port->handle_break)
		port->handle_break(port);

#ifdef CONFIG_MAGIC_SYSRQ_SERIAL
	if (port->has_sysrq && uart_console(port)) {
		if (!port->sysrq) {
			port->sysrq = jiffies + SYSRQ_TIMEOUT;
			return 1;
		}
		port->sysrq = 0;
	}
#endif
	if (port->flags & UPF_SAK)
		do_SAK(state->port.tty);
	return 0;
}
L
Linus Torvalds 已提交
927 928 929 930 931 932 933 934

/*
 *	UART_ENABLE_MS - determine if port should enable modem status irqs
 */
#define UART_ENABLE_MS(port,cflag)	((port)->flags & UPF_HARDPPS_CD || \
					 (cflag) & CRTSCTS || \
					 !((cflag) & CLOCAL))

935
int uart_get_rs485_mode(struct uart_port *port);
I
Ilpo Järvinen 已提交
936
int uart_rs485_config(struct uart_port *port);
L
Linus Torvalds 已提交
937
#endif /* LINUX_SERIAL_CORE_H */