cpm_uart.h revision 09b03b6c29638eb5c79b02e585cb1b20d91a8ea0
1/* 2 * linux/drivers/serial/cpm_uart.h 3 * 4 * Driver for CPM (SCC/SMC) serial ports 5 * 6 * Copyright (C) 2004 Freescale Semiconductor, Inc. 7 * 8 */ 9#ifndef CPM_UART_H 10#define CPM_UART_H 11 12#include <linux/config.h> 13#include <linux/platform_device.h> 14#include <linux/fs_uart_pd.h> 15 16#if defined(CONFIG_CPM2) 17#include "cpm_uart_cpm2.h" 18#elif defined(CONFIG_8xx) 19#include "cpm_uart_cpm1.h" 20#endif 21 22#define SERIAL_CPM_MAJOR 204 23#define SERIAL_CPM_MINOR 46 24 25#define IS_SMC(pinfo) (pinfo->flags & FLAG_SMC) 26#define IS_DISCARDING(pinfo) (pinfo->flags & FLAG_DISCARDING) 27#define FLAG_DISCARDING 0x00000004 /* when set, don't discard */ 28#define FLAG_SMC 0x00000002 29#define FLAG_CONSOLE 0x00000001 30 31#define UART_SMC1 fsid_smc1_uart 32#define UART_SMC2 fsid_smc2_uart 33#define UART_SCC1 fsid_scc1_uart 34#define UART_SCC2 fsid_scc2_uart 35#define UART_SCC3 fsid_scc3_uart 36#define UART_SCC4 fsid_scc4_uart 37 38#define UART_NR fs_uart_nr 39 40#define RX_NUM_FIFO 4 41#define RX_BUF_SIZE 32 42#define TX_NUM_FIFO 4 43#define TX_BUF_SIZE 32 44 45#define SCC_WAIT_CLOSING 100 46 47struct uart_cpm_port { 48 struct uart_port port; 49 u16 rx_nrfifos; 50 u16 rx_fifosize; 51 u16 tx_nrfifos; 52 u16 tx_fifosize; 53 smc_t *smcp; 54 smc_uart_t *smcup; 55 scc_t *sccp; 56 scc_uart_t *sccup; 57 volatile cbd_t *rx_bd_base; 58 volatile cbd_t *rx_cur; 59 volatile cbd_t *tx_bd_base; 60 volatile cbd_t *tx_cur; 61 unsigned char *tx_buf; 62 unsigned char *rx_buf; 63 u32 flags; 64 void (*set_lineif)(struct uart_cpm_port *); 65 u8 brg; 66 uint dp_addr; 67 void *mem_addr; 68 dma_addr_t dma_addr; 69 u32 mem_size; 70 /* helpers */ 71 int baud; 72 int bits; 73 /* Keep track of 'odd' SMC2 wirings */ 74 int is_portb; 75 /* wait on close if needed */ 76 int wait_closing; 77}; 78 79extern int cpm_uart_port_map[UART_NR]; 80extern int cpm_uart_nr; 81extern struct uart_cpm_port cpm_uart_ports[UART_NR]; 82 83/* these are located in their respective files */ 84void cpm_line_cr_cmd(int line, int cmd); 85int cpm_uart_init_portdesc(void); 86int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con); 87void cpm_uart_freebuf(struct uart_cpm_port *pinfo); 88 89void smc1_lineif(struct uart_cpm_port *pinfo); 90void smc2_lineif(struct uart_cpm_port *pinfo); 91void scc1_lineif(struct uart_cpm_port *pinfo); 92void scc2_lineif(struct uart_cpm_port *pinfo); 93void scc3_lineif(struct uart_cpm_port *pinfo); 94void scc4_lineif(struct uart_cpm_port *pinfo); 95 96/* 97 virtual to phys transtalion 98*/ 99static inline unsigned long cpu2cpm_addr(void* addr, struct uart_cpm_port *pinfo) 100{ 101 int offset; 102 u32 val = (u32)addr; 103 /* sane check */ 104 if ((val >= (u32)pinfo->mem_addr) && 105 (val<((u32)pinfo->mem_addr + pinfo->mem_size))) { 106 offset = val - (u32)pinfo->mem_addr; 107 return pinfo->dma_addr+offset; 108 } 109 printk("%s(): address %x to translate out of range!\n", __FUNCTION__, val); 110 return 0; 111} 112 113static inline void *cpm2cpu_addr(unsigned long addr, struct uart_cpm_port *pinfo) 114{ 115 int offset; 116 u32 val = addr; 117 /* sane check */ 118 if ((val >= pinfo->dma_addr) && 119 (val<(pinfo->dma_addr + pinfo->mem_size))) { 120 offset = val - (u32)pinfo->dma_addr; 121 return (void*)(pinfo->mem_addr+offset); 122 } 123 printk("%s(): address %x to translate out of range!\n", __FUNCTION__, val); 124 return 0; 125} 126 127 128#endif /* CPM_UART_H */ 129