1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#include "rtl2830_priv.h"
19
20
21static int rtl2830_bulk_write(struct i2c_client *client, unsigned int reg,
22 const void *val, size_t val_count)
23{
24 struct rtl2830_dev *dev = i2c_get_clientdata(client);
25 int ret;
26
27 i2c_lock_adapter(client->adapter);
28 ret = regmap_bulk_write(dev->regmap, reg, val, val_count);
29 i2c_unlock_adapter(client->adapter);
30 return ret;
31}
32
33static int rtl2830_update_bits(struct i2c_client *client, unsigned int reg,
34 unsigned int mask, unsigned int val)
35{
36 struct rtl2830_dev *dev = i2c_get_clientdata(client);
37 int ret;
38
39 i2c_lock_adapter(client->adapter);
40 ret = regmap_update_bits(dev->regmap, reg, mask, val);
41 i2c_unlock_adapter(client->adapter);
42 return ret;
43}
44
45static int rtl2830_bulk_read(struct i2c_client *client, unsigned int reg,
46 void *val, size_t val_count)
47{
48 struct rtl2830_dev *dev = i2c_get_clientdata(client);
49 int ret;
50
51 i2c_lock_adapter(client->adapter);
52 ret = regmap_bulk_read(dev->regmap, reg, val, val_count);
53 i2c_unlock_adapter(client->adapter);
54 return ret;
55}
56
57static int rtl2830_init(struct dvb_frontend *fe)
58{
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},
100 };
101
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;
107 }
108
109 ret = rtl2830_bulk_write(client, 0x18f, "\x28\x00", 2);
110 if (ret)
111 goto err;
112
113 ret = rtl2830_bulk_write(client, 0x195,
114 "\x04\x06\x0a\x12\x0a\x12\x1e\x28", 8);
115 if (ret)
116 goto err;
117
118
119
120
121 ret = rtl2830_update_bits(client, 0x101, 0x04, 0x04);
122 if (ret)
123 goto err;
124
125 ret = rtl2830_update_bits(client, 0x101, 0x04, 0x00);
126 if (ret)
127 goto err;
128
129
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;
138
139 dev->sleeping = false;
140
141 return ret;
142err:
143 dev_dbg(&client->dev, "failed=%d\n", ret);
144 return ret;
145}
146
147static int rtl2830_sleep(struct dvb_frontend *fe)
148{
149 struct i2c_client *client = fe->demodulator_priv;
150 struct rtl2830_dev *dev = i2c_get_clientdata(client);
151
152 dev->sleeping = true;
153 dev->fe_status = 0;
154
155 return 0;
156}
157
158static int rtl2830_get_tune_settings(struct dvb_frontend *fe,
159 struct dvb_frontend_tune_settings *s)
160{
161 s->min_delay_ms = 500;
162 s->step_size = fe->ops.info.frequency_stepsize * 2;
163 s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
164
165 return 0;
166}
167
168static int rtl2830_set_frontend(struct dvb_frontend *fe)
169{
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] = {
178 {
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,
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,
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,
193 },
194 };
195 static const u8 bw_params2[3][6] = {
196 {0xc3, 0x0c, 0x44, 0x33, 0x33, 0x30},
197 {0xb8, 0xe3, 0x93, 0x99, 0x99, 0x98},
198 {0xae, 0xba, 0xf3, 0x26, 0x66, 0x64},
199 };
200
201 dev_dbg(&client->dev, "frequency=%u bandwidth_hz=%u inversion=%u\n",
202 c->frequency, c->bandwidth_hz, c->inversion);
203
204
205 if (fe->ops.tuner_ops.set_params)
206 fe->ops.tuner_ops.set_params(fe);
207
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;
222 }
223
224 ret = rtl2830_update_bits(client, 0x008, 0x06, i << 1);
225 if (ret)
226 goto err;
227
228
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;
235
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);
243
244 buf[0] = (if_ctl >> 16) & 0x3f;
245 buf[1] = (if_ctl >> 8) & 0xff;
246 buf[2] = (if_ctl >> 0) & 0xff;
247
248 ret = rtl2830_bulk_read(client, 0x119, &u8tmp, 1);
249 if (ret)
250 goto err;
251
252 buf[0] |= u8tmp & 0xc0;
253
254 ret = rtl2830_bulk_write(client, 0x119, buf, 3);
255 if (ret)
256 goto err;
257
258
259 ret = rtl2830_bulk_write(client, 0x11c, &bw_params1[i][0], 17);
260 if (ret)
261 goto err;
262
263
264 ret = rtl2830_bulk_write(client, 0x12d, &bw_params1[i][17], 17);
265 if (ret)
266 goto err;
267
268 ret = rtl2830_bulk_write(client, 0x19d, bw_params2[i], 6);
269 if (ret)
270 goto err;
271
272 return ret;
273err:
274 dev_dbg(&client->dev, "failed=%d\n", ret);
275 return ret;
276}
277
278static int rtl2830_get_frontend(struct dvb_frontend *fe,
279 struct dtv_frontend_properties *c)
280{
281 struct i2c_client *client = fe->demodulator_priv;
282 struct rtl2830_dev *dev = i2c_get_clientdata(client);
283 int ret;
284 u8 buf[3];
285
286 if (dev->sleeping)
287 return 0;
288
289 ret = rtl2830_bulk_read(client, 0x33c, buf, 2);
290 if (ret)
291 goto err;
292
293 ret = rtl2830_bulk_read(client, 0x351, &buf[2], 1);
294 if (ret)
295 goto err;
296
297 dev_dbg(&client->dev, "TPS=%*ph\n", 3, buf);
298
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;
309 }
310
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;
317 }
318
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;
332 }
333
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;
347 }
348
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;
365 }
366
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;
383 }
384
385 return 0;
386err:
387 dev_dbg(&client->dev, "failed=%d\n", ret);
388 return ret;
389}
390
391static int rtl2830_read_status(struct dvb_frontend *fe, enum fe_status *status)
392{
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];
399
400 *status = 0;
401
402 if (dev->sleeping)
403 return 0;
404
405 ret = rtl2830_bulk_read(client, 0x351, &u8tmp, 1);
406 if (ret)
407 goto err;
408
409 u8tmp = (u8tmp >> 3) & 0x0f;
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;
416 }
417
418 dev->fe_status = *status;
419
420
421 if (dev->fe_status & FE_HAS_SIGNAL) {
422
423 ret = rtl2830_bulk_read(client, 0x359, buf, 2);
424 if (ret)
425 goto err;
426
427 stmp = buf[0] << 8 | buf[1] << 0;
428 stmp = sign_extend32(stmp, 13);
429 utmp = clamp_val(-4 * stmp + 32767, 0x0000, 0xffff);
430
431 dev_dbg(&client->dev, "IF AGC=%d\n", stmp);
432
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;
437 }
438
439
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},
448 };
449
450 ret = rtl2830_bulk_read(client, 0x33c, &u8tmp, 1);
451 if (ret)
452 goto err;
453
454 constellation = (u8tmp >> 2) & 0x03;
455 if (constellation > CONSTELLATION_NUM - 1)
456 goto err;
457
458 hierarchy = (u8tmp >> 4) & 0x07;
459 if (hierarchy > HIERARCHY_NUM - 1)
460 goto err;
461
462 ret = rtl2830_bulk_read(client, 0x40c, buf, 2);
463 if (ret)
464 goto err;
465
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;
472
473 dev_dbg(&client->dev, "CNR raw=%u\n", utmp);
474
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;
479 }
480
481
482 if (dev->fe_status & FE_HAS_LOCK) {
483 ret = rtl2830_bulk_read(client, 0x34e, buf, 2);
484 if (ret)
485 goto err;
486
487 utmp = buf[0] << 8 | buf[1] << 0;
488 dev->post_bit_error += utmp;
489 dev->post_bit_count += 1000000;
490
491 dev_dbg(&client->dev, "BER errors=%u total=1000000\n", utmp);
492
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;
500 }
501
502
503 return ret;
504err:
505 dev_dbg(&client->dev, "failed=%d\n", ret);
506 return ret;
507}
508
509static int rtl2830_read_snr(struct dvb_frontend *fe, u16 *snr)
510{
511 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
512
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;
517
518 return 0;
519}
520
521static int rtl2830_read_ber(struct dvb_frontend *fe, u32 *ber)
522{
523 struct i2c_client *client = fe->demodulator_priv;
524 struct rtl2830_dev *dev = i2c_get_clientdata(client);
525
526 *ber = (dev->post_bit_error - dev->post_bit_error_prev);
527 dev->post_bit_error_prev = dev->post_bit_error;
528
529 return 0;
530}
531
532static int rtl2830_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
533{
534 *ucblocks = 0;
535
536 return 0;
537}
538
539static int rtl2830_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
540{
541 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
542
543 if (c->strength.stat[0].scale == FE_SCALE_RELATIVE)
544 *strength = c->strength.stat[0].uvalue;
545 else
546 *strength = 0;
547
548 return 0;
549}
550
551static 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
570 },
571
572 .init = rtl2830_init,
573 .sleep = rtl2830_sleep,
574
575 .get_tune_settings = rtl2830_get_tune_settings,
576
577 .set_frontend = rtl2830_set_frontend,
578 .get_frontend = rtl2830_get_frontend,
579
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,
585};
586
587static int rtl2830_pid_filter_ctrl(struct dvb_frontend *fe, int onoff)
588{
589 struct i2c_client *client = fe->demodulator_priv;
590 int ret;
591 u8 u8tmp;
592
593 dev_dbg(&client->dev, "onoff=%d\n", onoff);
594
595
596 if (onoff)
597 u8tmp = 0x80;
598 else
599 u8tmp = 0x00;
600
601 ret = rtl2830_update_bits(client, 0x061, 0x80, u8tmp);
602 if (ret)
603 goto err;
604
605 return 0;
606err:
607 dev_dbg(&client->dev, "failed=%d\n", ret);
608 return ret;
609}
610
611static int rtl2830_pid_filter(struct dvb_frontend *fe, u8 index, u16 pid, int onoff)
612{
613 struct i2c_client *client = fe->demodulator_priv;
614 struct rtl2830_dev *dev = i2c_get_clientdata(client);
615 int ret;
616 u8 buf[4];
617
618 dev_dbg(&client->dev, "index=%d pid=%04x onoff=%d\n",
619 index, pid, onoff);
620
621
622 if (pid > 0x1fff || index > 32)
623 return 0;
624
625 if (onoff)
626 set_bit(index, &dev->filters);
627 else
628 clear_bit(index, &dev->filters);
629
630
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;
638
639
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;
645
646 return 0;
647err:
648 dev_dbg(&client->dev, "failed=%d\n", ret);
649 return ret;
650}
651
652
653
654
655
656
657
658static int rtl2830_select(struct i2c_mux_core *muxc, u32 chan_id)
659{
660 struct i2c_client *client = i2c_mux_priv(muxc);
661 struct rtl2830_dev *dev = i2c_get_clientdata(client);
662 int ret;
663
664 dev_dbg(&client->dev, "\n");
665
666
667
668 ret = regmap_update_bits(dev->regmap, 0x101, 0x08, 0x08);
669 if (ret)
670 goto err;
671
672 return 0;
673err:
674 dev_dbg(&client->dev, "failed=%d\n", ret);
675 return ret;
676}
677
678static struct dvb_frontend *rtl2830_get_dvb_frontend(struct i2c_client *client)
679{
680 struct rtl2830_dev *dev = i2c_get_clientdata(client);
681
682 dev_dbg(&client->dev, "\n");
683
684 return &dev->fe;
685}
686
687static struct i2c_adapter *rtl2830_get_i2c_adapter(struct i2c_client *client)
688{
689 struct rtl2830_dev *dev = i2c_get_clientdata(client);
690
691 dev_dbg(&client->dev, "\n");
692
693 return dev->muxc->adapter[0];
694}
695
696
697
698
699
700static int rtl2830_regmap_read(void *context, const void *reg_buf,
701 size_t reg_size, void *val_buf, size_t val_size)
702{
703 struct i2c_client *client = context;
704 int ret;
705 struct i2c_msg msg[2] = {
706 {
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,
716 }
717 };
718
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;
725 }
726 return 0;
727}
728
729static int rtl2830_regmap_write(void *context, const void *data, size_t count)
730{
731 struct i2c_client *client = context;
732 int ret;
733 struct i2c_msg msg[1] = {
734 {
735 .addr = client->addr,
736 .flags = 0,
737 .len = count,
738 .buf = (u8 *)data,
739 }
740 };
741
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;
748 }
749 return 0;
750}
751
752static int rtl2830_regmap_gather_write(void *context, const void *reg,
753 size_t reg_len, const void *val,
754 size_t val_len)
755{
756 struct i2c_client *client = context;
757 int ret;
758 u8 buf[256];
759 struct i2c_msg msg[1] = {
760 {
761 .addr = client->addr,
762 .flags = 0,
763 .len = 1 + val_len,
764 .buf = buf,
765 }
766 };
767
768 buf[0] = *(u8 const *)reg;
769 memcpy(&buf[1], val, val_len);
770
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;
777 }
778 return 0;
779}
780
781static int rtl2830_probe(struct i2c_client *client,
782 const struct i2c_device_id *id)
783{
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,
793 };
794 static const struct regmap_range_cfg regmap_range_cfg[] = {
795 {
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,
803 },
804 };
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),
811 };
812
813 dev_dbg(&client->dev, "\n");
814
815 if (pdata == NULL) {
816 ret = -EINVAL;
817 goto err;
818 }
819
820
821 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
822 if (dev == NULL) {
823 ret = -ENOMEM;
824 goto err;
825 }
826
827
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, ®map_bus, client,
833 ®map_config);
834 if (IS_ERR(dev->regmap)) {
835 ret = PTR_ERR(dev->regmap);
836 goto err_kfree;
837 }
838
839
840 ret = rtl2830_bulk_read(client, 0x000, &u8tmp, 1);
841 if (ret)
842 goto err_regmap_exit;
843
844
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;
850 }
851 dev->muxc->priv = client;
852 ret = i2c_mux_add_adapter(dev->muxc, 0, 0, 0);
853 if (ret)
854 goto err_regmap_exit;
855
856
857 memcpy(&dev->fe.ops, &rtl2830_ops, sizeof(dev->fe.ops));
858 dev->fe.demodulator_priv = client;
859
860
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;
865
866 dev_info(&client->dev, "Realtek RTL2830 successfully attached\n");
867
868 return 0;
869err_regmap_exit:
870 regmap_exit(dev->regmap);
871err_kfree:
872 kfree(dev);
873err:
874 dev_dbg(&client->dev, "failed=%d\n", ret);
875 return ret;
876}
877
878static int rtl2830_remove(struct i2c_client *client)
879{
880 struct rtl2830_dev *dev = i2c_get_clientdata(client);
881
882 dev_dbg(&client->dev, "\n");
883
884 i2c_mux_del_adapters(dev->muxc);
885 regmap_exit(dev->regmap);
886 kfree(dev);
887
888 return 0;
889}
890
891static const struct i2c_device_id rtl2830_id_table[] = {
892 {"rtl2830", 0},
893 {}
894};
895MODULE_DEVICE_TABLE(i2c, rtl2830_id_table);
896
897static struct i2c_driver rtl2830_driver = {
898 .driver = {
899 .name = "rtl2830",
900 .suppress_bind_attrs = true,
901 },
902 .probe = rtl2830_probe,
903 .remove = rtl2830_remove,
904 .id_table = rtl2830_id_table,
905};
906
907module_i2c_driver(rtl2830_driver);
908
909MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
910MODULE_DESCRIPTION("Realtek RTL2830 DVB-T demodulator driver");
911MODULE_LICENSE("GPL");
912