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/interrupt.h>
25 #include <linux/mutex.h>
26 #include <linux/workqueue.h>
27
28 #include "mantis_reg.h"
29 #include "mantis_uart.h"
30
31 #include "mantis_link.h"
32
33 #define MANTIS_ERROR 0
34 #define MANTIS_NOTICE 1
35 #define MANTIS_INFO 2
36 #define MANTIS_DEBUG 3
37 #define MANTIS_TMG 9
38
39 #define dprintk(y, z, format, arg...) do { \
40 if (z) { \
41 if ((mantis->verbose > MANTIS_ERROR) && (mantis->verbose > y)) \
42 printk(KERN_ERR "%s (%d): " format "\n" , __func__ , mantis->num , ##arg); \
43 else if ((mantis->verbose > MANTIS_NOTICE) && (mantis->verbose > y)) \
44 printk(KERN_NOTICE "%s (%d): " format "\n" , __func__ , mantis->num , ##arg); \
45 else if ((mantis->verbose > MANTIS_INFO) && (mantis->verbose > y)) \
46 printk(KERN_INFO "%s (%d): " format "\n" , __func__ , mantis->num , ##arg); \
47 else if ((mantis->verbose > MANTIS_DEBUG) && (mantis->verbose > y)) \
48 printk(KERN_DEBUG "%s (%d): " format "\n" , __func__ , mantis->num , ##arg); \
49 else if ((mantis->verbose > MANTIS_TMG) && (mantis->verbose > y)) \
50 printk(KERN_DEBUG "%s (%d): " format "\n" , __func__ , mantis->num , ##arg); \
51 } else { \
52 if (mantis->verbose > y) \
53 printk(format , ##arg); \
54 } \
55 } while(0)
56
57 #define mwrite(dat, addr) writel((dat), addr)
58 #define mread(addr) readl(addr)
59
60 #define mmwrite(dat, addr) mwrite((dat), (mantis->mmio + (addr)))
61 #define mmread(addr) mread(mantis->mmio + (addr))
62
63 #define MANTIS_TS_188 0
64 #define MANTIS_TS_204 1
65
66 #define TWINHAN_TECHNOLOGIES 0x1822
67 #define MANTIS 0x4e35
68
69 #define TECHNISAT 0x1ae4
70 #define TERRATEC 0x153b
71
72 #define MAKE_ENTRY(__subven, __subdev, __configptr, __rc) { \
73 .vendor = TWINHAN_TECHNOLOGIES, \
74 .device = MANTIS, \
75 .subvendor = (__subven), \
76 .subdevice = (__subdev), \
77 .driver_data = (unsigned long) \
78 &(struct mantis_pci_drvdata){__configptr, __rc} \
79 }
80
81 enum mantis_i2c_mode {
82 MANTIS_PAGE_MODE = 0,
83 MANTIS_BYTE_MODE,
84 };
85
86 struct mantis_pci;
87
88 struct mantis_hwconfig {
89 char *model_name;
90 char *dev_type;
91 u32 ts_size;
92
93 enum mantis_baud baud_rate;
94 enum mantis_parity parity;
95 u32 bytes;
96
97 irqreturn_t (*irq_handler)(int irq, void *dev_id);
98 int (*frontend_init)(struct mantis_pci *mantis, struct dvb_frontend *fe);
99
100 u8 power;
101 u8 reset;
102
103 enum mantis_i2c_mode i2c_mode;
104 };
105
106 struct mantis_pci_drvdata {
107 struct mantis_hwconfig *hwconfig;
108 char *rc_map_name;
109 };
110
111 struct mantis_pci {
112 unsigned int verbose;
113
114 /* PCI stuff */
115 u16 vendor_id;
116 u16 device_id;
117 u16 subsystem_vendor;
118 u16 subsystem_device;
119
120 u8 latency;
121
122 struct pci_dev *pdev;
123
124 unsigned long mantis_addr;
125 void __iomem *mmio;
126
127 u8 irq;
128 u8 revision;
129
130 unsigned int num;
131
132 /* RISC Core */
133 u32 busy_block;
134 u32 last_block;
135 u8 *buf_cpu;
136 dma_addr_t buf_dma;
137 __le32 *risc_cpu;
138 dma_addr_t risc_dma;
139
140 struct tasklet_struct tasklet;
141 spinlock_t intmask_lock;
142
143 struct i2c_adapter adapter;
144 int i2c_rc;
145 wait_queue_head_t i2c_wq;
146 struct mutex i2c_lock;
147
148 /* DVB stuff */
149 struct dvb_adapter dvb_adapter;
150 struct dvb_frontend *fe;
151 struct dvb_demux demux;
152 struct dmxdev dmxdev;
153 struct dmx_frontend fe_hw;
154 struct dmx_frontend fe_mem;
155 struct dvb_net dvbnet;
156
157 u8 feeds;
158
159 struct mantis_hwconfig *hwconfig;
160
161 u32 mantis_int_stat;
162 u32 mantis_int_mask;
163
164 /* board specific */
165 u8 mac_address[8];
166 u32 sub_vendor_id;
167 u32 sub_device_id;
168
169 /* A12 A13 A14 */
170 u32 gpio_status;
171
172 u32 gpif_status;
173
174 struct mantis_ca *mantis_ca;
175
176 struct work_struct uart_work;
177
178 struct rc_dev *rc;
179 char input_name[80];
180 char input_phys[80];
181 char *rc_map_name;
182 };
183
184 #define MANTIS_HIF_STATUS (mantis->gpio_status)
185
mantis_mask_ints(struct mantis_pci * mantis,u32 mask)186 static inline void mantis_mask_ints(struct mantis_pci *mantis, u32 mask)
187 {
188 unsigned long flags;
189
190 spin_lock_irqsave(&mantis->intmask_lock, flags);
191 mmwrite(mmread(MANTIS_INT_MASK) & ~mask, MANTIS_INT_MASK);
192 spin_unlock_irqrestore(&mantis->intmask_lock, flags);
193 }
194
mantis_unmask_ints(struct mantis_pci * mantis,u32 mask)195 static inline void mantis_unmask_ints(struct mantis_pci *mantis, u32 mask)
196 {
197 unsigned long flags;
198
199 spin_lock_irqsave(&mantis->intmask_lock, flags);
200 mmwrite(mmread(MANTIS_INT_MASK) | mask, MANTIS_INT_MASK);
201 spin_unlock_irqrestore(&mantis->intmask_lock, flags);
202 }
203
204 #endif /* __MANTIS_COMMON_H */
205