1 /* 2 * Driver for 8250/16550-type serial ports 3 * 4 * Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o. 5 * 6 * Copyright (C) 2001 Russell King. 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * (at your option) any later version. 12 */ 13 14 #include <linux/serial_8250.h> 15 16 struct old_serial_port { 17 unsigned int uart; 18 unsigned int baud_base; 19 unsigned int port; 20 unsigned int irq; 21 unsigned int flags; 22 unsigned char hub6; 23 unsigned char io_type; 24 unsigned char *iomem_base; 25 unsigned short iomem_reg_shift; 26 unsigned long irqflags; 27 }; 28 29 struct serial8250_config { 30 const char *name; 31 unsigned short fifo_size; 32 unsigned short tx_loadsz; 33 unsigned char fcr; 34 unsigned int flags; 35 }; 36 37 #define UART_CAP_FIFO (1 << 8) /* UART has FIFO */ 38 #define UART_CAP_EFR (1 << 9) /* UART has EFR */ 39 #define UART_CAP_SLEEP (1 << 10) /* UART has IER sleep */ 40 #define UART_CAP_AFE (1 << 11) /* MCR-based hw flow control */ 41 #define UART_CAP_UUE (1 << 12) /* UART needs IER bit 6 set (Xscale) */ 42 #define UART_CAP_RTOIE (1 << 13) /* UART needs IER bit 4 set (Xscale, Tegra) */ 43 #define UART_CAP_HFIFO (1 << 14) /* UART has a "hidden" FIFO */ 44 45 #define UART_BUG_QUOT (1 << 0) /* UART has buggy quot LSB */ 46 #define UART_BUG_TXEN (1 << 1) /* UART has buggy TX IIR status */ 47 #define UART_BUG_NOMSR (1 << 2) /* UART has buggy MSR status bits (Au1x00) */ 48 #define UART_BUG_THRE (1 << 3) /* UART has buggy THRE reassertion */ 49 #define UART_BUG_PARITY (1 << 4) /* UART mishandles parity if FIFO enabled */ 50 51 #define PROBE_RSA (1 << 0) 52 #define PROBE_ANY (~0) 53 54 #define HIGH_BITS_OFFSET ((sizeof(long)-sizeof(int))*8) 55 56 #ifdef CONFIG_SERIAL_8250_SHARE_IRQ 57 #define SERIAL8250_SHARE_IRQS 1 58 #else 59 #define SERIAL8250_SHARE_IRQS 0 60 #endif 61 62 static inline int serial_in(struct uart_8250_port *up, int offset) 63 { 64 return up->port.serial_in(&up->port, offset); 65 } 66 67 static inline void serial_out(struct uart_8250_port *up, int offset, int value) 68 { 69 up->port.serial_out(&up->port, offset, value); 70 } 71 72 void serial8250_clear_and_reinit_fifos(struct uart_8250_port *p); 73 74 static inline int serial_dl_read(struct uart_8250_port *up) 75 { 76 return up->dl_read(up); 77 } 78 79 static inline void serial_dl_write(struct uart_8250_port *up, int value) 80 { 81 up->dl_write(up, value); 82 } 83 84 #if defined(__alpha__) && !defined(CONFIG_PCI) 85 /* 86 * Digital did something really horribly wrong with the OUT1 and OUT2 87 * lines on at least some ALPHA's. The failure mode is that if either 88 * is cleared, the machine locks up with endless interrupts. 89 */ 90 #define ALPHA_KLUDGE_MCR (UART_MCR_OUT2 | UART_MCR_OUT1) 91 #elif defined(CONFIG_SBC8560) 92 /* 93 * WindRiver did something similarly broken on their SBC8560 board. The 94 * UART tristates its IRQ output while OUT2 is clear, but they pulled 95 * the interrupt line _up_ instead of down, so if we register the IRQ 96 * while the UART is in that state, we die in an IRQ storm. */ 97 #define ALPHA_KLUDGE_MCR (UART_MCR_OUT2) 98 #else 99 #define ALPHA_KLUDGE_MCR 0 100 #endif 101 102 #ifdef CONFIG_SERIAL_8250_PNP 103 int serial8250_pnp_init(void); 104 void serial8250_pnp_exit(void); 105 #else 106 static inline int serial8250_pnp_init(void) { return 0; } 107 static inline void serial8250_pnp_exit(void) { } 108 #endif 109 110 #ifdef CONFIG_ARCH_OMAP1 111 static inline int is_omap1_8250(struct uart_8250_port *pt) 112 { 113 int res; 114 115 switch (pt->port.mapbase) { 116 case OMAP1_UART1_BASE: 117 case OMAP1_UART2_BASE: 118 case OMAP1_UART3_BASE: 119 res = 1; 120 break; 121 default: 122 res = 0; 123 break; 124 } 125 126 return res; 127 } 128 129 static inline int is_omap1510_8250(struct uart_8250_port *pt) 130 { 131 if (!cpu_is_omap1510()) 132 return 0; 133 134 return is_omap1_8250(pt); 135 } 136 #else 137 static inline int is_omap1_8250(struct uart_8250_port *pt) 138 { 139 return 0; 140 } 141 static inline int is_omap1510_8250(struct uart_8250_port *pt) 142 { 143 return 0; 144 } 145 #endif 146