Merge 5.0-rc6 into driver-core-next
[linux/fpc-iii.git] / drivers / media / dvb-frontends / rtl2830.c
blobc0659568471b8d3663b3cde025199f842eb4cbb0
1 /*
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.
18 #include "rtl2830_priv.h"
20 /* Our regmap is bypassing I2C adapter lock, thus we do it! */
21 static int rtl2830_bulk_write(struct i2c_client *client, unsigned int reg,
22 const void *val, size_t val_count)
24 struct rtl2830_dev *dev = i2c_get_clientdata(client);
25 int ret;
27 i2c_lock_bus(client->adapter, I2C_LOCK_SEGMENT);
28 ret = regmap_bulk_write(dev->regmap, reg, val, val_count);
29 i2c_unlock_bus(client->adapter, I2C_LOCK_SEGMENT);
30 return ret;
33 static int rtl2830_update_bits(struct i2c_client *client, unsigned int reg,
34 unsigned int mask, unsigned int val)
36 struct rtl2830_dev *dev = i2c_get_clientdata(client);
37 int ret;
39 i2c_lock_bus(client->adapter, I2C_LOCK_SEGMENT);
40 ret = regmap_update_bits(dev->regmap, reg, mask, val);
41 i2c_unlock_bus(client->adapter, I2C_LOCK_SEGMENT);
42 return ret;
45 static int rtl2830_bulk_read(struct i2c_client *client, unsigned int reg,
46 void *val, size_t val_count)
48 struct rtl2830_dev *dev = i2c_get_clientdata(client);
49 int ret;
51 i2c_lock_bus(client->adapter, I2C_LOCK_SEGMENT);
52 ret = regmap_bulk_read(dev->regmap, reg, val, val_count);
53 i2c_unlock_bus(client->adapter, I2C_LOCK_SEGMENT);
54 return ret;
57 static int rtl2830_init(struct dvb_frontend *fe)
59 struct i2c_client *client = fe->demodulator_priv;
60 struct rtl2830_dev *dev = i2c_get_clientdata(client);
61 struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
62 int ret, i;
63 struct rtl2830_reg_val_mask tab[] = {
64 {0x00d, 0x01, 0x03},
65 {0x00d, 0x10, 0x10},
66 {0x104, 0x00, 0x1e},
67 {0x105, 0x80, 0x80},
68 {0x110, 0x02, 0x03},
69 {0x110, 0x08, 0x0c},
70 {0x17b, 0x00, 0x40},
71 {0x17d, 0x05, 0x0f},
72 {0x17d, 0x50, 0xf0},
73 {0x18c, 0x08, 0x0f},
74 {0x18d, 0x00, 0xc0},
75 {0x188, 0x05, 0x0f},
76 {0x189, 0x00, 0xfc},
77 {0x2d5, 0x02, 0x02},
78 {0x2f1, 0x02, 0x06},
79 {0x2f1, 0x20, 0xf8},
80 {0x16d, 0x00, 0x01},
81 {0x1a6, 0x00, 0x80},
82 {0x106, dev->pdata->vtop, 0x3f},
83 {0x107, dev->pdata->krf, 0x3f},
84 {0x112, 0x28, 0xff},
85 {0x103, dev->pdata->agc_targ_val, 0xff},
86 {0x00a, 0x02, 0x07},
87 {0x140, 0x0c, 0x3c},
88 {0x140, 0x40, 0xc0},
89 {0x15b, 0x05, 0x07},
90 {0x15b, 0x28, 0x38},
91 {0x15c, 0x05, 0x07},
92 {0x15c, 0x28, 0x38},
93 {0x115, dev->pdata->spec_inv, 0x01},
94 {0x16f, 0x01, 0x07},
95 {0x170, 0x18, 0x38},
96 {0x172, 0x0f, 0x0f},
97 {0x173, 0x08, 0x38},
98 {0x175, 0x01, 0x07},
99 {0x176, 0x00, 0xc0},
102 for (i = 0; i < ARRAY_SIZE(tab); i++) {
103 ret = rtl2830_update_bits(client, tab[i].reg, tab[i].mask,
104 tab[i].val);
105 if (ret)
106 goto err;
109 ret = rtl2830_bulk_write(client, 0x18f, "\x28\x00", 2);
110 if (ret)
111 goto err;
113 ret = rtl2830_bulk_write(client, 0x195,
114 "\x04\x06\x0a\x12\x0a\x12\x1e\x28", 8);
115 if (ret)
116 goto err;
118 /* TODO: spec init */
120 /* soft reset */
121 ret = rtl2830_update_bits(client, 0x101, 0x04, 0x04);
122 if (ret)
123 goto err;
125 ret = rtl2830_update_bits(client, 0x101, 0x04, 0x00);
126 if (ret)
127 goto err;
129 /* init stats here in order signal app which stats are supported */
130 c->strength.len = 1;
131 c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
132 c->cnr.len = 1;
133 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
134 c->post_bit_error.len = 1;
135 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
136 c->post_bit_count.len = 1;
137 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
139 dev->sleeping = false;
141 return ret;
142 err:
143 dev_dbg(&client->dev, "failed=%d\n", ret);
144 return ret;
147 static int rtl2830_sleep(struct dvb_frontend *fe)
149 struct i2c_client *client = fe->demodulator_priv;
150 struct rtl2830_dev *dev = i2c_get_clientdata(client);
152 dev->sleeping = true;
153 dev->fe_status = 0;
155 return 0;
158 static int rtl2830_get_tune_settings(struct dvb_frontend *fe,
159 struct dvb_frontend_tune_settings *s)
161 s->min_delay_ms = 500;
162 s->step_size = fe->ops.info.frequency_stepsize_hz * 2;
163 s->max_drift = (fe->ops.info.frequency_stepsize_hz * 2) + 1;
165 return 0;
168 static int rtl2830_set_frontend(struct dvb_frontend *fe)
170 struct i2c_client *client = fe->demodulator_priv;
171 struct rtl2830_dev *dev = i2c_get_clientdata(client);
172 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
173 int ret, i;
174 u64 num;
175 u8 buf[3], u8tmp;
176 u32 if_ctl, if_frequency;
177 static const u8 bw_params1[3][34] = {
179 0x1f, 0xf0, 0x1f, 0xf0, 0x1f, 0xfa, 0x00, 0x17, 0x00, 0x41,
180 0x00, 0x64, 0x00, 0x67, 0x00, 0x38, 0x1f, 0xde, 0x1f, 0x7a,
181 0x1f, 0x47, 0x1f, 0x7c, 0x00, 0x30, 0x01, 0x4b, 0x02, 0x82,
182 0x03, 0x73, 0x03, 0xcf, /* 6 MHz */
183 }, {
184 0x1f, 0xfa, 0x1f, 0xda, 0x1f, 0xc1, 0x1f, 0xb3, 0x1f, 0xca,
185 0x00, 0x07, 0x00, 0x4d, 0x00, 0x6d, 0x00, 0x40, 0x1f, 0xca,
186 0x1f, 0x4d, 0x1f, 0x2a, 0x1f, 0xb2, 0x00, 0xec, 0x02, 0x7e,
187 0x03, 0xd0, 0x04, 0x53, /* 7 MHz */
188 }, {
189 0x00, 0x10, 0x00, 0x0e, 0x1f, 0xf7, 0x1f, 0xc9, 0x1f, 0xa0,
190 0x1f, 0xa6, 0x1f, 0xec, 0x00, 0x4e, 0x00, 0x7d, 0x00, 0x3a,
191 0x1f, 0x98, 0x1f, 0x10, 0x1f, 0x40, 0x00, 0x75, 0x02, 0x5f,
192 0x04, 0x24, 0x04, 0xdb, /* 8 MHz */
195 static const u8 bw_params2[3][6] = {
196 {0xc3, 0x0c, 0x44, 0x33, 0x33, 0x30}, /* 6 MHz */
197 {0xb8, 0xe3, 0x93, 0x99, 0x99, 0x98}, /* 7 MHz */
198 {0xae, 0xba, 0xf3, 0x26, 0x66, 0x64}, /* 8 MHz */
201 dev_dbg(&client->dev, "frequency=%u bandwidth_hz=%u inversion=%u\n",
202 c->frequency, c->bandwidth_hz, c->inversion);
204 /* program tuner */
205 if (fe->ops.tuner_ops.set_params)
206 fe->ops.tuner_ops.set_params(fe);
208 switch (c->bandwidth_hz) {
209 case 6000000:
210 i = 0;
211 break;
212 case 7000000:
213 i = 1;
214 break;
215 case 8000000:
216 i = 2;
217 break;
218 default:
219 dev_err(&client->dev, "invalid bandwidth_hz %u\n",
220 c->bandwidth_hz);
221 return -EINVAL;
224 ret = rtl2830_update_bits(client, 0x008, 0x06, i << 1);
225 if (ret)
226 goto err;
228 /* program if frequency */
229 if (fe->ops.tuner_ops.get_if_frequency)
230 ret = fe->ops.tuner_ops.get_if_frequency(fe, &if_frequency);
231 else
232 ret = -EINVAL;
233 if (ret)
234 goto err;
236 num = if_frequency % dev->pdata->clk;
237 num *= 0x400000;
238 num = div_u64(num, dev->pdata->clk);
239 num = -num;
240 if_ctl = num & 0x3fffff;
241 dev_dbg(&client->dev, "if_frequency=%d if_ctl=%08x\n",
242 if_frequency, if_ctl);
244 buf[0] = (if_ctl >> 16) & 0x3f;
245 buf[1] = (if_ctl >> 8) & 0xff;
246 buf[2] = (if_ctl >> 0) & 0xff;
248 ret = rtl2830_bulk_read(client, 0x119, &u8tmp, 1);
249 if (ret)
250 goto err;
252 buf[0] |= u8tmp & 0xc0; /* [7:6] */
254 ret = rtl2830_bulk_write(client, 0x119, buf, 3);
255 if (ret)
256 goto err;
258 /* 1/2 split I2C write */
259 ret = rtl2830_bulk_write(client, 0x11c, &bw_params1[i][0], 17);
260 if (ret)
261 goto err;
263 /* 2/2 split I2C write */
264 ret = rtl2830_bulk_write(client, 0x12d, &bw_params1[i][17], 17);
265 if (ret)
266 goto err;
268 ret = rtl2830_bulk_write(client, 0x19d, bw_params2[i], 6);
269 if (ret)
270 goto err;
272 return ret;
273 err:
274 dev_dbg(&client->dev, "failed=%d\n", ret);
275 return ret;
278 static int rtl2830_get_frontend(struct dvb_frontend *fe,
279 struct dtv_frontend_properties *c)
281 struct i2c_client *client = fe->demodulator_priv;
282 struct rtl2830_dev *dev = i2c_get_clientdata(client);
283 int ret;
284 u8 buf[3];
286 if (dev->sleeping)
287 return 0;
289 ret = rtl2830_bulk_read(client, 0x33c, buf, 2);
290 if (ret)
291 goto err;
293 ret = rtl2830_bulk_read(client, 0x351, &buf[2], 1);
294 if (ret)
295 goto err;
297 dev_dbg(&client->dev, "TPS=%*ph\n", 3, buf);
299 switch ((buf[0] >> 2) & 3) {
300 case 0:
301 c->modulation = QPSK;
302 break;
303 case 1:
304 c->modulation = QAM_16;
305 break;
306 case 2:
307 c->modulation = QAM_64;
308 break;
311 switch ((buf[2] >> 2) & 1) {
312 case 0:
313 c->transmission_mode = TRANSMISSION_MODE_2K;
314 break;
315 case 1:
316 c->transmission_mode = TRANSMISSION_MODE_8K;
319 switch ((buf[2] >> 0) & 3) {
320 case 0:
321 c->guard_interval = GUARD_INTERVAL_1_32;
322 break;
323 case 1:
324 c->guard_interval = GUARD_INTERVAL_1_16;
325 break;
326 case 2:
327 c->guard_interval = GUARD_INTERVAL_1_8;
328 break;
329 case 3:
330 c->guard_interval = GUARD_INTERVAL_1_4;
331 break;
334 switch ((buf[0] >> 4) & 7) {
335 case 0:
336 c->hierarchy = HIERARCHY_NONE;
337 break;
338 case 1:
339 c->hierarchy = HIERARCHY_1;
340 break;
341 case 2:
342 c->hierarchy = HIERARCHY_2;
343 break;
344 case 3:
345 c->hierarchy = HIERARCHY_4;
346 break;
349 switch ((buf[1] >> 3) & 7) {
350 case 0:
351 c->code_rate_HP = FEC_1_2;
352 break;
353 case 1:
354 c->code_rate_HP = FEC_2_3;
355 break;
356 case 2:
357 c->code_rate_HP = FEC_3_4;
358 break;
359 case 3:
360 c->code_rate_HP = FEC_5_6;
361 break;
362 case 4:
363 c->code_rate_HP = FEC_7_8;
364 break;
367 switch ((buf[1] >> 0) & 7) {
368 case 0:
369 c->code_rate_LP = FEC_1_2;
370 break;
371 case 1:
372 c->code_rate_LP = FEC_2_3;
373 break;
374 case 2:
375 c->code_rate_LP = FEC_3_4;
376 break;
377 case 3:
378 c->code_rate_LP = FEC_5_6;
379 break;
380 case 4:
381 c->code_rate_LP = FEC_7_8;
382 break;
385 return 0;
386 err:
387 dev_dbg(&client->dev, "failed=%d\n", ret);
388 return ret;
391 static int rtl2830_read_status(struct dvb_frontend *fe, enum fe_status *status)
393 struct i2c_client *client = fe->demodulator_priv;
394 struct rtl2830_dev *dev = i2c_get_clientdata(client);
395 struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
396 int ret, stmp;
397 unsigned int utmp;
398 u8 u8tmp, buf[2];
400 *status = 0;
402 if (dev->sleeping)
403 return 0;
405 ret = rtl2830_bulk_read(client, 0x351, &u8tmp, 1);
406 if (ret)
407 goto err;
409 u8tmp = (u8tmp >> 3) & 0x0f; /* [6:3] */
410 if (u8tmp == 11) {
411 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
412 FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
413 } else if (u8tmp == 10) {
414 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
415 FE_HAS_VITERBI;
418 dev->fe_status = *status;
420 /* Signal strength */
421 if (dev->fe_status & FE_HAS_SIGNAL) {
422 /* Read IF AGC */
423 ret = rtl2830_bulk_read(client, 0x359, buf, 2);
424 if (ret)
425 goto err;
427 stmp = buf[0] << 8 | buf[1] << 0;
428 stmp = sign_extend32(stmp, 13);
429 utmp = clamp_val(-4 * stmp + 32767, 0x0000, 0xffff);
431 dev_dbg(&client->dev, "IF AGC=%d\n", stmp);
433 c->strength.stat[0].scale = FE_SCALE_RELATIVE;
434 c->strength.stat[0].uvalue = utmp;
435 } else {
436 c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
439 /* CNR */
440 if (dev->fe_status & FE_HAS_VITERBI) {
441 unsigned int hierarchy, constellation;
442 #define CONSTELLATION_NUM 3
443 #define HIERARCHY_NUM 4
444 static const u32 constant[CONSTELLATION_NUM][HIERARCHY_NUM] = {
445 {70705899, 70705899, 70705899, 70705899},
446 {82433173, 82433173, 87483115, 94445660},
447 {92888734, 92888734, 95487525, 99770748},
450 ret = rtl2830_bulk_read(client, 0x33c, &u8tmp, 1);
451 if (ret)
452 goto err;
454 constellation = (u8tmp >> 2) & 0x03; /* [3:2] */
455 if (constellation > CONSTELLATION_NUM - 1)
456 goto err;
458 hierarchy = (u8tmp >> 4) & 0x07; /* [6:4] */
459 if (hierarchy > HIERARCHY_NUM - 1)
460 goto err;
462 ret = rtl2830_bulk_read(client, 0x40c, buf, 2);
463 if (ret)
464 goto err;
466 utmp = buf[0] << 8 | buf[1] << 0;
467 if (utmp)
468 stmp = (constant[constellation][hierarchy] -
469 intlog10(utmp)) / ((1 << 24) / 10000);
470 else
471 stmp = 0;
473 dev_dbg(&client->dev, "CNR raw=%u\n", utmp);
475 c->cnr.stat[0].scale = FE_SCALE_DECIBEL;
476 c->cnr.stat[0].svalue = stmp;
477 } else {
478 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
481 /* BER */
482 if (dev->fe_status & FE_HAS_LOCK) {
483 ret = rtl2830_bulk_read(client, 0x34e, buf, 2);
484 if (ret)
485 goto err;
487 utmp = buf[0] << 8 | buf[1] << 0;
488 dev->post_bit_error += utmp;
489 dev->post_bit_count += 1000000;
491 dev_dbg(&client->dev, "BER errors=%u total=1000000\n", utmp);
493 c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
494 c->post_bit_error.stat[0].uvalue = dev->post_bit_error;
495 c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
496 c->post_bit_count.stat[0].uvalue = dev->post_bit_count;
497 } else {
498 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
499 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
503 return ret;
504 err:
505 dev_dbg(&client->dev, "failed=%d\n", ret);
506 return ret;
509 static int rtl2830_read_snr(struct dvb_frontend *fe, u16 *snr)
511 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
513 if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL)
514 *snr = div_s64(c->cnr.stat[0].svalue, 100);
515 else
516 *snr = 0;
518 return 0;
521 static int rtl2830_read_ber(struct dvb_frontend *fe, u32 *ber)
523 struct i2c_client *client = fe->demodulator_priv;
524 struct rtl2830_dev *dev = i2c_get_clientdata(client);
526 *ber = (dev->post_bit_error - dev->post_bit_error_prev);
527 dev->post_bit_error_prev = dev->post_bit_error;
529 return 0;
532 static int rtl2830_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
534 *ucblocks = 0;
536 return 0;
539 static int rtl2830_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
541 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
543 if (c->strength.stat[0].scale == FE_SCALE_RELATIVE)
544 *strength = c->strength.stat[0].uvalue;
545 else
546 *strength = 0;
548 return 0;
551 static const struct dvb_frontend_ops rtl2830_ops = {
552 .delsys = {SYS_DVBT},
553 .info = {
554 .name = "Realtek RTL2830 (DVB-T)",
555 .caps = FE_CAN_FEC_1_2 |
556 FE_CAN_FEC_2_3 |
557 FE_CAN_FEC_3_4 |
558 FE_CAN_FEC_5_6 |
559 FE_CAN_FEC_7_8 |
560 FE_CAN_FEC_AUTO |
561 FE_CAN_QPSK |
562 FE_CAN_QAM_16 |
563 FE_CAN_QAM_64 |
564 FE_CAN_QAM_AUTO |
565 FE_CAN_TRANSMISSION_MODE_AUTO |
566 FE_CAN_GUARD_INTERVAL_AUTO |
567 FE_CAN_HIERARCHY_AUTO |
568 FE_CAN_RECOVER |
569 FE_CAN_MUTE_TS
572 .init = rtl2830_init,
573 .sleep = rtl2830_sleep,
575 .get_tune_settings = rtl2830_get_tune_settings,
577 .set_frontend = rtl2830_set_frontend,
578 .get_frontend = rtl2830_get_frontend,
580 .read_status = rtl2830_read_status,
581 .read_snr = rtl2830_read_snr,
582 .read_ber = rtl2830_read_ber,
583 .read_ucblocks = rtl2830_read_ucblocks,
584 .read_signal_strength = rtl2830_read_signal_strength,
587 static int rtl2830_pid_filter_ctrl(struct dvb_frontend *fe, int onoff)
589 struct i2c_client *client = fe->demodulator_priv;
590 int ret;
591 u8 u8tmp;
593 dev_dbg(&client->dev, "onoff=%d\n", onoff);
595 /* enable / disable PID filter */
596 if (onoff)
597 u8tmp = 0x80;
598 else
599 u8tmp = 0x00;
601 ret = rtl2830_update_bits(client, 0x061, 0x80, u8tmp);
602 if (ret)
603 goto err;
605 return 0;
606 err:
607 dev_dbg(&client->dev, "failed=%d\n", ret);
608 return ret;
611 static int rtl2830_pid_filter(struct dvb_frontend *fe, u8 index, u16 pid, int onoff)
613 struct i2c_client *client = fe->demodulator_priv;
614 struct rtl2830_dev *dev = i2c_get_clientdata(client);
615 int ret;
616 u8 buf[4];
618 dev_dbg(&client->dev, "index=%d pid=%04x onoff=%d\n",
619 index, pid, onoff);
621 /* skip invalid PIDs (0x2000) */
622 if (pid > 0x1fff || index > 32)
623 return 0;
625 if (onoff)
626 set_bit(index, &dev->filters);
627 else
628 clear_bit(index, &dev->filters);
630 /* enable / disable PIDs */
631 buf[0] = (dev->filters >> 0) & 0xff;
632 buf[1] = (dev->filters >> 8) & 0xff;
633 buf[2] = (dev->filters >> 16) & 0xff;
634 buf[3] = (dev->filters >> 24) & 0xff;
635 ret = rtl2830_bulk_write(client, 0x062, buf, 4);
636 if (ret)
637 goto err;
639 /* add PID */
640 buf[0] = (pid >> 8) & 0xff;
641 buf[1] = (pid >> 0) & 0xff;
642 ret = rtl2830_bulk_write(client, 0x066 + 2 * index, buf, 2);
643 if (ret)
644 goto err;
646 return 0;
647 err:
648 dev_dbg(&client->dev, "failed=%d\n", ret);
649 return ret;
653 * I2C gate/mux/repeater logic
654 * We must use unlocked __i2c_transfer() here (through regmap) because of I2C
655 * adapter lock is already taken by tuner driver.
656 * Gate is closed automatically after single I2C transfer.
658 static int rtl2830_select(struct i2c_mux_core *muxc, u32 chan_id)
660 struct i2c_client *client = i2c_mux_priv(muxc);
661 struct rtl2830_dev *dev = i2c_get_clientdata(client);
662 int ret;
664 dev_dbg(&client->dev, "\n");
666 /* open I2C repeater for 1 transfer, closes automatically */
667 /* XXX: regmap_update_bits() does not lock I2C adapter */
668 ret = regmap_update_bits(dev->regmap, 0x101, 0x08, 0x08);
669 if (ret)
670 goto err;
672 return 0;
673 err:
674 dev_dbg(&client->dev, "failed=%d\n", ret);
675 return ret;
678 static struct dvb_frontend *rtl2830_get_dvb_frontend(struct i2c_client *client)
680 struct rtl2830_dev *dev = i2c_get_clientdata(client);
682 dev_dbg(&client->dev, "\n");
684 return &dev->fe;
687 static struct i2c_adapter *rtl2830_get_i2c_adapter(struct i2c_client *client)
689 struct rtl2830_dev *dev = i2c_get_clientdata(client);
691 dev_dbg(&client->dev, "\n");
693 return dev->muxc->adapter[0];
697 * We implement own I2C access routines for regmap in order to get manual access
698 * to I2C adapter lock, which is needed for I2C mux adapter.
700 static int rtl2830_regmap_read(void *context, const void *reg_buf,
701 size_t reg_size, void *val_buf, size_t val_size)
703 struct i2c_client *client = context;
704 int ret;
705 struct i2c_msg msg[2] = {
707 .addr = client->addr,
708 .flags = 0,
709 .len = reg_size,
710 .buf = (u8 *)reg_buf,
711 }, {
712 .addr = client->addr,
713 .flags = I2C_M_RD,
714 .len = val_size,
715 .buf = val_buf,
719 ret = __i2c_transfer(client->adapter, msg, 2);
720 if (ret != 2) {
721 dev_warn(&client->dev, "i2c reg read failed %d\n", ret);
722 if (ret >= 0)
723 ret = -EREMOTEIO;
724 return ret;
726 return 0;
729 static int rtl2830_regmap_write(void *context, const void *data, size_t count)
731 struct i2c_client *client = context;
732 int ret;
733 struct i2c_msg msg[1] = {
735 .addr = client->addr,
736 .flags = 0,
737 .len = count,
738 .buf = (u8 *)data,
742 ret = __i2c_transfer(client->adapter, msg, 1);
743 if (ret != 1) {
744 dev_warn(&client->dev, "i2c reg write failed %d\n", ret);
745 if (ret >= 0)
746 ret = -EREMOTEIO;
747 return ret;
749 return 0;
752 static int rtl2830_regmap_gather_write(void *context, const void *reg,
753 size_t reg_len, const void *val,
754 size_t val_len)
756 struct i2c_client *client = context;
757 int ret;
758 u8 buf[256];
759 struct i2c_msg msg[1] = {
761 .addr = client->addr,
762 .flags = 0,
763 .len = 1 + val_len,
764 .buf = buf,
768 buf[0] = *(u8 const *)reg;
769 memcpy(&buf[1], val, val_len);
771 ret = __i2c_transfer(client->adapter, msg, 1);
772 if (ret != 1) {
773 dev_warn(&client->dev, "i2c reg write failed %d\n", ret);
774 if (ret >= 0)
775 ret = -EREMOTEIO;
776 return ret;
778 return 0;
781 static int rtl2830_probe(struct i2c_client *client,
782 const struct i2c_device_id *id)
784 struct rtl2830_platform_data *pdata = client->dev.platform_data;
785 struct rtl2830_dev *dev;
786 int ret;
787 u8 u8tmp;
788 static const struct regmap_bus regmap_bus = {
789 .read = rtl2830_regmap_read,
790 .write = rtl2830_regmap_write,
791 .gather_write = rtl2830_regmap_gather_write,
792 .val_format_endian_default = REGMAP_ENDIAN_NATIVE,
794 static const struct regmap_range_cfg regmap_range_cfg[] = {
796 .selector_reg = 0x00,
797 .selector_mask = 0xff,
798 .selector_shift = 0,
799 .window_start = 0,
800 .window_len = 0x100,
801 .range_min = 0 * 0x100,
802 .range_max = 5 * 0x100,
805 static const struct regmap_config regmap_config = {
806 .reg_bits = 8,
807 .val_bits = 8,
808 .max_register = 5 * 0x100,
809 .ranges = regmap_range_cfg,
810 .num_ranges = ARRAY_SIZE(regmap_range_cfg),
813 dev_dbg(&client->dev, "\n");
815 if (pdata == NULL) {
816 ret = -EINVAL;
817 goto err;
820 /* allocate memory for the internal state */
821 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
822 if (dev == NULL) {
823 ret = -ENOMEM;
824 goto err;
827 /* setup the state */
828 i2c_set_clientdata(client, dev);
829 dev->client = client;
830 dev->pdata = client->dev.platform_data;
831 dev->sleeping = true;
832 dev->regmap = regmap_init(&client->dev, &regmap_bus, client,
833 &regmap_config);
834 if (IS_ERR(dev->regmap)) {
835 ret = PTR_ERR(dev->regmap);
836 goto err_kfree;
839 /* check if the demod is there */
840 ret = rtl2830_bulk_read(client, 0x000, &u8tmp, 1);
841 if (ret)
842 goto err_regmap_exit;
844 /* create muxed i2c adapter for tuner */
845 dev->muxc = i2c_mux_alloc(client->adapter, &client->dev, 1, 0, 0,
846 rtl2830_select, NULL);
847 if (!dev->muxc) {
848 ret = -ENOMEM;
849 goto err_regmap_exit;
851 dev->muxc->priv = client;
852 ret = i2c_mux_add_adapter(dev->muxc, 0, 0, 0);
853 if (ret)
854 goto err_regmap_exit;
856 /* create dvb frontend */
857 memcpy(&dev->fe.ops, &rtl2830_ops, sizeof(dev->fe.ops));
858 dev->fe.demodulator_priv = client;
860 /* setup callbacks */
861 pdata->get_dvb_frontend = rtl2830_get_dvb_frontend;
862 pdata->get_i2c_adapter = rtl2830_get_i2c_adapter;
863 pdata->pid_filter = rtl2830_pid_filter;
864 pdata->pid_filter_ctrl = rtl2830_pid_filter_ctrl;
866 dev_info(&client->dev, "Realtek RTL2830 successfully attached\n");
868 return 0;
869 err_regmap_exit:
870 regmap_exit(dev->regmap);
871 err_kfree:
872 kfree(dev);
873 err:
874 dev_dbg(&client->dev, "failed=%d\n", ret);
875 return ret;
878 static int rtl2830_remove(struct i2c_client *client)
880 struct rtl2830_dev *dev = i2c_get_clientdata(client);
882 dev_dbg(&client->dev, "\n");
884 i2c_mux_del_adapters(dev->muxc);
885 regmap_exit(dev->regmap);
886 kfree(dev);
888 return 0;
891 static const struct i2c_device_id rtl2830_id_table[] = {
892 {"rtl2830", 0},
895 MODULE_DEVICE_TABLE(i2c, rtl2830_id_table);
897 static struct i2c_driver rtl2830_driver = {
898 .driver = {
899 .name = "rtl2830",
900 .suppress_bind_attrs = true,
902 .probe = rtl2830_probe,
903 .remove = rtl2830_remove,
904 .id_table = rtl2830_id_table,
907 module_i2c_driver(rtl2830_driver);
909 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
910 MODULE_DESCRIPTION("Realtek RTL2830 DVB-T demodulator driver");
911 MODULE_LICENSE("GPL");