]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - drivers/media/dvb-frontends/rtl2830.c
x86/mm/pat, drivers/media/ivtv: Move the PAT warning and replace WARN() with pr_warn()
[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
AP
138 /* start statistics polling */
139 schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000));
140
f544f100 141 dev->sleeping = false;
a8567cf2 142
c0adca73
AP
143 return ret;
144err:
7cc39328 145 dev_dbg(&client->dev, "failed=%d\n", ret);
c0adca73
AP
146 return ret;
147}
148
a8567cf2
AP
149static int rtl2830_sleep(struct dvb_frontend *fe)
150{
1f153c4d
AP
151 struct i2c_client *client = fe->demodulator_priv;
152 struct rtl2830_dev *dev = i2c_get_clientdata(client);
947debb4 153
f544f100 154 dev->sleeping = true;
47b4dbff
AP
155 /* stop statistics polling */
156 cancel_delayed_work_sync(&dev->stat_work);
157 dev->fe_status = 0;
947debb4 158
a8567cf2
AP
159 return 0;
160}
161
a17ff2ee 162static int rtl2830_get_tune_settings(struct dvb_frontend *fe,
947debb4 163 struct dvb_frontend_tune_settings *s)
c0adca73
AP
164{
165 s->min_delay_ms = 500;
166 s->step_size = fe->ops.info.frequency_stepsize * 2;
167 s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
168
169 return 0;
170}
171
172static int rtl2830_set_frontend(struct dvb_frontend *fe)
173{
1f153c4d
AP
174 struct i2c_client *client = fe->demodulator_priv;
175 struct rtl2830_dev *dev = i2c_get_clientdata(client);
c0adca73
AP
176 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
177 int ret, i;
66b3c4de 178 u64 num;
15d37f38 179 u8 buf[3], u8tmp;
66b3c4de 180 u32 if_ctl, if_frequency;
3a2fca26 181 static const u8 bw_params1[3][34] = {
c0adca73
AP
182 {
183 0x1f, 0xf0, 0x1f, 0xf0, 0x1f, 0xfa, 0x00, 0x17, 0x00, 0x41,
184 0x00, 0x64, 0x00, 0x67, 0x00, 0x38, 0x1f, 0xde, 0x1f, 0x7a,
185 0x1f, 0x47, 0x1f, 0x7c, 0x00, 0x30, 0x01, 0x4b, 0x02, 0x82,
186 0x03, 0x73, 0x03, 0xcf, /* 6 MHz */
187 }, {
188 0x1f, 0xfa, 0x1f, 0xda, 0x1f, 0xc1, 0x1f, 0xb3, 0x1f, 0xca,
189 0x00, 0x07, 0x00, 0x4d, 0x00, 0x6d, 0x00, 0x40, 0x1f, 0xca,
190 0x1f, 0x4d, 0x1f, 0x2a, 0x1f, 0xb2, 0x00, 0xec, 0x02, 0x7e,
191 0x03, 0xd0, 0x04, 0x53, /* 7 MHz */
192 }, {
193 0x00, 0x10, 0x00, 0x0e, 0x1f, 0xf7, 0x1f, 0xc9, 0x1f, 0xa0,
194 0x1f, 0xa6, 0x1f, 0xec, 0x00, 0x4e, 0x00, 0x7d, 0x00, 0x3a,
195 0x1f, 0x98, 0x1f, 0x10, 0x1f, 0x40, 0x00, 0x75, 0x02, 0x5f,
196 0x04, 0x24, 0x04, 0xdb, /* 8 MHz */
197 },
198 };
3a2fca26
AP
199 static const u8 bw_params2[3][6] = {
200 {0xc3, 0x0c, 0x44, 0x33, 0x33, 0x30}, /* 6 MHz */
201 {0xb8, 0xe3, 0x93, 0x99, 0x99, 0x98}, /* 7 MHz */
202 {0xae, 0xba, 0xf3, 0x26, 0x66, 0x64}, /* 8 MHz */
c0adca73
AP
203 };
204
7cc39328 205 dev_dbg(&client->dev, "frequency=%u bandwidth_hz=%u inversion=%u\n",
947debb4 206 c->frequency, c->bandwidth_hz, c->inversion);
c0adca73
AP
207
208 /* program tuner */
209 if (fe->ops.tuner_ops.set_params)
210 fe->ops.tuner_ops.set_params(fe);
211
212 switch (c->bandwidth_hz) {
213 case 6000000:
214 i = 0;
215 break;
216 case 7000000:
217 i = 1;
218 break;
219 case 8000000:
220 i = 2;
221 break;
222 default:
7cc39328 223 dev_err(&client->dev, "invalid bandwidth_hz %u\n",
947debb4 224 c->bandwidth_hz);
c0adca73
AP
225 return -EINVAL;
226 }
227
15d37f38 228 ret = rtl2830_update_bits(client, 0x008, 0x06, i << 1);
c0adca73
AP
229 if (ret)
230 goto err;
231
66b3c4de
AP
232 /* program if frequency */
233 if (fe->ops.tuner_ops.get_if_frequency)
234 ret = fe->ops.tuner_ops.get_if_frequency(fe, &if_frequency);
235 else
236 ret = -EINVAL;
947debb4 237 if (ret)
66b3c4de
AP
238 goto err;
239
b8cb50d2 240 num = if_frequency % dev->pdata->clk;
66b3c4de 241 num *= 0x400000;
b8cb50d2 242 num = div_u64(num, dev->pdata->clk);
66b3c4de
AP
243 num = -num;
244 if_ctl = num & 0x3fffff;
7cc39328 245 dev_dbg(&client->dev, "if_frequency=%d if_ctl=%08x\n",
947debb4 246 if_frequency, if_ctl);
66b3c4de 247
15d37f38
AP
248 buf[0] = (if_ctl >> 16) & 0x3f;
249 buf[1] = (if_ctl >> 8) & 0xff;
250 buf[2] = (if_ctl >> 0) & 0xff;
251
252 ret = rtl2830_bulk_read(client, 0x119, &u8tmp, 1);
66b3c4de
AP
253 if (ret)
254 goto err;
255
15d37f38 256 buf[0] |= u8tmp & 0xc0; /* [7:6] */
66b3c4de 257
15d37f38 258 ret = rtl2830_bulk_write(client, 0x119, buf, 3);
66b3c4de
AP
259 if (ret)
260 goto err;
261
c0adca73 262 /* 1/2 split I2C write */
15d37f38 263 ret = rtl2830_bulk_write(client, 0x11c, &bw_params1[i][0], 17);
c0adca73
AP
264 if (ret)
265 goto err;
266
267 /* 2/2 split I2C write */
15d37f38 268 ret = rtl2830_bulk_write(client, 0x12d, &bw_params1[i][17], 17);
c0adca73
AP
269 if (ret)
270 goto err;
271
15d37f38 272 ret = rtl2830_bulk_write(client, 0x19d, bw_params2[i], 6);
c0adca73
AP
273 if (ret)
274 goto err;
275
276 return ret;
277err:
7cc39328 278 dev_dbg(&client->dev, "failed=%d\n", ret);
c0adca73
AP
279 return ret;
280}
281
631a2b61
AP
282static int rtl2830_get_frontend(struct dvb_frontend *fe)
283{
1f153c4d
AP
284 struct i2c_client *client = fe->demodulator_priv;
285 struct rtl2830_dev *dev = i2c_get_clientdata(client);
631a2b61
AP
286 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
287 int ret;
288 u8 buf[3];
289
f544f100 290 if (dev->sleeping)
c188637d
AP
291 return 0;
292
15d37f38 293 ret = rtl2830_bulk_read(client, 0x33c, buf, 2);
631a2b61
AP
294 if (ret)
295 goto err;
296
15d37f38 297 ret = rtl2830_bulk_read(client, 0x351, &buf[2], 1);
631a2b61
AP
298 if (ret)
299 goto err;
300
7cc39328 301 dev_dbg(&client->dev, "TPS=%*ph\n", 3, buf);
631a2b61
AP
302
303 switch ((buf[0] >> 2) & 3) {
304 case 0:
305 c->modulation = QPSK;
306 break;
307 case 1:
308 c->modulation = QAM_16;
309 break;
310 case 2:
311 c->modulation = QAM_64;
312 break;
313 }
314
315 switch ((buf[2] >> 2) & 1) {
316 case 0:
317 c->transmission_mode = TRANSMISSION_MODE_2K;
318 break;
319 case 1:
320 c->transmission_mode = TRANSMISSION_MODE_8K;
321 }
322
323 switch ((buf[2] >> 0) & 3) {
324 case 0:
325 c->guard_interval = GUARD_INTERVAL_1_32;
326 break;
327 case 1:
328 c->guard_interval = GUARD_INTERVAL_1_16;
329 break;
330 case 2:
331 c->guard_interval = GUARD_INTERVAL_1_8;
332 break;
333 case 3:
334 c->guard_interval = GUARD_INTERVAL_1_4;
335 break;
336 }
337
338 switch ((buf[0] >> 4) & 7) {
339 case 0:
340 c->hierarchy = HIERARCHY_NONE;
341 break;
342 case 1:
343 c->hierarchy = HIERARCHY_1;
344 break;
345 case 2:
346 c->hierarchy = HIERARCHY_2;
347 break;
348 case 3:
349 c->hierarchy = HIERARCHY_4;
350 break;
351 }
352
353 switch ((buf[1] >> 3) & 7) {
354 case 0:
355 c->code_rate_HP = FEC_1_2;
356 break;
357 case 1:
358 c->code_rate_HP = FEC_2_3;
359 break;
360 case 2:
361 c->code_rate_HP = FEC_3_4;
362 break;
363 case 3:
364 c->code_rate_HP = FEC_5_6;
365 break;
366 case 4:
367 c->code_rate_HP = FEC_7_8;
368 break;
369 }
370
371 switch ((buf[1] >> 0) & 7) {
372 case 0:
373 c->code_rate_LP = FEC_1_2;
374 break;
375 case 1:
376 c->code_rate_LP = FEC_2_3;
377 break;
378 case 2:
379 c->code_rate_LP = FEC_3_4;
380 break;
381 case 3:
382 c->code_rate_LP = FEC_5_6;
383 break;
384 case 4:
385 c->code_rate_LP = FEC_7_8;
386 break;
387 }
388
389 return 0;
390err:
7cc39328 391 dev_dbg(&client->dev, "failed=%d\n", ret);
631a2b61
AP
392 return ret;
393}
394
0df289a2 395static int rtl2830_read_status(struct dvb_frontend *fe, enum fe_status *status)
c0adca73 396{
1f153c4d 397 struct i2c_client *client = fe->demodulator_priv;
b8cb50d2 398 struct rtl2830_dev *dev = i2c_get_clientdata(client);
c0adca73 399 int ret;
15d37f38 400 u8 u8tmp;
947debb4 401
c0adca73
AP
402 *status = 0;
403
f544f100 404 if (dev->sleeping)
a8567cf2
AP
405 return 0;
406
15d37f38 407 ret = rtl2830_bulk_read(client, 0x351, &u8tmp, 1);
c0adca73
AP
408 if (ret)
409 goto err;
410
15d37f38
AP
411 u8tmp = (u8tmp >> 3) & 0x0f; /* [6:3] */
412 if (u8tmp == 11) {
c0adca73
AP
413 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
414 FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
15d37f38 415 } else if (u8tmp == 10) {
c0adca73
AP
416 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
417 FE_HAS_VITERBI;
418 }
419
47b4dbff
AP
420 dev->fe_status = *status;
421
c0adca73
AP
422 return ret;
423err:
7cc39328 424 dev_dbg(&client->dev, "failed=%d\n", ret);
c0adca73
AP
425 return ret;
426}
427
428static int rtl2830_read_snr(struct dvb_frontend *fe, u16 *snr)
429{
6dcfe3cc 430 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
eba672a0 431
6dcfe3cc
AP
432 if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL)
433 *snr = div_s64(c->cnr.stat[0].svalue, 100);
eba672a0
AP
434 else
435 *snr = 0;
436
c0adca73
AP
437 return 0;
438}
439
440static int rtl2830_read_ber(struct dvb_frontend *fe, u32 *ber)
441{
1f153c4d
AP
442 struct i2c_client *client = fe->demodulator_priv;
443 struct rtl2830_dev *dev = i2c_get_clientdata(client);
525ffc19 444
f491391c
AP
445 *ber = (dev->post_bit_error - dev->post_bit_error_prev);
446 dev->post_bit_error_prev = dev->post_bit_error;
525ffc19 447
c0adca73
AP
448 return 0;
449}
450
451static int rtl2830_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
452{
453 *ucblocks = 0;
947debb4 454
c0adca73
AP
455 return 0;
456}
457
458static int rtl2830_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
459{
d512e286 460 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
78e75075 461
d512e286
AP
462 if (c->strength.stat[0].scale == FE_SCALE_RELATIVE)
463 *strength = c->strength.stat[0].uvalue;
78e75075 464 else
d512e286 465 *strength = 0;
78e75075 466
c0adca73
AP
467 return 0;
468}
469
c0adca73 470static struct dvb_frontend_ops rtl2830_ops = {
947debb4 471 .delsys = {SYS_DVBT},
c0adca73
AP
472 .info = {
473 .name = "Realtek RTL2830 (DVB-T)",
474 .caps = FE_CAN_FEC_1_2 |
475 FE_CAN_FEC_2_3 |
476 FE_CAN_FEC_3_4 |
477 FE_CAN_FEC_5_6 |
478 FE_CAN_FEC_7_8 |
479 FE_CAN_FEC_AUTO |
480 FE_CAN_QPSK |
481 FE_CAN_QAM_16 |
482 FE_CAN_QAM_64 |
483 FE_CAN_QAM_AUTO |
484 FE_CAN_TRANSMISSION_MODE_AUTO |
485 FE_CAN_GUARD_INTERVAL_AUTO |
486 FE_CAN_HIERARCHY_AUTO |
487 FE_CAN_RECOVER |
488 FE_CAN_MUTE_TS
489 },
490
c0adca73 491 .init = rtl2830_init,
a8567cf2 492 .sleep = rtl2830_sleep,
c0adca73
AP
493
494 .get_tune_settings = rtl2830_get_tune_settings,
495
496 .set_frontend = rtl2830_set_frontend,
631a2b61 497 .get_frontend = rtl2830_get_frontend,
c0adca73
AP
498
499 .read_status = rtl2830_read_status,
500 .read_snr = rtl2830_read_snr,
501 .read_ber = rtl2830_read_ber,
502 .read_ucblocks = rtl2830_read_ucblocks,
503 .read_signal_strength = rtl2830_read_signal_strength,
504};
505
47b4dbff
AP
506static void rtl2830_stat_work(struct work_struct *work)
507{
508 struct rtl2830_dev *dev = container_of(work, struct rtl2830_dev, stat_work.work);
509 struct i2c_client *client = dev->client;
510 struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
511 int ret, tmp;
512 u8 u8tmp, buf[2];
513 u16 u16tmp;
514
515 dev_dbg(&client->dev, "\n");
516
871f7025
AP
517 /* signal strength */
518 if (dev->fe_status & FE_HAS_SIGNAL) {
519 struct {signed int x:14; } s;
520
521 /* read IF AGC */
15d37f38 522 ret = rtl2830_bulk_read(client, 0x359, buf, 2);
871f7025
AP
523 if (ret)
524 goto err;
525
526 u16tmp = buf[0] << 8 | buf[1] << 0;
527 u16tmp &= 0x3fff; /* [13:0] */
528 tmp = s.x = u16tmp; /* 14-bit bin to 2 complement */
529 u16tmp = clamp_val(-4 * tmp + 32767, 0x0000, 0xffff);
530
531 dev_dbg(&client->dev, "IF AGC=%d\n", tmp);
532
533 c->strength.stat[0].scale = FE_SCALE_RELATIVE;
534 c->strength.stat[0].uvalue = u16tmp;
535 } else {
536 c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
537 }
538
47b4dbff
AP
539 /* CNR */
540 if (dev->fe_status & FE_HAS_VITERBI) {
541 unsigned hierarchy, constellation;
542 #define CONSTELLATION_NUM 3
543 #define HIERARCHY_NUM 4
544 static const u32 constant[CONSTELLATION_NUM][HIERARCHY_NUM] = {
545 {70705899, 70705899, 70705899, 70705899},
546 {82433173, 82433173, 87483115, 94445660},
547 {92888734, 92888734, 95487525, 99770748},
548 };
549
15d37f38 550 ret = rtl2830_bulk_read(client, 0x33c, &u8tmp, 1);
47b4dbff
AP
551 if (ret)
552 goto err;
553
554 constellation = (u8tmp >> 2) & 0x03; /* [3:2] */
555 if (constellation > CONSTELLATION_NUM - 1)
556 goto err_schedule_delayed_work;
557
558 hierarchy = (u8tmp >> 4) & 0x07; /* [6:4] */
559 if (hierarchy > HIERARCHY_NUM - 1)
560 goto err_schedule_delayed_work;
561
15d37f38 562 ret = rtl2830_bulk_read(client, 0x40c, buf, 2);
47b4dbff
AP
563 if (ret)
564 goto err;
565
566 u16tmp = buf[0] << 8 | buf[1] << 0;
567 if (u16tmp)
568 tmp = (constant[constellation][hierarchy] -
569 intlog10(u16tmp)) / ((1 << 24) / 10000);
570 else
571 tmp = 0;
572
573 dev_dbg(&client->dev, "CNR raw=%u\n", u16tmp);
574
575 c->cnr.stat[0].scale = FE_SCALE_DECIBEL;
576 c->cnr.stat[0].svalue = tmp;
577 } else {
578 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
579 }
580
5bb11ca5
AP
581 /* BER */
582 if (dev->fe_status & FE_HAS_LOCK) {
15d37f38 583 ret = rtl2830_bulk_read(client, 0x34e, buf, 2);
5bb11ca5
AP
584 if (ret)
585 goto err;
586
587 u16tmp = buf[0] << 8 | buf[1] << 0;
588 dev->post_bit_error += u16tmp;
589 dev->post_bit_count += 1000000;
590
591 dev_dbg(&client->dev, "BER errors=%u total=1000000\n", u16tmp);
592
593 c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
594 c->post_bit_error.stat[0].uvalue = dev->post_bit_error;
595 c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
596 c->post_bit_count.stat[0].uvalue = dev->post_bit_count;
597 } else {
598 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
599 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
600 }
601
47b4dbff
AP
602err_schedule_delayed_work:
603 schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000));
604 return;
605err:
606 dev_dbg(&client->dev, "failed=%d\n", ret);
607}
608
df70ddad
AP
609static int rtl2830_pid_filter_ctrl(struct dvb_frontend *fe, int onoff)
610{
611 struct i2c_client *client = fe->demodulator_priv;
612 int ret;
613 u8 u8tmp;
614
615 dev_dbg(&client->dev, "onoff=%d\n", onoff);
616
617 /* enable / disable PID filter */
618 if (onoff)
619 u8tmp = 0x80;
620 else
621 u8tmp = 0x00;
622
15d37f38 623 ret = rtl2830_update_bits(client, 0x061, 0x80, u8tmp);
df70ddad
AP
624 if (ret)
625 goto err;
626
627 return 0;
628err:
629 dev_dbg(&client->dev, "failed=%d\n", ret);
630 return ret;
631}
632
633static int rtl2830_pid_filter(struct dvb_frontend *fe, u8 index, u16 pid, int onoff)
634{
635 struct i2c_client *client = fe->demodulator_priv;
636 struct rtl2830_dev *dev = i2c_get_clientdata(client);
637 int ret;
638 u8 buf[4];
639
640 dev_dbg(&client->dev, "index=%d pid=%04x onoff=%d\n",
641 index, pid, onoff);
642
643 /* skip invalid PIDs (0x2000) */
644 if (pid > 0x1fff || index > 32)
645 return 0;
646
647 if (onoff)
648 set_bit(index, &dev->filters);
649 else
650 clear_bit(index, &dev->filters);
651
652 /* enable / disable PIDs */
653 buf[0] = (dev->filters >> 0) & 0xff;
654 buf[1] = (dev->filters >> 8) & 0xff;
655 buf[2] = (dev->filters >> 16) & 0xff;
656 buf[3] = (dev->filters >> 24) & 0xff;
15d37f38 657 ret = rtl2830_bulk_write(client, 0x062, buf, 4);
df70ddad
AP
658 if (ret)
659 goto err;
660
661 /* add PID */
662 buf[0] = (pid >> 8) & 0xff;
663 buf[1] = (pid >> 0) & 0xff;
15d37f38 664 ret = rtl2830_bulk_write(client, 0x066 + 2 * index, buf, 2);
df70ddad
AP
665 if (ret)
666 goto err;
667
668 return 0;
669err:
670 dev_dbg(&client->dev, "failed=%d\n", ret);
671 return ret;
672}
673
28c08799 674/*
15d37f38
AP
675 * I2C gate/mux/repeater logic
676 * We must use unlocked __i2c_transfer() here (through regmap) because of I2C
677 * adapter lock is already taken by tuner driver.
678 * Gate is closed automatically after single I2C transfer.
28c08799
AP
679 */
680static int rtl2830_select(struct i2c_adapter *adap, void *mux_priv, u32 chan_id)
681{
682 struct i2c_client *client = mux_priv;
f544f100 683 struct rtl2830_dev *dev = i2c_get_clientdata(client);
28c08799
AP
684 int ret;
685
fd4cfa8b
AP
686 dev_dbg(&client->dev, "\n");
687
15d37f38
AP
688 /* open I2C repeater for 1 transfer, closes automatically */
689 /* XXX: regmap_update_bits() does not lock I2C adapter */
690 ret = regmap_update_bits(dev->regmap, 0x101, 0x08, 0x08);
691 if (ret)
28c08799 692 goto err;
28c08799
AP
693
694 return 0;
28c08799 695err:
7cc39328 696 dev_dbg(&client->dev, "failed=%d\n", ret);
28c08799
AP
697 return ret;
698}
699
15d37f38 700static struct dvb_frontend *rtl2830_get_dvb_frontend(struct i2c_client *client)
fd4cfa8b 701{
fd4cfa8b
AP
702 struct rtl2830_dev *dev = i2c_get_clientdata(client);
703
704 dev_dbg(&client->dev, "\n");
705
15d37f38 706 return &dev->fe;
fd4cfa8b
AP
707}
708
15d37f38 709static struct i2c_adapter *rtl2830_get_i2c_adapter(struct i2c_client *client)
28c08799 710{
f544f100 711 struct rtl2830_dev *dev = i2c_get_clientdata(client);
28c08799
AP
712
713 dev_dbg(&client->dev, "\n");
714
15d37f38 715 return dev->adapter;
28c08799
AP
716}
717
15d37f38
AP
718/*
719 * We implement own I2C access routines for regmap in order to get manual access
720 * to I2C adapter lock, which is needed for I2C mux adapter.
721 */
722static int rtl2830_regmap_read(void *context, const void *reg_buf,
723 size_t reg_size, void *val_buf, size_t val_size)
28c08799 724{
15d37f38
AP
725 struct i2c_client *client = context;
726 int ret;
727 struct i2c_msg msg[2] = {
728 {
729 .addr = client->addr,
730 .flags = 0,
731 .len = reg_size,
732 .buf = (u8 *)reg_buf,
733 }, {
734 .addr = client->addr,
735 .flags = I2C_M_RD,
736 .len = val_size,
737 .buf = val_buf,
738 }
739 };
28c08799 740
15d37f38
AP
741 ret = __i2c_transfer(client->adapter, msg, 2);
742 if (ret != 2) {
743 dev_warn(&client->dev, "i2c reg read failed %d\n", ret);
744 if (ret >= 0)
745 ret = -EREMOTEIO;
746 return ret;
747 }
748 return 0;
749}
28c08799 750
15d37f38
AP
751static int rtl2830_regmap_write(void *context, const void *data, size_t count)
752{
753 struct i2c_client *client = context;
754 int ret;
755 struct i2c_msg msg[1] = {
756 {
757 .addr = client->addr,
758 .flags = 0,
759 .len = count,
760 .buf = (u8 *)data,
761 }
762 };
763
764 ret = __i2c_transfer(client->adapter, msg, 1);
765 if (ret != 1) {
766 dev_warn(&client->dev, "i2c reg write failed %d\n", ret);
767 if (ret >= 0)
768 ret = -EREMOTEIO;
769 return ret;
770 }
771 return 0;
772}
773
774static int rtl2830_regmap_gather_write(void *context, const void *reg,
775 size_t reg_len, const void *val,
776 size_t val_len)
777{
778 struct i2c_client *client = context;
779 int ret;
780 u8 buf[256];
781 struct i2c_msg msg[1] = {
782 {
783 .addr = client->addr,
784 .flags = 0,
785 .len = 1 + val_len,
786 .buf = buf,
787 }
788 };
789
790 buf[0] = *(u8 const *)reg;
791 memcpy(&buf[1], val, val_len);
792
793 ret = __i2c_transfer(client->adapter, msg, 1);
794 if (ret != 1) {
795 dev_warn(&client->dev, "i2c reg write failed %d\n", ret);
796 if (ret >= 0)
797 ret = -EREMOTEIO;
798 return ret;
799 }
800 return 0;
28c08799
AP
801}
802
803static int rtl2830_probe(struct i2c_client *client,
947debb4 804 const struct i2c_device_id *id)
28c08799
AP
805{
806 struct rtl2830_platform_data *pdata = client->dev.platform_data;
f544f100 807 struct rtl2830_dev *dev;
28c08799
AP
808 int ret;
809 u8 u8tmp;
15d37f38
AP
810 static const struct regmap_bus regmap_bus = {
811 .read = rtl2830_regmap_read,
812 .write = rtl2830_regmap_write,
813 .gather_write = rtl2830_regmap_gather_write,
814 .val_format_endian_default = REGMAP_ENDIAN_NATIVE,
815 };
816 static const struct regmap_range_cfg regmap_range_cfg[] = {
817 {
818 .selector_reg = 0x00,
819 .selector_mask = 0xff,
820 .selector_shift = 0,
821 .window_start = 0,
822 .window_len = 0x100,
823 .range_min = 0 * 0x100,
824 .range_max = 5 * 0x100,
825 },
826 };
827 static const struct regmap_config regmap_config = {
828 .reg_bits = 8,
829 .val_bits = 8,
830 .max_register = 5 * 0x100,
831 .ranges = regmap_range_cfg,
832 .num_ranges = ARRAY_SIZE(regmap_range_cfg),
833 };
28c08799
AP
834
835 dev_dbg(&client->dev, "\n");
836
837 if (pdata == NULL) {
838 ret = -EINVAL;
839 goto err;
840 }
841
842 /* allocate memory for the internal state */
f544f100
AP
843 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
844 if (dev == NULL) {
28c08799
AP
845 ret = -ENOMEM;
846 goto err;
847 }
848
849 /* setup the state */
f544f100 850 i2c_set_clientdata(client, dev);
47b4dbff 851 dev->client = client;
b8cb50d2 852 dev->pdata = client->dev.platform_data;
f544f100 853 dev->sleeping = true;
47b4dbff 854 INIT_DELAYED_WORK(&dev->stat_work, rtl2830_stat_work);
15d37f38
AP
855 dev->regmap = regmap_init(&client->dev, &regmap_bus, client,
856 &regmap_config);
857 if (IS_ERR(dev->regmap)) {
858 ret = PTR_ERR(dev->regmap);
859 goto err_kfree;
860 }
28c08799
AP
861
862 /* check if the demod is there */
15d37f38 863 ret = rtl2830_bulk_read(client, 0x000, &u8tmp, 1);
28c08799 864 if (ret)
15d37f38 865 goto err_regmap_exit;
28c08799
AP
866
867 /* create muxed i2c adapter for tuner */
f544f100 868 dev->adapter = i2c_add_mux_adapter(client->adapter, &client->dev,
15d37f38 869 client, 0, 0, 0, rtl2830_select, NULL);
f544f100 870 if (dev->adapter == NULL) {
28c08799 871 ret = -ENODEV;
15d37f38 872 goto err_regmap_exit;
28c08799
AP
873 }
874
875 /* create dvb frontend */
f544f100 876 memcpy(&dev->fe.ops, &rtl2830_ops, sizeof(dev->fe.ops));
1f153c4d 877 dev->fe.demodulator_priv = client;
28c08799
AP
878
879 /* setup callbacks */
880 pdata->get_dvb_frontend = rtl2830_get_dvb_frontend;
881 pdata->get_i2c_adapter = rtl2830_get_i2c_adapter;
df70ddad
AP
882 pdata->pid_filter = rtl2830_pid_filter;
883 pdata->pid_filter_ctrl = rtl2830_pid_filter_ctrl;
28c08799
AP
884
885 dev_info(&client->dev, "Realtek RTL2830 successfully attached\n");
28c08799 886
947debb4 887 return 0;
15d37f38
AP
888err_regmap_exit:
889 regmap_exit(dev->regmap);
28c08799 890err_kfree:
f544f100 891 kfree(dev);
28c08799
AP
892err:
893 dev_dbg(&client->dev, "failed=%d\n", ret);
894 return ret;
895}
896
897static int rtl2830_remove(struct i2c_client *client)
898{
f544f100 899 struct rtl2830_dev *dev = i2c_get_clientdata(client);
28c08799
AP
900
901 dev_dbg(&client->dev, "\n");
902
f544f100 903 i2c_del_mux_adapter(dev->adapter);
15d37f38 904 regmap_exit(dev->regmap);
f544f100 905 kfree(dev);
947debb4 906
28c08799
AP
907 return 0;
908}
909
910static const struct i2c_device_id rtl2830_id_table[] = {
911 {"rtl2830", 0},
912 {}
913};
914MODULE_DEVICE_TABLE(i2c, rtl2830_id_table);
915
916static struct i2c_driver rtl2830_driver = {
917 .driver = {
918 .owner = THIS_MODULE,
919 .name = "rtl2830",
920 },
921 .probe = rtl2830_probe,
922 .remove = rtl2830_remove,
923 .id_table = rtl2830_id_table,
924};
925
926module_i2c_driver(rtl2830_driver);
927
c0adca73
AP
928MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
929MODULE_DESCRIPTION("Realtek RTL2830 DVB-T demodulator driver");
930MODULE_LICENSE("GPL");