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
27 #define REG_MASK(b) (BIT(b + 1) - 1)
29 static const struct rtl2832_reg_entry registers
[] = {
30 [DVBT_SOFT_RST
] = {0x1, 0x1, 2, 2},
31 [DVBT_IIC_REPEAT
] = {0x1, 0x1, 3, 3},
32 [DVBT_TR_WAIT_MIN_8K
] = {0x1, 0x88, 11, 2},
33 [DVBT_RSD_BER_FAIL_VAL
] = {0x1, 0x8f, 15, 0},
34 [DVBT_EN_BK_TRK
] = {0x1, 0xa6, 7, 7},
35 [DVBT_AD_EN_REG
] = {0x0, 0x8, 7, 7},
36 [DVBT_AD_EN_REG1
] = {0x0, 0x8, 6, 6},
37 [DVBT_EN_BBIN
] = {0x1, 0xb1, 0, 0},
38 [DVBT_MGD_THD0
] = {0x1, 0x95, 7, 0},
39 [DVBT_MGD_THD1
] = {0x1, 0x96, 7, 0},
40 [DVBT_MGD_THD2
] = {0x1, 0x97, 7, 0},
41 [DVBT_MGD_THD3
] = {0x1, 0x98, 7, 0},
42 [DVBT_MGD_THD4
] = {0x1, 0x99, 7, 0},
43 [DVBT_MGD_THD5
] = {0x1, 0x9a, 7, 0},
44 [DVBT_MGD_THD6
] = {0x1, 0x9b, 7, 0},
45 [DVBT_MGD_THD7
] = {0x1, 0x9c, 7, 0},
46 [DVBT_EN_CACQ_NOTCH
] = {0x1, 0x61, 4, 4},
47 [DVBT_AD_AV_REF
] = {0x0, 0x9, 6, 0},
48 [DVBT_REG_PI
] = {0x0, 0xa, 2, 0},
49 [DVBT_PIP_ON
] = {0x0, 0x21, 3, 3},
50 [DVBT_SCALE1_B92
] = {0x2, 0x92, 7, 0},
51 [DVBT_SCALE1_B93
] = {0x2, 0x93, 7, 0},
52 [DVBT_SCALE1_BA7
] = {0x2, 0xa7, 7, 0},
53 [DVBT_SCALE1_BA9
] = {0x2, 0xa9, 7, 0},
54 [DVBT_SCALE1_BAA
] = {0x2, 0xaa, 7, 0},
55 [DVBT_SCALE1_BAB
] = {0x2, 0xab, 7, 0},
56 [DVBT_SCALE1_BAC
] = {0x2, 0xac, 7, 0},
57 [DVBT_SCALE1_BB0
] = {0x2, 0xb0, 7, 0},
58 [DVBT_SCALE1_BB1
] = {0x2, 0xb1, 7, 0},
59 [DVBT_KB_P1
] = {0x1, 0x64, 3, 1},
60 [DVBT_KB_P2
] = {0x1, 0x64, 6, 4},
61 [DVBT_KB_P3
] = {0x1, 0x65, 2, 0},
62 [DVBT_OPT_ADC_IQ
] = {0x0, 0x6, 5, 4},
63 [DVBT_AD_AVI
] = {0x0, 0x9, 1, 0},
64 [DVBT_AD_AVQ
] = {0x0, 0x9, 3, 2},
65 [DVBT_K1_CR_STEP12
] = {0x2, 0xad, 9, 4},
66 [DVBT_TRK_KS_P2
] = {0x1, 0x6f, 2, 0},
67 [DVBT_TRK_KS_I2
] = {0x1, 0x70, 5, 3},
68 [DVBT_TR_THD_SET2
] = {0x1, 0x72, 3, 0},
69 [DVBT_TRK_KC_P2
] = {0x1, 0x73, 5, 3},
70 [DVBT_TRK_KC_I2
] = {0x1, 0x75, 2, 0},
71 [DVBT_CR_THD_SET2
] = {0x1, 0x76, 7, 6},
72 [DVBT_PSET_IFFREQ
] = {0x1, 0x19, 21, 0},
73 [DVBT_SPEC_INV
] = {0x1, 0x15, 0, 0},
74 [DVBT_RSAMP_RATIO
] = {0x1, 0x9f, 27, 2},
75 [DVBT_CFREQ_OFF_RATIO
] = {0x1, 0x9d, 23, 4},
76 [DVBT_FSM_STAGE
] = {0x3, 0x51, 6, 3},
77 [DVBT_RX_CONSTEL
] = {0x3, 0x3c, 3, 2},
78 [DVBT_RX_HIER
] = {0x3, 0x3c, 6, 4},
79 [DVBT_RX_C_RATE_LP
] = {0x3, 0x3d, 2, 0},
80 [DVBT_RX_C_RATE_HP
] = {0x3, 0x3d, 5, 3},
81 [DVBT_GI_IDX
] = {0x3, 0x51, 1, 0},
82 [DVBT_FFT_MODE_IDX
] = {0x3, 0x51, 2, 2},
83 [DVBT_RSD_BER_EST
] = {0x3, 0x4e, 15, 0},
84 [DVBT_CE_EST_EVM
] = {0x4, 0xc, 15, 0},
85 [DVBT_RF_AGC_VAL
] = {0x3, 0x5b, 13, 0},
86 [DVBT_IF_AGC_VAL
] = {0x3, 0x59, 13, 0},
87 [DVBT_DAGC_VAL
] = {0x3, 0x5, 7, 0},
88 [DVBT_SFREQ_OFF
] = {0x3, 0x18, 13, 0},
89 [DVBT_CFREQ_OFF
] = {0x3, 0x5f, 17, 0},
90 [DVBT_POLAR_RF_AGC
] = {0x0, 0xe, 1, 1},
91 [DVBT_POLAR_IF_AGC
] = {0x0, 0xe, 0, 0},
92 [DVBT_AAGC_HOLD
] = {0x1, 0x4, 5, 5},
93 [DVBT_EN_RF_AGC
] = {0x1, 0x4, 6, 6},
94 [DVBT_EN_IF_AGC
] = {0x1, 0x4, 7, 7},
95 [DVBT_IF_AGC_MIN
] = {0x1, 0x8, 7, 0},
96 [DVBT_IF_AGC_MAX
] = {0x1, 0x9, 7, 0},
97 [DVBT_RF_AGC_MIN
] = {0x1, 0xa, 7, 0},
98 [DVBT_RF_AGC_MAX
] = {0x1, 0xb, 7, 0},
99 [DVBT_IF_AGC_MAN
] = {0x1, 0xc, 6, 6},
100 [DVBT_IF_AGC_MAN_VAL
] = {0x1, 0xc, 13, 0},
101 [DVBT_RF_AGC_MAN
] = {0x1, 0xe, 6, 6},
102 [DVBT_RF_AGC_MAN_VAL
] = {0x1, 0xe, 13, 0},
103 [DVBT_DAGC_TRG_VAL
] = {0x1, 0x12, 7, 0},
104 [DVBT_AGC_TARG_VAL_0
] = {0x1, 0x2, 0, 0},
105 [DVBT_AGC_TARG_VAL_8_1
] = {0x1, 0x3, 7, 0},
106 [DVBT_AAGC_LOOP_GAIN
] = {0x1, 0xc7, 5, 1},
107 [DVBT_LOOP_GAIN2_3_0
] = {0x1, 0x4, 4, 1},
108 [DVBT_LOOP_GAIN2_4
] = {0x1, 0x5, 7, 7},
109 [DVBT_LOOP_GAIN3
] = {0x1, 0xc8, 4, 0},
110 [DVBT_VTOP1
] = {0x1, 0x6, 5, 0},
111 [DVBT_VTOP2
] = {0x1, 0xc9, 5, 0},
112 [DVBT_VTOP3
] = {0x1, 0xca, 5, 0},
113 [DVBT_KRF1
] = {0x1, 0xcb, 7, 0},
114 [DVBT_KRF2
] = {0x1, 0x7, 7, 0},
115 [DVBT_KRF3
] = {0x1, 0xcd, 7, 0},
116 [DVBT_KRF4
] = {0x1, 0xce, 7, 0},
117 [DVBT_EN_GI_PGA
] = {0x1, 0xe5, 0, 0},
118 [DVBT_THD_LOCK_UP
] = {0x1, 0xd9, 8, 0},
119 [DVBT_THD_LOCK_DW
] = {0x1, 0xdb, 8, 0},
120 [DVBT_THD_UP1
] = {0x1, 0xdd, 7, 0},
121 [DVBT_THD_DW1
] = {0x1, 0xde, 7, 0},
122 [DVBT_INTER_CNT_LEN
] = {0x1, 0xd8, 3, 0},
123 [DVBT_GI_PGA_STATE
] = {0x1, 0xe6, 3, 3},
124 [DVBT_EN_AGC_PGA
] = {0x1, 0xd7, 0, 0},
125 [DVBT_CKOUTPAR
] = {0x1, 0x7b, 5, 5},
126 [DVBT_CKOUT_PWR
] = {0x1, 0x7b, 6, 6},
127 [DVBT_SYNC_DUR
] = {0x1, 0x7b, 7, 7},
128 [DVBT_ERR_DUR
] = {0x1, 0x7c, 0, 0},
129 [DVBT_SYNC_LVL
] = {0x1, 0x7c, 1, 1},
130 [DVBT_ERR_LVL
] = {0x1, 0x7c, 2, 2},
131 [DVBT_VAL_LVL
] = {0x1, 0x7c, 3, 3},
132 [DVBT_SERIAL
] = {0x1, 0x7c, 4, 4},
133 [DVBT_SER_LSB
] = {0x1, 0x7c, 5, 5},
134 [DVBT_CDIV_PH0
] = {0x1, 0x7d, 3, 0},
135 [DVBT_CDIV_PH1
] = {0x1, 0x7d, 7, 4},
136 [DVBT_MPEG_IO_OPT_2_2
] = {0x0, 0x6, 7, 7},
137 [DVBT_MPEG_IO_OPT_1_0
] = {0x0, 0x7, 7, 6},
138 [DVBT_CKOUTPAR_PIP
] = {0x0, 0xb7, 4, 4},
139 [DVBT_CKOUT_PWR_PIP
] = {0x0, 0xb7, 3, 3},
140 [DVBT_SYNC_LVL_PIP
] = {0x0, 0xb7, 2, 2},
141 [DVBT_ERR_LVL_PIP
] = {0x0, 0xb7, 1, 1},
142 [DVBT_VAL_LVL_PIP
] = {0x0, 0xb7, 0, 0},
143 [DVBT_CKOUTPAR_PID
] = {0x0, 0xb9, 4, 4},
144 [DVBT_CKOUT_PWR_PID
] = {0x0, 0xb9, 3, 3},
145 [DVBT_SYNC_LVL_PID
] = {0x0, 0xb9, 2, 2},
146 [DVBT_ERR_LVL_PID
] = {0x0, 0xb9, 1, 1},
147 [DVBT_VAL_LVL_PID
] = {0x0, 0xb9, 0, 0},
148 [DVBT_SM_PASS
] = {0x1, 0x93, 11, 0},
149 [DVBT_AD7_SETTING
] = {0x0, 0x11, 15, 0},
150 [DVBT_RSSI_R
] = {0x3, 0x1, 6, 0},
151 [DVBT_ACI_DET_IND
] = {0x3, 0x12, 0, 0},
152 [DVBT_REG_MON
] = {0x0, 0xd, 1, 0},
153 [DVBT_REG_MONSEL
] = {0x0, 0xd, 2, 2},
154 [DVBT_REG_GPE
] = {0x0, 0xd, 7, 7},
155 [DVBT_REG_GPO
] = {0x0, 0x10, 0, 0},
156 [DVBT_REG_4MSEL
] = {0x0, 0x13, 0, 0},
159 /* write multiple hardware registers */
160 static int rtl2832_wr(struct rtl2832_priv
*priv
, u8 reg
, u8
*val
, int len
)
163 u8 buf
[MAX_XFER_SIZE
];
164 struct i2c_msg msg
[1] = {
166 .addr
= priv
->cfg
.i2c_addr
,
173 if (1 + len
> sizeof(buf
)) {
174 dev_warn(&priv
->i2c
->dev
,
175 "%s: i2c wr reg=%04x: len=%d is too big!\n",
176 KBUILD_MODNAME
, reg
, len
);
181 memcpy(&buf
[1], val
, len
);
183 ret
= i2c_transfer(priv
->i2c_adapter
, msg
, 1);
187 dev_warn(&priv
->i2c
->dev
,
188 "%s: i2c wr failed=%d reg=%02x len=%d\n",
189 KBUILD_MODNAME
, ret
, reg
, len
);
195 /* read multiple hardware registers */
196 static int rtl2832_rd(struct rtl2832_priv
*priv
, u8 reg
, u8
*val
, int len
)
199 struct i2c_msg msg
[2] = {
201 .addr
= priv
->cfg
.i2c_addr
,
206 .addr
= priv
->cfg
.i2c_addr
,
213 ret
= i2c_transfer(priv
->i2c_adapter
, msg
, 2);
217 dev_warn(&priv
->i2c
->dev
,
218 "%s: i2c rd failed=%d reg=%02x len=%d\n",
219 KBUILD_MODNAME
, ret
, reg
, len
);
225 /* write multiple registers */
226 static int rtl2832_wr_regs(struct rtl2832_priv
*priv
, u8 reg
, u8 page
, u8
*val
,
231 /* switch bank if needed */
232 if (page
!= priv
->page
) {
233 ret
= rtl2832_wr(priv
, 0x00, &page
, 1);
240 return rtl2832_wr(priv
, reg
, val
, len
);
243 /* read multiple registers */
244 static int rtl2832_rd_regs(struct rtl2832_priv
*priv
, u8 reg
, u8 page
, u8
*val
,
249 /* switch bank if needed */
250 if (page
!= priv
->page
) {
251 ret
= rtl2832_wr(priv
, 0x00, &page
, 1);
258 return rtl2832_rd(priv
, reg
, val
, len
);
261 #if 0 /* currently not used */
262 /* write single register */
263 static int rtl2832_wr_reg(struct rtl2832_priv
*priv
, u8 reg
, u8 page
, u8 val
)
265 return rtl2832_wr_regs(priv
, reg
, page
, &val
, 1);
269 /* read single register */
270 static int rtl2832_rd_reg(struct rtl2832_priv
*priv
, u8 reg
, u8 page
, u8
*val
)
272 return rtl2832_rd_regs(priv
, reg
, page
, val
, 1);
275 static int rtl2832_rd_demod_reg(struct rtl2832_priv
*priv
, int reg
, u32
*val
)
289 reg_start_addr
= registers
[reg
].start_address
;
290 msb
= registers
[reg
].msb
;
291 lsb
= registers
[reg
].lsb
;
292 page
= registers
[reg
].page
;
294 len
= (msb
>> 3) + 1;
295 mask
= REG_MASK(msb
- lsb
);
297 ret
= rtl2832_rd_regs(priv
, reg_start_addr
, page
, &reading
[0], len
);
302 for (i
= 0; i
< len
; i
++)
303 reading_tmp
|= reading
[i
] << ((len
- 1 - i
) * 8);
305 *val
= (reading_tmp
>> lsb
) & mask
;
310 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
315 static int rtl2832_wr_demod_reg(struct rtl2832_priv
*priv
, int reg
, u32 val
)
331 reg_start_addr
= registers
[reg
].start_address
;
332 msb
= registers
[reg
].msb
;
333 lsb
= registers
[reg
].lsb
;
334 page
= registers
[reg
].page
;
336 len
= (msb
>> 3) + 1;
337 mask
= REG_MASK(msb
- lsb
);
340 ret
= rtl2832_rd_regs(priv
, reg_start_addr
, page
, &reading
[0], len
);
345 for (i
= 0; i
< len
; i
++)
346 reading_tmp
|= reading
[i
] << ((len
- 1 - i
) * 8);
348 writing_tmp
= reading_tmp
& ~(mask
<< lsb
);
349 writing_tmp
|= ((val
& mask
) << lsb
);
352 for (i
= 0; i
< len
; i
++)
353 writing
[i
] = (writing_tmp
>> ((len
- 1 - i
) * 8)) & 0xff;
355 ret
= rtl2832_wr_regs(priv
, reg_start_addr
, page
, &writing
[0], len
);
362 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
367 static int rtl2832_i2c_gate_ctrl(struct dvb_frontend
*fe
, int enable
)
370 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
372 dev_dbg(&priv
->i2c
->dev
, "%s: enable=%d\n", __func__
, enable
);
374 /* gate already open or close */
375 if (priv
->i2c_gate_state
== enable
)
378 ret
= rtl2832_wr_demod_reg(priv
, DVBT_IIC_REPEAT
, (enable
? 0x1 : 0x0));
382 priv
->i2c_gate_state
= enable
;
386 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
391 static int rtl2832_set_if(struct dvb_frontend
*fe
, u32 if_freq
)
393 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
396 u8 en_bbin
= (if_freq
== 0 ? 0x1 : 0x0);
399 * PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
403 pset_iffreq
= if_freq
% priv
->cfg
.xtal
;
404 pset_iffreq
*= 0x400000;
405 pset_iffreq
= div_u64(pset_iffreq
, priv
->cfg
.xtal
);
406 pset_iffreq
= -pset_iffreq
;
407 pset_iffreq
= pset_iffreq
& 0x3fffff;
408 dev_dbg(&priv
->i2c
->dev
, "%s: if_frequency=%d pset_iffreq=%08x\n",
409 __func__
, if_freq
, (unsigned)pset_iffreq
);
411 ret
= rtl2832_wr_demod_reg(priv
, DVBT_EN_BBIN
, en_bbin
);
415 ret
= rtl2832_wr_demod_reg(priv
, DVBT_PSET_IFFREQ
, pset_iffreq
);
420 static int rtl2832_init(struct dvb_frontend
*fe
)
422 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
423 const struct rtl2832_reg_value
*init
;
426 /* initialization values for the demodulator registers */
427 struct rtl2832_reg_value rtl2832_initial_regs
[] = {
428 {DVBT_AD_EN_REG
, 0x1},
429 {DVBT_AD_EN_REG1
, 0x1},
430 {DVBT_RSD_BER_FAIL_VAL
, 0x2800},
431 {DVBT_MGD_THD0
, 0x10},
432 {DVBT_MGD_THD1
, 0x20},
433 {DVBT_MGD_THD2
, 0x20},
434 {DVBT_MGD_THD3
, 0x40},
435 {DVBT_MGD_THD4
, 0x22},
436 {DVBT_MGD_THD5
, 0x32},
437 {DVBT_MGD_THD6
, 0x37},
438 {DVBT_MGD_THD7
, 0x39},
439 {DVBT_EN_BK_TRK
, 0x0},
440 {DVBT_EN_CACQ_NOTCH
, 0x0},
441 {DVBT_AD_AV_REF
, 0x2a},
444 {DVBT_CDIV_PH0
, 0x8},
445 {DVBT_CDIV_PH1
, 0x8},
446 {DVBT_SCALE1_B92
, 0x4},
447 {DVBT_SCALE1_B93
, 0xb0},
448 {DVBT_SCALE1_BA7
, 0x78},
449 {DVBT_SCALE1_BA9
, 0x28},
450 {DVBT_SCALE1_BAA
, 0x59},
451 {DVBT_SCALE1_BAB
, 0x83},
452 {DVBT_SCALE1_BAC
, 0xd4},
453 {DVBT_SCALE1_BB0
, 0x65},
454 {DVBT_SCALE1_BB1
, 0x43},
458 {DVBT_K1_CR_STEP12
, 0xa},
461 {DVBT_CDIV_PH0
, 0x9},
462 {DVBT_CDIV_PH1
, 0x9},
463 {DVBT_MPEG_IO_OPT_2_2
, 0x0},
464 {DVBT_MPEG_IO_OPT_1_0
, 0x0},
465 {DVBT_TRK_KS_P2
, 0x4},
466 {DVBT_TRK_KS_I2
, 0x7},
467 {DVBT_TR_THD_SET2
, 0x6},
468 {DVBT_TRK_KC_I2
, 0x5},
469 {DVBT_CR_THD_SET2
, 0x1},
472 dev_dbg(&priv
->i2c
->dev
, "%s:\n", __func__
);
474 for (i
= 0; i
< ARRAY_SIZE(rtl2832_initial_regs
); i
++) {
475 ret
= rtl2832_wr_demod_reg(priv
, rtl2832_initial_regs
[i
].reg
,
476 rtl2832_initial_regs
[i
].value
);
481 /* load tuner specific settings */
482 dev_dbg(&priv
->i2c
->dev
, "%s: load settings for tuner=%02x\n",
483 __func__
, priv
->cfg
.tuner
);
484 switch (priv
->cfg
.tuner
) {
485 case RTL2832_TUNER_FC0012
:
486 case RTL2832_TUNER_FC0013
:
487 len
= ARRAY_SIZE(rtl2832_tuner_init_fc0012
);
488 init
= rtl2832_tuner_init_fc0012
;
490 case RTL2832_TUNER_TUA9001
:
491 len
= ARRAY_SIZE(rtl2832_tuner_init_tua9001
);
492 init
= rtl2832_tuner_init_tua9001
;
494 case RTL2832_TUNER_E4000
:
495 len
= ARRAY_SIZE(rtl2832_tuner_init_e4000
);
496 init
= rtl2832_tuner_init_e4000
;
498 case RTL2832_TUNER_R820T
:
499 case RTL2832_TUNER_R828D
:
500 len
= ARRAY_SIZE(rtl2832_tuner_init_r820t
);
501 init
= rtl2832_tuner_init_r820t
;
508 for (i
= 0; i
< len
; i
++) {
509 ret
= rtl2832_wr_demod_reg(priv
, init
[i
].reg
, init
[i
].value
);
515 * r820t NIM code does a software reset here at the demod -
516 * may not be needed, as there's already a software reset at
521 ret
= rtl2832_wr_demod_reg(priv
, DVBT_SOFT_RST
, 0x1);
525 ret
= rtl2832_wr_demod_reg(priv
, DVBT_SOFT_RST
, 0x0);
530 priv
->sleeping
= false;
535 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
539 static int rtl2832_sleep(struct dvb_frontend
*fe
)
541 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
543 dev_dbg(&priv
->i2c
->dev
, "%s:\n", __func__
);
544 priv
->sleeping
= true;
548 static int rtl2832_get_tune_settings(struct dvb_frontend
*fe
,
549 struct dvb_frontend_tune_settings
*s
)
551 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
553 dev_dbg(&priv
->i2c
->dev
, "%s:\n", __func__
);
554 s
->min_delay_ms
= 1000;
555 s
->step_size
= fe
->ops
.info
.frequency_stepsize
* 2;
556 s
->max_drift
= (fe
->ops
.info
.frequency_stepsize
* 2) + 1;
560 static int rtl2832_set_frontend(struct dvb_frontend
*fe
)
562 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
563 struct dtv_frontend_properties
*c
= &fe
->dtv_property_cache
;
565 u64 bw_mode
, num
, num2
;
566 u32 resamp_ratio
, cfreq_off_ratio
;
567 static u8 bw_params
[3][32] = {
568 /* 6 MHz bandwidth */
570 0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
571 0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
572 0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
576 /* 7 MHz bandwidth */
578 0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
579 0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
580 0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
584 /* 8 MHz bandwidth */
586 0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
587 0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
588 0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
594 dev_dbg(&priv
->i2c
->dev
,
595 "%s: frequency=%d bandwidth_hz=%d inversion=%d\n",
596 __func__
, c
->frequency
, c
->bandwidth_hz
, c
->inversion
);
599 if (fe
->ops
.tuner_ops
.set_params
)
600 fe
->ops
.tuner_ops
.set_params(fe
);
602 /* If the frontend has get_if_frequency(), use it */
603 if (fe
->ops
.tuner_ops
.get_if_frequency
) {
606 ret
= fe
->ops
.tuner_ops
.get_if_frequency(fe
, &if_freq
);
610 ret
= rtl2832_set_if(fe
, if_freq
);
615 switch (c
->bandwidth_hz
) {
629 dev_dbg(&priv
->i2c
->dev
, "%s: invalid bandwidth\n", __func__
);
633 for (j
= 0; j
< sizeof(bw_params
[0]); j
++) {
634 ret
= rtl2832_wr_regs(priv
, 0x1c+j
, 1, &bw_params
[i
][j
], 1);
639 /* calculate and set resample ratio
640 * RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
641 * / ConstWithBandwidthMode)
643 num
= priv
->cfg
.xtal
* 7;
645 num
= div_u64(num
, bw_mode
);
646 resamp_ratio
= num
& 0x3ffffff;
647 ret
= rtl2832_wr_demod_reg(priv
, DVBT_RSAMP_RATIO
, resamp_ratio
);
651 /* calculate and set cfreq off ratio
652 * CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
653 * / (CrystalFreqHz * 7))
656 num2
= priv
->cfg
.xtal
* 7;
657 num
= div_u64(num
, num2
);
659 cfreq_off_ratio
= num
& 0xfffff;
660 ret
= rtl2832_wr_demod_reg(priv
, DVBT_CFREQ_OFF_RATIO
, cfreq_off_ratio
);
666 ret
= rtl2832_wr_demod_reg(priv
, DVBT_SOFT_RST
, 0x1);
670 ret
= rtl2832_wr_demod_reg(priv
, DVBT_SOFT_RST
, 0x0);
676 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
680 static int rtl2832_get_frontend(struct dvb_frontend
*fe
)
682 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
683 struct dtv_frontend_properties
*c
= &fe
->dtv_property_cache
;
690 ret
= rtl2832_rd_regs(priv
, 0x3c, 3, buf
, 2);
694 ret
= rtl2832_rd_reg(priv
, 0x51, 3, &buf
[2]);
698 dev_dbg(&priv
->i2c
->dev
, "%s: TPS=%*ph\n", __func__
, 3, buf
);
700 switch ((buf
[0] >> 2) & 3) {
702 c
->modulation
= QPSK
;
705 c
->modulation
= QAM_16
;
708 c
->modulation
= QAM_64
;
712 switch ((buf
[2] >> 2) & 1) {
714 c
->transmission_mode
= TRANSMISSION_MODE_2K
;
717 c
->transmission_mode
= TRANSMISSION_MODE_8K
;
720 switch ((buf
[2] >> 0) & 3) {
722 c
->guard_interval
= GUARD_INTERVAL_1_32
;
725 c
->guard_interval
= GUARD_INTERVAL_1_16
;
728 c
->guard_interval
= GUARD_INTERVAL_1_8
;
731 c
->guard_interval
= GUARD_INTERVAL_1_4
;
735 switch ((buf
[0] >> 4) & 7) {
737 c
->hierarchy
= HIERARCHY_NONE
;
740 c
->hierarchy
= HIERARCHY_1
;
743 c
->hierarchy
= HIERARCHY_2
;
746 c
->hierarchy
= HIERARCHY_4
;
750 switch ((buf
[1] >> 3) & 7) {
752 c
->code_rate_HP
= FEC_1_2
;
755 c
->code_rate_HP
= FEC_2_3
;
758 c
->code_rate_HP
= FEC_3_4
;
761 c
->code_rate_HP
= FEC_5_6
;
764 c
->code_rate_HP
= FEC_7_8
;
768 switch ((buf
[1] >> 0) & 7) {
770 c
->code_rate_LP
= FEC_1_2
;
773 c
->code_rate_LP
= FEC_2_3
;
776 c
->code_rate_LP
= FEC_3_4
;
779 c
->code_rate_LP
= FEC_5_6
;
782 c
->code_rate_LP
= FEC_7_8
;
788 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
792 static int rtl2832_read_status(struct dvb_frontend
*fe
, fe_status_t
*status
)
794 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
799 dev_dbg(&priv
->i2c
->dev
, "%s:\n", __func__
);
803 ret
= rtl2832_rd_demod_reg(priv
, DVBT_FSM_STAGE
, &tmp
);
808 *status
|= FE_HAS_SIGNAL
| FE_HAS_CARRIER
|
809 FE_HAS_VITERBI
| FE_HAS_SYNC
| FE_HAS_LOCK
;
811 /* TODO find out if this is also true for rtl2832? */
812 /*else if (tmp == 10) {
813 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
819 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
823 static int rtl2832_read_snr(struct dvb_frontend
*fe
, u16
*snr
)
825 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
826 int ret
, hierarchy
, constellation
;
829 #define CONSTELLATION_NUM 3
830 #define HIERARCHY_NUM 4
831 static const u32 snr_constant
[CONSTELLATION_NUM
][HIERARCHY_NUM
] = {
832 { 85387325, 85387325, 85387325, 85387325 },
833 { 86676178, 86676178, 87167949, 87795660 },
834 { 87659938, 87659938, 87885178, 88241743 },
837 /* reports SNR in resolution of 0.1 dB */
839 ret
= rtl2832_rd_reg(priv
, 0x3c, 3, &tmp
);
843 constellation
= (tmp
>> 2) & 0x03; /* [3:2] */
844 if (constellation
> CONSTELLATION_NUM
- 1)
847 hierarchy
= (tmp
>> 4) & 0x07; /* [6:4] */
848 if (hierarchy
> HIERARCHY_NUM
- 1)
851 ret
= rtl2832_rd_regs(priv
, 0x0c, 4, buf
, 2);
855 tmp16
= buf
[0] << 8 | buf
[1];
858 *snr
= (snr_constant
[constellation
][hierarchy
] -
859 intlog10(tmp16
)) / ((1 << 24) / 100);
865 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
869 static int rtl2832_read_ber(struct dvb_frontend
*fe
, u32
*ber
)
871 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
875 ret
= rtl2832_rd_regs(priv
, 0x4e, 3, buf
, 2);
879 *ber
= buf
[0] << 8 | buf
[1];
883 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
887 static struct dvb_frontend_ops rtl2832_ops
;
889 static void rtl2832_release(struct dvb_frontend
*fe
)
891 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
893 dev_dbg(&priv
->i2c
->dev
, "%s:\n", __func__
);
894 cancel_delayed_work_sync(&priv
->i2c_gate_work
);
895 i2c_del_mux_adapter(priv
->i2c_adapter_tuner
);
896 i2c_del_mux_adapter(priv
->i2c_adapter
);
901 * Delay mechanism to avoid unneeded I2C gate open / close. Gate close is
902 * delayed here a little bit in order to see if there is sequence of I2C
903 * messages sent to same I2C bus.
904 * We must use unlocked version of __i2c_transfer() in order to avoid deadlock
905 * as lock is already taken by calling muxed i2c_transfer().
907 static void rtl2832_i2c_gate_work(struct work_struct
*work
)
909 struct rtl2832_priv
*priv
= container_of(work
,
910 struct rtl2832_priv
, i2c_gate_work
.work
);
911 struct i2c_adapter
*adap
= priv
->i2c
;
914 struct i2c_msg msg
[1] = {
916 .addr
= priv
->cfg
.i2c_addr
,
923 /* select reg bank 1 */
926 ret
= __i2c_transfer(adap
, msg
, 1);
932 /* close I2C repeater gate */
935 ret
= __i2c_transfer(adap
, msg
, 1);
939 priv
->i2c_gate_state
= 0;
943 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
948 static int rtl2832_select(struct i2c_adapter
*adap
, void *mux_priv
, u32 chan_id
)
950 struct rtl2832_priv
*priv
= mux_priv
;
953 struct i2c_msg msg
[1] = {
955 .addr
= priv
->cfg
.i2c_addr
,
961 struct i2c_msg msg_rd
[2] = {
963 .addr
= priv
->cfg
.i2c_addr
,
968 .addr
= priv
->cfg
.i2c_addr
,
975 /* terminate possible gate closing */
976 cancel_delayed_work_sync(&priv
->i2c_gate_work
);
978 if (priv
->i2c_gate_state
== chan_id
)
981 /* select reg bank 1 */
984 ret
= __i2c_transfer(adap
, msg
, 1);
990 /* we must read that register, otherwise there will be errors */
991 ret
= __i2c_transfer(adap
, msg_rd
, 2);
995 /* open or close I2C repeater gate */
998 buf
[1] = 0x18; /* open */
1000 buf
[1] = 0x10; /* close */
1002 ret
= __i2c_transfer(adap
, msg
, 1);
1006 priv
->i2c_gate_state
= chan_id
;
1010 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
1015 static int rtl2832_deselect(struct i2c_adapter
*adap
, void *mux_priv
,
1018 struct rtl2832_priv
*priv
= mux_priv
;
1019 schedule_delayed_work(&priv
->i2c_gate_work
, usecs_to_jiffies(100));
1023 struct i2c_adapter
*rtl2832_get_i2c_adapter(struct dvb_frontend
*fe
)
1025 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
1026 return priv
->i2c_adapter_tuner
;
1028 EXPORT_SYMBOL(rtl2832_get_i2c_adapter
);
1030 struct i2c_adapter
*rtl2832_get_private_i2c_adapter(struct dvb_frontend
*fe
)
1032 struct rtl2832_priv
*priv
= fe
->demodulator_priv
;
1033 return priv
->i2c_adapter
;
1035 EXPORT_SYMBOL(rtl2832_get_private_i2c_adapter
);
1037 struct dvb_frontend
*rtl2832_attach(const struct rtl2832_config
*cfg
,
1038 struct i2c_adapter
*i2c
)
1040 struct rtl2832_priv
*priv
= NULL
;
1044 dev_dbg(&i2c
->dev
, "%s:\n", __func__
);
1046 /* allocate memory for the internal state */
1047 priv
= kzalloc(sizeof(struct rtl2832_priv
), GFP_KERNEL
);
1051 /* setup the priv */
1053 priv
->tuner
= cfg
->tuner
;
1054 memcpy(&priv
->cfg
, cfg
, sizeof(struct rtl2832_config
));
1055 INIT_DELAYED_WORK(&priv
->i2c_gate_work
, rtl2832_i2c_gate_work
);
1057 /* create muxed i2c adapter for demod itself */
1058 priv
->i2c_adapter
= i2c_add_mux_adapter(i2c
, &i2c
->dev
, priv
, 0, 0, 0,
1059 rtl2832_select
, NULL
);
1060 if (priv
->i2c_adapter
== NULL
)
1063 /* check if the demod is there */
1064 ret
= rtl2832_rd_reg(priv
, 0x00, 0x0, &tmp
);
1068 /* create muxed i2c adapter for demod tuner bus */
1069 priv
->i2c_adapter_tuner
= i2c_add_mux_adapter(i2c
, &i2c
->dev
, priv
,
1070 0, 1, 0, rtl2832_select
, rtl2832_deselect
);
1071 if (priv
->i2c_adapter_tuner
== NULL
)
1074 /* create dvb_frontend */
1075 memcpy(&priv
->fe
.ops
, &rtl2832_ops
, sizeof(struct dvb_frontend_ops
));
1076 priv
->fe
.demodulator_priv
= priv
;
1078 /* TODO implement sleep mode */
1079 priv
->sleeping
= true;
1083 dev_dbg(&i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
1084 if (priv
&& priv
->i2c_adapter
)
1085 i2c_del_mux_adapter(priv
->i2c_adapter
);
1089 EXPORT_SYMBOL(rtl2832_attach
);
1091 static struct dvb_frontend_ops rtl2832_ops
= {
1092 .delsys
= { SYS_DVBT
},
1094 .name
= "Realtek RTL2832 (DVB-T)",
1095 .frequency_min
= 174000000,
1096 .frequency_max
= 862000000,
1097 .frequency_stepsize
= 166667,
1098 .caps
= FE_CAN_FEC_1_2
|
1108 FE_CAN_TRANSMISSION_MODE_AUTO
|
1109 FE_CAN_GUARD_INTERVAL_AUTO
|
1110 FE_CAN_HIERARCHY_AUTO
|
1115 .release
= rtl2832_release
,
1117 .init
= rtl2832_init
,
1118 .sleep
= rtl2832_sleep
,
1120 .get_tune_settings
= rtl2832_get_tune_settings
,
1122 .set_frontend
= rtl2832_set_frontend
,
1123 .get_frontend
= rtl2832_get_frontend
,
1125 .read_status
= rtl2832_read_status
,
1126 .read_snr
= rtl2832_read_snr
,
1127 .read_ber
= rtl2832_read_ber
,
1129 .i2c_gate_ctrl
= rtl2832_i2c_gate_ctrl
,
1132 MODULE_AUTHOR("Thomas Mair <mair.thomas86@gmail.com>");
1133 MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
1134 MODULE_LICENSE("GPL");
1135 MODULE_VERSION("0.5");