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