2 * Realtek RTL2830 DVB-T demodulator driver
4 * Copyright (C) 2011 Antti Palosaari <crope@iki.fi>
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.
23 * Driver implements own I2C-adapter for tuner I2C access. That's since chip
24 * have unusual I2C-gate control which closes gate automatically after each
25 * I2C transfer. Using own I2C adapter we can workaround that.
28 #include "rtl2830_priv.h"
30 /* Max transfer size done by I2C transfer functions */
31 #define MAX_XFER_SIZE 64
33 /* write multiple hardware registers */
34 static int rtl2830_wr(struct rtl2830_priv
*priv
, u8 reg
, const u8
*val
, int len
)
37 u8 buf
[MAX_XFER_SIZE
];
38 struct i2c_msg msg
[1] = {
40 .addr
= priv
->cfg
.i2c_addr
,
47 if (1 + len
> sizeof(buf
)) {
48 dev_warn(&priv
->i2c
->dev
,
49 "%s: i2c wr reg=%04x: len=%d is too big!\n",
50 KBUILD_MODNAME
, reg
, len
);
55 memcpy(&buf
[1], val
, len
);
57 ret
= i2c_transfer(priv
->i2c
, msg
, 1);
61 dev_warn(&priv
->i2c
->dev
, "%s: i2c wr failed=%d reg=%02x " \
62 "len=%d\n", KBUILD_MODNAME
, ret
, reg
, len
);
68 /* read multiple hardware registers */
69 static int rtl2830_rd(struct rtl2830_priv
*priv
, u8 reg
, u8
*val
, int len
)
72 struct i2c_msg msg
[2] = {
74 .addr
= priv
->cfg
.i2c_addr
,
79 .addr
= priv
->cfg
.i2c_addr
,
86 ret
= i2c_transfer(priv
->i2c
, msg
, 2);
90 dev_warn(&priv
->i2c
->dev
, "%s: i2c rd failed=%d reg=%02x " \
91 "len=%d\n", KBUILD_MODNAME
, ret
, reg
, len
);
97 /* write multiple registers */
98 static int rtl2830_wr_regs(struct rtl2830_priv
*priv
, u16 reg
, const u8
*val
,
102 u8 reg2
= (reg
>> 0) & 0xff;
103 u8 page
= (reg
>> 8) & 0xff;
105 /* switch bank if needed */
106 if (page
!= priv
->page
) {
107 ret
= rtl2830_wr(priv
, 0x00, &page
, 1);
114 return rtl2830_wr(priv
, reg2
, val
, len
);
117 /* read multiple registers */
118 static int rtl2830_rd_regs(struct rtl2830_priv
*priv
, u16 reg
, u8
*val
, int len
)
121 u8 reg2
= (reg
>> 0) & 0xff;
122 u8 page
= (reg
>> 8) & 0xff;
124 /* switch bank if needed */
125 if (page
!= priv
->page
) {
126 ret
= rtl2830_wr(priv
, 0x00, &page
, 1);
133 return rtl2830_rd(priv
, reg2
, val
, len
);
136 /* read single register */
137 static int rtl2830_rd_reg(struct rtl2830_priv
*priv
, u16 reg
, u8
*val
)
139 return rtl2830_rd_regs(priv
, reg
, val
, 1);
142 /* write single register with mask */
143 static int rtl2830_wr_reg_mask(struct rtl2830_priv
*priv
, u16 reg
, u8 val
, u8 mask
)
148 /* no need for read if whole reg is written */
150 ret
= rtl2830_rd_regs(priv
, reg
, &tmp
, 1);
159 return rtl2830_wr_regs(priv
, reg
, &val
, 1);
162 /* read single register with mask */
163 static int rtl2830_rd_reg_mask(struct rtl2830_priv
*priv
, u16 reg
, u8
*val
, u8 mask
)
168 ret
= rtl2830_rd_regs(priv
, reg
, &tmp
, 1);
174 /* find position of the first bit */
175 for (i
= 0; i
< 8; i
++) {
176 if ((mask
>> i
) & 0x01)
184 static int rtl2830_init(struct dvb_frontend
*fe
)
186 struct rtl2830_priv
*priv
= fe
->demodulator_priv
;
188 struct rtl2830_reg_val_mask tab
[] = {
189 { 0x00d, 0x01, 0x03 },
190 { 0x00d, 0x10, 0x10 },
191 { 0x104, 0x00, 0x1e },
192 { 0x105, 0x80, 0x80 },
193 { 0x110, 0x02, 0x03 },
194 { 0x110, 0x08, 0x0c },
195 { 0x17b, 0x00, 0x40 },
196 { 0x17d, 0x05, 0x0f },
197 { 0x17d, 0x50, 0xf0 },
198 { 0x18c, 0x08, 0x0f },
199 { 0x18d, 0x00, 0xc0 },
200 { 0x188, 0x05, 0x0f },
201 { 0x189, 0x00, 0xfc },
202 { 0x2d5, 0x02, 0x02 },
203 { 0x2f1, 0x02, 0x06 },
204 { 0x2f1, 0x20, 0xf8 },
205 { 0x16d, 0x00, 0x01 },
206 { 0x1a6, 0x00, 0x80 },
207 { 0x106, priv
->cfg
.vtop
, 0x3f },
208 { 0x107, priv
->cfg
.krf
, 0x3f },
209 { 0x112, 0x28, 0xff },
210 { 0x103, priv
->cfg
.agc_targ_val
, 0xff },
211 { 0x00a, 0x02, 0x07 },
212 { 0x140, 0x0c, 0x3c },
213 { 0x140, 0x40, 0xc0 },
214 { 0x15b, 0x05, 0x07 },
215 { 0x15b, 0x28, 0x38 },
216 { 0x15c, 0x05, 0x07 },
217 { 0x15c, 0x28, 0x38 },
218 { 0x115, priv
->cfg
.spec_inv
, 0x01 },
219 { 0x16f, 0x01, 0x07 },
220 { 0x170, 0x18, 0x38 },
221 { 0x172, 0x0f, 0x0f },
222 { 0x173, 0x08, 0x38 },
223 { 0x175, 0x01, 0x07 },
224 { 0x176, 0x00, 0xc0 },
227 for (i
= 0; i
< ARRAY_SIZE(tab
); i
++) {
228 ret
= rtl2830_wr_reg_mask(priv
, tab
[i
].reg
, tab
[i
].val
,
234 ret
= rtl2830_wr_regs(priv
, 0x18f, "\x28\x00", 2);
238 ret
= rtl2830_wr_regs(priv
, 0x195,
239 "\x04\x06\x0a\x12\x0a\x12\x1e\x28", 8);
243 /* TODO: spec init */
246 ret
= rtl2830_wr_reg_mask(priv
, 0x101, 0x04, 0x04);
250 ret
= rtl2830_wr_reg_mask(priv
, 0x101, 0x00, 0x04);
254 priv
->sleeping
= false;
258 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
262 static int rtl2830_sleep(struct dvb_frontend
*fe
)
264 struct rtl2830_priv
*priv
= fe
->demodulator_priv
;
265 priv
->sleeping
= true;
269 static int rtl2830_get_tune_settings(struct dvb_frontend
*fe
,
270 struct dvb_frontend_tune_settings
*s
)
272 s
->min_delay_ms
= 500;
273 s
->step_size
= fe
->ops
.info
.frequency_stepsize
* 2;
274 s
->max_drift
= (fe
->ops
.info
.frequency_stepsize
* 2) + 1;
279 static int rtl2830_set_frontend(struct dvb_frontend
*fe
)
281 struct rtl2830_priv
*priv
= fe
->demodulator_priv
;
282 struct dtv_frontend_properties
*c
= &fe
->dtv_property_cache
;
286 u32 if_ctl
, if_frequency
;
287 static const u8 bw_params1
[3][34] = {
289 0x1f, 0xf0, 0x1f, 0xf0, 0x1f, 0xfa, 0x00, 0x17, 0x00, 0x41,
290 0x00, 0x64, 0x00, 0x67, 0x00, 0x38, 0x1f, 0xde, 0x1f, 0x7a,
291 0x1f, 0x47, 0x1f, 0x7c, 0x00, 0x30, 0x01, 0x4b, 0x02, 0x82,
292 0x03, 0x73, 0x03, 0xcf, /* 6 MHz */
294 0x1f, 0xfa, 0x1f, 0xda, 0x1f, 0xc1, 0x1f, 0xb3, 0x1f, 0xca,
295 0x00, 0x07, 0x00, 0x4d, 0x00, 0x6d, 0x00, 0x40, 0x1f, 0xca,
296 0x1f, 0x4d, 0x1f, 0x2a, 0x1f, 0xb2, 0x00, 0xec, 0x02, 0x7e,
297 0x03, 0xd0, 0x04, 0x53, /* 7 MHz */
299 0x00, 0x10, 0x00, 0x0e, 0x1f, 0xf7, 0x1f, 0xc9, 0x1f, 0xa0,
300 0x1f, 0xa6, 0x1f, 0xec, 0x00, 0x4e, 0x00, 0x7d, 0x00, 0x3a,
301 0x1f, 0x98, 0x1f, 0x10, 0x1f, 0x40, 0x00, 0x75, 0x02, 0x5f,
302 0x04, 0x24, 0x04, 0xdb, /* 8 MHz */
305 static const u8 bw_params2
[3][6] = {
306 {0xc3, 0x0c, 0x44, 0x33, 0x33, 0x30}, /* 6 MHz */
307 {0xb8, 0xe3, 0x93, 0x99, 0x99, 0x98}, /* 7 MHz */
308 {0xae, 0xba, 0xf3, 0x26, 0x66, 0x64}, /* 8 MHz */
311 dev_dbg(&priv
->i2c
->dev
,
312 "%s: frequency=%d bandwidth_hz=%d inversion=%d\n",
313 __func__
, c
->frequency
, c
->bandwidth_hz
, c
->inversion
);
316 if (fe
->ops
.tuner_ops
.set_params
)
317 fe
->ops
.tuner_ops
.set_params(fe
);
319 switch (c
->bandwidth_hz
) {
330 dev_dbg(&priv
->i2c
->dev
, "%s: invalid bandwidth\n", __func__
);
334 ret
= rtl2830_wr_reg_mask(priv
, 0x008, i
<< 1, 0x06);
338 /* program if frequency */
339 if (fe
->ops
.tuner_ops
.get_if_frequency
)
340 ret
= fe
->ops
.tuner_ops
.get_if_frequency(fe
, &if_frequency
);
347 num
= if_frequency
% priv
->cfg
.xtal
;
349 num
= div_u64(num
, priv
->cfg
.xtal
);
351 if_ctl
= num
& 0x3fffff;
352 dev_dbg(&priv
->i2c
->dev
, "%s: if_frequency=%d if_ctl=%08x\n",
353 __func__
, if_frequency
, if_ctl
);
355 ret
= rtl2830_rd_reg_mask(priv
, 0x119, &tmp
, 0xc0); /* b[7:6] */
360 buf
[0] |= (if_ctl
>> 16) & 0x3f;
361 buf
[1] = (if_ctl
>> 8) & 0xff;
362 buf
[2] = (if_ctl
>> 0) & 0xff;
364 ret
= rtl2830_wr_regs(priv
, 0x119, buf
, 3);
368 /* 1/2 split I2C write */
369 ret
= rtl2830_wr_regs(priv
, 0x11c, &bw_params1
[i
][0], 17);
373 /* 2/2 split I2C write */
374 ret
= rtl2830_wr_regs(priv
, 0x12d, &bw_params1
[i
][17], 17);
378 ret
= rtl2830_wr_regs(priv
, 0x19d, bw_params2
[i
], 6);
384 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
388 static int rtl2830_get_frontend(struct dvb_frontend
*fe
)
390 struct rtl2830_priv
*priv
= fe
->demodulator_priv
;
391 struct dtv_frontend_properties
*c
= &fe
->dtv_property_cache
;
398 ret
= rtl2830_rd_regs(priv
, 0x33c, buf
, 2);
402 ret
= rtl2830_rd_reg(priv
, 0x351, &buf
[2]);
406 dev_dbg(&priv
->i2c
->dev
, "%s: TPS=%*ph\n", __func__
, 3, buf
);
408 switch ((buf
[0] >> 2) & 3) {
410 c
->modulation
= QPSK
;
413 c
->modulation
= QAM_16
;
416 c
->modulation
= QAM_64
;
420 switch ((buf
[2] >> 2) & 1) {
422 c
->transmission_mode
= TRANSMISSION_MODE_2K
;
425 c
->transmission_mode
= TRANSMISSION_MODE_8K
;
428 switch ((buf
[2] >> 0) & 3) {
430 c
->guard_interval
= GUARD_INTERVAL_1_32
;
433 c
->guard_interval
= GUARD_INTERVAL_1_16
;
436 c
->guard_interval
= GUARD_INTERVAL_1_8
;
439 c
->guard_interval
= GUARD_INTERVAL_1_4
;
443 switch ((buf
[0] >> 4) & 7) {
445 c
->hierarchy
= HIERARCHY_NONE
;
448 c
->hierarchy
= HIERARCHY_1
;
451 c
->hierarchy
= HIERARCHY_2
;
454 c
->hierarchy
= HIERARCHY_4
;
458 switch ((buf
[1] >> 3) & 7) {
460 c
->code_rate_HP
= FEC_1_2
;
463 c
->code_rate_HP
= FEC_2_3
;
466 c
->code_rate_HP
= FEC_3_4
;
469 c
->code_rate_HP
= FEC_5_6
;
472 c
->code_rate_HP
= FEC_7_8
;
476 switch ((buf
[1] >> 0) & 7) {
478 c
->code_rate_LP
= FEC_1_2
;
481 c
->code_rate_LP
= FEC_2_3
;
484 c
->code_rate_LP
= FEC_3_4
;
487 c
->code_rate_LP
= FEC_5_6
;
490 c
->code_rate_LP
= FEC_7_8
;
496 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
500 static int rtl2830_read_status(struct dvb_frontend
*fe
, fe_status_t
*status
)
502 struct rtl2830_priv
*priv
= fe
->demodulator_priv
;
510 ret
= rtl2830_rd_reg_mask(priv
, 0x351, &tmp
, 0x78); /* [6:3] */
515 *status
|= FE_HAS_SIGNAL
| FE_HAS_CARRIER
|
516 FE_HAS_VITERBI
| FE_HAS_SYNC
| FE_HAS_LOCK
;
517 } else if (tmp
== 10) {
518 *status
|= FE_HAS_SIGNAL
| FE_HAS_CARRIER
|
524 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
528 static int rtl2830_read_snr(struct dvb_frontend
*fe
, u16
*snr
)
530 struct rtl2830_priv
*priv
= fe
->demodulator_priv
;
531 int ret
, hierarchy
, constellation
;
534 #define CONSTELLATION_NUM 3
535 #define HIERARCHY_NUM 4
536 static const u32 snr_constant
[CONSTELLATION_NUM
][HIERARCHY_NUM
] = {
537 { 70705899, 70705899, 70705899, 70705899 },
538 { 82433173, 82433173, 87483115, 94445660 },
539 { 92888734, 92888734, 95487525, 99770748 },
545 /* reports SNR in resolution of 0.1 dB */
547 ret
= rtl2830_rd_reg(priv
, 0x33c, &tmp
);
551 constellation
= (tmp
>> 2) & 0x03; /* [3:2] */
552 if (constellation
> CONSTELLATION_NUM
- 1)
555 hierarchy
= (tmp
>> 4) & 0x07; /* [6:4] */
556 if (hierarchy
> HIERARCHY_NUM
- 1)
559 ret
= rtl2830_rd_regs(priv
, 0x40c, buf
, 2);
563 tmp16
= buf
[0] << 8 | buf
[1];
566 *snr
= (snr_constant
[constellation
][hierarchy
] -
567 intlog10(tmp16
)) / ((1 << 24) / 100);
573 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
577 static int rtl2830_read_ber(struct dvb_frontend
*fe
, u32
*ber
)
579 struct rtl2830_priv
*priv
= fe
->demodulator_priv
;
586 ret
= rtl2830_rd_regs(priv
, 0x34e, buf
, 2);
590 *ber
= buf
[0] << 8 | buf
[1];
594 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
598 static int rtl2830_read_ucblocks(struct dvb_frontend
*fe
, u32
*ucblocks
)
604 static int rtl2830_read_signal_strength(struct dvb_frontend
*fe
, u16
*strength
)
606 struct rtl2830_priv
*priv
= fe
->demodulator_priv
;
609 u16 if_agc_raw
, if_agc
;
614 ret
= rtl2830_rd_regs(priv
, 0x359, buf
, 2);
618 if_agc_raw
= (buf
[0] << 8 | buf
[1]) & 0x3fff;
620 if (if_agc_raw
& (1 << 9))
621 if_agc
= -(~(if_agc_raw
- 1) & 0x1ff);
625 *strength
= (u8
) (55 - if_agc
/ 182);
626 *strength
|= *strength
<< 8;
630 dev_dbg(&priv
->i2c
->dev
, "%s: failed=%d\n", __func__
, ret
);
634 static struct dvb_frontend_ops rtl2830_ops
= {
635 .delsys
= { SYS_DVBT
},
637 .name
= "Realtek RTL2830 (DVB-T)",
638 .caps
= FE_CAN_FEC_1_2
|
648 FE_CAN_TRANSMISSION_MODE_AUTO
|
649 FE_CAN_GUARD_INTERVAL_AUTO
|
650 FE_CAN_HIERARCHY_AUTO
|
655 .init
= rtl2830_init
,
656 .sleep
= rtl2830_sleep
,
658 .get_tune_settings
= rtl2830_get_tune_settings
,
660 .set_frontend
= rtl2830_set_frontend
,
661 .get_frontend
= rtl2830_get_frontend
,
663 .read_status
= rtl2830_read_status
,
664 .read_snr
= rtl2830_read_snr
,
665 .read_ber
= rtl2830_read_ber
,
666 .read_ucblocks
= rtl2830_read_ucblocks
,
667 .read_signal_strength
= rtl2830_read_signal_strength
,
671 * I2C gate/repeater logic
672 * We must use unlocked i2c_transfer() here because I2C lock is already taken
673 * by tuner driver. Gate is closed automatically after single I2C xfer.
675 static int rtl2830_select(struct i2c_adapter
*adap
, void *mux_priv
, u32 chan_id
)
677 struct i2c_client
*client
= mux_priv
;
678 struct rtl2830_priv
*priv
= i2c_get_clientdata(client
);
679 struct i2c_msg select_reg_page_msg
[1] = {
681 .addr
= priv
->cfg
.i2c_addr
,
687 struct i2c_msg gate_open_msg
[1] = {
689 .addr
= priv
->cfg
.i2c_addr
,
697 /* select register page */
698 ret
= __i2c_transfer(adap
, select_reg_page_msg
, 1);
700 dev_warn(&client
->dev
, "i2c write failed %d\n", ret
);
708 /* open tuner I2C repeater for 1 xfer, closes automatically */
709 ret
= __i2c_transfer(adap
, gate_open_msg
, 1);
711 dev_warn(&client
->dev
, "i2c write failed %d\n", ret
);
720 dev_dbg(&client
->dev
, "%s: failed=%d\n", __func__
, ret
);
724 static struct dvb_frontend
*rtl2830_get_dvb_frontend(struct i2c_client
*client
)
726 struct rtl2830_priv
*priv
= i2c_get_clientdata(client
);
728 dev_dbg(&client
->dev
, "\n");
733 static struct i2c_adapter
*rtl2830_get_i2c_adapter(struct i2c_client
*client
)
735 struct rtl2830_priv
*priv
= i2c_get_clientdata(client
);
737 dev_dbg(&client
->dev
, "\n");
739 return priv
->adapter
;
742 static int rtl2830_probe(struct i2c_client
*client
,
743 const struct i2c_device_id
*id
)
745 struct rtl2830_platform_data
*pdata
= client
->dev
.platform_data
;
746 struct i2c_adapter
*i2c
= client
->adapter
;
747 struct rtl2830_priv
*priv
;
751 dev_dbg(&client
->dev
, "\n");
758 /* allocate memory for the internal state */
759 priv
= kzalloc(sizeof(*priv
), GFP_KERNEL
);
765 /* setup the state */
766 i2c_set_clientdata(client
, priv
);
768 priv
->sleeping
= true;
769 priv
->cfg
.i2c_addr
= client
->addr
;
770 priv
->cfg
.xtal
= pdata
->clk
;
771 priv
->cfg
.spec_inv
= pdata
->spec_inv
;
772 priv
->cfg
.vtop
= pdata
->vtop
;
773 priv
->cfg
.krf
= pdata
->krf
;
774 priv
->cfg
.agc_targ_val
= pdata
->agc_targ_val
;
776 /* check if the demod is there */
777 ret
= rtl2830_rd_reg(priv
, 0x000, &u8tmp
);
781 /* create muxed i2c adapter for tuner */
782 priv
->adapter
= i2c_add_mux_adapter(client
->adapter
, &client
->dev
,
783 client
, 0, 0, 0, rtl2830_select
, NULL
);
784 if (priv
->adapter
== NULL
) {
789 /* create dvb frontend */
790 memcpy(&priv
->fe
.ops
, &rtl2830_ops
, sizeof(priv
->fe
.ops
));
791 priv
->fe
.demodulator_priv
= priv
;
793 /* setup callbacks */
794 pdata
->get_dvb_frontend
= rtl2830_get_dvb_frontend
;
795 pdata
->get_i2c_adapter
= rtl2830_get_i2c_adapter
;
797 dev_info(&client
->dev
, "Realtek RTL2830 successfully attached\n");
803 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
807 static int rtl2830_remove(struct i2c_client
*client
)
809 struct rtl2830_priv
*priv
= i2c_get_clientdata(client
);
811 dev_dbg(&client
->dev
, "\n");
813 i2c_del_mux_adapter(priv
->adapter
);
818 static const struct i2c_device_id rtl2830_id_table
[] = {
822 MODULE_DEVICE_TABLE(i2c
, rtl2830_id_table
);
824 static struct i2c_driver rtl2830_driver
= {
826 .owner
= THIS_MODULE
,
829 .probe
= rtl2830_probe
,
830 .remove
= rtl2830_remove
,
831 .id_table
= rtl2830_id_table
,
834 module_i2c_driver(rtl2830_driver
);
836 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
837 MODULE_DESCRIPTION("Realtek RTL2830 DVB-T demodulator driver");
838 MODULE_LICENSE("GPL");