Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* |
| 2 | * drivers/serial/mpsc.h |
| 3 | * |
| 4 | * Author: Mark A. Greer <mgreer@mvista.com> |
| 5 | * |
| 6 | * 2004 (c) MontaVista, Software, Inc. This file is licensed under |
| 7 | * the terms of the GNU General Public License version 2. This program |
| 8 | * is licensed "as is" without any warranty of any kind, whether express |
| 9 | * or implied. |
| 10 | */ |
| 11 | |
| 12 | #ifndef __MPSC_H__ |
| 13 | #define __MPSC_H__ |
| 14 | |
| 15 | #include <linux/config.h> |
| 16 | #include <linux/module.h> |
| 17 | #include <linux/moduleparam.h> |
| 18 | #include <linux/tty.h> |
| 19 | #include <linux/tty_flip.h> |
| 20 | #include <linux/ioport.h> |
| 21 | #include <linux/init.h> |
| 22 | #include <linux/console.h> |
| 23 | #include <linux/sysrq.h> |
| 24 | #include <linux/serial.h> |
| 25 | #include <linux/serial_core.h> |
| 26 | #include <linux/delay.h> |
| 27 | #include <linux/device.h> |
| 28 | #include <linux/dma-mapping.h> |
| 29 | #include <linux/mv643xx.h> |
| 30 | |
| 31 | #include <asm/io.h> |
| 32 | #include <asm/irq.h> |
| 33 | |
| 34 | #if defined(CONFIG_SERIAL_MPSC_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) |
| 35 | #define SUPPORT_SYSRQ |
| 36 | #endif |
| 37 | |
| 38 | #define MPSC_NUM_CTLRS 2 |
| 39 | |
| 40 | /* |
| 41 | * Descriptors and buffers must be cache line aligned. |
| 42 | * Buffers lengths must be multiple of cache line size. |
| 43 | * Number of Tx & Rx descriptors must be powers of 2. |
| 44 | */ |
| 45 | #define MPSC_RXR_ENTRIES 32 |
| 46 | #define MPSC_RXRE_SIZE dma_get_cache_alignment() |
| 47 | #define MPSC_RXR_SIZE (MPSC_RXR_ENTRIES * MPSC_RXRE_SIZE) |
| 48 | #define MPSC_RXBE_SIZE dma_get_cache_alignment() |
| 49 | #define MPSC_RXB_SIZE (MPSC_RXR_ENTRIES * MPSC_RXBE_SIZE) |
| 50 | |
| 51 | #define MPSC_TXR_ENTRIES 32 |
| 52 | #define MPSC_TXRE_SIZE dma_get_cache_alignment() |
| 53 | #define MPSC_TXR_SIZE (MPSC_TXR_ENTRIES * MPSC_TXRE_SIZE) |
| 54 | #define MPSC_TXBE_SIZE dma_get_cache_alignment() |
| 55 | #define MPSC_TXB_SIZE (MPSC_TXR_ENTRIES * MPSC_TXBE_SIZE) |
| 56 | |
| 57 | #define MPSC_DMA_ALLOC_SIZE (MPSC_RXR_SIZE + MPSC_RXB_SIZE + \ |
| 58 | MPSC_TXR_SIZE + MPSC_TXB_SIZE + \ |
| 59 | dma_get_cache_alignment() /* for alignment */) |
| 60 | |
| 61 | /* Rx and Tx Ring entry descriptors -- assume entry size is <= cacheline size */ |
| 62 | struct mpsc_rx_desc { |
| 63 | u16 bufsize; |
| 64 | u16 bytecnt; |
| 65 | u32 cmdstat; |
| 66 | u32 link; |
| 67 | u32 buf_ptr; |
| 68 | } __attribute((packed)); |
| 69 | |
| 70 | struct mpsc_tx_desc { |
| 71 | u16 bytecnt; |
| 72 | u16 shadow; |
| 73 | u32 cmdstat; |
| 74 | u32 link; |
| 75 | u32 buf_ptr; |
| 76 | } __attribute((packed)); |
| 77 | |
| 78 | /* |
| 79 | * Some regs that have the erratum that you can't read them are are shared |
| 80 | * between the two MPSC controllers. This struct contains those shared regs. |
| 81 | */ |
| 82 | struct mpsc_shared_regs { |
| 83 | phys_addr_t mpsc_routing_base_p; |
| 84 | phys_addr_t sdma_intr_base_p; |
| 85 | |
Al Viro | 2c6e759 | 2005-04-25 18:32:12 -0700 | [diff] [blame] | 86 | void __iomem *mpsc_routing_base; |
| 87 | void __iomem *sdma_intr_base; |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 88 | |
| 89 | u32 MPSC_MRR_m; |
| 90 | u32 MPSC_RCRR_m; |
| 91 | u32 MPSC_TCRR_m; |
| 92 | u32 SDMA_INTR_CAUSE_m; |
| 93 | u32 SDMA_INTR_MASK_m; |
| 94 | }; |
| 95 | |
| 96 | /* The main driver data structure */ |
| 97 | struct mpsc_port_info { |
| 98 | struct uart_port port; /* Overlay uart_port structure */ |
| 99 | |
| 100 | /* Internal driver state for this ctlr */ |
| 101 | u8 ready; |
| 102 | u8 rcv_data; |
| 103 | tcflag_t c_iflag; /* save termios->c_iflag */ |
| 104 | tcflag_t c_cflag; /* save termios->c_cflag */ |
| 105 | |
| 106 | /* Info passed in from platform */ |
| 107 | u8 mirror_regs; /* Need to mirror regs? */ |
| 108 | u8 cache_mgmt; /* Need manual cache mgmt? */ |
| 109 | u8 brg_can_tune; /* BRG has baud tuning? */ |
| 110 | u32 brg_clk_src; |
| 111 | u16 mpsc_max_idle; |
| 112 | int default_baud; |
| 113 | int default_bits; |
| 114 | int default_parity; |
| 115 | int default_flow; |
| 116 | |
| 117 | /* Physical addresses of various blocks of registers (from platform) */ |
| 118 | phys_addr_t mpsc_base_p; |
| 119 | phys_addr_t sdma_base_p; |
| 120 | phys_addr_t brg_base_p; |
| 121 | |
| 122 | /* Virtual addresses of various blocks of registers (from platform) */ |
Al Viro | 2c6e759 | 2005-04-25 18:32:12 -0700 | [diff] [blame] | 123 | void __iomem *mpsc_base; |
| 124 | void __iomem *sdma_base; |
| 125 | void __iomem *brg_base; |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 126 | |
| 127 | /* Descriptor ring and buffer allocations */ |
| 128 | void *dma_region; |
| 129 | dma_addr_t dma_region_p; |
| 130 | |
| 131 | dma_addr_t rxr; /* Rx descriptor ring */ |
| 132 | dma_addr_t rxr_p; /* Phys addr of rxr */ |
| 133 | u8 *rxb; /* Rx Ring I/O buf */ |
| 134 | u8 *rxb_p; /* Phys addr of rxb */ |
| 135 | u32 rxr_posn; /* First desc w/ Rx data */ |
| 136 | |
| 137 | dma_addr_t txr; /* Tx descriptor ring */ |
| 138 | dma_addr_t txr_p; /* Phys addr of txr */ |
| 139 | u8 *txb; /* Tx Ring I/O buf */ |
| 140 | u8 *txb_p; /* Phys addr of txb */ |
| 141 | int txr_head; /* Where new data goes */ |
| 142 | int txr_tail; /* Where sent data comes off */ |
| 143 | |
| 144 | /* Mirrored values of regs we can't read (if 'mirror_regs' set) */ |
| 145 | u32 MPSC_MPCR_m; |
| 146 | u32 MPSC_CHR_1_m; |
| 147 | u32 MPSC_CHR_2_m; |
| 148 | u32 MPSC_CHR_10_m; |
| 149 | u32 BRG_BCR_m; |
| 150 | struct mpsc_shared_regs *shared_regs; |
| 151 | }; |
| 152 | |
| 153 | /* Hooks to platform-specific code */ |
| 154 | int mpsc_platform_register_driver(void); |
| 155 | void mpsc_platform_unregister_driver(void); |
| 156 | |
| 157 | /* Hooks back in to mpsc common to be called by platform-specific code */ |
| 158 | struct mpsc_port_info *mpsc_device_probe(int index); |
| 159 | struct mpsc_port_info *mpsc_device_remove(int index); |
| 160 | |
| 161 | /* |
| 162 | ***************************************************************************** |
| 163 | * |
| 164 | * Multi-Protocol Serial Controller Interface Registers |
| 165 | * |
| 166 | ***************************************************************************** |
| 167 | */ |
| 168 | |
| 169 | /* Main Configuratino Register Offsets */ |
| 170 | #define MPSC_MMCRL 0x0000 |
| 171 | #define MPSC_MMCRH 0x0004 |
| 172 | #define MPSC_MPCR 0x0008 |
| 173 | #define MPSC_CHR_1 0x000c |
| 174 | #define MPSC_CHR_2 0x0010 |
| 175 | #define MPSC_CHR_3 0x0014 |
| 176 | #define MPSC_CHR_4 0x0018 |
| 177 | #define MPSC_CHR_5 0x001c |
| 178 | #define MPSC_CHR_6 0x0020 |
| 179 | #define MPSC_CHR_7 0x0024 |
| 180 | #define MPSC_CHR_8 0x0028 |
| 181 | #define MPSC_CHR_9 0x002c |
| 182 | #define MPSC_CHR_10 0x0030 |
| 183 | #define MPSC_CHR_11 0x0034 |
| 184 | |
| 185 | #define MPSC_MPCR_FRZ (1 << 9) |
| 186 | #define MPSC_MPCR_CL_5 0 |
| 187 | #define MPSC_MPCR_CL_6 1 |
| 188 | #define MPSC_MPCR_CL_7 2 |
| 189 | #define MPSC_MPCR_CL_8 3 |
| 190 | #define MPSC_MPCR_SBL_1 0 |
| 191 | #define MPSC_MPCR_SBL_2 1 |
| 192 | |
| 193 | #define MPSC_CHR_2_TEV (1<<1) |
| 194 | #define MPSC_CHR_2_TA (1<<7) |
| 195 | #define MPSC_CHR_2_TTCS (1<<9) |
| 196 | #define MPSC_CHR_2_REV (1<<17) |
| 197 | #define MPSC_CHR_2_RA (1<<23) |
| 198 | #define MPSC_CHR_2_CRD (1<<25) |
| 199 | #define MPSC_CHR_2_EH (1<<31) |
| 200 | #define MPSC_CHR_2_PAR_ODD 0 |
| 201 | #define MPSC_CHR_2_PAR_SPACE 1 |
| 202 | #define MPSC_CHR_2_PAR_EVEN 2 |
| 203 | #define MPSC_CHR_2_PAR_MARK 3 |
| 204 | |
| 205 | /* MPSC Signal Routing */ |
| 206 | #define MPSC_MRR 0x0000 |
| 207 | #define MPSC_RCRR 0x0004 |
| 208 | #define MPSC_TCRR 0x0008 |
| 209 | |
| 210 | /* |
| 211 | ***************************************************************************** |
| 212 | * |
| 213 | * Serial DMA Controller Interface Registers |
| 214 | * |
| 215 | ***************************************************************************** |
| 216 | */ |
| 217 | |
| 218 | #define SDMA_SDC 0x0000 |
| 219 | #define SDMA_SDCM 0x0008 |
| 220 | #define SDMA_RX_DESC 0x0800 |
| 221 | #define SDMA_RX_BUF_PTR 0x0808 |
| 222 | #define SDMA_SCRDP 0x0810 |
| 223 | #define SDMA_TX_DESC 0x0c00 |
| 224 | #define SDMA_SCTDP 0x0c10 |
| 225 | #define SDMA_SFTDP 0x0c14 |
| 226 | |
| 227 | #define SDMA_DESC_CMDSTAT_PE (1<<0) |
| 228 | #define SDMA_DESC_CMDSTAT_CDL (1<<1) |
| 229 | #define SDMA_DESC_CMDSTAT_FR (1<<3) |
| 230 | #define SDMA_DESC_CMDSTAT_OR (1<<6) |
| 231 | #define SDMA_DESC_CMDSTAT_BR (1<<9) |
| 232 | #define SDMA_DESC_CMDSTAT_MI (1<<10) |
| 233 | #define SDMA_DESC_CMDSTAT_A (1<<11) |
| 234 | #define SDMA_DESC_CMDSTAT_AM (1<<12) |
| 235 | #define SDMA_DESC_CMDSTAT_CT (1<<13) |
| 236 | #define SDMA_DESC_CMDSTAT_C (1<<14) |
| 237 | #define SDMA_DESC_CMDSTAT_ES (1<<15) |
| 238 | #define SDMA_DESC_CMDSTAT_L (1<<16) |
| 239 | #define SDMA_DESC_CMDSTAT_F (1<<17) |
| 240 | #define SDMA_DESC_CMDSTAT_P (1<<18) |
| 241 | #define SDMA_DESC_CMDSTAT_EI (1<<23) |
| 242 | #define SDMA_DESC_CMDSTAT_O (1<<31) |
| 243 | |
| 244 | #define SDMA_DESC_DFLT (SDMA_DESC_CMDSTAT_O | \ |
| 245 | SDMA_DESC_CMDSTAT_EI) |
| 246 | |
| 247 | #define SDMA_SDC_RFT (1<<0) |
| 248 | #define SDMA_SDC_SFM (1<<1) |
| 249 | #define SDMA_SDC_BLMR (1<<6) |
| 250 | #define SDMA_SDC_BLMT (1<<7) |
| 251 | #define SDMA_SDC_POVR (1<<8) |
| 252 | #define SDMA_SDC_RIFB (1<<9) |
| 253 | |
| 254 | #define SDMA_SDCM_ERD (1<<7) |
| 255 | #define SDMA_SDCM_AR (1<<15) |
| 256 | #define SDMA_SDCM_STD (1<<16) |
| 257 | #define SDMA_SDCM_TXD (1<<23) |
| 258 | #define SDMA_SDCM_AT (1<<31) |
| 259 | |
| 260 | #define SDMA_0_CAUSE_RXBUF (1<<0) |
| 261 | #define SDMA_0_CAUSE_RXERR (1<<1) |
| 262 | #define SDMA_0_CAUSE_TXBUF (1<<2) |
| 263 | #define SDMA_0_CAUSE_TXEND (1<<3) |
| 264 | #define SDMA_1_CAUSE_RXBUF (1<<8) |
| 265 | #define SDMA_1_CAUSE_RXERR (1<<9) |
| 266 | #define SDMA_1_CAUSE_TXBUF (1<<10) |
| 267 | #define SDMA_1_CAUSE_TXEND (1<<11) |
| 268 | |
| 269 | #define SDMA_CAUSE_RX_MASK (SDMA_0_CAUSE_RXBUF | SDMA_0_CAUSE_RXERR | \ |
| 270 | SDMA_1_CAUSE_RXBUF | SDMA_1_CAUSE_RXERR) |
| 271 | #define SDMA_CAUSE_TX_MASK (SDMA_0_CAUSE_TXBUF | SDMA_0_CAUSE_TXEND | \ |
| 272 | SDMA_1_CAUSE_TXBUF | SDMA_1_CAUSE_TXEND) |
| 273 | |
| 274 | /* SDMA Interrupt registers */ |
| 275 | #define SDMA_INTR_CAUSE 0x0000 |
| 276 | #define SDMA_INTR_MASK 0x0080 |
| 277 | |
| 278 | /* |
| 279 | ***************************************************************************** |
| 280 | * |
| 281 | * Baud Rate Generator Interface Registers |
| 282 | * |
| 283 | ***************************************************************************** |
| 284 | */ |
| 285 | |
| 286 | #define BRG_BCR 0x0000 |
| 287 | #define BRG_BTR 0x0004 |
| 288 | |
| 289 | #endif /* __MPSC_H__ */ |