1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Realtek RTL2832 DVB-T demodulator driver
5 * Copyright (C) 2012 Thomas Mair <thomas.mair86@gmail.com>
6 * Copyright (C) 2012-2014 Antti Palosaari <crope@iki.fi>
9 #include "rtl2832_priv.h"
11 #define REG_MASK(b) (BIT(b + 1) - 1)
13 static const struct rtl2832_reg_entry registers
[] = {
14 [DVBT_SOFT_RST
] = {0x101, 2, 2},
15 [DVBT_IIC_REPEAT
] = {0x101, 3, 3},
16 [DVBT_TR_WAIT_MIN_8K
] = {0x188, 11, 2},
17 [DVBT_RSD_BER_FAIL_VAL
] = {0x18f, 15, 0},
18 [DVBT_EN_BK_TRK
] = {0x1a6, 7, 7},
19 [DVBT_AD_EN_REG
] = {0x008, 7, 7},
20 [DVBT_AD_EN_REG1
] = {0x008, 6, 6},
21 [DVBT_EN_BBIN
] = {0x1b1, 0, 0},
22 [DVBT_MGD_THD0
] = {0x195, 7, 0},
23 [DVBT_MGD_THD1
] = {0x196, 7, 0},
24 [DVBT_MGD_THD2
] = {0x197, 7, 0},
25 [DVBT_MGD_THD3
] = {0x198, 7, 0},
26 [DVBT_MGD_THD4
] = {0x199, 7, 0},
27 [DVBT_MGD_THD5
] = {0x19a, 7, 0},
28 [DVBT_MGD_THD6
] = {0x19b, 7, 0},
29 [DVBT_MGD_THD7
] = {0x19c, 7, 0},
30 [DVBT_EN_CACQ_NOTCH
] = {0x161, 4, 4},
31 [DVBT_AD_AV_REF
] = {0x009, 6, 0},
32 [DVBT_REG_PI
] = {0x00a, 2, 0},
33 [DVBT_PIP_ON
] = {0x021, 3, 3},
34 [DVBT_SCALE1_B92
] = {0x292, 7, 0},
35 [DVBT_SCALE1_B93
] = {0x293, 7, 0},
36 [DVBT_SCALE1_BA7
] = {0x2a7, 7, 0},
37 [DVBT_SCALE1_BA9
] = {0x2a9, 7, 0},
38 [DVBT_SCALE1_BAA
] = {0x2aa, 7, 0},
39 [DVBT_SCALE1_BAB
] = {0x2ab, 7, 0},
40 [DVBT_SCALE1_BAC
] = {0x2ac, 7, 0},
41 [DVBT_SCALE1_BB0
] = {0x2b0, 7, 0},
42 [DVBT_SCALE1_BB1
] = {0x2b1, 7, 0},
43 [DVBT_KB_P1
] = {0x164, 3, 1},
44 [DVBT_KB_P2
] = {0x164, 6, 4},
45 [DVBT_KB_P3
] = {0x165, 2, 0},
46 [DVBT_OPT_ADC_IQ
] = {0x006, 5, 4},
47 [DVBT_AD_AVI
] = {0x009, 1, 0},
48 [DVBT_AD_AVQ
] = {0x009, 3, 2},
49 [DVBT_K1_CR_STEP12
] = {0x2ad, 9, 4},
50 [DVBT_TRK_KS_P2
] = {0x16f, 2, 0},
51 [DVBT_TRK_KS_I2
] = {0x170, 5, 3},
52 [DVBT_TR_THD_SET2
] = {0x172, 3, 0},
53 [DVBT_TRK_KC_P2
] = {0x173, 5, 3},
54 [DVBT_TRK_KC_I2
] = {0x175, 2, 0},
55 [DVBT_CR_THD_SET2
] = {0x176, 7, 6},
56 [DVBT_PSET_IFFREQ
] = {0x119, 21, 0},
57 [DVBT_SPEC_INV
] = {0x115, 0, 0},
58 [DVBT_RSAMP_RATIO
] = {0x19f, 27, 2},
59 [DVBT_CFREQ_OFF_RATIO
] = {0x19d, 23, 4},
60 [DVBT_FSM_STAGE
] = {0x351, 6, 3},
61 [DVBT_RX_CONSTEL
] = {0x33c, 3, 2},
62 [DVBT_RX_HIER
] = {0x33c, 6, 4},
63 [DVBT_RX_C_RATE_LP
] = {0x33d, 2, 0},
64 [DVBT_RX_C_RATE_HP
] = {0x33d, 5, 3},
65 [DVBT_GI_IDX
] = {0x351, 1, 0},
66 [DVBT_FFT_MODE_IDX
] = {0x351, 2, 2},
67 [DVBT_RSD_BER_EST
] = {0x34e, 15, 0},
68 [DVBT_CE_EST_EVM
] = {0x40c, 15, 0},
69 [DVBT_RF_AGC_VAL
] = {0x35b, 13, 0},
70 [DVBT_IF_AGC_VAL
] = {0x359, 13, 0},
71 [DVBT_DAGC_VAL
] = {0x305, 7, 0},
72 [DVBT_SFREQ_OFF
] = {0x318, 13, 0},
73 [DVBT_CFREQ_OFF
] = {0x35f, 17, 0},
74 [DVBT_POLAR_RF_AGC
] = {0x00e, 1, 1},
75 [DVBT_POLAR_IF_AGC
] = {0x00e, 0, 0},
76 [DVBT_AAGC_HOLD
] = {0x104, 5, 5},
77 [DVBT_EN_RF_AGC
] = {0x104, 6, 6},
78 [DVBT_EN_IF_AGC
] = {0x104, 7, 7},
79 [DVBT_IF_AGC_MIN
] = {0x108, 7, 0},
80 [DVBT_IF_AGC_MAX
] = {0x109, 7, 0},
81 [DVBT_RF_AGC_MIN
] = {0x10a, 7, 0},
82 [DVBT_RF_AGC_MAX
] = {0x10b, 7, 0},
83 [DVBT_IF_AGC_MAN
] = {0x10c, 6, 6},
84 [DVBT_IF_AGC_MAN_VAL
] = {0x10c, 13, 0},
85 [DVBT_RF_AGC_MAN
] = {0x10e, 6, 6},
86 [DVBT_RF_AGC_MAN_VAL
] = {0x10e, 13, 0},
87 [DVBT_DAGC_TRG_VAL
] = {0x112, 7, 0},
88 [DVBT_AGC_TARG_VAL_0
] = {0x102, 0, 0},
89 [DVBT_AGC_TARG_VAL_8_1
] = {0x103, 7, 0},
90 [DVBT_AAGC_LOOP_GAIN
] = {0x1c7, 5, 1},
91 [DVBT_LOOP_GAIN2_3_0
] = {0x104, 4, 1},
92 [DVBT_LOOP_GAIN2_4
] = {0x105, 7, 7},
93 [DVBT_LOOP_GAIN3
] = {0x1c8, 4, 0},
94 [DVBT_VTOP1
] = {0x106, 5, 0},
95 [DVBT_VTOP2
] = {0x1c9, 5, 0},
96 [DVBT_VTOP3
] = {0x1ca, 5, 0},
97 [DVBT_KRF1
] = {0x1cb, 7, 0},
98 [DVBT_KRF2
] = {0x107, 7, 0},
99 [DVBT_KRF3
] = {0x1cd, 7, 0},
100 [DVBT_KRF4
] = {0x1ce, 7, 0},
101 [DVBT_EN_GI_PGA
] = {0x1e5, 0, 0},
102 [DVBT_THD_LOCK_UP
] = {0x1d9, 8, 0},
103 [DVBT_THD_LOCK_DW
] = {0x1db, 8, 0},
104 [DVBT_THD_UP1
] = {0x1dd, 7, 0},
105 [DVBT_THD_DW1
] = {0x1de, 7, 0},
106 [DVBT_INTER_CNT_LEN
] = {0x1d8, 3, 0},
107 [DVBT_GI_PGA_STATE
] = {0x1e6, 3, 3},
108 [DVBT_EN_AGC_PGA
] = {0x1d7, 0, 0},
109 [DVBT_CKOUTPAR
] = {0x17b, 5, 5},
110 [DVBT_CKOUT_PWR
] = {0x17b, 6, 6},
111 [DVBT_SYNC_DUR
] = {0x17b, 7, 7},
112 [DVBT_ERR_DUR
] = {0x17c, 0, 0},
113 [DVBT_SYNC_LVL
] = {0x17c, 1, 1},
114 [DVBT_ERR_LVL
] = {0x17c, 2, 2},
115 [DVBT_VAL_LVL
] = {0x17c, 3, 3},
116 [DVBT_SERIAL
] = {0x17c, 4, 4},
117 [DVBT_SER_LSB
] = {0x17c, 5, 5},
118 [DVBT_CDIV_PH0
] = {0x17d, 3, 0},
119 [DVBT_CDIV_PH1
] = {0x17d, 7, 4},
120 [DVBT_MPEG_IO_OPT_2_2
] = {0x006, 7, 7},
121 [DVBT_MPEG_IO_OPT_1_0
] = {0x007, 7, 6},
122 [DVBT_CKOUTPAR_PIP
] = {0x0b7, 4, 4},
123 [DVBT_CKOUT_PWR_PIP
] = {0x0b7, 3, 3},
124 [DVBT_SYNC_LVL_PIP
] = {0x0b7, 2, 2},
125 [DVBT_ERR_LVL_PIP
] = {0x0b7, 1, 1},
126 [DVBT_VAL_LVL_PIP
] = {0x0b7, 0, 0},
127 [DVBT_CKOUTPAR_PID
] = {0x0b9, 4, 4},
128 [DVBT_CKOUT_PWR_PID
] = {0x0b9, 3, 3},
129 [DVBT_SYNC_LVL_PID
] = {0x0b9, 2, 2},
130 [DVBT_ERR_LVL_PID
] = {0x0b9, 1, 1},
131 [DVBT_VAL_LVL_PID
] = {0x0b9, 0, 0},
132 [DVBT_SM_PASS
] = {0x193, 11, 0},
133 [DVBT_AD7_SETTING
] = {0x011, 15, 0},
134 [DVBT_RSSI_R
] = {0x301, 6, 0},
135 [DVBT_ACI_DET_IND
] = {0x312, 0, 0},
136 [DVBT_REG_MON
] = {0x00d, 1, 0},
137 [DVBT_REG_MONSEL
] = {0x00d, 2, 2},
138 [DVBT_REG_GPE
] = {0x00d, 7, 7},
139 [DVBT_REG_GPO
] = {0x010, 0, 0},
140 [DVBT_REG_4MSEL
] = {0x013, 0, 0},
143 static int rtl2832_rd_demod_reg(struct rtl2832_dev
*dev
, int reg
, u32
*val
)
145 struct i2c_client
*client
= dev
->client
;
148 u8 msb
, lsb
, reading
[4], len
;
149 u32 reading_tmp
, mask
;
151 reg_start_addr
= registers
[reg
].start_address
;
152 msb
= registers
[reg
].msb
;
153 lsb
= registers
[reg
].lsb
;
154 len
= (msb
>> 3) + 1;
155 mask
= REG_MASK(msb
- lsb
);
157 ret
= regmap_bulk_read(dev
->regmap
, reg_start_addr
, reading
, len
);
162 for (i
= 0; i
< len
; i
++)
163 reading_tmp
|= reading
[i
] << ((len
- 1 - i
) * 8);
165 *val
= (reading_tmp
>> lsb
) & mask
;
169 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
173 static int rtl2832_wr_demod_reg(struct rtl2832_dev
*dev
, int reg
, u32 val
)
175 struct i2c_client
*client
= dev
->client
;
178 u8 msb
, lsb
, reading
[4], writing
[4], len
;
179 u32 reading_tmp
, writing_tmp
, mask
;
181 reg_start_addr
= registers
[reg
].start_address
;
182 msb
= registers
[reg
].msb
;
183 lsb
= registers
[reg
].lsb
;
184 len
= (msb
>> 3) + 1;
185 mask
= REG_MASK(msb
- lsb
);
187 ret
= regmap_bulk_read(dev
->regmap
, reg_start_addr
, reading
, len
);
192 for (i
= 0; i
< len
; i
++)
193 reading_tmp
|= reading
[i
] << ((len
- 1 - i
) * 8);
195 writing_tmp
= reading_tmp
& ~(mask
<< lsb
);
196 writing_tmp
|= ((val
& mask
) << lsb
);
198 for (i
= 0; i
< len
; i
++)
199 writing
[i
] = (writing_tmp
>> ((len
- 1 - i
) * 8)) & 0xff;
201 ret
= regmap_bulk_write(dev
->regmap
, reg_start_addr
, writing
, len
);
207 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
211 static int rtl2832_set_if(struct dvb_frontend
*fe
, u32 if_freq
)
213 struct rtl2832_dev
*dev
= fe
->demodulator_priv
;
214 struct i2c_client
*client
= dev
->client
;
217 u8 en_bbin
= (if_freq
== 0 ? 0x1 : 0x0);
220 * PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
223 pset_iffreq
= if_freq
% dev
->pdata
->clk
;
224 pset_iffreq
*= 0x400000;
225 pset_iffreq
= div_u64(pset_iffreq
, dev
->pdata
->clk
);
226 pset_iffreq
= -pset_iffreq
;
227 pset_iffreq
= pset_iffreq
& 0x3fffff;
228 dev_dbg(&client
->dev
, "if_frequency=%d pset_iffreq=%08x\n",
229 if_freq
, (unsigned)pset_iffreq
);
231 ret
= rtl2832_wr_demod_reg(dev
, DVBT_EN_BBIN
, en_bbin
);
235 ret
= rtl2832_wr_demod_reg(dev
, DVBT_PSET_IFFREQ
, pset_iffreq
);
241 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
245 static int rtl2832_init(struct dvb_frontend
*fe
)
247 struct rtl2832_dev
*dev
= fe
->demodulator_priv
;
248 struct i2c_client
*client
= dev
->client
;
249 struct dtv_frontend_properties
*c
= &dev
->fe
.dtv_property_cache
;
250 const struct rtl2832_reg_value
*init
;
252 /* initialization values for the demodulator registers */
253 struct rtl2832_reg_value rtl2832_initial_regs
[] = {
254 {DVBT_AD_EN_REG
, 0x1},
255 {DVBT_AD_EN_REG1
, 0x1},
256 {DVBT_RSD_BER_FAIL_VAL
, 0x2800},
257 {DVBT_MGD_THD0
, 0x10},
258 {DVBT_MGD_THD1
, 0x20},
259 {DVBT_MGD_THD2
, 0x20},
260 {DVBT_MGD_THD3
, 0x40},
261 {DVBT_MGD_THD4
, 0x22},
262 {DVBT_MGD_THD5
, 0x32},
263 {DVBT_MGD_THD6
, 0x37},
264 {DVBT_MGD_THD7
, 0x39},
265 {DVBT_EN_BK_TRK
, 0x0},
266 {DVBT_EN_CACQ_NOTCH
, 0x0},
267 {DVBT_AD_AV_REF
, 0x2a},
270 {DVBT_CDIV_PH0
, 0x8},
271 {DVBT_CDIV_PH1
, 0x8},
272 {DVBT_SCALE1_B92
, 0x4},
273 {DVBT_SCALE1_B93
, 0xb0},
274 {DVBT_SCALE1_BA7
, 0x78},
275 {DVBT_SCALE1_BA9
, 0x28},
276 {DVBT_SCALE1_BAA
, 0x59},
277 {DVBT_SCALE1_BAB
, 0x83},
278 {DVBT_SCALE1_BAC
, 0xd4},
279 {DVBT_SCALE1_BB0
, 0x65},
280 {DVBT_SCALE1_BB1
, 0x43},
284 {DVBT_K1_CR_STEP12
, 0xa},
287 {DVBT_CDIV_PH0
, 0x9},
288 {DVBT_CDIV_PH1
, 0x9},
289 {DVBT_MPEG_IO_OPT_2_2
, 0x0},
290 {DVBT_MPEG_IO_OPT_1_0
, 0x0},
291 {DVBT_TRK_KS_P2
, 0x4},
292 {DVBT_TRK_KS_I2
, 0x7},
293 {DVBT_TR_THD_SET2
, 0x6},
294 {DVBT_TRK_KC_I2
, 0x5},
295 {DVBT_CR_THD_SET2
, 0x1},
298 dev_dbg(&client
->dev
, "\n");
300 ret
= rtl2832_wr_demod_reg(dev
, DVBT_SOFT_RST
, 0x0);
304 for (i
= 0; i
< ARRAY_SIZE(rtl2832_initial_regs
); i
++) {
305 ret
= rtl2832_wr_demod_reg(dev
, rtl2832_initial_regs
[i
].reg
,
306 rtl2832_initial_regs
[i
].value
);
311 /* load tuner specific settings */
312 dev_dbg(&client
->dev
, "load settings for tuner=%02x\n",
314 switch (dev
->pdata
->tuner
) {
315 case RTL2832_TUNER_FC2580
:
316 len
= ARRAY_SIZE(rtl2832_tuner_init_fc2580
);
317 init
= rtl2832_tuner_init_fc2580
;
319 case RTL2832_TUNER_FC0012
:
320 case RTL2832_TUNER_FC0013
:
321 len
= ARRAY_SIZE(rtl2832_tuner_init_fc0012
);
322 init
= rtl2832_tuner_init_fc0012
;
324 case RTL2832_TUNER_TUA9001
:
325 len
= ARRAY_SIZE(rtl2832_tuner_init_tua9001
);
326 init
= rtl2832_tuner_init_tua9001
;
328 case RTL2832_TUNER_E4000
:
329 len
= ARRAY_SIZE(rtl2832_tuner_init_e4000
);
330 init
= rtl2832_tuner_init_e4000
;
332 case RTL2832_TUNER_R820T
:
333 case RTL2832_TUNER_R828D
:
334 len
= ARRAY_SIZE(rtl2832_tuner_init_r820t
);
335 init
= rtl2832_tuner_init_r820t
;
337 case RTL2832_TUNER_SI2157
:
338 len
= ARRAY_SIZE(rtl2832_tuner_init_si2157
);
339 init
= rtl2832_tuner_init_si2157
;
346 for (i
= 0; i
< len
; i
++) {
347 ret
= rtl2832_wr_demod_reg(dev
, init
[i
].reg
, init
[i
].value
);
352 /* init stats here in order signal app which stats are supported */
354 c
->strength
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
356 c
->cnr
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
357 c
->post_bit_error
.len
= 1;
358 c
->post_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
359 c
->post_bit_count
.len
= 1;
360 c
->post_bit_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
361 dev
->sleeping
= false;
365 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
369 static int rtl2832_sleep(struct dvb_frontend
*fe
)
371 struct rtl2832_dev
*dev
= fe
->demodulator_priv
;
372 struct i2c_client
*client
= dev
->client
;
375 dev_dbg(&client
->dev
, "\n");
377 dev
->sleeping
= true;
380 ret
= rtl2832_wr_demod_reg(dev
, DVBT_SOFT_RST
, 0x1);
386 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
390 static int rtl2832_get_tune_settings(struct dvb_frontend
*fe
,
391 struct dvb_frontend_tune_settings
*s
)
393 struct rtl2832_dev
*dev
= fe
->demodulator_priv
;
394 struct i2c_client
*client
= dev
->client
;
396 dev_dbg(&client
->dev
, "\n");
397 s
->min_delay_ms
= 1000;
398 s
->step_size
= fe
->ops
.info
.frequency_stepsize_hz
* 2;
399 s
->max_drift
= (fe
->ops
.info
.frequency_stepsize_hz
* 2) + 1;
403 static int rtl2832_set_frontend(struct dvb_frontend
*fe
)
405 struct rtl2832_dev
*dev
= fe
->demodulator_priv
;
406 struct i2c_client
*client
= dev
->client
;
407 struct dtv_frontend_properties
*c
= &fe
->dtv_property_cache
;
409 u64 bw_mode
, num
, num2
;
410 u32 resamp_ratio
, cfreq_off_ratio
;
411 static u8 bw_params
[3][32] = {
412 /* 6 MHz bandwidth */
414 0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
415 0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
416 0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
420 /* 7 MHz bandwidth */
422 0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
423 0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
424 0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
428 /* 8 MHz bandwidth */
430 0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
431 0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
432 0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
437 dev_dbg(&client
->dev
, "frequency=%u bandwidth_hz=%u inversion=%u\n",
438 c
->frequency
, c
->bandwidth_hz
, c
->inversion
);
441 if (fe
->ops
.tuner_ops
.set_params
)
442 fe
->ops
.tuner_ops
.set_params(fe
);
444 /* If the frontend has get_if_frequency(), use it */
445 if (fe
->ops
.tuner_ops
.get_if_frequency
) {
448 ret
= fe
->ops
.tuner_ops
.get_if_frequency(fe
, &if_freq
);
452 ret
= rtl2832_set_if(fe
, if_freq
);
457 switch (c
->bandwidth_hz
) {
471 dev_err(&client
->dev
, "invalid bandwidth_hz %u\n",
477 for (j
= 0; j
< sizeof(bw_params
[0]); j
++) {
478 ret
= regmap_bulk_write(dev
->regmap
,
479 0x11c + j
, &bw_params
[i
][j
], 1);
484 /* calculate and set resample ratio
485 * RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
486 * / ConstWithBandwidthMode)
488 num
= dev
->pdata
->clk
* 7ULL;
490 num
= div_u64(num
, bw_mode
);
491 resamp_ratio
= num
& 0x3ffffff;
492 ret
= rtl2832_wr_demod_reg(dev
, DVBT_RSAMP_RATIO
, resamp_ratio
);
496 /* calculate and set cfreq off ratio
497 * CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
498 * / (CrystalFreqHz * 7))
501 num2
= dev
->pdata
->clk
* 7ULL;
502 num
= div_u64(num
, num2
);
504 cfreq_off_ratio
= num
& 0xfffff;
505 ret
= rtl2832_wr_demod_reg(dev
, DVBT_CFREQ_OFF_RATIO
, cfreq_off_ratio
);
510 ret
= rtl2832_wr_demod_reg(dev
, DVBT_SOFT_RST
, 0x1);
514 ret
= rtl2832_wr_demod_reg(dev
, DVBT_SOFT_RST
, 0x0);
520 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
524 static int rtl2832_get_frontend(struct dvb_frontend
*fe
,
525 struct dtv_frontend_properties
*c
)
527 struct rtl2832_dev
*dev
= fe
->demodulator_priv
;
528 struct i2c_client
*client
= dev
->client
;
535 ret
= regmap_bulk_read(dev
->regmap
, 0x33c, buf
, 2);
539 ret
= regmap_bulk_read(dev
->regmap
, 0x351, &buf
[2], 1);
543 dev_dbg(&client
->dev
, "TPS=%*ph\n", 3, buf
);
545 switch ((buf
[0] >> 2) & 3) {
547 c
->modulation
= QPSK
;
550 c
->modulation
= QAM_16
;
553 c
->modulation
= QAM_64
;
557 switch ((buf
[2] >> 2) & 1) {
559 c
->transmission_mode
= TRANSMISSION_MODE_2K
;
562 c
->transmission_mode
= TRANSMISSION_MODE_8K
;
565 switch ((buf
[2] >> 0) & 3) {
567 c
->guard_interval
= GUARD_INTERVAL_1_32
;
570 c
->guard_interval
= GUARD_INTERVAL_1_16
;
573 c
->guard_interval
= GUARD_INTERVAL_1_8
;
576 c
->guard_interval
= GUARD_INTERVAL_1_4
;
580 switch ((buf
[0] >> 4) & 7) {
582 c
->hierarchy
= HIERARCHY_NONE
;
585 c
->hierarchy
= HIERARCHY_1
;
588 c
->hierarchy
= HIERARCHY_2
;
591 c
->hierarchy
= HIERARCHY_4
;
595 switch ((buf
[1] >> 3) & 7) {
597 c
->code_rate_HP
= FEC_1_2
;
600 c
->code_rate_HP
= FEC_2_3
;
603 c
->code_rate_HP
= FEC_3_4
;
606 c
->code_rate_HP
= FEC_5_6
;
609 c
->code_rate_HP
= FEC_7_8
;
613 switch ((buf
[1] >> 0) & 7) {
615 c
->code_rate_LP
= FEC_1_2
;
618 c
->code_rate_LP
= FEC_2_3
;
621 c
->code_rate_LP
= FEC_3_4
;
624 c
->code_rate_LP
= FEC_5_6
;
627 c
->code_rate_LP
= FEC_7_8
;
633 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
637 static int rtl2832_read_status(struct dvb_frontend
*fe
, enum fe_status
*status
)
639 struct rtl2832_dev
*dev
= fe
->demodulator_priv
;
640 struct i2c_client
*client
= dev
->client
;
641 struct dtv_frontend_properties
*c
= &fe
->dtv_property_cache
;
647 dev_dbg(&client
->dev
, "\n");
653 ret
= rtl2832_rd_demod_reg(dev
, DVBT_FSM_STAGE
, &tmp
);
658 *status
|= FE_HAS_SIGNAL
| FE_HAS_CARRIER
|
659 FE_HAS_VITERBI
| FE_HAS_SYNC
| FE_HAS_LOCK
;
660 } else if (tmp
== 10) {
661 *status
|= FE_HAS_SIGNAL
| FE_HAS_CARRIER
|
665 dev
->fe_status
= *status
;
667 /* signal strength */
668 if (dev
->fe_status
& FE_HAS_SIGNAL
) {
669 /* read digital AGC */
670 ret
= regmap_bulk_read(dev
->regmap
, 0x305, &u8tmp
, 1);
674 dev_dbg(&client
->dev
, "digital agc=%02x", u8tmp
);
677 u16tmp
= u8tmp
<< 8 | u8tmp
<< 0;
679 c
->strength
.stat
[0].scale
= FE_SCALE_RELATIVE
;
680 c
->strength
.stat
[0].uvalue
= u16tmp
;
682 c
->strength
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
686 if (dev
->fe_status
& FE_HAS_VITERBI
) {
687 unsigned hierarchy
, constellation
;
688 #define CONSTELLATION_NUM 3
689 #define HIERARCHY_NUM 4
690 static const u32 constant
[CONSTELLATION_NUM
][HIERARCHY_NUM
] = {
691 {85387325, 85387325, 85387325, 85387325},
692 {86676178, 86676178, 87167949, 87795660},
693 {87659938, 87659938, 87885178, 88241743},
696 ret
= regmap_bulk_read(dev
->regmap
, 0x33c, &u8tmp
, 1);
700 constellation
= (u8tmp
>> 2) & 0x03; /* [3:2] */
701 if (constellation
> CONSTELLATION_NUM
- 1)
704 hierarchy
= (u8tmp
>> 4) & 0x07; /* [6:4] */
705 if (hierarchy
> HIERARCHY_NUM
- 1)
708 ret
= regmap_bulk_read(dev
->regmap
, 0x40c, buf
, 2);
712 u16tmp
= buf
[0] << 8 | buf
[1] << 0;
714 tmp
= (constant
[constellation
][hierarchy
] -
715 intlog10(u16tmp
)) / ((1 << 24) / 10000);
719 dev_dbg(&client
->dev
, "cnr raw=%u\n", u16tmp
);
721 c
->cnr
.stat
[0].scale
= FE_SCALE_DECIBEL
;
722 c
->cnr
.stat
[0].svalue
= tmp
;
724 c
->cnr
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
728 if (dev
->fe_status
& FE_HAS_LOCK
) {
729 ret
= regmap_bulk_read(dev
->regmap
, 0x34e, buf
, 2);
733 u16tmp
= buf
[0] << 8 | buf
[1] << 0;
734 dev
->post_bit_error
+= u16tmp
;
735 dev
->post_bit_count
+= 1000000;
737 dev_dbg(&client
->dev
, "ber errors=%u total=1000000\n", u16tmp
);
739 c
->post_bit_error
.stat
[0].scale
= FE_SCALE_COUNTER
;
740 c
->post_bit_error
.stat
[0].uvalue
= dev
->post_bit_error
;
741 c
->post_bit_count
.stat
[0].scale
= FE_SCALE_COUNTER
;
742 c
->post_bit_count
.stat
[0].uvalue
= dev
->post_bit_count
;
744 c
->post_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
745 c
->post_bit_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
750 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
754 static int rtl2832_read_snr(struct dvb_frontend
*fe
, u16
*snr
)
756 struct dtv_frontend_properties
*c
= &fe
->dtv_property_cache
;
758 /* report SNR in resolution of 0.1 dB */
759 if (c
->cnr
.stat
[0].scale
== FE_SCALE_DECIBEL
)
760 *snr
= div_s64(c
->cnr
.stat
[0].svalue
, 100);
767 static int rtl2832_read_ber(struct dvb_frontend
*fe
, u32
*ber
)
769 struct rtl2832_dev
*dev
= fe
->demodulator_priv
;
771 *ber
= (dev
->post_bit_error
- dev
->post_bit_error_prev
);
772 dev
->post_bit_error_prev
= dev
->post_bit_error
;
778 * I2C gate/mux/repeater logic
779 * There is delay mechanism to avoid unneeded I2C gate open / close. Gate close
780 * is delayed here a little bit in order to see if there is sequence of I2C
781 * messages sent to same I2C bus.
783 static void rtl2832_i2c_gate_work(struct work_struct
*work
)
785 struct rtl2832_dev
*dev
= container_of(work
, struct rtl2832_dev
, i2c_gate_work
.work
);
786 struct i2c_client
*client
= dev
->client
;
790 ret
= regmap_update_bits(dev
->regmap
, 0x101, 0x08, 0x00);
796 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
799 static int rtl2832_select(struct i2c_mux_core
*muxc
, u32 chan_id
)
801 struct rtl2832_dev
*dev
= i2c_mux_priv(muxc
);
802 struct i2c_client
*client
= dev
->client
;
805 /* terminate possible gate closing */
806 cancel_delayed_work(&dev
->i2c_gate_work
);
809 ret
= regmap_update_bits(dev
->regmap
, 0x101, 0x08, 0x08);
815 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
819 static int rtl2832_deselect(struct i2c_mux_core
*muxc
, u32 chan_id
)
821 struct rtl2832_dev
*dev
= i2c_mux_priv(muxc
);
823 schedule_delayed_work(&dev
->i2c_gate_work
, usecs_to_jiffies(100));
827 static const struct dvb_frontend_ops rtl2832_ops
= {
828 .delsys
= { SYS_DVBT
},
830 .name
= "Realtek RTL2832 (DVB-T)",
831 .frequency_min_hz
= 174 * MHz
,
832 .frequency_max_hz
= 862 * MHz
,
833 .frequency_stepsize_hz
= 166667,
834 .caps
= FE_CAN_FEC_1_2
|
844 FE_CAN_TRANSMISSION_MODE_AUTO
|
845 FE_CAN_GUARD_INTERVAL_AUTO
|
846 FE_CAN_HIERARCHY_AUTO
|
851 .init
= rtl2832_init
,
852 .sleep
= rtl2832_sleep
,
854 .get_tune_settings
= rtl2832_get_tune_settings
,
856 .set_frontend
= rtl2832_set_frontend
,
857 .get_frontend
= rtl2832_get_frontend
,
859 .read_status
= rtl2832_read_status
,
860 .read_snr
= rtl2832_read_snr
,
861 .read_ber
= rtl2832_read_ber
,
864 static bool rtl2832_volatile_reg(struct device
*dev
, unsigned int reg
)
871 case 0x40c ... 0x40d:
880 static struct dvb_frontend
*rtl2832_get_dvb_frontend(struct i2c_client
*client
)
882 struct rtl2832_dev
*dev
= i2c_get_clientdata(client
);
884 dev_dbg(&client
->dev
, "\n");
888 static struct i2c_adapter
*rtl2832_get_i2c_adapter(struct i2c_client
*client
)
890 struct rtl2832_dev
*dev
= i2c_get_clientdata(client
);
892 dev_dbg(&client
->dev
, "\n");
893 return dev
->muxc
->adapter
[0];
896 static int rtl2832_slave_ts_ctrl(struct i2c_client
*client
, bool enable
)
898 struct rtl2832_dev
*dev
= i2c_get_clientdata(client
);
901 dev_dbg(&client
->dev
, "enable=%d\n", enable
);
904 ret
= rtl2832_wr_demod_reg(dev
, DVBT_SOFT_RST
, 0x0);
907 ret
= regmap_bulk_write(dev
->regmap
, 0x10c, "\x5f\xff", 2);
910 ret
= rtl2832_wr_demod_reg(dev
, DVBT_PIP_ON
, 0x1);
913 ret
= regmap_bulk_write(dev
->regmap
, 0x0bc, "\x18", 1);
916 ret
= regmap_bulk_write(dev
->regmap
, 0x192, "\x7f\xf7\xff", 3);
920 ret
= regmap_bulk_write(dev
->regmap
, 0x192, "\x00\x0f\xff", 3);
923 ret
= regmap_bulk_write(dev
->regmap
, 0x0bc, "\x08", 1);
926 ret
= rtl2832_wr_demod_reg(dev
, DVBT_PIP_ON
, 0x0);
929 ret
= regmap_bulk_write(dev
->regmap
, 0x10c, "\x00\x00", 2);
932 ret
= rtl2832_wr_demod_reg(dev
, DVBT_SOFT_RST
, 0x1);
937 dev
->slave_ts
= enable
;
941 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
945 static int rtl2832_pid_filter_ctrl(struct dvb_frontend
*fe
, int onoff
)
947 struct rtl2832_dev
*dev
= fe
->demodulator_priv
;
948 struct i2c_client
*client
= dev
->client
;
952 dev_dbg(&client
->dev
, "onoff=%d, slave_ts=%d\n", onoff
, dev
->slave_ts
);
954 /* enable / disable PID filter */
961 ret
= regmap_update_bits(dev
->regmap
, 0x021, 0xc0, u8tmp
);
963 ret
= regmap_update_bits(dev
->regmap
, 0x061, 0xc0, u8tmp
);
969 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
973 static int rtl2832_pid_filter(struct dvb_frontend
*fe
, u8 index
, u16 pid
,
976 struct rtl2832_dev
*dev
= fe
->demodulator_priv
;
977 struct i2c_client
*client
= dev
->client
;
981 dev_dbg(&client
->dev
, "index=%d pid=%04x onoff=%d slave_ts=%d\n",
982 index
, pid
, onoff
, dev
->slave_ts
);
984 /* skip invalid PIDs (0x2000) */
985 if (pid
> 0x1fff || index
> 32)
989 set_bit(index
, &dev
->filters
);
991 clear_bit(index
, &dev
->filters
);
993 /* enable / disable PIDs */
994 buf
[0] = (dev
->filters
>> 0) & 0xff;
995 buf
[1] = (dev
->filters
>> 8) & 0xff;
996 buf
[2] = (dev
->filters
>> 16) & 0xff;
997 buf
[3] = (dev
->filters
>> 24) & 0xff;
1000 ret
= regmap_bulk_write(dev
->regmap
, 0x022, buf
, 4);
1002 ret
= regmap_bulk_write(dev
->regmap
, 0x062, buf
, 4);
1007 buf
[0] = (pid
>> 8) & 0xff;
1008 buf
[1] = (pid
>> 0) & 0xff;
1011 ret
= regmap_bulk_write(dev
->regmap
, 0x026 + 2 * index
, buf
, 2);
1013 ret
= regmap_bulk_write(dev
->regmap
, 0x066 + 2 * index
, buf
, 2);
1019 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
1023 static int rtl2832_probe(struct i2c_client
*client
,
1024 const struct i2c_device_id
*id
)
1026 struct rtl2832_platform_data
*pdata
= client
->dev
.platform_data
;
1027 struct i2c_adapter
*i2c
= client
->adapter
;
1028 struct rtl2832_dev
*dev
;
1031 static const struct regmap_range_cfg regmap_range_cfg
[] = {
1033 .selector_reg
= 0x00,
1034 .selector_mask
= 0xff,
1035 .selector_shift
= 0,
1037 .window_len
= 0x100,
1038 .range_min
= 0 * 0x100,
1039 .range_max
= 5 * 0x100,
1043 dev_dbg(&client
->dev
, "\n");
1045 /* allocate memory for the internal state */
1046 dev
= kzalloc(sizeof(struct rtl2832_dev
), GFP_KERNEL
);
1052 /* setup the state */
1053 i2c_set_clientdata(client
, dev
);
1054 dev
->client
= client
;
1055 dev
->pdata
= client
->dev
.platform_data
;
1056 dev
->sleeping
= true;
1057 INIT_DELAYED_WORK(&dev
->i2c_gate_work
, rtl2832_i2c_gate_work
);
1059 dev
->regmap_config
.reg_bits
= 8;
1060 dev
->regmap_config
.val_bits
= 8;
1061 dev
->regmap_config
.volatile_reg
= rtl2832_volatile_reg
;
1062 dev
->regmap_config
.max_register
= 5 * 0x100;
1063 dev
->regmap_config
.ranges
= regmap_range_cfg
;
1064 dev
->regmap_config
.num_ranges
= ARRAY_SIZE(regmap_range_cfg
);
1065 dev
->regmap_config
.cache_type
= REGCACHE_NONE
;
1066 dev
->regmap
= regmap_init_i2c(client
, &dev
->regmap_config
);
1067 if (IS_ERR(dev
->regmap
)) {
1068 ret
= PTR_ERR(dev
->regmap
);
1072 /* check if the demod is there */
1073 ret
= regmap_bulk_read(dev
->regmap
, 0x000, &tmp
, 1);
1075 goto err_regmap_exit
;
1077 /* create muxed i2c adapter for demod tuner bus */
1078 dev
->muxc
= i2c_mux_alloc(i2c
, &i2c
->dev
, 1, 0, I2C_MUX_LOCKED
,
1079 rtl2832_select
, rtl2832_deselect
);
1082 goto err_regmap_exit
;
1084 dev
->muxc
->priv
= dev
;
1085 ret
= i2c_mux_add_adapter(dev
->muxc
, 0, 0, 0);
1087 goto err_regmap_exit
;
1089 /* create dvb_frontend */
1090 memcpy(&dev
->fe
.ops
, &rtl2832_ops
, sizeof(struct dvb_frontend_ops
));
1091 dev
->fe
.demodulator_priv
= dev
;
1093 /* setup callbacks */
1094 pdata
->get_dvb_frontend
= rtl2832_get_dvb_frontend
;
1095 pdata
->get_i2c_adapter
= rtl2832_get_i2c_adapter
;
1096 pdata
->slave_ts_ctrl
= rtl2832_slave_ts_ctrl
;
1097 pdata
->pid_filter
= rtl2832_pid_filter
;
1098 pdata
->pid_filter_ctrl
= rtl2832_pid_filter_ctrl
;
1099 pdata
->regmap
= dev
->regmap
;
1101 dev_info(&client
->dev
, "Realtek RTL2832 successfully attached\n");
1104 regmap_exit(dev
->regmap
);
1108 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
1112 static int rtl2832_remove(struct i2c_client
*client
)
1114 struct rtl2832_dev
*dev
= i2c_get_clientdata(client
);
1116 dev_dbg(&client
->dev
, "\n");
1118 cancel_delayed_work_sync(&dev
->i2c_gate_work
);
1120 i2c_mux_del_adapters(dev
->muxc
);
1122 regmap_exit(dev
->regmap
);
1129 static const struct i2c_device_id rtl2832_id_table
[] = {
1133 MODULE_DEVICE_TABLE(i2c
, rtl2832_id_table
);
1135 static struct i2c_driver rtl2832_driver
= {
1138 .suppress_bind_attrs
= true,
1140 .probe
= rtl2832_probe
,
1141 .remove
= rtl2832_remove
,
1142 .id_table
= rtl2832_id_table
,
1145 module_i2c_driver(rtl2832_driver
);
1147 MODULE_AUTHOR("Thomas Mair <mair.thomas86@gmail.com>");
1148 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1149 MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
1150 MODULE_LICENSE("GPL");