193 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/*3 Mantis PCI bridge driver4 5 Copyright (C) Manu Abraham (abraham.manu@gmail.com)6 7*/8 9#ifndef __MANTIS_COMMON_H10#define __MANTIS_COMMON_H11 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 022#define MANTIS_NOTICE 123#define MANTIS_INFO 224#define MANTIS_DEBUG 325#define MANTIS_TMG 926 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 052#define MANTIS_TS_204 153 54#define TWINHAN_TECHNOLOGIES 0x182255#define MANTIS 0x4e3556 57#define TECHNISAT 0x1ae458#define TERRATEC 0x153b59 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 69enum mantis_i2c_mode {70 MANTIS_PAGE_MODE = 0,71 MANTIS_BYTE_MODE,72};73 74struct mantis_pci;75 76struct 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 94struct mantis_pci_drvdata {95 struct mantis_hwconfig *hwconfig;96 char *rc_map_name;97};98 99struct 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 work_struct bh_work;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 174static 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 183static 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