1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 * Realtek RTL2832 DVB-T demodulator driver
4 *
5 * Copyright (C) 2012 Thomas Mair <thomas.mair86@gmail.com>
6 * Copyright (C) 2012-2014 Antti Palosaari <crope@iki.fi>
7 */
8
9#ifndef RTL2832_PRIV_H
10#define RTL2832_PRIV_H
11
12#include <linux/regmap.h>
13#include <linux/math64.h>
14#include <linux/bitops.h>
15
16#include <media/dvb_frontend.h>
17#include <linux/int_log.h>
18#include "rtl2832.h"
19
20struct rtl2832_dev {
21 struct rtl2832_platform_data *pdata;
22 struct i2c_client *client;
23 struct regmap_config regmap_config;
24 struct regmap *regmap;
25 struct i2c_mux_core *muxc;
26 struct dvb_frontend fe;
27 enum fe_status fe_status;
28 u64 post_bit_error_prev; /* for old DVBv3 read_ber() calculation */
29 u64 post_bit_error;
30 u64 post_bit_count;
31 bool sleeping;
32 struct delayed_work i2c_gate_work;
33 unsigned long filters; /* PID filter */
34 bool slave_ts;
35};
36
37struct rtl2832_reg_entry {
38 u16 start_address;
39 u8 msb;
40 u8 lsb;
41};
42
43struct rtl2832_reg_value {
44 int reg;
45 u32 value;
46};
47
48/* Demod register bit names */
49enum DVBT_REG_BIT_NAME {
50 DVBT_SOFT_RST,
51 DVBT_IIC_REPEAT,
52 DVBT_TR_WAIT_MIN_8K,
53 DVBT_RSD_BER_FAIL_VAL,
54 DVBT_EN_BK_TRK,
55 DVBT_REG_PI,
56 DVBT_REG_PFREQ_1_0,
57 DVBT_PD_DA8,
58 DVBT_LOCK_TH,
59 DVBT_BER_PASS_SCAL,
60 DVBT_CE_FFSM_BYPASS,
61 DVBT_ALPHAIIR_N,
62 DVBT_ALPHAIIR_DIF,
63 DVBT_EN_TRK_SPAN,
64 DVBT_LOCK_TH_LEN,
65 DVBT_CCI_THRE,
66 DVBT_CCI_MON_SCAL,
67 DVBT_CCI_M0,
68 DVBT_CCI_M1,
69 DVBT_CCI_M2,
70 DVBT_CCI_M3,
71 DVBT_SPEC_INIT_0,
72 DVBT_SPEC_INIT_1,
73 DVBT_SPEC_INIT_2,
74 DVBT_AD_EN_REG,
75 DVBT_AD_EN_REG1,
76 DVBT_EN_BBIN,
77 DVBT_MGD_THD0,
78 DVBT_MGD_THD1,
79 DVBT_MGD_THD2,
80 DVBT_MGD_THD3,
81 DVBT_MGD_THD4,
82 DVBT_MGD_THD5,
83 DVBT_MGD_THD6,
84 DVBT_MGD_THD7,
85 DVBT_EN_CACQ_NOTCH,
86 DVBT_AD_AV_REF,
87 DVBT_PIP_ON,
88 DVBT_SCALE1_B92,
89 DVBT_SCALE1_B93,
90 DVBT_SCALE1_BA7,
91 DVBT_SCALE1_BA9,
92 DVBT_SCALE1_BAA,
93 DVBT_SCALE1_BAB,
94 DVBT_SCALE1_BAC,
95 DVBT_SCALE1_BB0,
96 DVBT_SCALE1_BB1,
97 DVBT_KB_P1,
98 DVBT_KB_P2,
99 DVBT_KB_P3,
100 DVBT_OPT_ADC_IQ,
101 DVBT_AD_AVI,
102 DVBT_AD_AVQ,
103 DVBT_K1_CR_STEP12,
104 DVBT_TRK_KS_P2,
105 DVBT_TRK_KS_I2,
106 DVBT_TR_THD_SET2,
107 DVBT_TRK_KC_P2,
108 DVBT_TRK_KC_I2,
109 DVBT_CR_THD_SET2,
110 DVBT_PSET_IFFREQ,
111 DVBT_SPEC_INV,
112 DVBT_BW_INDEX,
113 DVBT_RSAMP_RATIO,
114 DVBT_CFREQ_OFF_RATIO,
115 DVBT_FSM_STAGE,
116 DVBT_RX_CONSTEL,
117 DVBT_RX_HIER,
118 DVBT_RX_C_RATE_LP,
119 DVBT_RX_C_RATE_HP,
120 DVBT_GI_IDX,
121 DVBT_FFT_MODE_IDX,
122 DVBT_RSD_BER_EST,
123 DVBT_CE_EST_EVM,
124 DVBT_RF_AGC_VAL,
125 DVBT_IF_AGC_VAL,
126 DVBT_DAGC_VAL,
127 DVBT_SFREQ_OFF,
128 DVBT_CFREQ_OFF,
129 DVBT_POLAR_RF_AGC,
130 DVBT_POLAR_IF_AGC,
131 DVBT_AAGC_HOLD,
132 DVBT_EN_RF_AGC,
133 DVBT_EN_IF_AGC,
134 DVBT_IF_AGC_MIN,
135 DVBT_IF_AGC_MAX,
136 DVBT_RF_AGC_MIN,
137 DVBT_RF_AGC_MAX,
138 DVBT_IF_AGC_MAN,
139 DVBT_IF_AGC_MAN_VAL,
140 DVBT_RF_AGC_MAN,
141 DVBT_RF_AGC_MAN_VAL,
142 DVBT_DAGC_TRG_VAL,
143 DVBT_AGC_TARG_VAL,
144 DVBT_LOOP_GAIN_3_0,
145 DVBT_LOOP_GAIN_4,
146 DVBT_VTOP,
147 DVBT_KRF,
148 DVBT_AGC_TARG_VAL_0,
149 DVBT_AGC_TARG_VAL_8_1,
150 DVBT_AAGC_LOOP_GAIN,
151 DVBT_LOOP_GAIN2_3_0,
152 DVBT_LOOP_GAIN2_4,
153 DVBT_LOOP_GAIN3,
154 DVBT_VTOP1,
155 DVBT_VTOP2,
156 DVBT_VTOP3,
157 DVBT_KRF1,
158 DVBT_KRF2,
159 DVBT_KRF3,
160 DVBT_KRF4,
161 DVBT_EN_GI_PGA,
162 DVBT_THD_LOCK_UP,
163 DVBT_THD_LOCK_DW,
164 DVBT_THD_UP1,
165 DVBT_THD_DW1,
166 DVBT_INTER_CNT_LEN,
167 DVBT_GI_PGA_STATE,
168 DVBT_EN_AGC_PGA,
169 DVBT_CKOUTPAR,
170 DVBT_CKOUT_PWR,
171 DVBT_SYNC_DUR,
172 DVBT_ERR_DUR,
173 DVBT_SYNC_LVL,
174 DVBT_ERR_LVL,
175 DVBT_VAL_LVL,
176 DVBT_SERIAL,
177 DVBT_SER_LSB,
178 DVBT_CDIV_PH0,
179 DVBT_CDIV_PH1,
180 DVBT_MPEG_IO_OPT_2_2,
181 DVBT_MPEG_IO_OPT_1_0,
182 DVBT_CKOUTPAR_PIP,
183 DVBT_CKOUT_PWR_PIP,
184 DVBT_SYNC_LVL_PIP,
185 DVBT_ERR_LVL_PIP,
186 DVBT_VAL_LVL_PIP,
187 DVBT_CKOUTPAR_PID,
188 DVBT_CKOUT_PWR_PID,
189 DVBT_SYNC_LVL_PID,
190 DVBT_ERR_LVL_PID,
191 DVBT_VAL_LVL_PID,
192 DVBT_SM_PASS,
193 DVBT_UPDATE_REG_2,
194 DVBT_BTHD_P3,
195 DVBT_BTHD_D3,
196 DVBT_FUNC4_REG0,
197 DVBT_FUNC4_REG1,
198 DVBT_FUNC4_REG2,
199 DVBT_FUNC4_REG3,
200 DVBT_FUNC4_REG4,
201 DVBT_FUNC4_REG5,
202 DVBT_FUNC4_REG6,
203 DVBT_FUNC4_REG7,
204 DVBT_FUNC4_REG8,
205 DVBT_FUNC4_REG9,
206 DVBT_FUNC4_REG10,
207 DVBT_FUNC5_REG0,
208 DVBT_FUNC5_REG1,
209 DVBT_FUNC5_REG2,
210 DVBT_FUNC5_REG3,
211 DVBT_FUNC5_REG4,
212 DVBT_FUNC5_REG5,
213 DVBT_FUNC5_REG6,
214 DVBT_FUNC5_REG7,
215 DVBT_FUNC5_REG8,
216 DVBT_FUNC5_REG9,
217 DVBT_FUNC5_REG10,
218 DVBT_FUNC5_REG11,
219 DVBT_FUNC5_REG12,
220 DVBT_FUNC5_REG13,
221 DVBT_FUNC5_REG14,
222 DVBT_FUNC5_REG15,
223 DVBT_FUNC5_REG16,
224 DVBT_FUNC5_REG17,
225 DVBT_FUNC5_REG18,
226 DVBT_AD7_SETTING,
227 DVBT_RSSI_R,
228 DVBT_ACI_DET_IND,
229 DVBT_REG_MON,
230 DVBT_REG_MONSEL,
231 DVBT_REG_GPE,
232 DVBT_REG_GPO,
233 DVBT_REG_4MSEL,
234 DVBT_TEST_REG_1,
235 DVBT_TEST_REG_2,
236 DVBT_TEST_REG_3,
237 DVBT_TEST_REG_4,
238 DVBT_REG_BIT_NAME_ITEM_TERMINATOR,
239};
240
241static const struct rtl2832_reg_value rtl2832_tuner_init_fc2580[] = {
242 {DVBT_DAGC_TRG_VAL, 0x39},
243 {DVBT_AGC_TARG_VAL_0, 0x0},
244 {DVBT_AGC_TARG_VAL_8_1, 0x5a},
245 {DVBT_AAGC_LOOP_GAIN, 0x16},
246 {DVBT_LOOP_GAIN2_3_0, 0x6},
247 {DVBT_LOOP_GAIN2_4, 0x1},
248 {DVBT_LOOP_GAIN3, 0x16},
249 {DVBT_VTOP1, 0x35},
250 {DVBT_VTOP2, 0x21},
251 {DVBT_VTOP3, 0x21},
252 {DVBT_KRF1, 0x0},
253 {DVBT_KRF2, 0x40},
254 {DVBT_KRF3, 0x10},
255 {DVBT_KRF4, 0x10},
256 {DVBT_IF_AGC_MIN, 0x80},
257 {DVBT_IF_AGC_MAX, 0x7f},
258 {DVBT_RF_AGC_MIN, 0x9c},
259 {DVBT_RF_AGC_MAX, 0x7f},
260 {DVBT_POLAR_RF_AGC, 0x0},
261 {DVBT_POLAR_IF_AGC, 0x0},
262 {DVBT_AD7_SETTING, 0xe9f4},
263};
264
265static const struct rtl2832_reg_value rtl2832_tuner_init_tua9001[] = {
266 {DVBT_DAGC_TRG_VAL, 0x39},
267 {DVBT_AGC_TARG_VAL_0, 0x0},
268 {DVBT_AGC_TARG_VAL_8_1, 0x5a},
269 {DVBT_AAGC_LOOP_GAIN, 0x16},
270 {DVBT_LOOP_GAIN2_3_0, 0x6},
271 {DVBT_LOOP_GAIN2_4, 0x1},
272 {DVBT_LOOP_GAIN3, 0x16},
273 {DVBT_VTOP1, 0x35},
274 {DVBT_VTOP2, 0x21},
275 {DVBT_VTOP3, 0x21},
276 {DVBT_KRF1, 0x0},
277 {DVBT_KRF2, 0x40},
278 {DVBT_KRF3, 0x10},
279 {DVBT_KRF4, 0x10},
280 {DVBT_IF_AGC_MIN, 0x80},
281 {DVBT_IF_AGC_MAX, 0x7f},
282 {DVBT_RF_AGC_MIN, 0x9c},
283 {DVBT_RF_AGC_MAX, 0x7f},
284 {DVBT_POLAR_RF_AGC, 0x0},
285 {DVBT_POLAR_IF_AGC, 0x0},
286 {DVBT_AD7_SETTING, 0xe9f4},
287 {DVBT_OPT_ADC_IQ, 0x1},
288 {DVBT_AD_AVI, 0x0},
289 {DVBT_AD_AVQ, 0x0},
290 {DVBT_SPEC_INV, 0x0},
291};
292
293static const struct rtl2832_reg_value rtl2832_tuner_init_fc0012[] = {
294 {DVBT_DAGC_TRG_VAL, 0x5a},
295 {DVBT_AGC_TARG_VAL_0, 0x0},
296 {DVBT_AGC_TARG_VAL_8_1, 0x5a},
297 {DVBT_AAGC_LOOP_GAIN, 0x16},
298 {DVBT_LOOP_GAIN2_3_0, 0x6},
299 {DVBT_LOOP_GAIN2_4, 0x1},
300 {DVBT_LOOP_GAIN3, 0x16},
301 {DVBT_VTOP1, 0x35},
302 {DVBT_VTOP2, 0x21},
303 {DVBT_VTOP3, 0x21},
304 {DVBT_KRF1, 0x0},
305 {DVBT_KRF2, 0x40},
306 {DVBT_KRF3, 0x10},
307 {DVBT_KRF4, 0x10},
308 {DVBT_IF_AGC_MIN, 0x80},
309 {DVBT_IF_AGC_MAX, 0x7f},
310 {DVBT_RF_AGC_MIN, 0x80},
311 {DVBT_RF_AGC_MAX, 0x7f},
312 {DVBT_POLAR_RF_AGC, 0x0},
313 {DVBT_POLAR_IF_AGC, 0x0},
314 {DVBT_AD7_SETTING, 0xe9bf},
315 {DVBT_EN_GI_PGA, 0x0},
316 {DVBT_THD_LOCK_UP, 0x0},
317 {DVBT_THD_LOCK_DW, 0x0},
318 {DVBT_THD_UP1, 0x11},
319 {DVBT_THD_DW1, 0xef},
320 {DVBT_INTER_CNT_LEN, 0xc},
321 {DVBT_GI_PGA_STATE, 0x0},
322 {DVBT_EN_AGC_PGA, 0x1},
323 {DVBT_IF_AGC_MAN, 0x0},
324 {DVBT_SPEC_INV, 0x0},
325};
326
327static const struct rtl2832_reg_value rtl2832_tuner_init_e4000[] = {
328 {DVBT_DAGC_TRG_VAL, 0x5a},
329 {DVBT_AGC_TARG_VAL_0, 0x0},
330 {DVBT_AGC_TARG_VAL_8_1, 0x5a},
331 {DVBT_AAGC_LOOP_GAIN, 0x18},
332 {DVBT_LOOP_GAIN2_3_0, 0x8},
333 {DVBT_LOOP_GAIN2_4, 0x1},
334 {DVBT_LOOP_GAIN3, 0x18},
335 {DVBT_VTOP1, 0x35},
336 {DVBT_VTOP2, 0x21},
337 {DVBT_VTOP3, 0x21},
338 {DVBT_KRF1, 0x0},
339 {DVBT_KRF2, 0x40},
340 {DVBT_KRF3, 0x10},
341 {DVBT_KRF4, 0x10},
342 {DVBT_IF_AGC_MIN, 0x80},
343 {DVBT_IF_AGC_MAX, 0x7f},
344 {DVBT_RF_AGC_MIN, 0x80},
345 {DVBT_RF_AGC_MAX, 0x7f},
346 {DVBT_POLAR_RF_AGC, 0x0},
347 {DVBT_POLAR_IF_AGC, 0x0},
348 {DVBT_AD7_SETTING, 0xe9d4},
349 {DVBT_EN_GI_PGA, 0x0},
350 {DVBT_THD_LOCK_UP, 0x0},
351 {DVBT_THD_LOCK_DW, 0x0},
352 {DVBT_THD_UP1, 0x14},
353 {DVBT_THD_DW1, 0xec},
354 {DVBT_INTER_CNT_LEN, 0xc},
355 {DVBT_GI_PGA_STATE, 0x0},
356 {DVBT_EN_AGC_PGA, 0x1},
357 {DVBT_REG_GPE, 0x1},
358 {DVBT_REG_GPO, 0x1},
359 {DVBT_REG_MONSEL, 0x1},
360 {DVBT_REG_MON, 0x1},
361 {DVBT_REG_4MSEL, 0x0},
362 {DVBT_SPEC_INV, 0x0},
363};
364
365static const struct rtl2832_reg_value rtl2832_tuner_init_r820t[] = {
366 {DVBT_DAGC_TRG_VAL, 0x39},
367 {DVBT_AGC_TARG_VAL_0, 0x0},
368 {DVBT_AGC_TARG_VAL_8_1, 0x40},
369 {DVBT_AAGC_LOOP_GAIN, 0x16},
370 {DVBT_LOOP_GAIN2_3_0, 0x8},
371 {DVBT_LOOP_GAIN2_4, 0x1},
372 {DVBT_LOOP_GAIN3, 0x18},
373 {DVBT_VTOP1, 0x35},
374 {DVBT_VTOP2, 0x21},
375 {DVBT_VTOP3, 0x21},
376 {DVBT_KRF1, 0x0},
377 {DVBT_KRF2, 0x40},
378 {DVBT_KRF3, 0x10},
379 {DVBT_KRF4, 0x10},
380 {DVBT_IF_AGC_MIN, 0x80},
381 {DVBT_IF_AGC_MAX, 0x7f},
382 {DVBT_RF_AGC_MIN, 0x80},
383 {DVBT_RF_AGC_MAX, 0x7f},
384 {DVBT_POLAR_RF_AGC, 0x0},
385 {DVBT_POLAR_IF_AGC, 0x0},
386 {DVBT_AD7_SETTING, 0xe9f4},
387 {DVBT_SPEC_INV, 0x1},
388};
389
390static const struct rtl2832_reg_value rtl2832_tuner_init_si2157[] = {
391 {DVBT_DAGC_TRG_VAL, 0x39},
392 {DVBT_AGC_TARG_VAL_0, 0x0},
393 {DVBT_AGC_TARG_VAL_8_1, 0x40},
394 {DVBT_AAGC_LOOP_GAIN, 0x16},
395 {DVBT_LOOP_GAIN2_3_0, 0x8},
396 {DVBT_LOOP_GAIN2_4, 0x1},
397 {DVBT_LOOP_GAIN3, 0x18},
398 {DVBT_VTOP1, 0x35},
399 {DVBT_VTOP2, 0x21},
400 {DVBT_VTOP3, 0x21},
401 {DVBT_KRF1, 0x0},
402 {DVBT_KRF2, 0x40},
403 {DVBT_KRF3, 0x10},
404 {DVBT_KRF4, 0x10},
405 {DVBT_IF_AGC_MIN, 0x80},
406 {DVBT_IF_AGC_MAX, 0x7f},
407 {DVBT_RF_AGC_MIN, 0x80},
408 {DVBT_RF_AGC_MAX, 0x7f},
409 {DVBT_POLAR_RF_AGC, 0x0},
410 {DVBT_POLAR_IF_AGC, 0x0},
411 {DVBT_AD7_SETTING, 0xe9f4},
412 {DVBT_SPEC_INV, 0x0},
413};
414
415#endif /* RTL2832_PRIV_H */
416

source code of linux/drivers/media/dvb-frontends/rtl2832_priv.h