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_reg.h> 13 #include <linux/dmaengine.h> 14 15 #include "../serial_mctrl_gpio.h" 16 17 struct 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 56 struct 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 67 struct 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_PARITY BIT(4) /* UART mishandles parity if FIFO enabled */ 95 #define UART_BUG_TXRACE BIT(5) /* UART Tx fails to set remote DR */ 96 97 98 #ifdef CONFIG_SERIAL_8250_SHARE_IRQ 99 #define SERIAL8250_SHARE_IRQS 1 100 #else 101 #define SERIAL8250_SHARE_IRQS 0 102 #endif 103 104 #define SERIAL8250_PORT_FLAGS(_base, _irq, _flags) \ 105 { \ 106 .iobase = _base, \ 107 .irq = _irq, \ 108 .uartclk = 1843200, \ 109 .iotype = UPIO_PORT, \ 110 .flags = UPF_BOOT_AUTOCONF | (_flags), \ 111 } 112 113 #define SERIAL8250_PORT(_base, _irq) SERIAL8250_PORT_FLAGS(_base, _irq, 0) 114 115 116 static inline int serial_in(struct uart_8250_port *up, int offset) 117 { 118 return up->port.serial_in(&up->port, offset); 119 } 120 121 static inline void serial_out(struct uart_8250_port *up, int offset, int value) 122 { 123 up->port.serial_out(&up->port, offset, value); 124 } 125 126 /** 127 * serial_lsr_in - Read LSR register and preserve flags across reads 128 * @up: uart 8250 port 129 * 130 * Read LSR register and handle saving non-preserved flags across reads. 131 * The flags that are not preserved across reads are stored into 132 * up->lsr_saved_flags. 133 * 134 * Returns LSR value or'ed with the preserved flags (if any). 135 */ 136 static inline u16 serial_lsr_in(struct uart_8250_port *up) 137 { 138 u16 lsr = up->lsr_saved_flags; 139 140 lsr |= serial_in(up, UART_LSR); 141 up->lsr_saved_flags = lsr & up->lsr_save_mask; 142 143 return lsr; 144 } 145 146 /* 147 * For the 16C950 148 */ 149 static void serial_icr_write(struct uart_8250_port *up, int offset, int value) 150 { 151 serial_out(up, UART_SCR, offset); 152 serial_out(up, UART_ICR, value); 153 } 154 155 static unsigned int __maybe_unused serial_icr_read(struct uart_8250_port *up, 156 int offset) 157 { 158 unsigned int value; 159 160 serial_icr_write(up, UART_ACR, up->acr | UART_ACR_ICRRD); 161 serial_out(up, UART_SCR, offset); 162 value = serial_in(up, UART_ICR); 163 serial_icr_write(up, UART_ACR, up->acr); 164 165 return value; 166 } 167 168 void serial8250_clear_and_reinit_fifos(struct uart_8250_port *p); 169 170 static inline int serial_dl_read(struct uart_8250_port *up) 171 { 172 return up->dl_read(up); 173 } 174 175 static inline void serial_dl_write(struct uart_8250_port *up, int value) 176 { 177 up->dl_write(up, value); 178 } 179 180 static inline bool serial8250_set_THRI(struct uart_8250_port *up) 181 { 182 if (up->ier & UART_IER_THRI) 183 return false; 184 up->ier |= UART_IER_THRI; 185 serial_out(up, UART_IER, up->ier); 186 return true; 187 } 188 189 static inline bool serial8250_clear_THRI(struct uart_8250_port *up) 190 { 191 if (!(up->ier & UART_IER_THRI)) 192 return false; 193 up->ier &= ~UART_IER_THRI; 194 serial_out(up, UART_IER, up->ier); 195 return true; 196 } 197 198 struct uart_8250_port *serial8250_get_port(int line); 199 200 void serial8250_rpm_get(struct uart_8250_port *p); 201 void serial8250_rpm_put(struct uart_8250_port *p); 202 203 void serial8250_rpm_get_tx(struct uart_8250_port *p); 204 void serial8250_rpm_put_tx(struct uart_8250_port *p); 205 206 int serial8250_em485_config(struct uart_port *port, struct ktermios *termios, 207 struct serial_rs485 *rs485); 208 void serial8250_em485_start_tx(struct uart_8250_port *p); 209 void serial8250_em485_stop_tx(struct uart_8250_port *p); 210 void serial8250_em485_destroy(struct uart_8250_port *p); 211 extern struct serial_rs485 serial8250_em485_supported; 212 213 /* MCR <-> TIOCM conversion */ 214 static inline int serial8250_TIOCM_to_MCR(int tiocm) 215 { 216 int mcr = 0; 217 218 if (tiocm & TIOCM_RTS) 219 mcr |= UART_MCR_RTS; 220 if (tiocm & TIOCM_DTR) 221 mcr |= UART_MCR_DTR; 222 if (tiocm & TIOCM_OUT1) 223 mcr |= UART_MCR_OUT1; 224 if (tiocm & TIOCM_OUT2) 225 mcr |= UART_MCR_OUT2; 226 if (tiocm & TIOCM_LOOP) 227 mcr |= UART_MCR_LOOP; 228 229 return mcr; 230 } 231 232 static inline int serial8250_MCR_to_TIOCM(int mcr) 233 { 234 int tiocm = 0; 235 236 if (mcr & UART_MCR_RTS) 237 tiocm |= TIOCM_RTS; 238 if (mcr & UART_MCR_DTR) 239 tiocm |= TIOCM_DTR; 240 if (mcr & UART_MCR_OUT1) 241 tiocm |= TIOCM_OUT1; 242 if (mcr & UART_MCR_OUT2) 243 tiocm |= TIOCM_OUT2; 244 if (mcr & UART_MCR_LOOP) 245 tiocm |= TIOCM_LOOP; 246 247 return tiocm; 248 } 249 250 /* MSR <-> TIOCM conversion */ 251 static inline int serial8250_MSR_to_TIOCM(int msr) 252 { 253 int tiocm = 0; 254 255 if (msr & UART_MSR_DCD) 256 tiocm |= TIOCM_CAR; 257 if (msr & UART_MSR_RI) 258 tiocm |= TIOCM_RNG; 259 if (msr & UART_MSR_DSR) 260 tiocm |= TIOCM_DSR; 261 if (msr & UART_MSR_CTS) 262 tiocm |= TIOCM_CTS; 263 264 return tiocm; 265 } 266 267 static inline void serial8250_out_MCR(struct uart_8250_port *up, int value) 268 { 269 serial_out(up, UART_MCR, value); 270 271 if (up->gpios) 272 mctrl_gpio_set(up->gpios, serial8250_MCR_to_TIOCM(value)); 273 } 274 275 static inline int serial8250_in_MCR(struct uart_8250_port *up) 276 { 277 int mctrl; 278 279 mctrl = serial_in(up, UART_MCR); 280 281 if (up->gpios) { 282 unsigned int mctrl_gpio = 0; 283 284 mctrl_gpio = mctrl_gpio_get_outputs(up->gpios, &mctrl_gpio); 285 mctrl |= serial8250_TIOCM_to_MCR(mctrl_gpio); 286 } 287 288 return mctrl; 289 } 290 291 bool alpha_jensen(void); 292 void alpha_jensen_set_mctrl(struct uart_port *port, unsigned int mctrl); 293 294 #ifdef CONFIG_SERIAL_8250_PNP 295 int serial8250_pnp_init(void); 296 void serial8250_pnp_exit(void); 297 #else 298 static inline int serial8250_pnp_init(void) { return 0; } 299 static inline void serial8250_pnp_exit(void) { } 300 #endif 301 302 #ifdef CONFIG_SERIAL_8250_FINTEK 303 int fintek_8250_probe(struct uart_8250_port *uart); 304 #else 305 static inline int fintek_8250_probe(struct uart_8250_port *uart) { return 0; } 306 #endif 307 308 #ifdef CONFIG_ARCH_OMAP1 309 #include <linux/soc/ti/omap1-soc.h> 310 static inline int is_omap1_8250(struct uart_8250_port *pt) 311 { 312 int res; 313 314 switch (pt->port.mapbase) { 315 case OMAP1_UART1_BASE: 316 case OMAP1_UART2_BASE: 317 case OMAP1_UART3_BASE: 318 res = 1; 319 break; 320 default: 321 res = 0; 322 break; 323 } 324 325 return res; 326 } 327 328 static inline int is_omap1510_8250(struct uart_8250_port *pt) 329 { 330 if (!cpu_is_omap1510()) 331 return 0; 332 333 return is_omap1_8250(pt); 334 } 335 #else 336 static inline int is_omap1_8250(struct uart_8250_port *pt) 337 { 338 return 0; 339 } 340 static inline int is_omap1510_8250(struct uart_8250_port *pt) 341 { 342 return 0; 343 } 344 #endif 345 346 #ifdef CONFIG_SERIAL_8250_DMA 347 extern int serial8250_tx_dma(struct uart_8250_port *); 348 extern int serial8250_rx_dma(struct uart_8250_port *); 349 extern void serial8250_rx_dma_flush(struct uart_8250_port *); 350 extern int serial8250_request_dma(struct uart_8250_port *); 351 extern void serial8250_release_dma(struct uart_8250_port *); 352 353 static inline void serial8250_do_prepare_tx_dma(struct uart_8250_port *p) 354 { 355 struct uart_8250_dma *dma = p->dma; 356 357 if (dma->prepare_tx_dma) 358 dma->prepare_tx_dma(p); 359 } 360 361 static inline void serial8250_do_prepare_rx_dma(struct uart_8250_port *p) 362 { 363 struct uart_8250_dma *dma = p->dma; 364 365 if (dma->prepare_rx_dma) 366 dma->prepare_rx_dma(p); 367 } 368 #else 369 static inline int serial8250_tx_dma(struct uart_8250_port *p) 370 { 371 return -1; 372 } 373 static inline int serial8250_rx_dma(struct uart_8250_port *p) 374 { 375 return -1; 376 } 377 static inline void serial8250_rx_dma_flush(struct uart_8250_port *p) { } 378 static inline int serial8250_request_dma(struct uart_8250_port *p) 379 { 380 return -1; 381 } 382 static inline void serial8250_release_dma(struct uart_8250_port *p) { } 383 #endif 384 385 static inline int ns16550a_goto_highspeed(struct uart_8250_port *up) 386 { 387 unsigned char status; 388 389 status = serial_in(up, 0x04); /* EXCR2 */ 390 #define PRESL(x) ((x) & 0x30) 391 if (PRESL(status) == 0x10) { 392 /* already in high speed mode */ 393 return 0; 394 } else { 395 status &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */ 396 status |= 0x10; /* 1.625 divisor for baud_base --> 921600 */ 397 serial_out(up, 0x04, status); 398 } 399 return 1; 400 } 401 402 static inline int serial_index(struct uart_port *port) 403 { 404 return port->minor - 64; 405 } 406