]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - drivers/media/dvb-frontends/rtl2830.c
UBUNTU: Ubuntu-4.15.0-96.97
[mirror_ubuntu-bionic-kernel.git] / drivers / media / dvb-frontends / rtl2830.c
CommitLineData
c0adca73
AP
1/*
2 * Realtek RTL2830 DVB-T demodulator driver
3 *
4 * Copyright (C) 2011 Antti Palosaari <crope@iki.fi>
5 *
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.
10 *
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.
15 *
c0adca73
AP
16 */
17
18#include "rtl2830_priv.h"
19
15d37f38 20/* Our regmap is bypassing I2C adapter lock, thus we do it! */
d858b0e7
MCC
21static int rtl2830_bulk_write(struct i2c_client *client, unsigned int reg,
22 const void *val, size_t val_count)
c0adca73 23{
15d37f38 24 struct rtl2830_dev *dev = i2c_get_clientdata(client);
c0adca73 25 int ret;
947debb4 26
15d37f38
AP
27 i2c_lock_adapter(client->adapter);
28 ret = regmap_bulk_write(dev->regmap, reg, val, val_count);
29 i2c_unlock_adapter(client->adapter);
c0adca73
AP
30 return ret;
31}
32
d858b0e7
MCC
33static int rtl2830_update_bits(struct i2c_client *client, unsigned int reg,
34 unsigned int mask, unsigned int val)
0485a708 35{
1f153c4d 36 struct rtl2830_dev *dev = i2c_get_clientdata(client);
0485a708 37 int ret;
fd4cfa8b 38
15d37f38
AP
39 i2c_lock_adapter(client->adapter);
40 ret = regmap_update_bits(dev->regmap, reg, mask, val);
41 i2c_unlock_adapter(client->adapter);
fd4cfa8b 42 return ret;
0485a708
AP
43}
44
d858b0e7
MCC
45static int rtl2830_bulk_read(struct i2c_client *client, unsigned int reg,
46 void *val, size_t val_count)
0485a708 47{
1f153c4d 48 struct rtl2830_dev *dev = i2c_get_clientdata(client);
0485a708 49 int ret;
fd4cfa8b 50
15d37f38
AP
51 i2c_lock_adapter(client->adapter);
52 ret = regmap_bulk_read(dev->regmap, reg, val, val_count);
53 i2c_unlock_adapter(client->adapter);
fd4cfa8b 54 return ret;
0485a708
AP
55}
56
c0adca73
AP
57static int rtl2830_init(struct dvb_frontend *fe)
58{
1f153c4d
AP
59 struct i2c_client *client = fe->demodulator_priv;
60 struct rtl2830_dev *dev = i2c_get_clientdata(client);
47b4dbff 61 struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
c0adca73 62 int ret, i;
c0adca73 63 struct rtl2830_reg_val_mask tab[] = {
947debb4
AP
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},
c0adca73
AP
100 };
101
102 for (i = 0; i < ARRAY_SIZE(tab); i++) {
15d37f38
AP
103 ret = rtl2830_update_bits(client, tab[i].reg, tab[i].mask,
104 tab[i].val);
c0adca73
AP
105 if (ret)
106 goto err;
107 }
108
15d37f38 109 ret = rtl2830_bulk_write(client, 0x18f, "\x28\x00", 2);
c0adca73
AP
110 if (ret)
111 goto err;
112
15d37f38
AP
113 ret = rtl2830_bulk_write(client, 0x195,
114 "\x04\x06\x0a\x12\x0a\x12\x1e\x28", 8);
c0adca73
AP
115 if (ret)
116 goto err;
117
c0adca73
AP
118 /* TODO: spec init */
119
120 /* soft reset */
15d37f38 121 ret = rtl2830_update_bits(client, 0x101, 0x04, 0x04);
c0adca73
AP
122 if (ret)
123 goto err;
124
15d37f38 125 ret = rtl2830_update_bits(client, 0x101, 0x04, 0x00);
c0adca73
AP
126 if (ret)
127 goto err;
128
47b4dbff 129 /* init stats here in order signal app which stats are supported */
871f7025
AP
130 c->strength.len = 1;
131 c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
47b4dbff
AP
132 c->cnr.len = 1;
133 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
5bb11ca5
AP
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;
47b4dbff 138
f544f100 139 dev->sleeping = false;
a8567cf2 140
c0adca73
AP
141 return ret;
142err:
7cc39328 143 dev_dbg(&client->dev, "failed=%d\n", ret);
c0adca73
AP
144 return ret;
145}
146
a8567cf2
AP
147static int rtl2830_sleep(struct dvb_frontend *fe)
148{
1f153c4d
AP
149 struct i2c_client *client = fe->demodulator_priv;
150 struct rtl2830_dev *dev = i2c_get_clientdata(client);
947debb4 151
f544f100 152 dev->sleeping = true;
47b4dbff 153 dev->fe_status = 0;
947debb4 154
a8567cf2
AP
155 return 0;
156}
157
a17ff2ee 158static int rtl2830_get_tune_settings(struct dvb_frontend *fe,
947debb4 159 struct dvb_frontend_tune_settings *s)
c0adca73
AP
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{
1f153c4d
AP
170 struct i2c_client *client = fe->demodulator_priv;
171 struct rtl2830_dev *dev = i2c_get_clientdata(client);
c0adca73
AP
172 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
173 int ret, i;
66b3c4de 174 u64 num;
15d37f38 175 u8 buf[3], u8tmp;
66b3c4de 176 u32 if_ctl, if_frequency;
3a2fca26 177 static const u8 bw_params1[3][34] = {
c0adca73
AP
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, /* 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 */
193 },
194 };
3a2fca26
AP
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 */
c0adca73
AP
199 };
200
7cc39328 201 dev_dbg(&client->dev, "frequency=%u bandwidth_hz=%u inversion=%u\n",
947debb4 202 c->frequency, c->bandwidth_hz, c->inversion);
c0adca73
AP
203
204 /* program tuner */
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:
7cc39328 219 dev_err(&client->dev, "invalid bandwidth_hz %u\n",
947debb4 220 c->bandwidth_hz);
c0adca73
AP
221 return -EINVAL;
222 }
223
15d37f38 224 ret = rtl2830_update_bits(client, 0x008, 0x06, i << 1);
c0adca73
AP
225 if (ret)
226 goto err;
227
66b3c4de
AP
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;
947debb4 233 if (ret)
66b3c4de
AP
234 goto err;
235
b8cb50d2 236 num = if_frequency % dev->pdata->clk;
66b3c4de 237 num *= 0x400000;
b8cb50d2 238 num = div_u64(num, dev->pdata->clk);
66b3c4de
AP
239 num = -num;
240 if_ctl = num & 0x3fffff;
7cc39328 241 dev_dbg(&client->dev, "if_frequency=%d if_ctl=%08x\n",
947debb4 242 if_frequency, if_ctl);
66b3c4de 243
15d37f38
AP
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);
66b3c4de
AP
249 if (ret)
250 goto err;
251
15d37f38 252 buf[0] |= u8tmp & 0xc0; /* [7:6] */
66b3c4de 253
15d37f38 254 ret = rtl2830_bulk_write(client, 0x119, buf, 3);
66b3c4de
AP
255 if (ret)
256 goto err;
257
c0adca73 258 /* 1/2 split I2C write */
15d37f38 259 ret = rtl2830_bulk_write(client, 0x11c, &bw_params1[i][0], 17);
c0adca73
AP
260 if (ret)
261 goto err;
262
263 /* 2/2 split I2C write */
15d37f38 264 ret = rtl2830_bulk_write(client, 0x12d, &bw_params1[i][17], 17);
c0adca73
AP
265 if (ret)
266 goto err;
267
15d37f38 268 ret = rtl2830_bulk_write(client, 0x19d, bw_params2[i], 6);
c0adca73
AP
269 if (ret)
270 goto err;
271
272 return ret;
273err:
7cc39328 274 dev_dbg(&client->dev, "failed=%d\n", ret);
c0adca73
AP
275 return ret;
276}
277
7e3e68bc
MCC
278static int rtl2830_get_frontend(struct dvb_frontend *fe,
279 struct dtv_frontend_properties *c)
631a2b61 280{
1f153c4d
AP
281 struct i2c_client *client = fe->demodulator_priv;
282 struct rtl2830_dev *dev = i2c_get_clientdata(client);
631a2b61
AP
283 int ret;
284 u8 buf[3];
285
f544f100 286 if (dev->sleeping)
c188637d
AP
287 return 0;
288
15d37f38 289 ret = rtl2830_bulk_read(client, 0x33c, buf, 2);
631a2b61
AP
290 if (ret)
291 goto err;
292
15d37f38 293 ret = rtl2830_bulk_read(client, 0x351, &buf[2], 1);
631a2b61
AP
294 if (ret)
295 goto err;
296
7cc39328 297 dev_dbg(&client->dev, "TPS=%*ph\n", 3, buf);
631a2b61
AP
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:
7cc39328 387 dev_dbg(&client->dev, "failed=%d\n", ret);
631a2b61
AP
388 return ret;
389}
390
0df289a2 391static int rtl2830_read_status(struct dvb_frontend *fe, enum fe_status *status)
c0adca73 392{
1f153c4d 393 struct i2c_client *client = fe->demodulator_priv;
b8cb50d2 394 struct rtl2830_dev *dev = i2c_get_clientdata(client);
4a7e445b
AP
395 struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
396 int ret, stmp;
397 unsigned int utmp;
398 u8 u8tmp, buf[2];
947debb4 399
c0adca73
AP
400 *status = 0;
401
f544f100 402 if (dev->sleeping)
a8567cf2
AP
403 return 0;
404
15d37f38 405 ret = rtl2830_bulk_read(client, 0x351, &u8tmp, 1);
c0adca73
AP
406 if (ret)
407 goto err;
408
15d37f38
AP
409 u8tmp = (u8tmp >> 3) & 0x0f; /* [6:3] */
410 if (u8tmp == 11) {
c0adca73
AP
411 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
412 FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
15d37f38 413 } else if (u8tmp == 10) {
c0adca73
AP
414 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
415 FE_HAS_VITERBI;
416 }
417
47b4dbff
AP
418 dev->fe_status = *status;
419
4a7e445b
AP
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;
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 /* 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},
448 };
449
450 ret = rtl2830_bulk_read(client, 0x33c, &u8tmp, 1);
451 if (ret)
452 goto err;
453
454 constellation = (u8tmp >> 2) & 0x03; /* [3:2] */
455 if (constellation > CONSTELLATION_NUM - 1)
456 goto err;
457
458 hierarchy = (u8tmp >> 4) & 0x07; /* [6:4] */
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 /* BER */
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
c0adca73
AP
503 return ret;
504err:
7cc39328 505 dev_dbg(&client->dev, "failed=%d\n", ret);
c0adca73
AP
506 return ret;
507}
508
509static int rtl2830_read_snr(struct dvb_frontend *fe, u16 *snr)
510{
6dcfe3cc 511 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
eba672a0 512
6dcfe3cc
AP
513 if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL)
514 *snr = div_s64(c->cnr.stat[0].svalue, 100);
eba672a0
AP
515 else
516 *snr = 0;
517
c0adca73
AP
518 return 0;
519}
520
521static int rtl2830_read_ber(struct dvb_frontend *fe, u32 *ber)
522{
1f153c4d
AP
523 struct i2c_client *client = fe->demodulator_priv;
524 struct rtl2830_dev *dev = i2c_get_clientdata(client);
525ffc19 525
f491391c
AP
526 *ber = (dev->post_bit_error - dev->post_bit_error_prev);
527 dev->post_bit_error_prev = dev->post_bit_error;
525ffc19 528
c0adca73
AP
529 return 0;
530}
531
532static int rtl2830_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
533{
534 *ucblocks = 0;
947debb4 535
c0adca73
AP
536 return 0;
537}
538
539static int rtl2830_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
540{
d512e286 541 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
78e75075 542
d512e286
AP
543 if (c->strength.stat[0].scale == FE_SCALE_RELATIVE)
544 *strength = c->strength.stat[0].uvalue;
78e75075 545 else
d512e286 546 *strength = 0;
78e75075 547
c0adca73
AP
548 return 0;
549}
550
bd336e63 551static const struct dvb_frontend_ops rtl2830_ops = {
947debb4 552 .delsys = {SYS_DVBT},
c0adca73
AP
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
c0adca73 572 .init = rtl2830_init,
a8567cf2 573 .sleep = rtl2830_sleep,
c0adca73
AP
574
575 .get_tune_settings = rtl2830_get_tune_settings,
576
577 .set_frontend = rtl2830_set_frontend,
631a2b61 578 .get_frontend = rtl2830_get_frontend,
c0adca73
AP
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
df70ddad
AP
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 /* enable / disable PID filter */
596 if (onoff)
597 u8tmp = 0x80;
598 else
599 u8tmp = 0x00;
600
15d37f38 601 ret = rtl2830_update_bits(client, 0x061, 0x80, u8tmp);
df70ddad
AP
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 /* skip invalid PIDs (0x2000) */
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 /* 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;
15d37f38 635 ret = rtl2830_bulk_write(client, 0x062, buf, 4);
df70ddad
AP
636 if (ret)
637 goto err;
638
639 /* add PID */
640 buf[0] = (pid >> 8) & 0xff;
641 buf[1] = (pid >> 0) & 0xff;
15d37f38 642 ret = rtl2830_bulk_write(client, 0x066 + 2 * index, buf, 2);
df70ddad
AP
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
28c08799 652/*
15d37f38
AP
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.
28c08799 657 */
a0119159 658static int rtl2830_select(struct i2c_mux_core *muxc, u32 chan_id)
28c08799 659{
a0119159 660 struct i2c_client *client = i2c_mux_priv(muxc);
f544f100 661 struct rtl2830_dev *dev = i2c_get_clientdata(client);
28c08799
AP
662 int ret;
663
fd4cfa8b
AP
664 dev_dbg(&client->dev, "\n");
665
15d37f38
AP
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)
28c08799 670 goto err;
28c08799
AP
671
672 return 0;
28c08799 673err:
7cc39328 674 dev_dbg(&client->dev, "failed=%d\n", ret);
28c08799
AP
675 return ret;
676}
677
15d37f38 678static struct dvb_frontend *rtl2830_get_dvb_frontend(struct i2c_client *client)
fd4cfa8b 679{
fd4cfa8b
AP
680 struct rtl2830_dev *dev = i2c_get_clientdata(client);
681
682 dev_dbg(&client->dev, "\n");
683
15d37f38 684 return &dev->fe;
fd4cfa8b
AP
685}
686
15d37f38 687static struct i2c_adapter *rtl2830_get_i2c_adapter(struct i2c_client *client)
28c08799 688{
f544f100 689 struct rtl2830_dev *dev = i2c_get_clientdata(client);
28c08799
AP
690
691 dev_dbg(&client->dev, "\n");
692
a0119159 693 return dev->muxc->adapter[0];
28c08799
AP
694}
695
15d37f38
AP
696/*
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.
699 */
700static int rtl2830_regmap_read(void *context, const void *reg_buf,
701 size_t reg_size, void *val_buf, size_t val_size)
28c08799 702{
15d37f38
AP
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 };
28c08799 718
15d37f38
AP
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}
28c08799 728
15d37f38
AP
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;
28c08799
AP
779}
780
781static int rtl2830_probe(struct i2c_client *client,
947debb4 782 const struct i2c_device_id *id)
28c08799
AP
783{
784 struct rtl2830_platform_data *pdata = client->dev.platform_data;
f544f100 785 struct rtl2830_dev *dev;
28c08799
AP
786 int ret;
787 u8 u8tmp;
15d37f38
AP
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 };
28c08799
AP
812
813 dev_dbg(&client->dev, "\n");
814
815 if (pdata == NULL) {
816 ret = -EINVAL;
817 goto err;
818 }
819
820 /* allocate memory for the internal state */
f544f100
AP
821 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
822 if (dev == NULL) {
28c08799
AP
823 ret = -ENOMEM;
824 goto err;
825 }
826
827 /* setup the state */
f544f100 828 i2c_set_clientdata(client, dev);
47b4dbff 829 dev->client = client;
b8cb50d2 830 dev->pdata = client->dev.platform_data;
f544f100 831 dev->sleeping = true;
15d37f38
AP
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;
837 }
28c08799
AP
838
839 /* check if the demod is there */
15d37f38 840 ret = rtl2830_bulk_read(client, 0x000, &u8tmp, 1);
28c08799 841 if (ret)
15d37f38 842 goto err_regmap_exit;
28c08799
AP
843
844 /* create muxed i2c adapter for tuner */
a0119159
PR
845 dev->muxc = i2c_mux_alloc(client->adapter, &client->dev, 1, 0, 0,
846 rtl2830_select, NULL);
847 if (!dev->muxc) {
848 ret = -ENOMEM;
15d37f38 849 goto err_regmap_exit;
28c08799 850 }
a0119159
PR
851 dev->muxc->priv = client;
852 ret = i2c_mux_add_adapter(dev->muxc, 0, 0, 0);
853 if (ret)
854 goto err_regmap_exit;
28c08799
AP
855
856 /* create dvb frontend */
f544f100 857 memcpy(&dev->fe.ops, &rtl2830_ops, sizeof(dev->fe.ops));
1f153c4d 858 dev->fe.demodulator_priv = client;
28c08799
AP
859
860 /* setup callbacks */
861 pdata->get_dvb_frontend = rtl2830_get_dvb_frontend;
862 pdata->get_i2c_adapter = rtl2830_get_i2c_adapter;
df70ddad
AP
863 pdata->pid_filter = rtl2830_pid_filter;
864 pdata->pid_filter_ctrl = rtl2830_pid_filter_ctrl;
28c08799
AP
865
866 dev_info(&client->dev, "Realtek RTL2830 successfully attached\n");
28c08799 867
947debb4 868 return 0;
15d37f38
AP
869err_regmap_exit:
870 regmap_exit(dev->regmap);
28c08799 871err_kfree:
f544f100 872 kfree(dev);
28c08799
AP
873err:
874 dev_dbg(&client->dev, "failed=%d\n", ret);
875 return ret;
876}
877
878static int rtl2830_remove(struct i2c_client *client)
879{
f544f100 880 struct rtl2830_dev *dev = i2c_get_clientdata(client);
28c08799
AP
881
882 dev_dbg(&client->dev, "\n");
883
a0119159 884 i2c_mux_del_adapters(dev->muxc);
15d37f38 885 regmap_exit(dev->regmap);
f544f100 886 kfree(dev);
947debb4 887
28c08799
AP
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 = {
95e7cdb7
AP
899 .name = "rtl2830",
900 .suppress_bind_attrs = true,
28c08799
AP
901 },
902 .probe = rtl2830_probe,
903 .remove = rtl2830_remove,
904 .id_table = rtl2830_id_table,
905};
906
907module_i2c_driver(rtl2830_driver);
908
c0adca73
AP
909MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
910MODULE_DESCRIPTION("Realtek RTL2830 DVB-T demodulator driver");
911MODULE_LICENSE("GPL");