Linux Audio

Check our new training course

Loading...
  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 */