/* SPDX-License-Identifier: GPL-2.0-or-later */ /* Mantis PCI bridge driver Copyright (C) Manu Abraham (abraham.manu@gmail.com) */ #ifndef __MANTIS_COMMON_H #define __MANTIS_COMMON_H #include #include #include #include "mantis_reg.h" #include "mantis_uart.h" #include "mantis_link.h" #define MANTIS_ERROR 0 #define MANTIS_NOTICE 1 #define MANTIS_INFO 2 #define MANTIS_DEBUG 3 #define MANTIS_TMG 9 #define dprintk(y, z, format, arg...) do { \ if (z) { \ if ((mantis->verbose > MANTIS_ERROR) && (mantis->verbose > y)) \ printk(KERN_ERR "%s (%d): " format "\n" , __func__ , mantis->num , ##arg); \ else if ((mantis->verbose > MANTIS_NOTICE) && (mantis->verbose > y)) \ printk(KERN_NOTICE "%s (%d): " format "\n" , __func__ , mantis->num , ##arg); \ else if ((mantis->verbose > MANTIS_INFO) && (mantis->verbose > y)) \ printk(KERN_INFO "%s (%d): " format "\n" , __func__ , mantis->num , ##arg); \ else if ((mantis->verbose > MANTIS_DEBUG) && (mantis->verbose > y)) \ printk(KERN_DEBUG "%s (%d): " format "\n" , __func__ , mantis->num , ##arg); \ else if ((mantis->verbose > MANTIS_TMG) && (mantis->verbose > y)) \ printk(KERN_DEBUG "%s (%d): " format "\n" , __func__ , mantis->num , ##arg); \ } else { \ if (mantis->verbose > y) \ printk(format , ##arg); \ } \ } while(0) #define mwrite(dat, addr) writel((dat), addr) #define mread(addr) readl(addr) #define mmwrite(dat, addr) mwrite((dat), (mantis->mmio + (addr))) #define mmread(addr) mread(mantis->mmio + (addr)) #define MANTIS_TS_188 0 #define MANTIS_TS_204 1 #define TWINHAN_TECHNOLOGIES 0x1822 #define MANTIS 0x4e35 #define TECHNISAT 0x1ae4 #define TERRATEC 0x153b #define MAKE_ENTRY(__subven, __subdev, __configptr, __rc) { \ .vendor = TWINHAN_TECHNOLOGIES, \ .device = MANTIS, \ .subvendor = (__subven), \ .subdevice = (__subdev), \ .driver_data = (unsigned long) \ &(struct mantis_pci_drvdata){__configptr, __rc} \ } enum mantis_i2c_mode { MANTIS_PAGE_MODE = 0, MANTIS_BYTE_MODE, }; struct mantis_pci; struct mantis_hwconfig { char *model_name; char *dev_type; u32 ts_size; enum mantis_baud baud_rate; enum mantis_parity parity; u32 bytes; irqreturn_t (*irq_handler)(int irq, void *dev_id); int (*frontend_init)(struct mantis_pci *mantis, struct dvb_frontend *fe); u8 power; u8 reset; enum mantis_i2c_mode i2c_mode; }; struct mantis_pci_drvdata { struct mantis_hwconfig *hwconfig; char *rc_map_name; }; struct mantis_pci { unsigned int verbose; /* PCI stuff */ u16 vendor_id; u16 device_id; u16 subsystem_vendor; u16 subsystem_device; u8 latency; struct pci_dev *pdev; unsigned long mantis_addr; void __iomem *mmio; u8 irq; u8 revision; unsigned int num; /* RISC Core */ u32 busy_block; u32 last_block; u8 *buf_cpu; dma_addr_t buf_dma; __le32 *risc_cpu; dma_addr_t risc_dma; struct tasklet_struct tasklet; spinlock_t intmask_lock; struct i2c_adapter adapter; int i2c_rc; wait_queue_head_t i2c_wq; struct mutex i2c_lock; /* DVB stuff */ struct dvb_adapter dvb_adapter; struct dvb_frontend *fe; struct dvb_demux demux; struct dmxdev dmxdev; struct dmx_frontend fe_hw; struct dmx_frontend fe_mem; struct dvb_net dvbnet; u8 feeds; struct mantis_hwconfig *hwconfig; u32 mantis_int_stat; u32 mantis_int_mask; /* board specific */ u8 mac_address[8]; u32 sub_vendor_id; u32 sub_device_id; /* A12 A13 A14 */ u32 gpio_status; u32 gpif_status; struct mantis_ca *mantis_ca; struct work_struct uart_work; struct rc_dev *rc; char device_name[80]; char input_phys[80]; char *rc_map_name; }; #define MANTIS_HIF_STATUS (mantis->gpio_status) static inline void mantis_mask_ints(struct mantis_pci *mantis, u32 mask) { unsigned long flags; spin_lock_irqsave(&mantis->intmask_lock, flags); mmwrite(mmread(MANTIS_INT_MASK) & ~mask, MANTIS_INT_MASK); spin_unlock_irqrestore(&mantis->intmask_lock, flags); } static inline void mantis_unmask_ints(struct mantis_pci *mantis, u32 mask) { unsigned long flags; spin_lock_irqsave(&mantis->intmask_lock, flags); mmwrite(mmread(MANTIS_INT_MASK) | mask, MANTIS_INT_MASK); spin_unlock_irqrestore(&mantis->intmask_lock, flags); } #endif /* __MANTIS_COMMON_H */