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