1 /*
2 	Mantis PCI bridge driver
3 
4 	Copyright (C) Manu Abraham (abraham.manu@gmail.com)
5 
6 	This program is free software; you can redistribute it and/or modify
7 	it under the terms of the GNU General Public License as published by
8 	the Free Software Foundation; either version 2 of the License, or
9 	(at your option) any later version.
10 
11 	This program is distributed in the hope that it will be useful,
12 	but WITHOUT ANY WARRANTY; without even the implied warranty of
13 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 	GNU General Public License for more details.
15 
16 	You should have received a copy of the GNU General Public License
17 	along with this program; if not, write to the Free Software
18 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 */
20 
21 #ifndef __MANTIS_COMMON_H
22 #define __MANTIS_COMMON_H
23 
24 #include <linux/mutex.h>
25 #include <linux/workqueue.h>
26 
27 #include "mantis_uart.h"
28 
29 #include "mantis_link.h"
30 
31 #define MANTIS_ERROR		0
32 #define MANTIS_NOTICE		1
33 #define MANTIS_INFO		2
34 #define MANTIS_DEBUG		3
35 #define MANTIS_TMG		9
36 
37 #define dprintk(y, z, format, arg...) do {								\
38 	if (z) {											\
39 		if	((mantis->verbose > MANTIS_ERROR) && (mantis->verbose > y))			\
40 			printk(KERN_ERR "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);	\
41 		else if	((mantis->verbose > MANTIS_NOTICE) && (mantis->verbose > y))			\
42 			printk(KERN_NOTICE "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);	\
43 		else if ((mantis->verbose > MANTIS_INFO) && (mantis->verbose > y))			\
44 			printk(KERN_INFO "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);	\
45 		else if ((mantis->verbose > MANTIS_DEBUG) && (mantis->verbose > y))			\
46 			printk(KERN_DEBUG "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);	\
47 		else if ((mantis->verbose > MANTIS_TMG) && (mantis->verbose > y))			\
48 			printk(KERN_DEBUG "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);	\
49 	} else {											\
50 		if (mantis->verbose > y)								\
51 			printk(format , ##arg);								\
52 	}												\
53 } while(0)
54 
55 #define mwrite(dat, addr)	writel((dat), addr)
56 #define mread(addr)		readl(addr)
57 
58 #define mmwrite(dat, addr)	mwrite((dat), (mantis->mmio + (addr)))
59 #define mmread(addr)		mread(mantis->mmio + (addr))
60 
61 #define MANTIS_TS_188		0
62 #define MANTIS_TS_204		1
63 
64 #define TWINHAN_TECHNOLOGIES	0x1822
65 #define MANTIS			0x4e35
66 
67 #define TECHNISAT		0x1ae4
68 #define TERRATEC		0x153b
69 
70 #define MAKE_ENTRY(__subven, __subdev, __configptr) {			\
71 		.vendor		= TWINHAN_TECHNOLOGIES,			\
72 		.device		= MANTIS,				\
73 		.subvendor	= (__subven),				\
74 		.subdevice	= (__subdev),				\
75 		.driver_data	= (unsigned long) (__configptr)		\
76 }
77 
78 enum mantis_i2c_mode {
79 	MANTIS_PAGE_MODE = 0,
80 	MANTIS_BYTE_MODE,
81 };
82 
83 struct mantis_pci;
84 
85 struct mantis_hwconfig {
86 	char			*model_name;
87 	char			*dev_type;
88 	u32			ts_size;
89 
90 	enum mantis_baud	baud_rate;
91 	enum mantis_parity	parity;
92 	u32			bytes;
93 
94 	irqreturn_t (*irq_handler)(int irq, void *dev_id);
95 	int (*frontend_init)(struct mantis_pci *mantis, struct dvb_frontend *fe);
96 
97 	u8			power;
98 	u8			reset;
99 
100 	enum mantis_i2c_mode	i2c_mode;
101 };
102 
103 struct mantis_pci {
104 	unsigned int		verbose;
105 
106 	/*	PCI stuff		*/
107 	u16			vendor_id;
108 	u16			device_id;
109 	u16			subsystem_vendor;
110 	u16			subsystem_device;
111 
112 	u8			latency;
113 
114 	struct pci_dev		*pdev;
115 
116 	unsigned long		mantis_addr;
117 	void __iomem		*mmio;
118 
119 	u8			irq;
120 	u8			revision;
121 
122 	unsigned int		num;
123 
124 	/*	RISC Core		*/
125 	u32			finished_block;
126 	u32			last_block;
127 	u32			line_bytes;
128 	u32			line_count;
129 	u32			risc_pos;
130 	u8			*buf_cpu;
131 	dma_addr_t		buf_dma;
132 	u32			*risc_cpu;
133 	dma_addr_t		risc_dma;
134 
135 	struct tasklet_struct	tasklet;
136 
137 	struct i2c_adapter	adapter;
138 	int			i2c_rc;
139 	wait_queue_head_t	i2c_wq;
140 	struct mutex		i2c_lock;
141 
142 	/*	DVB stuff		*/
143 	struct dvb_adapter	dvb_adapter;
144 	struct dvb_frontend	*fe;
145 	struct dvb_demux	demux;
146 	struct dmxdev		dmxdev;
147 	struct dmx_frontend	fe_hw;
148 	struct dmx_frontend	fe_mem;
149 	struct dvb_net		dvbnet;
150 
151 	u8			feeds;
152 
153 	struct mantis_hwconfig	*hwconfig;
154 
155 	u32			mantis_int_stat;
156 	u32			mantis_int_mask;
157 
158 	/*	board specific		*/
159 	u8			mac_address[8];
160 	u32			sub_vendor_id;
161 	u32			sub_device_id;
162 
163 	 /*	A12 A13 A14		*/
164 	u32			gpio_status;
165 
166 	u32			gpif_status;
167 
168 	struct mantis_ca	*mantis_ca;
169 
170 	wait_queue_head_t	uart_wq;
171 	struct work_struct	uart_work;
172 	spinlock_t		uart_lock;
173 
174 	struct rc_dev		*rc;
175 	char			input_name[80];
176 	char			input_phys[80];
177 };
178 
179 #define MANTIS_HIF_STATUS	(mantis->gpio_status)
180 
181 #endif /* __MANTIS_COMMON_H */
182