1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * netup_unidvb.h 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Data type definitions for NetUP Universal Dual DVB-CI 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Copyright (C) 2014 NetUP Inc. 8*4882a593Smuzhiyun * Copyright (C) 2014 Sergey Kozlov <serjk@netup.ru> 9*4882a593Smuzhiyun * Copyright (C) 2014 Abylay Ospan <aospan@netup.ru> 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <linux/pci.h> 13*4882a593Smuzhiyun #include <linux/i2c.h> 14*4882a593Smuzhiyun #include <linux/workqueue.h> 15*4882a593Smuzhiyun #include <media/v4l2-common.h> 16*4882a593Smuzhiyun #include <media/v4l2-device.h> 17*4882a593Smuzhiyun #include <media/videobuf2-dvb.h> 18*4882a593Smuzhiyun #include <media/dvb_ca_en50221.h> 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define NETUP_UNIDVB_NAME "netup_unidvb" 21*4882a593Smuzhiyun #define NETUP_UNIDVB_VERSION "0.0.1" 22*4882a593Smuzhiyun #define NETUP_VENDOR_ID 0x1b55 23*4882a593Smuzhiyun #define NETUP_PCI_DEV_REVISION 0x2 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun /* IRQ-related regisers */ 26*4882a593Smuzhiyun #define REG_ISR 0x4890 27*4882a593Smuzhiyun #define REG_ISR_MASKED 0x4892 28*4882a593Smuzhiyun #define REG_IMASK_SET 0x4894 29*4882a593Smuzhiyun #define REG_IMASK_CLEAR 0x4896 30*4882a593Smuzhiyun /* REG_ISR register bits */ 31*4882a593Smuzhiyun #define NETUP_UNIDVB_IRQ_SPI (1 << 0) 32*4882a593Smuzhiyun #define NETUP_UNIDVB_IRQ_I2C0 (1 << 1) 33*4882a593Smuzhiyun #define NETUP_UNIDVB_IRQ_I2C1 (1 << 2) 34*4882a593Smuzhiyun #define NETUP_UNIDVB_IRQ_FRA0 (1 << 4) 35*4882a593Smuzhiyun #define NETUP_UNIDVB_IRQ_FRA1 (1 << 5) 36*4882a593Smuzhiyun #define NETUP_UNIDVB_IRQ_FRB0 (1 << 6) 37*4882a593Smuzhiyun #define NETUP_UNIDVB_IRQ_FRB1 (1 << 7) 38*4882a593Smuzhiyun #define NETUP_UNIDVB_IRQ_DMA1 (1 << 8) 39*4882a593Smuzhiyun #define NETUP_UNIDVB_IRQ_DMA2 (1 << 9) 40*4882a593Smuzhiyun #define NETUP_UNIDVB_IRQ_CI (1 << 10) 41*4882a593Smuzhiyun #define NETUP_UNIDVB_IRQ_CAM0 (1 << 11) 42*4882a593Smuzhiyun #define NETUP_UNIDVB_IRQ_CAM1 (1 << 12) 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun /* NetUP Universal DVB card hardware revisions and it's PCI device id's: 45*4882a593Smuzhiyun * 1.3 - CXD2841ER demod, ASCOT2E and HORUS3A tuners 46*4882a593Smuzhiyun * 1.4 - CXD2854ER demod, HELENE tuner 47*4882a593Smuzhiyun */ 48*4882a593Smuzhiyun enum netup_hw_rev { 49*4882a593Smuzhiyun NETUP_HW_REV_1_3 = 0x18F6, 50*4882a593Smuzhiyun NETUP_HW_REV_1_4 = 0x18F7 51*4882a593Smuzhiyun }; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun struct netup_dma { 54*4882a593Smuzhiyun u8 num; 55*4882a593Smuzhiyun spinlock_t lock; 56*4882a593Smuzhiyun struct netup_unidvb_dev *ndev; 57*4882a593Smuzhiyun struct netup_dma_regs __iomem *regs; 58*4882a593Smuzhiyun u32 ring_buffer_size; 59*4882a593Smuzhiyun u8 *addr_virt; 60*4882a593Smuzhiyun dma_addr_t addr_phys; 61*4882a593Smuzhiyun u64 addr_last; 62*4882a593Smuzhiyun u32 high_addr; 63*4882a593Smuzhiyun u32 data_offset; 64*4882a593Smuzhiyun u32 data_size; 65*4882a593Smuzhiyun struct list_head free_buffers; 66*4882a593Smuzhiyun struct work_struct work; 67*4882a593Smuzhiyun struct timer_list timeout; 68*4882a593Smuzhiyun }; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun enum netup_i2c_state { 71*4882a593Smuzhiyun STATE_DONE, 72*4882a593Smuzhiyun STATE_WAIT, 73*4882a593Smuzhiyun STATE_WANT_READ, 74*4882a593Smuzhiyun STATE_WANT_WRITE, 75*4882a593Smuzhiyun STATE_ERROR 76*4882a593Smuzhiyun }; 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun struct netup_i2c_regs; 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun struct netup_i2c { 81*4882a593Smuzhiyun spinlock_t lock; 82*4882a593Smuzhiyun wait_queue_head_t wq; 83*4882a593Smuzhiyun struct i2c_adapter adap; 84*4882a593Smuzhiyun struct netup_unidvb_dev *dev; 85*4882a593Smuzhiyun struct netup_i2c_regs __iomem *regs; 86*4882a593Smuzhiyun struct i2c_msg *msg; 87*4882a593Smuzhiyun enum netup_i2c_state state; 88*4882a593Smuzhiyun u32 xmit_size; 89*4882a593Smuzhiyun }; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun struct netup_ci_state { 92*4882a593Smuzhiyun struct dvb_ca_en50221 ca; 93*4882a593Smuzhiyun u8 __iomem *membase8_config; 94*4882a593Smuzhiyun u8 __iomem *membase8_io; 95*4882a593Smuzhiyun struct netup_unidvb_dev *dev; 96*4882a593Smuzhiyun int status; 97*4882a593Smuzhiyun int nr; 98*4882a593Smuzhiyun }; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun struct netup_spi; 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun struct netup_unidvb_dev { 103*4882a593Smuzhiyun struct pci_dev *pci_dev; 104*4882a593Smuzhiyun int pci_bus; 105*4882a593Smuzhiyun int pci_slot; 106*4882a593Smuzhiyun int pci_func; 107*4882a593Smuzhiyun int board_num; 108*4882a593Smuzhiyun int old_fw; 109*4882a593Smuzhiyun u32 __iomem *lmmio0; 110*4882a593Smuzhiyun u8 __iomem *bmmio0; 111*4882a593Smuzhiyun u32 __iomem *lmmio1; 112*4882a593Smuzhiyun u8 __iomem *bmmio1; 113*4882a593Smuzhiyun u8 *dma_virt; 114*4882a593Smuzhiyun dma_addr_t dma_phys; 115*4882a593Smuzhiyun u32 dma_size; 116*4882a593Smuzhiyun struct vb2_dvb_frontends frontends[2]; 117*4882a593Smuzhiyun struct netup_i2c i2c[2]; 118*4882a593Smuzhiyun struct workqueue_struct *wq; 119*4882a593Smuzhiyun struct netup_dma dma[2]; 120*4882a593Smuzhiyun struct netup_ci_state ci[2]; 121*4882a593Smuzhiyun struct netup_spi *spi; 122*4882a593Smuzhiyun enum netup_hw_rev rev; 123*4882a593Smuzhiyun }; 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun int netup_i2c_register(struct netup_unidvb_dev *ndev); 126*4882a593Smuzhiyun void netup_i2c_unregister(struct netup_unidvb_dev *ndev); 127*4882a593Smuzhiyun irqreturn_t netup_ci_interrupt(struct netup_unidvb_dev *ndev); 128*4882a593Smuzhiyun irqreturn_t netup_i2c_interrupt(struct netup_i2c *i2c); 129*4882a593Smuzhiyun irqreturn_t netup_spi_interrupt(struct netup_spi *spi); 130*4882a593Smuzhiyun int netup_unidvb_ci_register(struct netup_unidvb_dev *dev, 131*4882a593Smuzhiyun int num, struct pci_dev *pci_dev); 132*4882a593Smuzhiyun void netup_unidvb_ci_unregister(struct netup_unidvb_dev *dev, int num); 133*4882a593Smuzhiyun int netup_spi_init(struct netup_unidvb_dev *ndev); 134*4882a593Smuzhiyun void netup_spi_release(struct netup_unidvb_dev *ndev); 135