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 case RTL2832_TUNER_R828D
:
503 len
= ARRAY_SIZE(rtl2832_tuner_init_r820t
);
504 init
= rtl2832_tuner_init_r820t
;
511 for (i
= 0; i
< len
; i
++) {
512 ret
= rtl2832_wr_demod_reg(priv
, init
[i
].reg
, init
[i
].value
);
517 if (!fe
->ops
.tuner_ops
.get_if_frequency
) {
518 ret
= rtl2832_set_if(fe
, priv
->cfg
.if_dvbt
);
524 * r820t NIM code does a software reset here at the demod -
525 * may not be needed, as there's already a software reset at set_params()
529 ret
= rtl2832_wr_demod_reg(priv
, DVBT_SOFT_RST
, 0x1);
533 ret
= rtl2832_wr_demod_reg(priv
, DVBT_SOFT_RST
, 0x0);
538 priv
->sleeping
= false;
543 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
547 static int rtl2832_sleep(struct dvb_frontend
*fe
)
549 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
551 dev_dbg(&priv
->i2c
->dev
, "%s:\n", __func__
);
552 priv
->sleeping
= true;
556 static int rtl2832_get_tune_settings(struct dvb_frontend
*fe
,
557 struct dvb_frontend_tune_settings
*s
)
559 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
561 dev_dbg(&priv
->i2c
->dev
, "%s:\n", __func__
);
562 s
->min_delay_ms
= 1000;
563 s
->step_size
= fe
->ops
.info
.frequency_stepsize
* 2;
564 s
->max_drift
= (fe
->ops
.info
.frequency_stepsize
* 2) + 1;
568 static int rtl2832_set_frontend(struct dvb_frontend
*fe
)
570 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
571 struct dtv_frontend_properties
*c
= &fe
->dtv_property_cache
;
573 u64 bw_mode
, num
, num2
;
574 u32 resamp_ratio
, cfreq_off_ratio
;
575 static u8 bw_params
[3][32] = {
576 /* 6 MHz bandwidth */
578 0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
579 0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
580 0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
584 /* 7 MHz bandwidth */
586 0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
587 0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
588 0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
592 /* 8 MHz bandwidth */
594 0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
595 0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
596 0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
602 dev_dbg(&priv
->i2c
->dev
, "%s: frequency=%d bandwidth_hz=%d " \
603 "inversion=%d\n", __func__
, c
->frequency
,
604 c
->bandwidth_hz
, c
->inversion
);
607 if (fe
->ops
.tuner_ops
.set_params
)
608 fe
->ops
.tuner_ops
.set_params(fe
);
610 /* If the frontend has get_if_frequency(), use it */
611 if (fe
->ops
.tuner_ops
.get_if_frequency
) {
614 ret
= fe
->ops
.tuner_ops
.get_if_frequency(fe
, &if_freq
);
618 ret
= rtl2832_set_if(fe
, if_freq
);
623 switch (c
->bandwidth_hz
) {
637 dev_dbg(&priv
->i2c
->dev
, "%s: invalid bandwidth\n", __func__
);
641 for (j
= 0; j
< sizeof(bw_params
[0]); j
++) {
642 ret
= rtl2832_wr_regs(priv
, 0x1c+j
, 1, &bw_params
[i
][j
], 1);
647 /* calculate and set resample ratio
648 * RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
649 * / ConstWithBandwidthMode)
651 num
= priv
->cfg
.xtal
* 7;
653 num
= div_u64(num
, bw_mode
);
654 resamp_ratio
= num
& 0x3ffffff;
655 ret
= rtl2832_wr_demod_reg(priv
, DVBT_RSAMP_RATIO
, resamp_ratio
);
659 /* calculate and set cfreq off ratio
660 * CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
661 * / (CrystalFreqHz * 7))
664 num2
= priv
->cfg
.xtal
* 7;
665 num
= div_u64(num
, num2
);
667 cfreq_off_ratio
= num
& 0xfffff;
668 ret
= rtl2832_wr_demod_reg(priv
, DVBT_CFREQ_OFF_RATIO
, cfreq_off_ratio
);
674 ret
= rtl2832_wr_demod_reg(priv
, DVBT_SOFT_RST
, 0x1);
678 ret
= rtl2832_wr_demod_reg(priv
, DVBT_SOFT_RST
, 0x0);
684 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
688 static int rtl2832_get_frontend(struct dvb_frontend
*fe
)
690 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
691 struct dtv_frontend_properties
*c
= &fe
->dtv_property_cache
;
698 ret
= rtl2832_rd_regs(priv
, 0x3c, 3, buf
, 2);
702 ret
= rtl2832_rd_reg(priv
, 0x51, 3, &buf
[2]);
706 dev_dbg(&priv
->i2c
->dev
, "%s: TPS=%*ph\n", __func__
, 3, buf
);
708 switch ((buf
[0] >> 2) & 3) {
710 c
->modulation
= QPSK
;
713 c
->modulation
= QAM_16
;
716 c
->modulation
= QAM_64
;
720 switch ((buf
[2] >> 2) & 1) {
722 c
->transmission_mode
= TRANSMISSION_MODE_2K
;
725 c
->transmission_mode
= TRANSMISSION_MODE_8K
;
728 switch ((buf
[2] >> 0) & 3) {
730 c
->guard_interval
= GUARD_INTERVAL_1_32
;
733 c
->guard_interval
= GUARD_INTERVAL_1_16
;
736 c
->guard_interval
= GUARD_INTERVAL_1_8
;
739 c
->guard_interval
= GUARD_INTERVAL_1_4
;
743 switch ((buf
[0] >> 4) & 7) {
745 c
->hierarchy
= HIERARCHY_NONE
;
748 c
->hierarchy
= HIERARCHY_1
;
751 c
->hierarchy
= HIERARCHY_2
;
754 c
->hierarchy
= HIERARCHY_4
;
758 switch ((buf
[1] >> 3) & 7) {
760 c
->code_rate_HP
= FEC_1_2
;
763 c
->code_rate_HP
= FEC_2_3
;
766 c
->code_rate_HP
= FEC_3_4
;
769 c
->code_rate_HP
= FEC_5_6
;
772 c
->code_rate_HP
= FEC_7_8
;
776 switch ((buf
[1] >> 0) & 7) {
778 c
->code_rate_LP
= FEC_1_2
;
781 c
->code_rate_LP
= FEC_2_3
;
784 c
->code_rate_LP
= FEC_3_4
;
787 c
->code_rate_LP
= FEC_5_6
;
790 c
->code_rate_LP
= FEC_7_8
;
796 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
800 static int rtl2832_read_status(struct dvb_frontend
*fe
, fe_status_t
*status
)
802 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
807 dev_dbg(&priv
->i2c
->dev
, "%s:\n", __func__
);
811 ret
= rtl2832_rd_demod_reg(priv
, DVBT_FSM_STAGE
, &tmp
);
816 *status
|= FE_HAS_SIGNAL
| FE_HAS_CARRIER
|
817 FE_HAS_VITERBI
| FE_HAS_SYNC
| FE_HAS_LOCK
;
819 /* TODO find out if this is also true for rtl2832? */
820 /*else if (tmp == 10) {
821 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
827 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
831 static int rtl2832_read_snr(struct dvb_frontend
*fe
, u16
*snr
)
833 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
834 int ret
, hierarchy
, constellation
;
837 #define CONSTELLATION_NUM 3
838 #define HIERARCHY_NUM 4
839 static const u32 snr_constant
[CONSTELLATION_NUM
][HIERARCHY_NUM
] = {
840 { 85387325, 85387325, 85387325, 85387325 },
841 { 86676178, 86676178, 87167949, 87795660 },
842 { 87659938, 87659938, 87885178, 88241743 },
845 /* reports SNR in resolution of 0.1 dB */
847 ret
= rtl2832_rd_reg(priv
, 0x3c, 3, &tmp
);
851 constellation
= (tmp
>> 2) & 0x03; /* [3:2] */
852 if (constellation
> CONSTELLATION_NUM
- 1)
855 hierarchy
= (tmp
>> 4) & 0x07; /* [6:4] */
856 if (hierarchy
> HIERARCHY_NUM
- 1)
859 ret
= rtl2832_rd_regs(priv
, 0x0c, 4, buf
, 2);
863 tmp16
= buf
[0] << 8 | buf
[1];
866 *snr
= (snr_constant
[constellation
][hierarchy
] -
867 intlog10(tmp16
)) / ((1 << 24) / 100);
873 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
877 static int rtl2832_read_ber(struct dvb_frontend
*fe
, u32
*ber
)
879 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
883 ret
= rtl2832_rd_regs(priv
, 0x4e, 3, buf
, 2);
887 *ber
= buf
[0] << 8 | buf
[1];
891 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
895 static struct dvb_frontend_ops rtl2832_ops
;
897 static void rtl2832_release(struct dvb_frontend
*fe
)
899 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
901 dev_dbg(&priv
->i2c
->dev
, "%s:\n", __func__
);
905 struct dvb_frontend
*rtl2832_attach(const struct rtl2832_config
*cfg
,
906 struct i2c_adapter
*i2c
)
908 struct rtl2832_priv
*priv
= NULL
;
912 dev_dbg(&i2c
->dev
, "%s:\n", __func__
);
914 /* allocate memory for the internal state */
915 priv
= kzalloc(sizeof(struct rtl2832_priv
), GFP_KERNEL
);
921 priv
->tuner
= cfg
->tuner
;
922 memcpy(&priv
->cfg
, cfg
, sizeof(struct rtl2832_config
));
924 /* check if the demod is there */
925 ret
= rtl2832_rd_reg(priv
, 0x00, 0x0, &tmp
);
929 /* create dvb_frontend */
930 memcpy(&priv
->fe
.ops
, &rtl2832_ops
, sizeof(struct dvb_frontend_ops
));
931 priv
->fe
.demodulator_priv
= priv
;
933 /* TODO implement sleep mode */
934 priv
->sleeping
= true;
938 dev_dbg(&i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
942 EXPORT_SYMBOL(rtl2832_attach
);
944 static struct dvb_frontend_ops rtl2832_ops
= {
945 .delsys
= { SYS_DVBT
},
947 .name
= "Realtek RTL2832 (DVB-T)",
948 .frequency_min
= 174000000,
949 .frequency_max
= 862000000,
950 .frequency_stepsize
= 166667,
951 .caps
= FE_CAN_FEC_1_2
|
961 FE_CAN_TRANSMISSION_MODE_AUTO
|
962 FE_CAN_GUARD_INTERVAL_AUTO
|
963 FE_CAN_HIERARCHY_AUTO
|
968 .release
= rtl2832_release
,
970 .init
= rtl2832_init
,
971 .sleep
= rtl2832_sleep
,
973 .get_tune_settings
= rtl2832_get_tune_settings
,
975 .set_frontend
= rtl2832_set_frontend
,
976 .get_frontend
= rtl2832_get_frontend
,
978 .read_status
= rtl2832_read_status
,
979 .read_snr
= rtl2832_read_snr
,
980 .read_ber
= rtl2832_read_ber
,
982 .i2c_gate_ctrl
= rtl2832_i2c_gate_ctrl
,
985 MODULE_AUTHOR("Thomas Mair <mair.thomas86@gmail.com>");
986 MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
987 MODULE_LICENSE("GPL");
988 MODULE_VERSION("0.5");