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 i2c_client
*client
, u8 reg
, const u8
*val
, int len
)
37 u8 buf
[MAX_XFER_SIZE
];
38 struct i2c_msg msg
[1] = {
47 if (1 + len
> sizeof(buf
)) {
48 dev_warn(&client
->dev
, "i2c wr reg=%04x: len=%d is too big!\n",
54 memcpy(&buf
[1], val
, len
);
56 ret
= i2c_transfer(client
->adapter
, msg
, 1);
60 dev_warn(&client
->dev
, "i2c wr failed=%d reg=%02x len=%d\n",
67 /* read multiple hardware registers */
68 static int rtl2830_rd(struct i2c_client
*client
, u8 reg
, u8
*val
, int len
)
71 struct i2c_msg msg
[2] = {
85 ret
= i2c_transfer(client
->adapter
, msg
, 2);
89 dev_warn(&client
->dev
, "i2c rd failed=%d reg=%02x len=%d\n",
96 /* write multiple registers */
97 static int rtl2830_wr_regs(struct i2c_client
*client
, u16 reg
, const u8
*val
, int len
)
99 struct rtl2830_dev
*dev
= i2c_get_clientdata(client
);
101 u8 reg2
= (reg
>> 0) & 0xff;
102 u8 page
= (reg
>> 8) & 0xff;
104 /* switch bank if needed */
105 if (page
!= dev
->page
) {
106 ret
= rtl2830_wr(client
, 0x00, &page
, 1);
113 return rtl2830_wr(client
, reg2
, val
, len
);
116 /* read multiple registers */
117 static int rtl2830_rd_regs(struct i2c_client
*client
, u16 reg
, u8
*val
, int len
)
119 struct rtl2830_dev
*dev
= i2c_get_clientdata(client
);
121 u8 reg2
= (reg
>> 0) & 0xff;
122 u8 page
= (reg
>> 8) & 0xff;
124 /* switch bank if needed */
125 if (page
!= dev
->page
) {
126 ret
= rtl2830_wr(client
, 0x00, &page
, 1);
133 return rtl2830_rd(client
, reg2
, val
, len
);
136 /* read single register */
137 static int rtl2830_rd_reg(struct i2c_client
*client
, u16 reg
, u8
*val
)
139 return rtl2830_rd_regs(client
, reg
, val
, 1);
142 /* write single register with mask */
143 static int rtl2830_wr_reg_mask(struct i2c_client
*client
, u16 reg
, u8 val
, u8 mask
)
148 /* no need for read if whole reg is written */
150 ret
= rtl2830_rd_regs(client
, reg
, &tmp
, 1);
159 return rtl2830_wr_regs(client
, reg
, &val
, 1);
162 /* read single register with mask */
163 static int rtl2830_rd_reg_mask(struct i2c_client
*client
, u16 reg
, u8
*val
, u8 mask
)
168 ret
= rtl2830_rd_regs(client
, 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 i2c_client
*client
= fe
->demodulator_priv
;
187 struct rtl2830_dev
*dev
= i2c_get_clientdata(client
);
189 struct rtl2830_reg_val_mask tab
[] = {
190 { 0x00d, 0x01, 0x03 },
191 { 0x00d, 0x10, 0x10 },
192 { 0x104, 0x00, 0x1e },
193 { 0x105, 0x80, 0x80 },
194 { 0x110, 0x02, 0x03 },
195 { 0x110, 0x08, 0x0c },
196 { 0x17b, 0x00, 0x40 },
197 { 0x17d, 0x05, 0x0f },
198 { 0x17d, 0x50, 0xf0 },
199 { 0x18c, 0x08, 0x0f },
200 { 0x18d, 0x00, 0xc0 },
201 { 0x188, 0x05, 0x0f },
202 { 0x189, 0x00, 0xfc },
203 { 0x2d5, 0x02, 0x02 },
204 { 0x2f1, 0x02, 0x06 },
205 { 0x2f1, 0x20, 0xf8 },
206 { 0x16d, 0x00, 0x01 },
207 { 0x1a6, 0x00, 0x80 },
208 { 0x106, dev
->pdata
->vtop
, 0x3f },
209 { 0x107, dev
->pdata
->krf
, 0x3f },
210 { 0x112, 0x28, 0xff },
211 { 0x103, dev
->pdata
->agc_targ_val
, 0xff },
212 { 0x00a, 0x02, 0x07 },
213 { 0x140, 0x0c, 0x3c },
214 { 0x140, 0x40, 0xc0 },
215 { 0x15b, 0x05, 0x07 },
216 { 0x15b, 0x28, 0x38 },
217 { 0x15c, 0x05, 0x07 },
218 { 0x15c, 0x28, 0x38 },
219 { 0x115, dev
->pdata
->spec_inv
, 0x01 },
220 { 0x16f, 0x01, 0x07 },
221 { 0x170, 0x18, 0x38 },
222 { 0x172, 0x0f, 0x0f },
223 { 0x173, 0x08, 0x38 },
224 { 0x175, 0x01, 0x07 },
225 { 0x176, 0x00, 0xc0 },
228 for (i
= 0; i
< ARRAY_SIZE(tab
); i
++) {
229 ret
= rtl2830_wr_reg_mask(client
, tab
[i
].reg
, tab
[i
].val
,
235 ret
= rtl2830_wr_regs(client
, 0x18f, "\x28\x00", 2);
239 ret
= rtl2830_wr_regs(client
, 0x195,
240 "\x04\x06\x0a\x12\x0a\x12\x1e\x28", 8);
244 /* TODO: spec init */
247 ret
= rtl2830_wr_reg_mask(client
, 0x101, 0x04, 0x04);
251 ret
= rtl2830_wr_reg_mask(client
, 0x101, 0x00, 0x04);
255 dev
->sleeping
= false;
259 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
263 static int rtl2830_sleep(struct dvb_frontend
*fe
)
265 struct i2c_client
*client
= fe
->demodulator_priv
;
266 struct rtl2830_dev
*dev
= i2c_get_clientdata(client
);
267 dev
->sleeping
= true;
271 static int rtl2830_get_tune_settings(struct dvb_frontend
*fe
,
272 struct dvb_frontend_tune_settings
*s
)
274 s
->min_delay_ms
= 500;
275 s
->step_size
= fe
->ops
.info
.frequency_stepsize
* 2;
276 s
->max_drift
= (fe
->ops
.info
.frequency_stepsize
* 2) + 1;
281 static int rtl2830_set_frontend(struct dvb_frontend
*fe
)
283 struct i2c_client
*client
= fe
->demodulator_priv
;
284 struct rtl2830_dev
*dev
= i2c_get_clientdata(client
);
285 struct dtv_frontend_properties
*c
= &fe
->dtv_property_cache
;
289 u32 if_ctl
, if_frequency
;
290 static const u8 bw_params1
[3][34] = {
292 0x1f, 0xf0, 0x1f, 0xf0, 0x1f, 0xfa, 0x00, 0x17, 0x00, 0x41,
293 0x00, 0x64, 0x00, 0x67, 0x00, 0x38, 0x1f, 0xde, 0x1f, 0x7a,
294 0x1f, 0x47, 0x1f, 0x7c, 0x00, 0x30, 0x01, 0x4b, 0x02, 0x82,
295 0x03, 0x73, 0x03, 0xcf, /* 6 MHz */
297 0x1f, 0xfa, 0x1f, 0xda, 0x1f, 0xc1, 0x1f, 0xb3, 0x1f, 0xca,
298 0x00, 0x07, 0x00, 0x4d, 0x00, 0x6d, 0x00, 0x40, 0x1f, 0xca,
299 0x1f, 0x4d, 0x1f, 0x2a, 0x1f, 0xb2, 0x00, 0xec, 0x02, 0x7e,
300 0x03, 0xd0, 0x04, 0x53, /* 7 MHz */
302 0x00, 0x10, 0x00, 0x0e, 0x1f, 0xf7, 0x1f, 0xc9, 0x1f, 0xa0,
303 0x1f, 0xa6, 0x1f, 0xec, 0x00, 0x4e, 0x00, 0x7d, 0x00, 0x3a,
304 0x1f, 0x98, 0x1f, 0x10, 0x1f, 0x40, 0x00, 0x75, 0x02, 0x5f,
305 0x04, 0x24, 0x04, 0xdb, /* 8 MHz */
308 static const u8 bw_params2
[3][6] = {
309 {0xc3, 0x0c, 0x44, 0x33, 0x33, 0x30}, /* 6 MHz */
310 {0xb8, 0xe3, 0x93, 0x99, 0x99, 0x98}, /* 7 MHz */
311 {0xae, 0xba, 0xf3, 0x26, 0x66, 0x64}, /* 8 MHz */
314 dev_dbg(&client
->dev
, "frequency=%u bandwidth_hz=%u inversion=%u\n",
315 c
->frequency
, c
->bandwidth_hz
, c
->inversion
);
318 if (fe
->ops
.tuner_ops
.set_params
)
319 fe
->ops
.tuner_ops
.set_params(fe
);
321 switch (c
->bandwidth_hz
) {
332 dev_err(&client
->dev
, "invalid bandwidth_hz %u\n",
337 ret
= rtl2830_wr_reg_mask(client
, 0x008, i
<< 1, 0x06);
341 /* program if frequency */
342 if (fe
->ops
.tuner_ops
.get_if_frequency
)
343 ret
= fe
->ops
.tuner_ops
.get_if_frequency(fe
, &if_frequency
);
350 num
= if_frequency
% dev
->pdata
->clk
;
352 num
= div_u64(num
, dev
->pdata
->clk
);
354 if_ctl
= num
& 0x3fffff;
355 dev_dbg(&client
->dev
, "if_frequency=%d if_ctl=%08x\n",
356 if_frequency
, if_ctl
);
358 ret
= rtl2830_rd_reg_mask(client
, 0x119, &tmp
, 0xc0); /* b[7:6] */
363 buf
[0] |= (if_ctl
>> 16) & 0x3f;
364 buf
[1] = (if_ctl
>> 8) & 0xff;
365 buf
[2] = (if_ctl
>> 0) & 0xff;
367 ret
= rtl2830_wr_regs(client
, 0x119, buf
, 3);
371 /* 1/2 split I2C write */
372 ret
= rtl2830_wr_regs(client
, 0x11c, &bw_params1
[i
][0], 17);
376 /* 2/2 split I2C write */
377 ret
= rtl2830_wr_regs(client
, 0x12d, &bw_params1
[i
][17], 17);
381 ret
= rtl2830_wr_regs(client
, 0x19d, bw_params2
[i
], 6);
387 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
391 static int rtl2830_get_frontend(struct dvb_frontend
*fe
)
393 struct i2c_client
*client
= fe
->demodulator_priv
;
394 struct rtl2830_dev
*dev
= i2c_get_clientdata(client
);
395 struct dtv_frontend_properties
*c
= &fe
->dtv_property_cache
;
402 ret
= rtl2830_rd_regs(client
, 0x33c, buf
, 2);
406 ret
= rtl2830_rd_reg(client
, 0x351, &buf
[2]);
410 dev_dbg(&client
->dev
, "TPS=%*ph\n", 3, buf
);
412 switch ((buf
[0] >> 2) & 3) {
414 c
->modulation
= QPSK
;
417 c
->modulation
= QAM_16
;
420 c
->modulation
= QAM_64
;
424 switch ((buf
[2] >> 2) & 1) {
426 c
->transmission_mode
= TRANSMISSION_MODE_2K
;
429 c
->transmission_mode
= TRANSMISSION_MODE_8K
;
432 switch ((buf
[2] >> 0) & 3) {
434 c
->guard_interval
= GUARD_INTERVAL_1_32
;
437 c
->guard_interval
= GUARD_INTERVAL_1_16
;
440 c
->guard_interval
= GUARD_INTERVAL_1_8
;
443 c
->guard_interval
= GUARD_INTERVAL_1_4
;
447 switch ((buf
[0] >> 4) & 7) {
449 c
->hierarchy
= HIERARCHY_NONE
;
452 c
->hierarchy
= HIERARCHY_1
;
455 c
->hierarchy
= HIERARCHY_2
;
458 c
->hierarchy
= HIERARCHY_4
;
462 switch ((buf
[1] >> 3) & 7) {
464 c
->code_rate_HP
= FEC_1_2
;
467 c
->code_rate_HP
= FEC_2_3
;
470 c
->code_rate_HP
= FEC_3_4
;
473 c
->code_rate_HP
= FEC_5_6
;
476 c
->code_rate_HP
= FEC_7_8
;
480 switch ((buf
[1] >> 0) & 7) {
482 c
->code_rate_LP
= FEC_1_2
;
485 c
->code_rate_LP
= FEC_2_3
;
488 c
->code_rate_LP
= FEC_3_4
;
491 c
->code_rate_LP
= FEC_5_6
;
494 c
->code_rate_LP
= FEC_7_8
;
500 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
504 static int rtl2830_read_status(struct dvb_frontend
*fe
, fe_status_t
*status
)
506 struct i2c_client
*client
= fe
->demodulator_priv
;
507 struct rtl2830_dev
*dev
= i2c_get_clientdata(client
);
515 ret
= rtl2830_rd_reg_mask(client
, 0x351, &tmp
, 0x78); /* [6:3] */
520 *status
|= FE_HAS_SIGNAL
| FE_HAS_CARRIER
|
521 FE_HAS_VITERBI
| FE_HAS_SYNC
| FE_HAS_LOCK
;
522 } else if (tmp
== 10) {
523 *status
|= FE_HAS_SIGNAL
| FE_HAS_CARRIER
|
529 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
533 static int rtl2830_read_snr(struct dvb_frontend
*fe
, u16
*snr
)
535 struct i2c_client
*client
= fe
->demodulator_priv
;
536 struct rtl2830_dev
*dev
= i2c_get_clientdata(client
);
537 int ret
, hierarchy
, constellation
;
540 #define CONSTELLATION_NUM 3
541 #define HIERARCHY_NUM 4
542 static const u32 snr_constant
[CONSTELLATION_NUM
][HIERARCHY_NUM
] = {
543 { 70705899, 70705899, 70705899, 70705899 },
544 { 82433173, 82433173, 87483115, 94445660 },
545 { 92888734, 92888734, 95487525, 99770748 },
551 /* reports SNR in resolution of 0.1 dB */
553 ret
= rtl2830_rd_reg(client
, 0x33c, &tmp
);
557 constellation
= (tmp
>> 2) & 0x03; /* [3:2] */
558 if (constellation
> CONSTELLATION_NUM
- 1)
561 hierarchy
= (tmp
>> 4) & 0x07; /* [6:4] */
562 if (hierarchy
> HIERARCHY_NUM
- 1)
565 ret
= rtl2830_rd_regs(client
, 0x40c, buf
, 2);
569 tmp16
= buf
[0] << 8 | buf
[1];
572 *snr
= (snr_constant
[constellation
][hierarchy
] -
573 intlog10(tmp16
)) / ((1 << 24) / 100);
579 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
583 static int rtl2830_read_ber(struct dvb_frontend
*fe
, u32
*ber
)
585 struct i2c_client
*client
= fe
->demodulator_priv
;
586 struct rtl2830_dev
*dev
= i2c_get_clientdata(client
);
593 ret
= rtl2830_rd_regs(client
, 0x34e, buf
, 2);
597 *ber
= buf
[0] << 8 | buf
[1];
601 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
605 static int rtl2830_read_ucblocks(struct dvb_frontend
*fe
, u32
*ucblocks
)
611 static int rtl2830_read_signal_strength(struct dvb_frontend
*fe
, u16
*strength
)
613 struct i2c_client
*client
= fe
->demodulator_priv
;
614 struct rtl2830_dev
*dev
= i2c_get_clientdata(client
);
617 u16 if_agc_raw
, if_agc
;
622 ret
= rtl2830_rd_regs(client
, 0x359, buf
, 2);
626 if_agc_raw
= (buf
[0] << 8 | buf
[1]) & 0x3fff;
628 if (if_agc_raw
& (1 << 9))
629 if_agc
= -(~(if_agc_raw
- 1) & 0x1ff);
633 *strength
= (u8
) (55 - if_agc
/ 182);
634 *strength
|= *strength
<< 8;
638 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
642 static struct dvb_frontend_ops rtl2830_ops
= {
643 .delsys
= { SYS_DVBT
},
645 .name
= "Realtek RTL2830 (DVB-T)",
646 .caps
= FE_CAN_FEC_1_2
|
656 FE_CAN_TRANSMISSION_MODE_AUTO
|
657 FE_CAN_GUARD_INTERVAL_AUTO
|
658 FE_CAN_HIERARCHY_AUTO
|
663 .init
= rtl2830_init
,
664 .sleep
= rtl2830_sleep
,
666 .get_tune_settings
= rtl2830_get_tune_settings
,
668 .set_frontend
= rtl2830_set_frontend
,
669 .get_frontend
= rtl2830_get_frontend
,
671 .read_status
= rtl2830_read_status
,
672 .read_snr
= rtl2830_read_snr
,
673 .read_ber
= rtl2830_read_ber
,
674 .read_ucblocks
= rtl2830_read_ucblocks
,
675 .read_signal_strength
= rtl2830_read_signal_strength
,
679 * I2C gate/repeater logic
680 * We must use unlocked i2c_transfer() here because I2C lock is already taken
681 * by tuner driver. Gate is closed automatically after single I2C xfer.
683 static int rtl2830_select(struct i2c_adapter
*adap
, void *mux_priv
, u32 chan_id
)
685 struct i2c_client
*client
= mux_priv
;
686 struct rtl2830_dev
*dev
= i2c_get_clientdata(client
);
687 struct i2c_msg select_reg_page_msg
[1] = {
689 .addr
= client
->addr
,
695 struct i2c_msg gate_open_msg
[1] = {
697 .addr
= client
->addr
,
705 /* select register page */
706 ret
= __i2c_transfer(client
->adapter
, select_reg_page_msg
, 1);
708 dev_warn(&client
->dev
, "i2c write failed %d\n", ret
);
716 /* open tuner I2C repeater for 1 xfer, closes automatically */
717 ret
= __i2c_transfer(client
->adapter
, gate_open_msg
, 1);
719 dev_warn(&client
->dev
, "i2c write failed %d\n", ret
);
728 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
732 static struct dvb_frontend
*rtl2830_get_dvb_frontend(struct i2c_client
*client
)
734 struct rtl2830_dev
*dev
= i2c_get_clientdata(client
);
736 dev_dbg(&client
->dev
, "\n");
741 static struct i2c_adapter
*rtl2830_get_i2c_adapter(struct i2c_client
*client
)
743 struct rtl2830_dev
*dev
= i2c_get_clientdata(client
);
745 dev_dbg(&client
->dev
, "\n");
750 static int rtl2830_probe(struct i2c_client
*client
,
751 const struct i2c_device_id
*id
)
753 struct rtl2830_platform_data
*pdata
= client
->dev
.platform_data
;
754 struct rtl2830_dev
*dev
;
758 dev_dbg(&client
->dev
, "\n");
765 /* allocate memory for the internal state */
766 dev
= kzalloc(sizeof(*dev
), GFP_KERNEL
);
772 /* setup the state */
773 i2c_set_clientdata(client
, dev
);
774 dev
->pdata
= client
->dev
.platform_data
;
775 dev
->sleeping
= true;
777 /* check if the demod is there */
778 ret
= rtl2830_rd_reg(client
, 0x000, &u8tmp
);
782 /* create muxed i2c adapter for tuner */
783 dev
->adapter
= i2c_add_mux_adapter(client
->adapter
, &client
->dev
,
784 client
, 0, 0, 0, rtl2830_select
, NULL
);
785 if (dev
->adapter
== NULL
) {
790 /* create dvb frontend */
791 memcpy(&dev
->fe
.ops
, &rtl2830_ops
, sizeof(dev
->fe
.ops
));
792 dev
->fe
.demodulator_priv
= client
;
794 /* setup callbacks */
795 pdata
->get_dvb_frontend
= rtl2830_get_dvb_frontend
;
796 pdata
->get_i2c_adapter
= rtl2830_get_i2c_adapter
;
798 dev_info(&client
->dev
, "Realtek RTL2830 successfully attached\n");
804 dev_dbg(&client
->dev
, "failed=%d\n", ret
);
808 static int rtl2830_remove(struct i2c_client
*client
)
810 struct rtl2830_dev
*dev
= i2c_get_clientdata(client
);
812 dev_dbg(&client
->dev
, "\n");
814 i2c_del_mux_adapter(dev
->adapter
);
819 static const struct i2c_device_id rtl2830_id_table
[] = {
823 MODULE_DEVICE_TABLE(i2c
, rtl2830_id_table
);
825 static struct i2c_driver rtl2830_driver
= {
827 .owner
= THIS_MODULE
,
830 .probe
= rtl2830_probe
,
831 .remove
= rtl2830_remove
,
832 .id_table
= rtl2830_id_table
,
835 module_i2c_driver(rtl2830_driver
);
837 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
838 MODULE_DESCRIPTION("Realtek RTL2830 DVB-T demodulator driver");
839 MODULE_LICENSE("GPL");