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