FILE
8250.h
File preview with syntax highlighting.
linux-6.19.14/drivers/tty/serial/8250/8250.h
1/* SPDX-License-Identifier: GPL-2.0+ */ 2/* 3 * Driver for 8250/16550-type serial ports 4 * 5 * Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o. 6 * 7 * Copyright (C) 2001 Russell King. 8 */ 9 10#include <linux/bits.h> 11#include <linux/serial_8250.h> 12#include <linux/serial_core.h> 13#include <linux/dmaengine.h> 14 15#include "../serial_mctrl_gpio.h" 16 17struct uart_8250_dma { 18 int (*tx_dma)(struct uart_8250_port *p); 19 int (*rx_dma)(struct uart_8250_port *p); 20 void (*prepare_tx_dma)(struct uart_8250_port *p); 21 void (*prepare_rx_dma)(struct uart_8250_port *p); 22 23 /* Filter function */ 24 dma_filter_fn fn; 25 /* Parameter to the filter function */ 26 void *rx_param; 27 void *tx_param; 28 29 struct dma_slave_config rxconf; 30 struct dma_slave_config txconf; 31 32 struct dma_chan *rxchan; 33 struct dma_chan *txchan; 34 35 /* Device address base for DMA operations */ 36 phys_addr_t rx_dma_addr; 37 phys_addr_t tx_dma_addr; 38 39 /* DMA address of the buffer in memory */ 40 dma_addr_t rx_addr; 41 dma_addr_t tx_addr; 42 43 dma_cookie_t rx_cookie; 44 dma_cookie_t tx_cookie; 45 46 void *rx_buf; 47 48 size_t rx_size; 49 size_t tx_size; 50 51 unsigned char tx_running; 52 unsigned char tx_err; 53 unsigned char rx_running; 54}; 55 56struct old_serial_port { 57 unsigned int uart; 58 unsigned int baud_base; 59 unsigned int port; 60 unsigned int irq; 61 upf_t flags; 62 unsigned char io_type; 63 unsigned char __iomem *iomem_base; 64 unsigned short iomem_reg_shift; 65}; 66 67struct serial8250_config { 68 const char *name; 69 unsigned short fifo_size; 70 unsigned short tx_loadsz; 71 unsigned char fcr; 72 unsigned char rxtrig_bytes[UART_FCR_R_TRIG_MAX_STATE]; 73 unsigned int flags; 74}; 75 76#define UART_CAP_FIFO BIT(8) /* UART has FIFO */ 77#define UART_CAP_EFR BIT(9) /* UART has EFR */ 78#define UART_CAP_SLEEP BIT(10) /* UART has IER sleep */ 79#define UART_CAP_AFE BIT(11) /* MCR-based hw flow control */ 80#define UART_CAP_UUE BIT(12) /* UART needs IER bit 6 set (Xscale) */ 81#define UART_CAP_RTOIE BIT(13) /* UART needs IER bit 4 set (Xscale, Tegra) */ 82#define UART_CAP_HFIFO BIT(14) /* UART has a "hidden" FIFO */ 83#define UART_CAP_RPM BIT(15) /* Runtime PM is active while idle */ 84#define UART_CAP_IRDA BIT(16) /* UART supports IrDA line discipline */ 85#define UART_CAP_MINI BIT(17) /* Mini UART on BCM283X family lacks: 86 * STOP PARITY EPAR SPAR WLEN5 WLEN6 87 */ 88#define UART_CAP_NOTEMT BIT(18) /* UART without interrupt on TEMT available */ 89 90#define UART_BUG_QUOT BIT(0) /* UART has buggy quot LSB */ 91#define UART_BUG_TXEN BIT(1) /* UART has buggy TX IIR status */ 92#define UART_BUG_NOMSR BIT(2) /* UART has buggy MSR status bits (Au1x00) */ 93#define UART_BUG_THRE BIT(3) /* UART has buggy THRE reassertion */ 94#define UART_BUG_TXRACE BIT(5) /* UART Tx fails to set remote DR */ 95 96/* Module parameters */ 97#define UART_NR CONFIG_SERIAL_8250_NR_UARTS 98 99extern unsigned int nr_uarts; 100 101#define SERIAL8250_PORT_FLAGS(_base, _irq, _flags) \ 102 { \ 103 .iobase = _base, \ 104 .irq = _irq, \ 105 .uartclk = 1843200, \ 106 .iotype = UPIO_PORT, \ 107 .flags = UPF_BOOT_AUTOCONF | (_flags), \ 108 } 109 110#define SERIAL8250_PORT(_base, _irq) SERIAL8250_PORT_FLAGS(_base, _irq, 0) 111 112extern struct uart_driver serial8250_reg; 113void serial8250_register_ports(struct uart_driver *drv, struct device *dev); 114 115/* Legacy ISA bus related APIs */ 116typedef void (*serial8250_isa_config_fn)(int, struct uart_port *, u32 *); 117extern serial8250_isa_config_fn serial8250_isa_config; 118 119void serial8250_isa_init_ports(void); 120 121extern struct platform_device *serial8250_isa_devs; 122 123extern const struct uart_ops *univ8250_port_base_ops; 124extern struct uart_ops univ8250_port_ops; 125 126static inline int serial_in(struct uart_8250_port *up, int offset) 127{ 128 return up->port.serial_in(&up->port, offset); 129} 130 131static inline void serial_out(struct uart_8250_port *up, int offset, int value) 132{ 133 up->port.serial_out(&up->port, offset, value); 134} 135 136/** 137 * serial_lsr_in - Read LSR register and preserve flags across reads 138 * @up: uart 8250 port 139 * 140 * Read LSR register and handle saving non-preserved flags across reads. 141 * The flags that are not preserved across reads are stored into 142 * up->lsr_saved_flags. 143 * 144 * Returns LSR value or'ed with the preserved flags (if any). 145 */ 146static inline u16 serial_lsr_in(struct uart_8250_port *up) 147{ 148 u16 lsr = up->lsr_saved_flags; 149 150 lsr |= serial_in(up, UART_LSR); 151 up->lsr_saved_flags = lsr & up->lsr_save_mask; 152 153 return lsr; 154} 155 156/* 157 * For the 16C950 158 */ 159static void serial_icr_write(struct uart_8250_port *up, int offset, int value) 160{ 161 serial_out(up, UART_SCR, offset); 162 serial_out(up, UART_ICR, value); 163} 164 165static unsigned int __maybe_unused serial_icr_read(struct uart_8250_port *up, 166 int offset) 167{ 168 unsigned int value; 169 170 serial_icr_write(up, UART_ACR, up->acr | UART_ACR_ICRRD); 171 serial_out(up, UART_SCR, offset); 172 value = serial_in(up, UART_ICR); 173 serial_icr_write(up, UART_ACR, up->acr); 174 175 return value; 176} 177 178void serial8250_clear_fifos(struct uart_8250_port *p); 179void serial8250_clear_and_reinit_fifos(struct uart_8250_port *p); 180void serial8250_fifo_wait_for_lsr_thre(struct uart_8250_port *up, unsigned int count); 181 182void serial8250_rpm_get(struct uart_8250_port *p); 183void serial8250_rpm_put(struct uart_8250_port *p); 184DEFINE_GUARD(serial8250_rpm, struct uart_8250_port *, 185 serial8250_rpm_get(_T), serial8250_rpm_put(_T)); 186 187static inline u32 serial_dl_read(struct uart_8250_port *up) 188{ 189 return up->dl_read(up); 190} 191 192static inline void serial_dl_write(struct uart_8250_port *up, u32 value) 193{ 194 up->dl_write(up, value); 195} 196 197static inline bool serial8250_set_THRI(struct uart_8250_port *up) 198{ 199 /* Port locked to synchronize UART_IER access against the console. */ 200 lockdep_assert_held_once(&up->port.lock); 201 202 if (up->ier & UART_IER_THRI) 203 return false; 204 up->ier |= UART_IER_THRI; 205 serial_out(up, UART_IER, up->ier); 206 return true; 207} 208 209static inline bool serial8250_clear_THRI(struct uart_8250_port *up) 210{ 211 /* Port locked to synchronize UART_IER access against the console. */ 212 lockdep_assert_held_once(&up->port.lock); 213 214 if (!(up->ier & UART_IER_THRI)) 215 return false; 216 up->ier &= ~UART_IER_THRI; 217 serial_out(up, UART_IER, up->ier); 218 return true; 219} 220 221struct uart_8250_port *serial8250_setup_port(int index); 222struct uart_8250_port *serial8250_get_port(int line); 223 224int serial8250_em485_config(struct uart_port *port, struct ktermios *termios, 225 struct serial_rs485 *rs485); 226void serial8250_em485_start_tx(struct uart_8250_port *p, bool toggle_ier); 227void serial8250_em485_stop_tx(struct uart_8250_port *p, bool toggle_ier); 228void serial8250_em485_destroy(struct uart_8250_port *p); 229extern struct serial_rs485 serial8250_em485_supported; 230 231/* MCR <-> TIOCM conversion */ 232static inline int serial8250_TIOCM_to_MCR(int tiocm) 233{ 234 int mcr = 0; 235 236 if (tiocm & TIOCM_RTS) 237 mcr |= UART_MCR_RTS; 238 if (tiocm & TIOCM_DTR) 239 mcr |= UART_MCR_DTR; 240 if (tiocm & TIOCM_OUT1) 241 mcr |= UART_MCR_OUT1; 242 if (tiocm & TIOCM_OUT2) 243 mcr |= UART_MCR_OUT2; 244 if (tiocm & TIOCM_LOOP) 245 mcr |= UART_MCR_LOOP; 246 247 return mcr; 248} 249 250static inline int serial8250_MCR_to_TIOCM(int mcr) 251{ 252 int tiocm = 0; 253 254 if (mcr & UART_MCR_RTS) 255 tiocm |= TIOCM_RTS; 256 if (mcr & UART_MCR_DTR) 257 tiocm |= TIOCM_DTR; 258 if (mcr & UART_MCR_OUT1) 259 tiocm |= TIOCM_OUT1; 260 if (mcr & UART_MCR_OUT2) 261 tiocm |= TIOCM_OUT2; 262 if (mcr & UART_MCR_LOOP) 263 tiocm |= TIOCM_LOOP; 264 265 return tiocm; 266} 267 268/* MSR <-> TIOCM conversion */ 269static inline int serial8250_MSR_to_TIOCM(int msr) 270{ 271 int tiocm = 0; 272 273 if (msr & UART_MSR_DCD) 274 tiocm |= TIOCM_CAR; 275 if (msr & UART_MSR_RI) 276 tiocm |= TIOCM_RNG; 277 if (msr & UART_MSR_DSR) 278 tiocm |= TIOCM_DSR; 279 if (msr & UART_MSR_CTS) 280 tiocm |= TIOCM_CTS; 281 282 return tiocm; 283} 284 285static inline void serial8250_out_MCR(struct uart_8250_port *up, int value) 286{ 287 serial_out(up, UART_MCR, value); 288 289 if (up->gpios) 290 mctrl_gpio_set(up->gpios, serial8250_MCR_to_TIOCM(value)); 291} 292 293static inline int serial8250_in_MCR(struct uart_8250_port *up) 294{ 295 int mctrl; 296 297 mctrl = serial_in(up, UART_MCR); 298 299 if (up->gpios) { 300 unsigned int mctrl_gpio = 0; 301 302 mctrl_gpio = mctrl_gpio_get_outputs(up->gpios, &mctrl_gpio); 303 mctrl |= serial8250_TIOCM_to_MCR(mctrl_gpio); 304 } 305 306 return mctrl; 307} 308 309#ifdef CONFIG_SERIAL_8250_PNP 310int serial8250_pnp_init(void); 311void serial8250_pnp_exit(void); 312#else 313static inline int serial8250_pnp_init(void) { return 0; } 314static inline void serial8250_pnp_exit(void) { } 315#endif 316 317#ifdef CONFIG_SERIAL_8250_RSA 318void univ8250_rsa_support(struct uart_ops *ops, const struct uart_ops *core_ops); 319void rsa_enable(struct uart_8250_port *up); 320void rsa_disable(struct uart_8250_port *up); 321void rsa_autoconfig(struct uart_8250_port *up); 322void rsa_reset(struct uart_8250_port *up); 323#else 324static inline void univ8250_rsa_support(struct uart_ops *ops, const struct uart_ops *core_ops) { } 325static inline void rsa_enable(struct uart_8250_port *up) {} 326static inline void rsa_disable(struct uart_8250_port *up) {} 327static inline void rsa_autoconfig(struct uart_8250_port *up) {} 328static inline void rsa_reset(struct uart_8250_port *up) {} 329#endif 330 331#ifdef CONFIG_SERIAL_8250_FINTEK 332int fintek_8250_probe(struct uart_8250_port *uart); 333#else 334static inline int fintek_8250_probe(struct uart_8250_port *uart) { return 0; } 335#endif 336 337#ifdef CONFIG_ARCH_OMAP1 338#include <linux/soc/ti/omap1-soc.h> 339static inline int is_omap1_8250(struct uart_8250_port *pt) 340{ 341 int res; 342 343 switch (pt->port.mapbase) { 344 case OMAP1_UART1_BASE: 345 case OMAP1_UART2_BASE: 346 case OMAP1_UART3_BASE: 347 res = 1; 348 break; 349 default: 350 res = 0; 351 break; 352 } 353 354 return res; 355} 356 357static inline int is_omap1510_8250(struct uart_8250_port *pt) 358{ 359 if (!cpu_is_omap1510()) 360 return 0; 361 362 return is_omap1_8250(pt); 363} 364#else 365static inline int is_omap1_8250(struct uart_8250_port *pt) 366{ 367 return 0; 368} 369static inline int is_omap1510_8250(struct uart_8250_port *pt) 370{ 371 return 0; 372} 373#endif 374 375#ifdef CONFIG_SERIAL_8250_DMA 376extern int serial8250_tx_dma(struct uart_8250_port *); 377extern void serial8250_tx_dma_flush(struct uart_8250_port *); 378extern int serial8250_rx_dma(struct uart_8250_port *); 379extern void serial8250_rx_dma_flush(struct uart_8250_port *); 380extern int serial8250_request_dma(struct uart_8250_port *); 381extern void serial8250_release_dma(struct uart_8250_port *); 382 383static inline void serial8250_do_prepare_tx_dma(struct uart_8250_port *p) 384{ 385 struct uart_8250_dma *dma = p->dma; 386 387 if (dma->prepare_tx_dma) 388 dma->prepare_tx_dma(p); 389} 390 391static inline void serial8250_do_prepare_rx_dma(struct uart_8250_port *p) 392{ 393 struct uart_8250_dma *dma = p->dma; 394 395 if (dma->prepare_rx_dma) 396 dma->prepare_rx_dma(p); 397} 398 399static inline bool serial8250_tx_dma_running(struct uart_8250_port *p) 400{ 401 struct uart_8250_dma *dma = p->dma; 402 403 return dma && dma->tx_running; 404} 405 406static inline void serial8250_tx_dma_pause(struct uart_8250_port *p) 407{ 408 struct uart_8250_dma *dma = p->dma; 409 410 if (!dma->tx_running) 411 return; 412 413 dmaengine_pause(dma->txchan); 414} 415 416static inline void serial8250_tx_dma_resume(struct uart_8250_port *p) 417{ 418 struct uart_8250_dma *dma = p->dma; 419 420 if (!dma->tx_running) 421 return; 422 423 dmaengine_resume(dma->txchan); 424} 425#else 426static inline int serial8250_tx_dma(struct uart_8250_port *p) 427{ 428 return -1; 429} 430static inline void serial8250_tx_dma_flush(struct uart_8250_port *p) { } 431static inline int serial8250_rx_dma(struct uart_8250_port *p) 432{ 433 return -1; 434} 435static inline void serial8250_rx_dma_flush(struct uart_8250_port *p) { } 436static inline int serial8250_request_dma(struct uart_8250_port *p) 437{ 438 return -1; 439} 440static inline void serial8250_release_dma(struct uart_8250_port *p) { } 441 442static inline bool serial8250_tx_dma_running(struct uart_8250_port *p) 443{ 444 return false; 445} 446 447static inline void serial8250_tx_dma_pause(struct uart_8250_port *p) { } 448static inline void serial8250_tx_dma_resume(struct uart_8250_port *p) { } 449#endif 450 451static inline int ns16550a_goto_highspeed(struct uart_8250_port *up) 452{ 453 unsigned char status; 454 455 status = serial_in(up, 0x04); /* EXCR2 */ 456#define PRESL(x) ((x) & 0x30) 457 if (PRESL(status) == 0x10) { 458 /* already in high speed mode */ 459 return 0; 460 } else { 461 status &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */ 462 status |= 0x10; /* 1.625 divisor for baud_base --> 921600 */ 463 serial_out(up, 0x04, status); 464 } 465 return 1; 466} 467 468static inline int serial_index(struct uart_port *port) 469{ 470 return port->minor - 64; 471}
~/
Read-only file preview.