xref: /OK3568_Linux_fs/kernel/drivers/media/pci/netup_unidvb/netup_unidvb.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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