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 *
16 */
17
18#include "rtl2830_priv.h"
19
20/* Our regmap is bypassing I2C adapter lock, thus we do it! */
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	/* TODO: spec init */
119
120	/* soft reset */
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	/* 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;
138	/* start statistics polling */
139	schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000));
140
141	dev->sleeping = false;
142
143	return ret;
144err:
145	dev_dbg(&client->dev, "failed=%d\n", ret);
146	return ret;
147}
148
149static int rtl2830_sleep(struct dvb_frontend *fe)
150{
151	struct i2c_client *client = fe->demodulator_priv;
152	struct rtl2830_dev *dev = i2c_get_clientdata(client);
153
154	dev->sleeping = true;
155	/* stop statistics polling */
156	cancel_delayed_work_sync(&dev->stat_work);
157	dev->fe_status = 0;
158
159	return 0;
160}
161
162static int rtl2830_get_tune_settings(struct dvb_frontend *fe,
163				     struct dvb_frontend_tune_settings *s)
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{
174	struct i2c_client *client = fe->demodulator_priv;
175	struct rtl2830_dev *dev = i2c_get_clientdata(client);
176	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
177	int ret, i;
178	u64 num;
179	u8 buf[3], u8tmp;
180	u32 if_ctl, if_frequency;
181	static const u8 bw_params1[3][34] = {
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	};
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 */
203	};
204
205	dev_dbg(&client->dev, "frequency=%u bandwidth_hz=%u inversion=%u\n",
206		c->frequency, c->bandwidth_hz, c->inversion);
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:
223		dev_err(&client->dev, "invalid bandwidth_hz %u\n",
224			c->bandwidth_hz);
225		return -EINVAL;
226	}
227
228	ret = rtl2830_update_bits(client, 0x008, 0x06, i << 1);
229	if (ret)
230		goto err;
231
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;
237	if (ret)
238		goto err;
239
240	num = if_frequency % dev->pdata->clk;
241	num *= 0x400000;
242	num = div_u64(num, dev->pdata->clk);
243	num = -num;
244	if_ctl = num & 0x3fffff;
245	dev_dbg(&client->dev, "if_frequency=%d if_ctl=%08x\n",
246		if_frequency, if_ctl);
247
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);
253	if (ret)
254		goto err;
255
256	buf[0] |= u8tmp & 0xc0;  /* [7:6] */
257
258	ret = rtl2830_bulk_write(client, 0x119, buf, 3);
259	if (ret)
260		goto err;
261
262	/* 1/2 split I2C write */
263	ret = rtl2830_bulk_write(client, 0x11c, &bw_params1[i][0], 17);
264	if (ret)
265		goto err;
266
267	/* 2/2 split I2C write */
268	ret = rtl2830_bulk_write(client, 0x12d, &bw_params1[i][17], 17);
269	if (ret)
270		goto err;
271
272	ret = rtl2830_bulk_write(client, 0x19d, bw_params2[i], 6);
273	if (ret)
274		goto err;
275
276	return ret;
277err:
278	dev_dbg(&client->dev, "failed=%d\n", ret);
279	return ret;
280}
281
282static int rtl2830_get_frontend(struct dvb_frontend *fe)
283{
284	struct i2c_client *client = fe->demodulator_priv;
285	struct rtl2830_dev *dev = i2c_get_clientdata(client);
286	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
287	int ret;
288	u8 buf[3];
289
290	if (dev->sleeping)
291		return 0;
292
293	ret = rtl2830_bulk_read(client, 0x33c, buf, 2);
294	if (ret)
295		goto err;
296
297	ret = rtl2830_bulk_read(client, 0x351, &buf[2], 1);
298	if (ret)
299		goto err;
300
301	dev_dbg(&client->dev, "TPS=%*ph\n", 3, buf);
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:
391	dev_dbg(&client->dev, "failed=%d\n", ret);
392	return ret;
393}
394
395static int rtl2830_read_status(struct dvb_frontend *fe, enum fe_status *status)
396{
397	struct i2c_client *client = fe->demodulator_priv;
398	struct rtl2830_dev *dev = i2c_get_clientdata(client);
399	int ret;
400	u8 u8tmp;
401
402	*status = 0;
403
404	if (dev->sleeping)
405		return 0;
406
407	ret = rtl2830_bulk_read(client, 0x351, &u8tmp, 1);
408	if (ret)
409		goto err;
410
411	u8tmp = (u8tmp >> 3) & 0x0f; /* [6:3] */
412	if (u8tmp == 11) {
413		*status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
414			FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
415	} else if (u8tmp == 10) {
416		*status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
417			FE_HAS_VITERBI;
418	}
419
420	dev->fe_status = *status;
421
422	return ret;
423err:
424	dev_dbg(&client->dev, "failed=%d\n", ret);
425	return ret;
426}
427
428static int rtl2830_read_snr(struct dvb_frontend *fe, u16 *snr)
429{
430	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
431
432	if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL)
433		*snr = div_s64(c->cnr.stat[0].svalue, 100);
434	else
435		*snr = 0;
436
437	return 0;
438}
439
440static int rtl2830_read_ber(struct dvb_frontend *fe, u32 *ber)
441{
442	struct i2c_client *client = fe->demodulator_priv;
443	struct rtl2830_dev *dev = i2c_get_clientdata(client);
444
445	*ber = (dev->post_bit_error - dev->post_bit_error_prev);
446	dev->post_bit_error_prev = dev->post_bit_error;
447
448	return 0;
449}
450
451static int rtl2830_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
452{
453	*ucblocks = 0;
454
455	return 0;
456}
457
458static int rtl2830_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
459{
460	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
461
462	if (c->strength.stat[0].scale == FE_SCALE_RELATIVE)
463		*strength = c->strength.stat[0].uvalue;
464	else
465		*strength = 0;
466
467	return 0;
468}
469
470static struct dvb_frontend_ops rtl2830_ops = {
471	.delsys = {SYS_DVBT},
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
491	.init = rtl2830_init,
492	.sleep = rtl2830_sleep,
493
494	.get_tune_settings = rtl2830_get_tune_settings,
495
496	.set_frontend = rtl2830_set_frontend,
497	.get_frontend = rtl2830_get_frontend,
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
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
517	/* signal strength */
518	if (dev->fe_status & FE_HAS_SIGNAL) {
519		struct {signed int x:14; } s;
520
521		/* read IF AGC */
522		ret = rtl2830_bulk_read(client, 0x359, buf, 2);
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
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
550		ret = rtl2830_bulk_read(client, 0x33c, &u8tmp, 1);
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
562		ret = rtl2830_bulk_read(client, 0x40c, buf, 2);
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
581	/* BER */
582	if (dev->fe_status & FE_HAS_LOCK) {
583		ret = rtl2830_bulk_read(client, 0x34e, buf, 2);
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
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
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
623	ret = rtl2830_update_bits(client, 0x061, 0x80, u8tmp);
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;
657	ret = rtl2830_bulk_write(client, 0x062, buf, 4);
658	if (ret)
659		goto err;
660
661	/* add PID */
662	buf[0] = (pid >> 8) & 0xff;
663	buf[1] = (pid >> 0) & 0xff;
664	ret = rtl2830_bulk_write(client, 0x066 + 2 * index, buf, 2);
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
674/*
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.
679 */
680static int rtl2830_select(struct i2c_adapter *adap, void *mux_priv, u32 chan_id)
681{
682	struct i2c_client *client = mux_priv;
683	struct rtl2830_dev *dev = i2c_get_clientdata(client);
684	int ret;
685
686	dev_dbg(&client->dev, "\n");
687
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)
692		goto err;
693
694	return 0;
695err:
696	dev_dbg(&client->dev, "failed=%d\n", ret);
697	return ret;
698}
699
700static struct dvb_frontend *rtl2830_get_dvb_frontend(struct i2c_client *client)
701{
702	struct rtl2830_dev *dev = i2c_get_clientdata(client);
703
704	dev_dbg(&client->dev, "\n");
705
706	return &dev->fe;
707}
708
709static struct i2c_adapter *rtl2830_get_i2c_adapter(struct i2c_client *client)
710{
711	struct rtl2830_dev *dev = i2c_get_clientdata(client);
712
713	dev_dbg(&client->dev, "\n");
714
715	return dev->adapter;
716}
717
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)
724{
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	};
740
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}
750
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;
801}
802
803static int rtl2830_probe(struct i2c_client *client,
804			 const struct i2c_device_id *id)
805{
806	struct rtl2830_platform_data *pdata = client->dev.platform_data;
807	struct rtl2830_dev *dev;
808	int ret;
809	u8 u8tmp;
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	};
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 */
843	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
844	if (dev == NULL) {
845		ret = -ENOMEM;
846		goto err;
847	}
848
849	/* setup the state */
850	i2c_set_clientdata(client, dev);
851	dev->client = client;
852	dev->pdata = client->dev.platform_data;
853	dev->sleeping = true;
854	INIT_DELAYED_WORK(&dev->stat_work, rtl2830_stat_work);
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	}
861
862	/* check if the demod is there */
863	ret = rtl2830_bulk_read(client, 0x000, &u8tmp, 1);
864	if (ret)
865		goto err_regmap_exit;
866
867	/* create muxed i2c adapter for tuner */
868	dev->adapter = i2c_add_mux_adapter(client->adapter, &client->dev,
869			client, 0, 0, 0, rtl2830_select, NULL);
870	if (dev->adapter == NULL) {
871		ret = -ENODEV;
872		goto err_regmap_exit;
873	}
874
875	/* create dvb frontend */
876	memcpy(&dev->fe.ops, &rtl2830_ops, sizeof(dev->fe.ops));
877	dev->fe.demodulator_priv = client;
878
879	/* setup callbacks */
880	pdata->get_dvb_frontend = rtl2830_get_dvb_frontend;
881	pdata->get_i2c_adapter = rtl2830_get_i2c_adapter;
882	pdata->pid_filter = rtl2830_pid_filter;
883	pdata->pid_filter_ctrl = rtl2830_pid_filter_ctrl;
884
885	dev_info(&client->dev, "Realtek RTL2830 successfully attached\n");
886
887	return 0;
888err_regmap_exit:
889	regmap_exit(dev->regmap);
890err_kfree:
891	kfree(dev);
892err:
893	dev_dbg(&client->dev, "failed=%d\n", ret);
894	return ret;
895}
896
897static int rtl2830_remove(struct i2c_client *client)
898{
899	struct rtl2830_dev *dev = i2c_get_clientdata(client);
900
901	dev_dbg(&client->dev, "\n");
902
903	i2c_del_mux_adapter(dev->adapter);
904	regmap_exit(dev->regmap);
905	kfree(dev);
906
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		.name	= "rtl2830",
919	},
920	.probe		= rtl2830_probe,
921	.remove		= rtl2830_remove,
922	.id_table	= rtl2830_id_table,
923};
924
925module_i2c_driver(rtl2830_driver);
926
927MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
928MODULE_DESCRIPTION("Realtek RTL2830 DVB-T demodulator driver");
929MODULE_LICENSE("GPL");
930