2 * Realtek RTL2832 DVB-T demodulator driver
4 * Copyright (C) 2012 Thomas Mair <thomas.mair86@gmail.com>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 #include "rtl2832_priv.h"
23 #include <linux/bitops.h>
25 /* Max transfer size done by I2C transfer functions */
26 #define MAX_XFER_SIZE 64
29 module_param_named(debug
, rtl2832_debug
, int, 0644);
30 MODULE_PARM_DESC(debug
, "Turn on/off frontend debugging (default:off).");
32 #define REG_MASK(b) (BIT(b + 1) - 1)
34 static const struct rtl2832_reg_entry registers
[] = {
35 [DVBT_SOFT_RST
] = {0x1, 0x1, 2, 2},
36 [DVBT_IIC_REPEAT
] = {0x1, 0x1, 3, 3},
37 [DVBT_TR_WAIT_MIN_8K
] = {0x1, 0x88, 11, 2},
38 [DVBT_RSD_BER_FAIL_VAL
] = {0x1, 0x8f, 15, 0},
39 [DVBT_EN_BK_TRK
] = {0x1, 0xa6, 7, 7},
40 [DVBT_AD_EN_REG
] = {0x0, 0x8, 7, 7},
41 [DVBT_AD_EN_REG1
] = {0x0, 0x8, 6, 6},
42 [DVBT_EN_BBIN
] = {0x1, 0xb1, 0, 0},
43 [DVBT_MGD_THD0
] = {0x1, 0x95, 7, 0},
44 [DVBT_MGD_THD1
] = {0x1, 0x96, 7, 0},
45 [DVBT_MGD_THD2
] = {0x1, 0x97, 7, 0},
46 [DVBT_MGD_THD3
] = {0x1, 0x98, 7, 0},
47 [DVBT_MGD_THD4
] = {0x1, 0x99, 7, 0},
48 [DVBT_MGD_THD5
] = {0x1, 0x9a, 7, 0},
49 [DVBT_MGD_THD6
] = {0x1, 0x9b, 7, 0},
50 [DVBT_MGD_THD7
] = {0x1, 0x9c, 7, 0},
51 [DVBT_EN_CACQ_NOTCH
] = {0x1, 0x61, 4, 4},
52 [DVBT_AD_AV_REF
] = {0x0, 0x9, 6, 0},
53 [DVBT_REG_PI
] = {0x0, 0xa, 2, 0},
54 [DVBT_PIP_ON
] = {0x0, 0x21, 3, 3},
55 [DVBT_SCALE1_B92
] = {0x2, 0x92, 7, 0},
56 [DVBT_SCALE1_B93
] = {0x2, 0x93, 7, 0},
57 [DVBT_SCALE1_BA7
] = {0x2, 0xa7, 7, 0},
58 [DVBT_SCALE1_BA9
] = {0x2, 0xa9, 7, 0},
59 [DVBT_SCALE1_BAA
] = {0x2, 0xaa, 7, 0},
60 [DVBT_SCALE1_BAB
] = {0x2, 0xab, 7, 0},
61 [DVBT_SCALE1_BAC
] = {0x2, 0xac, 7, 0},
62 [DVBT_SCALE1_BB0
] = {0x2, 0xb0, 7, 0},
63 [DVBT_SCALE1_BB1
] = {0x2, 0xb1, 7, 0},
64 [DVBT_KB_P1
] = {0x1, 0x64, 3, 1},
65 [DVBT_KB_P2
] = {0x1, 0x64, 6, 4},
66 [DVBT_KB_P3
] = {0x1, 0x65, 2, 0},
67 [DVBT_OPT_ADC_IQ
] = {0x0, 0x6, 5, 4},
68 [DVBT_AD_AVI
] = {0x0, 0x9, 1, 0},
69 [DVBT_AD_AVQ
] = {0x0, 0x9, 3, 2},
70 [DVBT_K1_CR_STEP12
] = {0x2, 0xad, 9, 4},
71 [DVBT_TRK_KS_P2
] = {0x1, 0x6f, 2, 0},
72 [DVBT_TRK_KS_I2
] = {0x1, 0x70, 5, 3},
73 [DVBT_TR_THD_SET2
] = {0x1, 0x72, 3, 0},
74 [DVBT_TRK_KC_P2
] = {0x1, 0x73, 5, 3},
75 [DVBT_TRK_KC_I2
] = {0x1, 0x75, 2, 0},
76 [DVBT_CR_THD_SET2
] = {0x1, 0x76, 7, 6},
77 [DVBT_PSET_IFFREQ
] = {0x1, 0x19, 21, 0},
78 [DVBT_SPEC_INV
] = {0x1, 0x15, 0, 0},
79 [DVBT_RSAMP_RATIO
] = {0x1, 0x9f, 27, 2},
80 [DVBT_CFREQ_OFF_RATIO
] = {0x1, 0x9d, 23, 4},
81 [DVBT_FSM_STAGE
] = {0x3, 0x51, 6, 3},
82 [DVBT_RX_CONSTEL
] = {0x3, 0x3c, 3, 2},
83 [DVBT_RX_HIER
] = {0x3, 0x3c, 6, 4},
84 [DVBT_RX_C_RATE_LP
] = {0x3, 0x3d, 2, 0},
85 [DVBT_RX_C_RATE_HP
] = {0x3, 0x3d, 5, 3},
86 [DVBT_GI_IDX
] = {0x3, 0x51, 1, 0},
87 [DVBT_FFT_MODE_IDX
] = {0x3, 0x51, 2, 2},
88 [DVBT_RSD_BER_EST
] = {0x3, 0x4e, 15, 0},
89 [DVBT_CE_EST_EVM
] = {0x4, 0xc, 15, 0},
90 [DVBT_RF_AGC_VAL
] = {0x3, 0x5b, 13, 0},
91 [DVBT_IF_AGC_VAL
] = {0x3, 0x59, 13, 0},
92 [DVBT_DAGC_VAL
] = {0x3, 0x5, 7, 0},
93 [DVBT_SFREQ_OFF
] = {0x3, 0x18, 13, 0},
94 [DVBT_CFREQ_OFF
] = {0x3, 0x5f, 17, 0},
95 [DVBT_POLAR_RF_AGC
] = {0x0, 0xe, 1, 1},
96 [DVBT_POLAR_IF_AGC
] = {0x0, 0xe, 0, 0},
97 [DVBT_AAGC_HOLD
] = {0x1, 0x4, 5, 5},
98 [DVBT_EN_RF_AGC
] = {0x1, 0x4, 6, 6},
99 [DVBT_EN_IF_AGC
] = {0x1, 0x4, 7, 7},
100 [DVBT_IF_AGC_MIN
] = {0x1, 0x8, 7, 0},
101 [DVBT_IF_AGC_MAX
] = {0x1, 0x9, 7, 0},
102 [DVBT_RF_AGC_MIN
] = {0x1, 0xa, 7, 0},
103 [DVBT_RF_AGC_MAX
] = {0x1, 0xb, 7, 0},
104 [DVBT_IF_AGC_MAN
] = {0x1, 0xc, 6, 6},
105 [DVBT_IF_AGC_MAN_VAL
] = {0x1, 0xc, 13, 0},
106 [DVBT_RF_AGC_MAN
] = {0x1, 0xe, 6, 6},
107 [DVBT_RF_AGC_MAN_VAL
] = {0x1, 0xe, 13, 0},
108 [DVBT_DAGC_TRG_VAL
] = {0x1, 0x12, 7, 0},
109 [DVBT_AGC_TARG_VAL_0
] = {0x1, 0x2, 0, 0},
110 [DVBT_AGC_TARG_VAL_8_1
] = {0x1, 0x3, 7, 0},
111 [DVBT_AAGC_LOOP_GAIN
] = {0x1, 0xc7, 5, 1},
112 [DVBT_LOOP_GAIN2_3_0
] = {0x1, 0x4, 4, 1},
113 [DVBT_LOOP_GAIN2_4
] = {0x1, 0x5, 7, 7},
114 [DVBT_LOOP_GAIN3
] = {0x1, 0xc8, 4, 0},
115 [DVBT_VTOP1
] = {0x1, 0x6, 5, 0},
116 [DVBT_VTOP2
] = {0x1, 0xc9, 5, 0},
117 [DVBT_VTOP3
] = {0x1, 0xca, 5, 0},
118 [DVBT_KRF1
] = {0x1, 0xcb, 7, 0},
119 [DVBT_KRF2
] = {0x1, 0x7, 7, 0},
120 [DVBT_KRF3
] = {0x1, 0xcd, 7, 0},
121 [DVBT_KRF4
] = {0x1, 0xce, 7, 0},
122 [DVBT_EN_GI_PGA
] = {0x1, 0xe5, 0, 0},
123 [DVBT_THD_LOCK_UP
] = {0x1, 0xd9, 8, 0},
124 [DVBT_THD_LOCK_DW
] = {0x1, 0xdb, 8, 0},
125 [DVBT_THD_UP1
] = {0x1, 0xdd, 7, 0},
126 [DVBT_THD_DW1
] = {0x1, 0xde, 7, 0},
127 [DVBT_INTER_CNT_LEN
] = {0x1, 0xd8, 3, 0},
128 [DVBT_GI_PGA_STATE
] = {0x1, 0xe6, 3, 3},
129 [DVBT_EN_AGC_PGA
] = {0x1, 0xd7, 0, 0},
130 [DVBT_CKOUTPAR
] = {0x1, 0x7b, 5, 5},
131 [DVBT_CKOUT_PWR
] = {0x1, 0x7b, 6, 6},
132 [DVBT_SYNC_DUR
] = {0x1, 0x7b, 7, 7},
133 [DVBT_ERR_DUR
] = {0x1, 0x7c, 0, 0},
134 [DVBT_SYNC_LVL
] = {0x1, 0x7c, 1, 1},
135 [DVBT_ERR_LVL
] = {0x1, 0x7c, 2, 2},
136 [DVBT_VAL_LVL
] = {0x1, 0x7c, 3, 3},
137 [DVBT_SERIAL
] = {0x1, 0x7c, 4, 4},
138 [DVBT_SER_LSB
] = {0x1, 0x7c, 5, 5},
139 [DVBT_CDIV_PH0
] = {0x1, 0x7d, 3, 0},
140 [DVBT_CDIV_PH1
] = {0x1, 0x7d, 7, 4},
141 [DVBT_MPEG_IO_OPT_2_2
] = {0x0, 0x6, 7, 7},
142 [DVBT_MPEG_IO_OPT_1_0
] = {0x0, 0x7, 7, 6},
143 [DVBT_CKOUTPAR_PIP
] = {0x0, 0xb7, 4, 4},
144 [DVBT_CKOUT_PWR_PIP
] = {0x0, 0xb7, 3, 3},
145 [DVBT_SYNC_LVL_PIP
] = {0x0, 0xb7, 2, 2},
146 [DVBT_ERR_LVL_PIP
] = {0x0, 0xb7, 1, 1},
147 [DVBT_VAL_LVL_PIP
] = {0x0, 0xb7, 0, 0},
148 [DVBT_CKOUTPAR_PID
] = {0x0, 0xb9, 4, 4},
149 [DVBT_CKOUT_PWR_PID
] = {0x0, 0xb9, 3, 3},
150 [DVBT_SYNC_LVL_PID
] = {0x0, 0xb9, 2, 2},
151 [DVBT_ERR_LVL_PID
] = {0x0, 0xb9, 1, 1},
152 [DVBT_VAL_LVL_PID
] = {0x0, 0xb9, 0, 0},
153 [DVBT_SM_PASS
] = {0x1, 0x93, 11, 0},
154 [DVBT_AD7_SETTING
] = {0x0, 0x11, 15, 0},
155 [DVBT_RSSI_R
] = {0x3, 0x1, 6, 0},
156 [DVBT_ACI_DET_IND
] = {0x3, 0x12, 0, 0},
157 [DVBT_REG_MON
] = {0x0, 0xd, 1, 0},
158 [DVBT_REG_MONSEL
] = {0x0, 0xd, 2, 2},
159 [DVBT_REG_GPE
] = {0x0, 0xd, 7, 7},
160 [DVBT_REG_GPO
] = {0x0, 0x10, 0, 0},
161 [DVBT_REG_4MSEL
] = {0x0, 0x13, 0, 0},
164 /* write multiple hardware registers */
165 static int rtl2832_wr(struct rtl2832_priv
*priv
, u8 reg
, u8
*val
, int len
)
168 u8 buf
[MAX_XFER_SIZE
];
169 struct i2c_msg msg
[1] = {
171 .addr
= priv
->cfg
.i2c_addr
,
178 if (1 + len
> sizeof(buf
)) {
179 dev_warn(&priv
->i2c
->dev
,
180 "%s: i2c wr reg=%04x: len=%d is too big!\n",
181 KBUILD_MODNAME
, reg
, len
);
186 memcpy(&buf
[1], val
, len
);
188 ret
= i2c_transfer(priv
->i2c
, msg
, 1);
192 dev_warn(&priv
->i2c
->dev
, "%s: i2c wr failed=%d reg=%02x " \
193 "len=%d\n", KBUILD_MODNAME
, ret
, reg
, len
);
199 /* read multiple hardware registers */
200 static int rtl2832_rd(struct rtl2832_priv
*priv
, u8 reg
, u8
*val
, int len
)
203 struct i2c_msg msg
[2] = {
205 .addr
= priv
->cfg
.i2c_addr
,
210 .addr
= priv
->cfg
.i2c_addr
,
217 ret
= i2c_transfer(priv
->i2c
, msg
, 2);
221 dev_warn(&priv
->i2c
->dev
, "%s: i2c rd failed=%d reg=%02x " \
222 "len=%d\n", KBUILD_MODNAME
, ret
, reg
, len
);
228 /* write multiple registers */
229 static int rtl2832_wr_regs(struct rtl2832_priv
*priv
, u8 reg
, u8 page
, u8
*val
,
234 /* switch bank if needed */
235 if (page
!= priv
->page
) {
236 ret
= rtl2832_wr(priv
, 0x00, &page
, 1);
243 return rtl2832_wr(priv
, reg
, val
, len
);
246 /* read multiple registers */
247 static int rtl2832_rd_regs(struct rtl2832_priv
*priv
, u8 reg
, u8 page
, u8
*val
,
252 /* switch bank if needed */
253 if (page
!= priv
->page
) {
254 ret
= rtl2832_wr(priv
, 0x00, &page
, 1);
261 return rtl2832_rd(priv
, reg
, val
, len
);
264 #if 0 /* currently not used */
265 /* write single register */
266 static int rtl2832_wr_reg(struct rtl2832_priv
*priv
, u8 reg
, u8 page
, u8 val
)
268 return rtl2832_wr_regs(priv
, reg
, page
, &val
, 1);
272 /* read single register */
273 static int rtl2832_rd_reg(struct rtl2832_priv
*priv
, u8 reg
, u8 page
, u8
*val
)
275 return rtl2832_rd_regs(priv
, reg
, page
, val
, 1);
278 static int rtl2832_rd_demod_reg(struct rtl2832_priv
*priv
, int reg
, u32
*val
)
292 reg_start_addr
= registers
[reg
].start_address
;
293 msb
= registers
[reg
].msb
;
294 lsb
= registers
[reg
].lsb
;
295 page
= registers
[reg
].page
;
297 len
= (msb
>> 3) + 1;
298 mask
= REG_MASK(msb
- lsb
);
300 ret
= rtl2832_rd_regs(priv
, reg_start_addr
, page
, &reading
[0], len
);
305 for (i
= 0; i
< len
; i
++)
306 reading_tmp
|= reading
[i
] << ((len
- 1 - i
) * 8);
308 *val
= (reading_tmp
>> lsb
) & mask
;
313 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
318 static int rtl2832_wr_demod_reg(struct rtl2832_priv
*priv
, int reg
, u32 val
)
334 reg_start_addr
= registers
[reg
].start_address
;
335 msb
= registers
[reg
].msb
;
336 lsb
= registers
[reg
].lsb
;
337 page
= registers
[reg
].page
;
339 len
= (msb
>> 3) + 1;
340 mask
= REG_MASK(msb
- lsb
);
343 ret
= rtl2832_rd_regs(priv
, reg_start_addr
, page
, &reading
[0], len
);
348 for (i
= 0; i
< len
; i
++)
349 reading_tmp
|= reading
[i
] << ((len
- 1 - i
) * 8);
351 writing_tmp
= reading_tmp
& ~(mask
<< lsb
);
352 writing_tmp
|= ((val
& mask
) << lsb
);
355 for (i
= 0; i
< len
; i
++)
356 writing
[i
] = (writing_tmp
>> ((len
- 1 - i
) * 8)) & 0xff;
358 ret
= rtl2832_wr_regs(priv
, reg_start_addr
, page
, &writing
[0], len
);
365 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
370 static int rtl2832_i2c_gate_ctrl(struct dvb_frontend
*fe
, int enable
)
373 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
375 dev_dbg(&priv
->i2c
->dev
, "%s: enable=%d\n", __func__
, enable
);
377 /* gate already open or close */
378 if (priv
->i2c_gate_state
== enable
)
381 ret
= rtl2832_wr_demod_reg(priv
, DVBT_IIC_REPEAT
, (enable
? 0x1 : 0x0));
385 priv
->i2c_gate_state
= enable
;
389 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
394 static int rtl2832_set_if(struct dvb_frontend
*fe
, u32 if_freq
)
396 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
399 u8 en_bbin
= (if_freq
== 0 ? 0x1 : 0x0);
402 * PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
406 pset_iffreq
= if_freq
% priv
->cfg
.xtal
;
407 pset_iffreq
*= 0x400000;
408 pset_iffreq
= div_u64(pset_iffreq
, priv
->cfg
.xtal
);
409 pset_iffreq
= -pset_iffreq
;
410 pset_iffreq
= pset_iffreq
& 0x3fffff;
411 dev_dbg(&priv
->i2c
->dev
, "%s: if_frequency=%d pset_iffreq=%08x\n",
412 __func__
, if_freq
, (unsigned)pset_iffreq
);
414 ret
= rtl2832_wr_demod_reg(priv
, DVBT_EN_BBIN
, en_bbin
);
418 ret
= rtl2832_wr_demod_reg(priv
, DVBT_PSET_IFFREQ
, pset_iffreq
);
423 static int rtl2832_init(struct dvb_frontend
*fe
)
425 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
426 const struct rtl2832_reg_value
*init
;
429 /* initialization values for the demodulator registers */
430 struct rtl2832_reg_value rtl2832_initial_regs
[] = {
431 {DVBT_AD_EN_REG
, 0x1},
432 {DVBT_AD_EN_REG1
, 0x1},
433 {DVBT_RSD_BER_FAIL_VAL
, 0x2800},
434 {DVBT_MGD_THD0
, 0x10},
435 {DVBT_MGD_THD1
, 0x20},
436 {DVBT_MGD_THD2
, 0x20},
437 {DVBT_MGD_THD3
, 0x40},
438 {DVBT_MGD_THD4
, 0x22},
439 {DVBT_MGD_THD5
, 0x32},
440 {DVBT_MGD_THD6
, 0x37},
441 {DVBT_MGD_THD7
, 0x39},
442 {DVBT_EN_BK_TRK
, 0x0},
443 {DVBT_EN_CACQ_NOTCH
, 0x0},
444 {DVBT_AD_AV_REF
, 0x2a},
447 {DVBT_CDIV_PH0
, 0x8},
448 {DVBT_CDIV_PH1
, 0x8},
449 {DVBT_SCALE1_B92
, 0x4},
450 {DVBT_SCALE1_B93
, 0xb0},
451 {DVBT_SCALE1_BA7
, 0x78},
452 {DVBT_SCALE1_BA9
, 0x28},
453 {DVBT_SCALE1_BAA
, 0x59},
454 {DVBT_SCALE1_BAB
, 0x83},
455 {DVBT_SCALE1_BAC
, 0xd4},
456 {DVBT_SCALE1_BB0
, 0x65},
457 {DVBT_SCALE1_BB1
, 0x43},
461 {DVBT_K1_CR_STEP12
, 0xa},
464 {DVBT_CDIV_PH0
, 0x9},
465 {DVBT_CDIV_PH1
, 0x9},
466 {DVBT_MPEG_IO_OPT_2_2
, 0x0},
467 {DVBT_MPEG_IO_OPT_1_0
, 0x0},
468 {DVBT_TRK_KS_P2
, 0x4},
469 {DVBT_TRK_KS_I2
, 0x7},
470 {DVBT_TR_THD_SET2
, 0x6},
471 {DVBT_TRK_KC_I2
, 0x5},
472 {DVBT_CR_THD_SET2
, 0x1},
475 dev_dbg(&priv
->i2c
->dev
, "%s:\n", __func__
);
477 for (i
= 0; i
< ARRAY_SIZE(rtl2832_initial_regs
); i
++) {
478 ret
= rtl2832_wr_demod_reg(priv
, rtl2832_initial_regs
[i
].reg
,
479 rtl2832_initial_regs
[i
].value
);
484 /* load tuner specific settings */
485 dev_dbg(&priv
->i2c
->dev
, "%s: load settings for tuner=%02x\n",
486 __func__
, priv
->cfg
.tuner
);
487 switch (priv
->cfg
.tuner
) {
488 case RTL2832_TUNER_FC0012
:
489 case RTL2832_TUNER_FC0013
:
490 len
= ARRAY_SIZE(rtl2832_tuner_init_fc0012
);
491 init
= rtl2832_tuner_init_fc0012
;
493 case RTL2832_TUNER_TUA9001
:
494 len
= ARRAY_SIZE(rtl2832_tuner_init_tua9001
);
495 init
= rtl2832_tuner_init_tua9001
;
497 case RTL2832_TUNER_E4000
:
498 len
= ARRAY_SIZE(rtl2832_tuner_init_e4000
);
499 init
= rtl2832_tuner_init_e4000
;
501 case RTL2832_TUNER_R820T
:
502 len
= ARRAY_SIZE(rtl2832_tuner_init_r820t
);
503 init
= rtl2832_tuner_init_r820t
;
510 for (i
= 0; i
< len
; i
++) {
511 ret
= rtl2832_wr_demod_reg(priv
, init
[i
].reg
, init
[i
].value
);
516 if (!fe
->ops
.tuner_ops
.get_if_frequency
) {
517 ret
= rtl2832_set_if(fe
, priv
->cfg
.if_dvbt
);
523 * r820t NIM code does a software reset here at the demod -
524 * may not be needed, as there's already a software reset at set_params()
528 ret
= rtl2832_wr_demod_reg(priv
, DVBT_SOFT_RST
, 0x1);
532 ret
= rtl2832_wr_demod_reg(priv
, DVBT_SOFT_RST
, 0x0);
537 priv
->sleeping
= false;
542 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
546 static int rtl2832_sleep(struct dvb_frontend
*fe
)
548 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
550 dev_dbg(&priv
->i2c
->dev
, "%s:\n", __func__
);
551 priv
->sleeping
= true;
555 static int rtl2832_get_tune_settings(struct dvb_frontend
*fe
,
556 struct dvb_frontend_tune_settings
*s
)
558 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
560 dev_dbg(&priv
->i2c
->dev
, "%s:\n", __func__
);
561 s
->min_delay_ms
= 1000;
562 s
->step_size
= fe
->ops
.info
.frequency_stepsize
* 2;
563 s
->max_drift
= (fe
->ops
.info
.frequency_stepsize
* 2) + 1;
567 static int rtl2832_set_frontend(struct dvb_frontend
*fe
)
569 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
570 struct dtv_frontend_properties
*c
= &fe
->dtv_property_cache
;
572 u64 bw_mode
, num
, num2
;
573 u32 resamp_ratio
, cfreq_off_ratio
;
574 static u8 bw_params
[3][32] = {
575 /* 6 MHz bandwidth */
577 0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
578 0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
579 0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
583 /* 7 MHz bandwidth */
585 0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
586 0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
587 0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
591 /* 8 MHz bandwidth */
593 0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
594 0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
595 0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
601 dev_dbg(&priv
->i2c
->dev
, "%s: frequency=%d bandwidth_hz=%d " \
602 "inversion=%d\n", __func__
, c
->frequency
,
603 c
->bandwidth_hz
, c
->inversion
);
606 if (fe
->ops
.tuner_ops
.set_params
)
607 fe
->ops
.tuner_ops
.set_params(fe
);
609 /* If the frontend has get_if_frequency(), use it */
610 if (fe
->ops
.tuner_ops
.get_if_frequency
) {
613 ret
= fe
->ops
.tuner_ops
.get_if_frequency(fe
, &if_freq
);
617 ret
= rtl2832_set_if(fe
, if_freq
);
622 switch (c
->bandwidth_hz
) {
636 dev_dbg(&priv
->i2c
->dev
, "%s: invalid bandwidth\n", __func__
);
640 for (j
= 0; j
< sizeof(bw_params
[0]); j
++) {
641 ret
= rtl2832_wr_regs(priv
, 0x1c+j
, 1, &bw_params
[i
][j
], 1);
646 /* calculate and set resample ratio
647 * RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
648 * / ConstWithBandwidthMode)
650 num
= priv
->cfg
.xtal
* 7;
652 num
= div_u64(num
, bw_mode
);
653 resamp_ratio
= num
& 0x3ffffff;
654 ret
= rtl2832_wr_demod_reg(priv
, DVBT_RSAMP_RATIO
, resamp_ratio
);
658 /* calculate and set cfreq off ratio
659 * CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
660 * / (CrystalFreqHz * 7))
663 num2
= priv
->cfg
.xtal
* 7;
664 num
= div_u64(num
, num2
);
666 cfreq_off_ratio
= num
& 0xfffff;
667 ret
= rtl2832_wr_demod_reg(priv
, DVBT_CFREQ_OFF_RATIO
, cfreq_off_ratio
);
673 ret
= rtl2832_wr_demod_reg(priv
, DVBT_SOFT_RST
, 0x1);
677 ret
= rtl2832_wr_demod_reg(priv
, DVBT_SOFT_RST
, 0x0);
683 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
687 static int rtl2832_get_frontend(struct dvb_frontend
*fe
)
689 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
690 struct dtv_frontend_properties
*c
= &fe
->dtv_property_cache
;
697 ret
= rtl2832_rd_regs(priv
, 0x3c, 3, buf
, 2);
701 ret
= rtl2832_rd_reg(priv
, 0x51, 3, &buf
[2]);
705 dev_dbg(&priv
->i2c
->dev
, "%s: TPS=%*ph\n", __func__
, 3, buf
);
707 switch ((buf
[0] >> 2) & 3) {
709 c
->modulation
= QPSK
;
712 c
->modulation
= QAM_16
;
715 c
->modulation
= QAM_64
;
719 switch ((buf
[2] >> 2) & 1) {
721 c
->transmission_mode
= TRANSMISSION_MODE_2K
;
724 c
->transmission_mode
= TRANSMISSION_MODE_8K
;
727 switch ((buf
[2] >> 0) & 3) {
729 c
->guard_interval
= GUARD_INTERVAL_1_32
;
732 c
->guard_interval
= GUARD_INTERVAL_1_16
;
735 c
->guard_interval
= GUARD_INTERVAL_1_8
;
738 c
->guard_interval
= GUARD_INTERVAL_1_4
;
742 switch ((buf
[0] >> 4) & 7) {
744 c
->hierarchy
= HIERARCHY_NONE
;
747 c
->hierarchy
= HIERARCHY_1
;
750 c
->hierarchy
= HIERARCHY_2
;
753 c
->hierarchy
= HIERARCHY_4
;
757 switch ((buf
[1] >> 3) & 7) {
759 c
->code_rate_HP
= FEC_1_2
;
762 c
->code_rate_HP
= FEC_2_3
;
765 c
->code_rate_HP
= FEC_3_4
;
768 c
->code_rate_HP
= FEC_5_6
;
771 c
->code_rate_HP
= FEC_7_8
;
775 switch ((buf
[1] >> 0) & 7) {
777 c
->code_rate_LP
= FEC_1_2
;
780 c
->code_rate_LP
= FEC_2_3
;
783 c
->code_rate_LP
= FEC_3_4
;
786 c
->code_rate_LP
= FEC_5_6
;
789 c
->code_rate_LP
= FEC_7_8
;
795 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
799 static int rtl2832_read_status(struct dvb_frontend
*fe
, fe_status_t
*status
)
801 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
806 dev_dbg(&priv
->i2c
->dev
, "%s:\n", __func__
);
810 ret
= rtl2832_rd_demod_reg(priv
, DVBT_FSM_STAGE
, &tmp
);
815 *status
|= FE_HAS_SIGNAL
| FE_HAS_CARRIER
|
816 FE_HAS_VITERBI
| FE_HAS_SYNC
| FE_HAS_LOCK
;
818 /* TODO find out if this is also true for rtl2832? */
819 /*else if (tmp == 10) {
820 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
826 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
830 static int rtl2832_read_snr(struct dvb_frontend
*fe
, u16
*snr
)
832 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
833 int ret
, hierarchy
, constellation
;
836 #define CONSTELLATION_NUM 3
837 #define HIERARCHY_NUM 4
838 static const u32 snr_constant
[CONSTELLATION_NUM
][HIERARCHY_NUM
] = {
839 { 85387325, 85387325, 85387325, 85387325 },
840 { 86676178, 86676178, 87167949, 87795660 },
841 { 87659938, 87659938, 87885178, 88241743 },
844 /* reports SNR in resolution of 0.1 dB */
846 ret
= rtl2832_rd_reg(priv
, 0x3c, 3, &tmp
);
850 constellation
= (tmp
>> 2) & 0x03; /* [3:2] */
851 if (constellation
> CONSTELLATION_NUM
- 1)
854 hierarchy
= (tmp
>> 4) & 0x07; /* [6:4] */
855 if (hierarchy
> HIERARCHY_NUM
- 1)
858 ret
= rtl2832_rd_regs(priv
, 0x0c, 4, buf
, 2);
862 tmp16
= buf
[0] << 8 | buf
[1];
865 *snr
= (snr_constant
[constellation
][hierarchy
] -
866 intlog10(tmp16
)) / ((1 << 24) / 100);
872 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
876 static int rtl2832_read_ber(struct dvb_frontend
*fe
, u32
*ber
)
878 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
882 ret
= rtl2832_rd_regs(priv
, 0x4e, 3, buf
, 2);
886 *ber
= buf
[0] << 8 | buf
[1];
890 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
894 static struct dvb_frontend_ops rtl2832_ops
;
896 static void rtl2832_release(struct dvb_frontend
*fe
)
898 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
900 dev_dbg(&priv
->i2c
->dev
, "%s:\n", __func__
);
904 struct dvb_frontend
*rtl2832_attach(const struct rtl2832_config
*cfg
,
905 struct i2c_adapter
*i2c
)
907 struct rtl2832_priv
*priv
= NULL
;
911 dev_dbg(&i2c
->dev
, "%s:\n", __func__
);
913 /* allocate memory for the internal state */
914 priv
= kzalloc(sizeof(struct rtl2832_priv
), GFP_KERNEL
);
920 priv
->tuner
= cfg
->tuner
;
921 memcpy(&priv
->cfg
, cfg
, sizeof(struct rtl2832_config
));
923 /* check if the demod is there */
924 ret
= rtl2832_rd_reg(priv
, 0x00, 0x0, &tmp
);
928 /* create dvb_frontend */
929 memcpy(&priv
->fe
.ops
, &rtl2832_ops
, sizeof(struct dvb_frontend_ops
));
930 priv
->fe
.demodulator_priv
= priv
;
932 /* TODO implement sleep mode */
933 priv
->sleeping
= true;
937 dev_dbg(&i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
941 EXPORT_SYMBOL(rtl2832_attach
);
943 static struct dvb_frontend_ops rtl2832_ops
= {
944 .delsys
= { SYS_DVBT
},
946 .name
= "Realtek RTL2832 (DVB-T)",
947 .frequency_min
= 174000000,
948 .frequency_max
= 862000000,
949 .frequency_stepsize
= 166667,
950 .caps
= FE_CAN_FEC_1_2
|
960 FE_CAN_TRANSMISSION_MODE_AUTO
|
961 FE_CAN_GUARD_INTERVAL_AUTO
|
962 FE_CAN_HIERARCHY_AUTO
|
967 .release
= rtl2832_release
,
969 .init
= rtl2832_init
,
970 .sleep
= rtl2832_sleep
,
972 .get_tune_settings
= rtl2832_get_tune_settings
,
974 .set_frontend
= rtl2832_set_frontend
,
975 .get_frontend
= rtl2832_get_frontend
,
977 .read_status
= rtl2832_read_status
,
978 .read_snr
= rtl2832_read_snr
,
979 .read_ber
= rtl2832_read_ber
,
981 .i2c_gate_ctrl
= rtl2832_i2c_gate_ctrl
,
984 MODULE_AUTHOR("Thomas Mair <mair.thomas86@gmail.com>");
985 MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
986 MODULE_LICENSE("GPL");
987 MODULE_VERSION("0.5");