1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* |
3 | * Earthsoft PT3 driver |
4 | * |
5 | * Copyright (C) 2014 Akihiro Tsukada <tskd08@gmail.com> |
6 | */ |
7 | |
8 | #ifndef PT3_H |
9 | #define PT3_H |
10 | |
11 | #include <linux/atomic.h> |
12 | #include <linux/types.h> |
13 | |
14 | #include <media/dvb_demux.h> |
15 | #include <media/dvb_frontend.h> |
16 | #include <media/dmxdev.h> |
17 | |
18 | #include "tc90522.h" |
19 | #include "mxl301rf.h" |
20 | #include "qm1d1c0042.h" |
21 | |
22 | #define DRV_NAME KBUILD_MODNAME |
23 | |
24 | #define PT3_NUM_FE 4 |
25 | |
26 | /* |
27 | * register index of the FPGA chip |
28 | */ |
29 | #define REG_VERSION 0x00 |
30 | #define REG_BUS 0x04 |
31 | #define REG_SYSTEM_W 0x08 |
32 | #define REG_SYSTEM_R 0x0c |
33 | #define REG_I2C_W 0x10 |
34 | #define REG_I2C_R 0x14 |
35 | #define REG_RAM_W 0x18 |
36 | #define REG_RAM_R 0x1c |
37 | #define REG_DMA_BASE 0x40 /* regs for FE[i] = REG_DMA_BASE + 0x18 * i */ |
38 | #define OFST_DMA_DESC_L 0x00 |
39 | #define OFST_DMA_DESC_H 0x04 |
40 | #define OFST_DMA_CTL 0x08 |
41 | #define OFST_TS_CTL 0x0c |
42 | #define OFST_STATUS 0x10 |
43 | #define OFST_TS_ERR 0x14 |
44 | |
45 | /* |
46 | * internal buffer for I2C |
47 | */ |
48 | #define PT3_I2C_MAX 4091 |
49 | struct pt3_i2cbuf { |
50 | u8 data[PT3_I2C_MAX]; |
51 | u8 tmp; |
52 | u32 num_cmds; |
53 | }; |
54 | |
55 | /* |
56 | * DMA things |
57 | */ |
58 | #define TS_PACKET_SZ 188 |
59 | /* DMA transfers must not cross 4GiB, so use one page / transfer */ |
60 | #define DATA_XFER_SZ 4096 |
61 | #define DATA_BUF_XFERS 47 |
62 | /* (num_bufs * DATA_BUF_SZ) % TS_PACKET_SZ must be 0 */ |
63 | #define DATA_BUF_SZ (DATA_BUF_XFERS * DATA_XFER_SZ) |
64 | #define MAX_DATA_BUFS 16 |
65 | #define MIN_DATA_BUFS 2 |
66 | |
67 | #define DESCS_IN_PAGE (PAGE_SIZE / sizeof(struct xfer_desc)) |
68 | #define MAX_NUM_XFERS (MAX_DATA_BUFS * DATA_BUF_XFERS) |
69 | #define MAX_DESC_BUFS DIV_ROUND_UP(MAX_NUM_XFERS, DESCS_IN_PAGE) |
70 | |
71 | /* DMA transfer description. |
72 | * device is passed a pointer to this struct, dma-reads it, |
73 | * and gets the DMA buffer ring for storing TS data. |
74 | */ |
75 | struct xfer_desc { |
76 | u32 addr_l; /* bus address of target data buffer */ |
77 | u32 addr_h; |
78 | u32 size; |
79 | u32 next_l; /* bus address of the next xfer_desc */ |
80 | u32 next_h; |
81 | }; |
82 | |
83 | /* A DMA mapping of a page containing xfer_desc's */ |
84 | struct xfer_desc_buffer { |
85 | dma_addr_t b_addr; |
86 | struct xfer_desc *descs; /* PAGE_SIZE (xfer_desc[DESCS_IN_PAGE]) */ |
87 | }; |
88 | |
89 | /* A DMA mapping of a data buffer */ |
90 | struct dma_data_buffer { |
91 | dma_addr_t b_addr; |
92 | u8 *data; /* size: u8[PAGE_SIZE] */ |
93 | }; |
94 | |
95 | /* |
96 | * device things |
97 | */ |
98 | struct pt3_adap_config { |
99 | struct i2c_board_info demod_info; |
100 | struct tc90522_config demod_cfg; |
101 | |
102 | struct i2c_board_info tuner_info; |
103 | union tuner_config { |
104 | struct qm1d1c0042_config qm1d1c0042; |
105 | struct mxl301rf_config mxl301rf; |
106 | } tuner_cfg; |
107 | u32 init_freq; |
108 | }; |
109 | |
110 | struct pt3_adapter { |
111 | struct dvb_adapter dvb_adap; /* dvb_adap.priv => struct pt3_board */ |
112 | int adap_idx; |
113 | |
114 | struct dvb_demux demux; |
115 | struct dmxdev dmxdev; |
116 | struct dvb_frontend *fe; |
117 | struct i2c_client *i2c_demod; |
118 | struct i2c_client *i2c_tuner; |
119 | |
120 | /* data fetch thread */ |
121 | struct task_struct *thread; |
122 | int num_feeds; |
123 | |
124 | bool cur_lna; |
125 | bool cur_lnb; /* current LNB power status (on/off) */ |
126 | |
127 | /* items below are for DMA */ |
128 | struct dma_data_buffer buffer[MAX_DATA_BUFS]; |
129 | int buf_idx; |
130 | int buf_ofs; |
131 | int num_bufs; /* == pt3_board->num_bufs */ |
132 | int num_discard; /* how many access units to discard initially */ |
133 | |
134 | struct xfer_desc_buffer desc_buf[MAX_DESC_BUFS]; |
135 | int num_desc_bufs; /* == num_bufs * DATA_BUF_XFERS / DESCS_IN_PAGE */ |
136 | }; |
137 | |
138 | |
139 | struct pt3_board { |
140 | struct pci_dev *pdev; |
141 | void __iomem *regs[2]; |
142 | /* regs[0]: registers, regs[1]: internal memory, used for I2C */ |
143 | |
144 | struct mutex lock; |
145 | |
146 | /* LNB power shared among sat-FEs */ |
147 | int lnb_on_cnt; /* LNB power on count */ |
148 | |
149 | /* LNA shared among terr-FEs */ |
150 | int lna_on_cnt; /* booster enabled count */ |
151 | |
152 | int num_bufs; /* number of DMA buffers allocated/mapped per FE */ |
153 | |
154 | struct i2c_adapter i2c_adap; |
155 | struct pt3_i2cbuf *i2c_buf; |
156 | |
157 | struct pt3_adapter *adaps[PT3_NUM_FE]; |
158 | }; |
159 | |
160 | |
161 | /* |
162 | * prototypes |
163 | */ |
164 | extern int pt3_alloc_dmabuf(struct pt3_adapter *adap); |
165 | extern void pt3_init_dmabuf(struct pt3_adapter *adap); |
166 | extern void pt3_free_dmabuf(struct pt3_adapter *adap); |
167 | extern int pt3_start_dma(struct pt3_adapter *adap); |
168 | extern int pt3_stop_dma(struct pt3_adapter *adap); |
169 | extern int pt3_proc_dma(struct pt3_adapter *adap); |
170 | |
171 | extern int pt3_i2c_master_xfer(struct i2c_adapter *adap, |
172 | struct i2c_msg *msgs, int num); |
173 | extern u32 pt3_i2c_functionality(struct i2c_adapter *adap); |
174 | extern void pt3_i2c_reset(struct pt3_board *pt3); |
175 | extern int pt3_init_all_demods(struct pt3_board *pt3); |
176 | extern int pt3_init_all_mxl301rf(struct pt3_board *pt3); |
177 | #endif /* PT3_H */ |
178 | |