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 device_name[80]; 180 char input_phys[80]; 181 char *rc_map_name; 182 }; 183 184 #define MANTIS_HIF_STATUS (mantis->gpio_status) 185 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 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