37 .addr = priv->
cfg.i2c_addr,
51 dev_warn(&priv->
i2c->dev,
"%s: i2c wr failed=%d reg=%02x " \
52 "len=%d\n", KBUILD_MODNAME, ret, reg, len);
69 .addr = priv->
cfg.i2c_addr,
80 dev_warn(&priv->
i2c->dev,
"%s: i2c rd failed=%d reg=%02x " \
81 "len=%d\n", KBUILD_MODNAME, ret, reg, len);
92 u8 reg2 = (reg >> 0) & 0xff;
93 u8 page = (reg >> 8) & 0xff;
96 if (page != priv->
page) {
97 ret = rtl2830_wr(priv, 0x00, &page, 1);
104 return rtl2830_wr(priv, reg2, val, len);
111 u8 reg2 = (reg >> 0) & 0xff;
112 u8 page = (reg >> 8) & 0xff;
115 if (page != priv->
page) {
116 ret = rtl2830_wr(priv, 0x00, &page, 1);
123 return rtl2830_rd(priv, reg2, val, len);
129 return rtl2830_rd_regs(priv, reg, val, 1);
140 ret = rtl2830_rd_regs(priv, reg, &tmp, 1);
149 return rtl2830_wr_regs(priv, reg, &val, 1);
158 ret = rtl2830_rd_regs(priv, reg, &tmp, 1);
165 for (i = 0; i < 8; i++) {
166 if ((mask >> i) & 0x01)
179 { 0x00d, 0x01, 0x03 },
180 { 0x00d, 0x10, 0x10 },
181 { 0x104, 0x00, 0x1e },
182 { 0x105, 0x80, 0x80 },
183 { 0x110, 0x02, 0x03 },
184 { 0x110, 0x08, 0x0c },
185 { 0x17b, 0x00, 0x40 },
186 { 0x17d, 0x05, 0x0f },
187 { 0x17d, 0x50, 0xf0 },
188 { 0x18c, 0x08, 0x0f },
189 { 0x18d, 0x00, 0xc0 },
190 { 0x188, 0x05, 0x0f },
191 { 0x189, 0x00, 0xfc },
192 { 0x2d5, 0x02, 0x02 },
193 { 0x2f1, 0x02, 0x06 },
194 { 0x2f1, 0x20, 0xf8 },
195 { 0x16d, 0x00, 0x01 },
196 { 0x1a6, 0x00, 0x80 },
197 { 0x106, priv->
cfg.vtop, 0x3f },
198 { 0x107, priv->
cfg.krf, 0x3f },
199 { 0x112, 0x28, 0xff },
200 { 0x103, priv->
cfg.agc_targ_val, 0xff },
201 { 0x00a, 0x02, 0x07 },
202 { 0x140, 0x0c, 0x3c },
203 { 0x140, 0x40, 0xc0 },
204 { 0x15b, 0x05, 0x07 },
205 { 0x15b, 0x28, 0x38 },
206 { 0x15c, 0x05, 0x07 },
207 { 0x15c, 0x28, 0x38 },
208 { 0x115, priv->
cfg.spec_inv, 0x01 },
209 { 0x16f, 0x01, 0x07 },
210 { 0x170, 0x18, 0x38 },
211 { 0x172, 0x0f, 0x0f },
212 { 0x173, 0x08, 0x38 },
213 { 0x175, 0x01, 0x07 },
214 { 0x176, 0x00, 0xc0 },
224 ret = rtl2830_wr_regs(priv, 0x18f,
"\x28\x00", 2);
228 ret = rtl2830_wr_regs(priv, 0x195,
229 "\x04\x06\x0a\x12\x0a\x12\x1e\x28", 8);
248 dev_dbg(&priv->
i2c->dev,
"%s: failed=%d\n", __func__, ret);
264 s->
max_drift = (fe->
ops.info.frequency_stepsize * 2) + 1;
269 static int rtl2830_set_frontend(
struct dvb_frontend *fe)
276 u32 if_ctl, if_frequency;
277 static const u8 bw_params1[3][34] = {
279 0x1f, 0xf0, 0x1f, 0xf0, 0x1f, 0xfa, 0x00, 0x17, 0x00, 0x41,
280 0x00, 0x64, 0x00, 0x67, 0x00, 0x38, 0x1f, 0xde, 0x1f, 0x7a,
281 0x1f, 0x47, 0x1f, 0x7c, 0x00, 0x30, 0x01, 0x4b, 0x02, 0x82,
282 0x03, 0x73, 0x03, 0xcf,
284 0x1f, 0xfa, 0x1f, 0xda, 0x1f, 0xc1, 0x1f, 0xb3, 0x1f, 0xca,
285 0x00, 0x07, 0x00, 0x4d, 0x00, 0x6d, 0x00, 0x40, 0x1f, 0xca,
286 0x1f, 0x4d, 0x1f, 0x2a, 0x1f, 0xb2, 0x00, 0xec, 0x02, 0x7e,
287 0x03, 0xd0, 0x04, 0x53,
289 0x00, 0x10, 0x00, 0x0e, 0x1f, 0xf7, 0x1f, 0xc9, 0x1f, 0xa0,
290 0x1f, 0xa6, 0x1f, 0xec, 0x00, 0x4e, 0x00, 0x7d, 0x00, 0x3a,
291 0x1f, 0x98, 0x1f, 0x10, 0x1f, 0x40, 0x00, 0x75, 0x02, 0x5f,
292 0x04, 0x24, 0x04, 0xdb,
295 static const u8 bw_params2[3][6] = {
296 {0xc3, 0x0c, 0x44, 0x33, 0x33, 0x30},
297 {0xb8, 0xe3, 0x93, 0x99, 0x99, 0x98},
298 {0xae, 0xba, 0xf3, 0x26, 0x66, 0x64},
302 "%s: frequency=%d bandwidth_hz=%d inversion=%d\n",
306 if (fe->
ops.tuner_ops.set_params)
307 fe->
ops.tuner_ops.set_params(fe);
320 dev_dbg(&priv->
i2c->dev,
"%s: invalid bandwidth\n", __func__);
329 if (fe->
ops.tuner_ops.get_if_frequency)
330 ret = fe->
ops.tuner_ops.get_if_frequency(fe, &if_frequency);
337 num = if_frequency % priv->
cfg.xtal;
339 num = div_u64(num, priv->
cfg.xtal);
341 if_ctl = num & 0x3fffff;
342 dev_dbg(&priv->
i2c->dev,
"%s: if_frequency=%d if_ctl=%08x\n",
343 __func__, if_frequency, if_ctl);
350 buf[0] |= (if_ctl >> 16) & 0x3f;
351 buf[1] = (if_ctl >> 8) & 0xff;
352 buf[2] = (if_ctl >> 0) & 0xff;
354 ret = rtl2830_wr_regs(priv, 0x119, buf, 3);
359 ret = rtl2830_wr_regs(priv, 0x11c, &bw_params1[i][0], 17);
364 ret = rtl2830_wr_regs(priv, 0x12d, &bw_params1[i][17], 17);
368 ret = rtl2830_wr_regs(priv, 0x19d, bw_params2[i], 6);
374 dev_dbg(&priv->
i2c->dev,
"%s: failed=%d\n", __func__, ret);
378 static int rtl2830_get_frontend(
struct dvb_frontend *fe)
388 ret = rtl2830_rd_regs(priv, 0x33c, buf, 2);
392 ret = rtl2830_rd_reg(priv, 0x351, &buf[2]);
396 dev_dbg(&priv->
i2c->dev,
"%s: TPS=%*ph\n", __func__, 3, buf);
398 switch ((buf[0] >> 2) & 3) {
410 switch ((buf[2] >> 2) & 1) {
418 switch ((buf[2] >> 0) & 3) {
433 switch ((buf[0] >> 4) & 7) {
448 switch ((buf[1] >> 3) & 7) {
466 switch ((buf[1] >> 0) & 7) {
486 dev_dbg(&priv->
i2c->dev,
"%s: failed=%d\n", __func__, ret);
507 }
else if (tmp == 10) {
514 dev_dbg(&priv->
i2c->dev,
"%s: failed=%d\n", __func__, ret);
521 int ret, hierarchy, constellation;
524 #define CONSTELLATION_NUM 3
525 #define HIERARCHY_NUM 4
527 { 70705899, 70705899, 70705899, 70705899 },
528 { 82433173, 82433173, 87483115, 94445660 },
529 { 92888734, 92888734, 95487525, 99770748 },
537 ret = rtl2830_rd_reg(priv, 0x33c, &tmp);
541 constellation = (tmp >> 2) & 0x03;
542 if (constellation > CONSTELLATION_NUM - 1)
545 hierarchy = (tmp >> 4) & 0x07;
546 if (hierarchy > HIERARCHY_NUM - 1)
549 ret = rtl2830_rd_regs(priv, 0x40c, buf, 2);
553 tmp16 = buf[0] << 8 | buf[1];
556 *snr = (snr_constant[constellation][hierarchy] -
557 intlog10(tmp16)) / ((1 << 24) / 100);
563 dev_dbg(&priv->
i2c->dev,
"%s: failed=%d\n", __func__, ret);
576 ret = rtl2830_rd_regs(priv, 0x34e, buf, 2);
580 *ber = buf[0] << 8 | buf[1];
584 dev_dbg(&priv->
i2c->dev,
"%s: failed=%d\n", __func__, ret);
588 static int rtl2830_read_ucblocks(
struct dvb_frontend *fe,
u32 *ucblocks)
594 static int rtl2830_read_signal_strength(
struct dvb_frontend *fe,
u16 *strength)
599 u16 if_agc_raw, if_agc;
604 ret = rtl2830_rd_regs(priv, 0x359, buf, 2);
608 if_agc_raw = (buf[0] << 8 | buf[1]) & 0x3fff;
610 if (if_agc_raw & (1 << 9))
611 if_agc = -(~(if_agc_raw - 1) & 0x1ff);
615 *strength = (
u8) (55 - if_agc / 182);
616 *strength |= *strength << 8;
620 dev_dbg(&priv->
i2c->dev,
"%s: failed=%d\n", __func__, ret);
631 static int rtl2830_tuner_i2c_xfer(
struct i2c_adapter *i2c_adap,
644 dev_warn(&priv->
i2c->dev,
"%s: tuner i2c failed=%d\n",
645 KBUILD_MODNAME, ret);
649 dev_dbg(&priv->
i2c->dev,
"%s: failed=%d\n", __func__, ret);
654 .master_xfer = rtl2830_tuner_i2c_xfer,
655 .functionality = rtl2830_tuner_i2c_func,
690 ret = rtl2830_rd_reg(priv, 0x000, &tmp);
696 priv->
fe.demodulator_priv =
priv;
706 "%s: tuner i2c bus could not be initialized\n",
715 dev_dbg(&i2c->
dev,
"%s: failed=%d\n", __func__, ret);
724 .name =
"Realtek RTL2830 (DVB-T)",
742 .release = rtl2830_release,
744 .init = rtl2830_init,
745 .sleep = rtl2830_sleep,
749 .set_frontend = rtl2830_set_frontend,
750 .get_frontend = rtl2830_get_frontend,
752 .read_status = rtl2830_read_status,
753 .read_snr = rtl2830_read_snr,
754 .read_ber = rtl2830_read_ber,
755 .read_ucblocks = rtl2830_read_ucblocks,
756 .read_signal_strength = rtl2830_read_signal_strength,