xref: /openbmc/linux/drivers/media/dvb-frontends/m88ds3103.c (revision 06487dee53ae1574fb9637a4c243287ea92ab69d)
1 /*
2  * Montage M88DS3103 demodulator driver
3  *
4  * Copyright (C) 2013 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  *    You should have received a copy of the GNU General Public License along
17  *    with this program; if not, write to the Free Software Foundation, Inc.,
18  *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19  */
20 
21 #include "m88ds3103_priv.h"
22 
23 static struct dvb_frontend_ops m88ds3103_ops;
24 
25 /* write multiple registers */
26 static int m88ds3103_wr_regs(struct m88ds3103_priv *priv,
27 		u8 reg, const u8 *val, int len)
28 {
29 #define MAX_WR_LEN 32
30 #define MAX_WR_XFER_LEN (MAX_WR_LEN + 1)
31 	int ret;
32 	u8 buf[MAX_WR_XFER_LEN];
33 	struct i2c_msg msg[1] = {
34 		{
35 			.addr = priv->cfg->i2c_addr,
36 			.flags = 0,
37 			.len = 1 + len,
38 			.buf = buf,
39 		}
40 	};
41 
42 	if (WARN_ON(len > MAX_WR_LEN))
43 		return -EINVAL;
44 
45 	buf[0] = reg;
46 	memcpy(&buf[1], val, len);
47 
48 	mutex_lock(&priv->i2c_mutex);
49 	ret = i2c_transfer(priv->i2c, msg, 1);
50 	mutex_unlock(&priv->i2c_mutex);
51 	if (ret == 1) {
52 		ret = 0;
53 	} else {
54 		dev_warn(&priv->i2c->dev,
55 				"%s: i2c wr failed=%d reg=%02x len=%d\n",
56 				KBUILD_MODNAME, ret, reg, len);
57 		ret = -EREMOTEIO;
58 	}
59 
60 	return ret;
61 }
62 
63 /* read multiple registers */
64 static int m88ds3103_rd_regs(struct m88ds3103_priv *priv,
65 		u8 reg, u8 *val, int len)
66 {
67 #define MAX_RD_LEN 3
68 #define MAX_RD_XFER_LEN (MAX_RD_LEN)
69 	int ret;
70 	u8 buf[MAX_RD_XFER_LEN];
71 	struct i2c_msg msg[2] = {
72 		{
73 			.addr = priv->cfg->i2c_addr,
74 			.flags = 0,
75 			.len = 1,
76 			.buf = &reg,
77 		}, {
78 			.addr = priv->cfg->i2c_addr,
79 			.flags = I2C_M_RD,
80 			.len = len,
81 			.buf = buf,
82 		}
83 	};
84 
85 	if (WARN_ON(len > MAX_RD_LEN))
86 		return -EINVAL;
87 
88 	mutex_lock(&priv->i2c_mutex);
89 	ret = i2c_transfer(priv->i2c, msg, 2);
90 	mutex_unlock(&priv->i2c_mutex);
91 	if (ret == 2) {
92 		memcpy(val, buf, len);
93 		ret = 0;
94 	} else {
95 		dev_warn(&priv->i2c->dev,
96 				"%s: i2c rd failed=%d reg=%02x len=%d\n",
97 				KBUILD_MODNAME, ret, reg, len);
98 		ret = -EREMOTEIO;
99 	}
100 
101 	return ret;
102 }
103 
104 /* write single register */
105 static int m88ds3103_wr_reg(struct m88ds3103_priv *priv, u8 reg, u8 val)
106 {
107 	return m88ds3103_wr_regs(priv, reg, &val, 1);
108 }
109 
110 /* read single register */
111 static int m88ds3103_rd_reg(struct m88ds3103_priv *priv, u8 reg, u8 *val)
112 {
113 	return m88ds3103_rd_regs(priv, reg, val, 1);
114 }
115 
116 /* write single register with mask */
117 static int m88ds3103_wr_reg_mask(struct m88ds3103_priv *priv,
118 		u8 reg, u8 val, u8 mask)
119 {
120 	int ret;
121 	u8 u8tmp;
122 
123 	/* no need for read if whole reg is written */
124 	if (mask != 0xff) {
125 		ret = m88ds3103_rd_regs(priv, reg, &u8tmp, 1);
126 		if (ret)
127 			return ret;
128 
129 		val &= mask;
130 		u8tmp &= ~mask;
131 		val |= u8tmp;
132 	}
133 
134 	return m88ds3103_wr_regs(priv, reg, &val, 1);
135 }
136 
137 /* read single register with mask */
138 static int m88ds3103_rd_reg_mask(struct m88ds3103_priv *priv,
139 		u8 reg, u8 *val, u8 mask)
140 {
141 	int ret, i;
142 	u8 u8tmp;
143 
144 	ret = m88ds3103_rd_regs(priv, reg, &u8tmp, 1);
145 	if (ret)
146 		return ret;
147 
148 	u8tmp &= mask;
149 
150 	/* find position of the first bit */
151 	for (i = 0; i < 8; i++) {
152 		if ((mask >> i) & 0x01)
153 			break;
154 	}
155 	*val = u8tmp >> i;
156 
157 	return 0;
158 }
159 
160 /* write reg val table using reg addr auto increment */
161 static int m88ds3103_wr_reg_val_tab(struct m88ds3103_priv *priv,
162 		const struct m88ds3103_reg_val *tab, int tab_len)
163 {
164 	int ret, i, j;
165 	u8 buf[83];
166 	dev_dbg(&priv->i2c->dev, "%s: tab_len=%d\n", __func__, tab_len);
167 
168 	if (tab_len > 83) {
169 		ret = -EINVAL;
170 		goto err;
171 	}
172 
173 	for (i = 0, j = 0; i < tab_len; i++, j++) {
174 		buf[j] = tab[i].val;
175 
176 		if (i == tab_len - 1 || tab[i].reg != tab[i + 1].reg - 1 ||
177 				!((j + 1) % (priv->cfg->i2c_wr_max - 1))) {
178 			ret = m88ds3103_wr_regs(priv, tab[i].reg - j, buf, j + 1);
179 			if (ret)
180 				goto err;
181 
182 			j = -1;
183 		}
184 	}
185 
186 	return 0;
187 err:
188 	dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
189 	return ret;
190 }
191 
192 static int m88ds3103_read_status(struct dvb_frontend *fe, fe_status_t *status)
193 {
194 	struct m88ds3103_priv *priv = fe->demodulator_priv;
195 	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
196 	int ret;
197 	u8 u8tmp;
198 
199 	*status = 0;
200 
201 	if (!priv->warm) {
202 		ret = -EAGAIN;
203 		goto err;
204 	}
205 
206 	switch (c->delivery_system) {
207 	case SYS_DVBS:
208 		ret = m88ds3103_rd_reg_mask(priv, 0xd1, &u8tmp, 0x07);
209 		if (ret)
210 			goto err;
211 
212 		if (u8tmp == 0x07)
213 			*status = FE_HAS_SIGNAL | FE_HAS_CARRIER |
214 					FE_HAS_VITERBI | FE_HAS_SYNC |
215 					FE_HAS_LOCK;
216 		break;
217 	case SYS_DVBS2:
218 		ret = m88ds3103_rd_reg_mask(priv, 0x0d, &u8tmp, 0x8f);
219 		if (ret)
220 			goto err;
221 
222 		if (u8tmp == 0x8f)
223 			*status = FE_HAS_SIGNAL | FE_HAS_CARRIER |
224 					FE_HAS_VITERBI | FE_HAS_SYNC |
225 					FE_HAS_LOCK;
226 		break;
227 	default:
228 		dev_dbg(&priv->i2c->dev, "%s: invalid delivery_system\n",
229 				__func__);
230 		ret = -EINVAL;
231 		goto err;
232 	}
233 
234 	priv->fe_status = *status;
235 
236 	dev_dbg(&priv->i2c->dev, "%s: lock=%02x status=%02x\n",
237 			__func__, u8tmp, *status);
238 
239 	return 0;
240 err:
241 	dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
242 	return ret;
243 }
244 
245 static int m88ds3103_set_frontend(struct dvb_frontend *fe)
246 {
247 	struct m88ds3103_priv *priv = fe->demodulator_priv;
248 	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
249 	int ret, len;
250 	const struct m88ds3103_reg_val *init;
251 	u8 u8tmp, u8tmp1, u8tmp2;
252 	u8 buf[2];
253 	u16 u16tmp, divide_ratio;
254 	u32 tuner_frequency, target_mclk, ts_clk;
255 	s32 s32tmp;
256 	dev_dbg(&priv->i2c->dev,
257 			"%s: delivery_system=%d modulation=%d frequency=%d symbol_rate=%d inversion=%d pilot=%d rolloff=%d\n",
258 			__func__, c->delivery_system,
259 			c->modulation, c->frequency, c->symbol_rate,
260 			c->inversion, c->pilot, c->rolloff);
261 
262 	if (!priv->warm) {
263 		ret = -EAGAIN;
264 		goto err;
265 	}
266 
267 	/* program tuner */
268 	if (fe->ops.tuner_ops.set_params) {
269 		ret = fe->ops.tuner_ops.set_params(fe);
270 		if (ret)
271 			goto err;
272 	}
273 
274 	if (fe->ops.tuner_ops.get_frequency) {
275 		ret = fe->ops.tuner_ops.get_frequency(fe, &tuner_frequency);
276 		if (ret)
277 			goto err;
278 	}
279 
280 	/* reset */
281 	ret = m88ds3103_wr_reg(priv, 0x07, 0x80);
282 	if (ret)
283 		goto err;
284 
285 	ret = m88ds3103_wr_reg(priv, 0x07, 0x00);
286 	if (ret)
287 		goto err;
288 
289 	ret = m88ds3103_wr_reg(priv, 0xb2, 0x01);
290 	if (ret)
291 		goto err;
292 
293 	ret = m88ds3103_wr_reg(priv, 0x00, 0x01);
294 	if (ret)
295 		goto err;
296 
297 	switch (c->delivery_system) {
298 	case SYS_DVBS:
299 		len = ARRAY_SIZE(m88ds3103_dvbs_init_reg_vals);
300 		init = m88ds3103_dvbs_init_reg_vals;
301 		target_mclk = 96000;
302 		break;
303 	case SYS_DVBS2:
304 		len = ARRAY_SIZE(m88ds3103_dvbs2_init_reg_vals);
305 		init = m88ds3103_dvbs2_init_reg_vals;
306 
307 		switch (priv->cfg->ts_mode) {
308 		case M88DS3103_TS_SERIAL:
309 		case M88DS3103_TS_SERIAL_D7:
310 			if (c->symbol_rate < 18000000)
311 				target_mclk = 96000;
312 			else
313 				target_mclk = 144000;
314 			break;
315 		case M88DS3103_TS_PARALLEL:
316 		case M88DS3103_TS_PARALLEL_12:
317 		case M88DS3103_TS_PARALLEL_16:
318 		case M88DS3103_TS_PARALLEL_19_2:
319 		case M88DS3103_TS_CI:
320 			if (c->symbol_rate < 18000000)
321 				target_mclk = 96000;
322 			else if (c->symbol_rate < 28000000)
323 				target_mclk = 144000;
324 			else
325 				target_mclk = 192000;
326 			break;
327 		default:
328 			dev_dbg(&priv->i2c->dev, "%s: invalid ts_mode\n",
329 					__func__);
330 			ret = -EINVAL;
331 			goto err;
332 		}
333 		break;
334 	default:
335 		dev_dbg(&priv->i2c->dev, "%s: invalid delivery_system\n",
336 				__func__);
337 		ret = -EINVAL;
338 		goto err;
339 	}
340 
341 	/* program init table */
342 	if (c->delivery_system != priv->delivery_system) {
343 		ret = m88ds3103_wr_reg_val_tab(priv, init, len);
344 		if (ret)
345 			goto err;
346 	}
347 
348 	u8tmp1 = 0; /* silence compiler warning */
349 	switch (priv->cfg->ts_mode) {
350 	case M88DS3103_TS_SERIAL:
351 		u8tmp1 = 0x00;
352 		ts_clk = 0;
353 		u8tmp = 0x46;
354 		break;
355 	case M88DS3103_TS_SERIAL_D7:
356 		u8tmp1 = 0x20;
357 		ts_clk = 0;
358 		u8tmp = 0x46;
359 		break;
360 	case M88DS3103_TS_PARALLEL:
361 		ts_clk = 24000;
362 		u8tmp = 0x42;
363 		break;
364 	case M88DS3103_TS_PARALLEL_12:
365 		ts_clk = 12000;
366 		u8tmp = 0x42;
367 		break;
368 	case M88DS3103_TS_PARALLEL_16:
369 		ts_clk = 16000;
370 		u8tmp = 0x42;
371 		break;
372 	case M88DS3103_TS_PARALLEL_19_2:
373 		ts_clk = 19200;
374 		u8tmp = 0x42;
375 		break;
376 	case M88DS3103_TS_CI:
377 		ts_clk = 6000;
378 		u8tmp = 0x43;
379 		break;
380 	default:
381 		dev_dbg(&priv->i2c->dev, "%s: invalid ts_mode\n", __func__);
382 		ret = -EINVAL;
383 		goto err;
384 	}
385 
386 	/* TS mode */
387 	ret = m88ds3103_wr_reg(priv, 0xfd, u8tmp);
388 	if (ret)
389 		goto err;
390 
391 	switch (priv->cfg->ts_mode) {
392 	case M88DS3103_TS_SERIAL:
393 	case M88DS3103_TS_SERIAL_D7:
394 		ret = m88ds3103_wr_reg_mask(priv, 0x29, u8tmp1, 0x20);
395 		if (ret)
396 			goto err;
397 	}
398 
399 	if (ts_clk) {
400 		divide_ratio = DIV_ROUND_UP(target_mclk, ts_clk);
401 		u8tmp1 = divide_ratio / 2;
402 		u8tmp2 = DIV_ROUND_UP(divide_ratio, 2);
403 	} else {
404 		divide_ratio = 0;
405 		u8tmp1 = 0;
406 		u8tmp2 = 0;
407 	}
408 
409 	dev_dbg(&priv->i2c->dev,
410 			"%s: target_mclk=%d ts_clk=%d divide_ratio=%d\n",
411 			__func__, target_mclk, ts_clk, divide_ratio);
412 
413 	u8tmp1--;
414 	u8tmp2--;
415 	/* u8tmp1[5:2] => fe[3:0], u8tmp1[1:0] => ea[7:6] */
416 	u8tmp1 &= 0x3f;
417 	/* u8tmp2[5:0] => ea[5:0] */
418 	u8tmp2 &= 0x3f;
419 
420 	ret = m88ds3103_rd_reg(priv, 0xfe, &u8tmp);
421 	if (ret)
422 		goto err;
423 
424 	u8tmp = ((u8tmp  & 0xf0) << 0) | u8tmp1 >> 2;
425 	ret = m88ds3103_wr_reg(priv, 0xfe, u8tmp);
426 	if (ret)
427 		goto err;
428 
429 	u8tmp = ((u8tmp1 & 0x03) << 6) | u8tmp2 >> 0;
430 	ret = m88ds3103_wr_reg(priv, 0xea, u8tmp);
431 	if (ret)
432 		goto err;
433 
434 	switch (target_mclk) {
435 	case 72000:
436 		u8tmp1 = 0x00; /* 0b00 */
437 		u8tmp2 = 0x03; /* 0b11 */
438 		break;
439 	case 96000:
440 		u8tmp1 = 0x02; /* 0b10 */
441 		u8tmp2 = 0x01; /* 0b01 */
442 		break;
443 	case 115200:
444 		u8tmp1 = 0x01; /* 0b01 */
445 		u8tmp2 = 0x01; /* 0b01 */
446 		break;
447 	case 144000:
448 		u8tmp1 = 0x00; /* 0b00 */
449 		u8tmp2 = 0x01; /* 0b01 */
450 		break;
451 	case 192000:
452 		u8tmp1 = 0x03; /* 0b11 */
453 		u8tmp2 = 0x00; /* 0b00 */
454 		break;
455 	default:
456 		dev_dbg(&priv->i2c->dev, "%s: invalid target_mclk\n", __func__);
457 		ret = -EINVAL;
458 		goto err;
459 	}
460 
461 	ret = m88ds3103_wr_reg_mask(priv, 0x22, u8tmp1 << 6, 0xc0);
462 	if (ret)
463 		goto err;
464 
465 	ret = m88ds3103_wr_reg_mask(priv, 0x24, u8tmp2 << 6, 0xc0);
466 	if (ret)
467 		goto err;
468 
469 	if (c->symbol_rate <= 3000000)
470 		u8tmp = 0x20;
471 	else if (c->symbol_rate <= 10000000)
472 		u8tmp = 0x10;
473 	else
474 		u8tmp = 0x06;
475 
476 	ret = m88ds3103_wr_reg(priv, 0xc3, 0x08);
477 	if (ret)
478 		goto err;
479 
480 	ret = m88ds3103_wr_reg(priv, 0xc8, u8tmp);
481 	if (ret)
482 		goto err;
483 
484 	ret = m88ds3103_wr_reg(priv, 0xc4, 0x08);
485 	if (ret)
486 		goto err;
487 
488 	ret = m88ds3103_wr_reg(priv, 0xc7, 0x00);
489 	if (ret)
490 		goto err;
491 
492 	u16tmp = DIV_ROUND_CLOSEST((c->symbol_rate / 1000) << 15, M88DS3103_MCLK_KHZ / 2);
493 	buf[0] = (u16tmp >> 0) & 0xff;
494 	buf[1] = (u16tmp >> 8) & 0xff;
495 	ret = m88ds3103_wr_regs(priv, 0x61, buf, 2);
496 	if (ret)
497 		goto err;
498 
499 	ret = m88ds3103_wr_reg_mask(priv, 0x4d, priv->cfg->spec_inv << 1, 0x02);
500 	if (ret)
501 		goto err;
502 
503 	ret = m88ds3103_wr_reg_mask(priv, 0x30, priv->cfg->agc_inv << 4, 0x10);
504 	if (ret)
505 		goto err;
506 
507 	ret = m88ds3103_wr_reg(priv, 0x33, priv->cfg->agc);
508 	if (ret)
509 		goto err;
510 
511 	dev_dbg(&priv->i2c->dev, "%s: carrier offset=%d\n", __func__,
512 			(tuner_frequency - c->frequency));
513 
514 	s32tmp = 0x10000 * (tuner_frequency - c->frequency);
515 	s32tmp = DIV_ROUND_CLOSEST(s32tmp, M88DS3103_MCLK_KHZ);
516 	if (s32tmp < 0)
517 		s32tmp += 0x10000;
518 
519 	buf[0] = (s32tmp >> 0) & 0xff;
520 	buf[1] = (s32tmp >> 8) & 0xff;
521 	ret = m88ds3103_wr_regs(priv, 0x5e, buf, 2);
522 	if (ret)
523 		goto err;
524 
525 	ret = m88ds3103_wr_reg(priv, 0x00, 0x00);
526 	if (ret)
527 		goto err;
528 
529 	ret = m88ds3103_wr_reg(priv, 0xb2, 0x00);
530 	if (ret)
531 		goto err;
532 
533 	priv->delivery_system = c->delivery_system;
534 
535 	return 0;
536 err:
537 	dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
538 	return ret;
539 }
540 
541 static int m88ds3103_init(struct dvb_frontend *fe)
542 {
543 	struct m88ds3103_priv *priv = fe->demodulator_priv;
544 	int ret, len, remaining;
545 	const struct firmware *fw = NULL;
546 	u8 *fw_file = M88DS3103_FIRMWARE;
547 	u8 u8tmp;
548 	dev_dbg(&priv->i2c->dev, "%s:\n", __func__);
549 
550 	/* set cold state by default */
551 	priv->warm = false;
552 
553 	/* wake up device from sleep */
554 	ret = m88ds3103_wr_reg_mask(priv, 0x08, 0x01, 0x01);
555 	if (ret)
556 		goto err;
557 
558 	ret = m88ds3103_wr_reg_mask(priv, 0x04, 0x00, 0x01);
559 	if (ret)
560 		goto err;
561 
562 	ret = m88ds3103_wr_reg_mask(priv, 0x23, 0x00, 0x10);
563 	if (ret)
564 		goto err;
565 
566 	/* reset */
567 	ret = m88ds3103_wr_reg(priv, 0x07, 0x60);
568 	if (ret)
569 		goto err;
570 
571 	ret = m88ds3103_wr_reg(priv, 0x07, 0x00);
572 	if (ret)
573 		goto err;
574 
575 	/* firmware status */
576 	ret = m88ds3103_rd_reg(priv, 0xb9, &u8tmp);
577 	if (ret)
578 		goto err;
579 
580 	dev_dbg(&priv->i2c->dev, "%s: firmware=%02x\n", __func__, u8tmp);
581 
582 	if (u8tmp)
583 		goto skip_fw_download;
584 
585 	/* cold state - try to download firmware */
586 	dev_info(&priv->i2c->dev, "%s: found a '%s' in cold state\n",
587 			KBUILD_MODNAME, m88ds3103_ops.info.name);
588 
589 	/* request the firmware, this will block and timeout */
590 	ret = request_firmware(&fw, fw_file, priv->i2c->dev.parent);
591 	if (ret) {
592 		dev_err(&priv->i2c->dev, "%s: firmare file '%s' not found\n",
593 				KBUILD_MODNAME, fw_file);
594 		goto err;
595 	}
596 
597 	dev_info(&priv->i2c->dev, "%s: downloading firmware from file '%s'\n",
598 			KBUILD_MODNAME, fw_file);
599 
600 	ret = m88ds3103_wr_reg(priv, 0xb2, 0x01);
601 	if (ret)
602 		goto err;
603 
604 	for (remaining = fw->size; remaining > 0;
605 			remaining -= (priv->cfg->i2c_wr_max - 1)) {
606 		len = remaining;
607 		if (len > (priv->cfg->i2c_wr_max - 1))
608 			len = (priv->cfg->i2c_wr_max - 1);
609 
610 		ret = m88ds3103_wr_regs(priv, 0xb0,
611 				&fw->data[fw->size - remaining], len);
612 		if (ret) {
613 			dev_err(&priv->i2c->dev,
614 					"%s: firmware download failed=%d\n",
615 					KBUILD_MODNAME, ret);
616 			goto err;
617 		}
618 	}
619 
620 	ret = m88ds3103_wr_reg(priv, 0xb2, 0x00);
621 	if (ret)
622 		goto err;
623 
624 	release_firmware(fw);
625 	fw = NULL;
626 
627 	ret = m88ds3103_rd_reg(priv, 0xb9, &u8tmp);
628 	if (ret)
629 		goto err;
630 
631 	if (!u8tmp) {
632 		dev_info(&priv->i2c->dev, "%s: firmware did not run\n",
633 				KBUILD_MODNAME);
634 		ret = -EFAULT;
635 		goto err;
636 	}
637 
638 	dev_info(&priv->i2c->dev, "%s: found a '%s' in warm state\n",
639 			KBUILD_MODNAME, m88ds3103_ops.info.name);
640 	dev_info(&priv->i2c->dev, "%s: firmware version %X.%X\n",
641 			KBUILD_MODNAME, (u8tmp >> 4) & 0xf, (u8tmp >> 0 & 0xf));
642 
643 skip_fw_download:
644 	/* warm state */
645 	priv->warm = true;
646 
647 	return 0;
648 err:
649 	if (fw)
650 		release_firmware(fw);
651 
652 	dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
653 	return ret;
654 }
655 
656 static int m88ds3103_sleep(struct dvb_frontend *fe)
657 {
658 	struct m88ds3103_priv *priv = fe->demodulator_priv;
659 	int ret;
660 	dev_dbg(&priv->i2c->dev, "%s:\n", __func__);
661 
662 	priv->delivery_system = SYS_UNDEFINED;
663 
664 	/* TS Hi-Z */
665 	ret = m88ds3103_wr_reg_mask(priv, 0x27, 0x00, 0x01);
666 	if (ret)
667 		goto err;
668 
669 	/* sleep */
670 	ret = m88ds3103_wr_reg_mask(priv, 0x08, 0x00, 0x01);
671 	if (ret)
672 		goto err;
673 
674 	ret = m88ds3103_wr_reg_mask(priv, 0x04, 0x01, 0x01);
675 	if (ret)
676 		goto err;
677 
678 	ret = m88ds3103_wr_reg_mask(priv, 0x23, 0x10, 0x10);
679 	if (ret)
680 		goto err;
681 
682 	return 0;
683 err:
684 	dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
685 	return ret;
686 }
687 
688 static int m88ds3103_get_frontend(struct dvb_frontend *fe)
689 {
690 	struct m88ds3103_priv *priv = fe->demodulator_priv;
691 	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
692 	int ret;
693 	u8 buf[3];
694 	dev_dbg(&priv->i2c->dev, "%s:\n", __func__);
695 
696 	if (!priv->warm || !(priv->fe_status & FE_HAS_LOCK)) {
697 		ret = -EAGAIN;
698 		goto err;
699 	}
700 
701 	switch (c->delivery_system) {
702 	case SYS_DVBS:
703 		ret = m88ds3103_rd_reg(priv, 0xe0, &buf[0]);
704 		if (ret)
705 			goto err;
706 
707 		ret = m88ds3103_rd_reg(priv, 0xe6, &buf[1]);
708 		if (ret)
709 			goto err;
710 
711 		switch ((buf[0] >> 2) & 0x01) {
712 		case 0:
713 			c->inversion = INVERSION_OFF;
714 			break;
715 		case 1:
716 			c->inversion = INVERSION_ON;
717 			break;
718 		default:
719 			dev_dbg(&priv->i2c->dev, "%s: invalid inversion\n",
720 					__func__);
721 		}
722 
723 		switch ((buf[1] >> 5) & 0x07) {
724 		case 0:
725 			c->fec_inner = FEC_7_8;
726 			break;
727 		case 1:
728 			c->fec_inner = FEC_5_6;
729 			break;
730 		case 2:
731 			c->fec_inner = FEC_3_4;
732 			break;
733 		case 3:
734 			c->fec_inner = FEC_2_3;
735 			break;
736 		case 4:
737 			c->fec_inner = FEC_1_2;
738 			break;
739 		default:
740 			dev_dbg(&priv->i2c->dev, "%s: invalid fec_inner\n",
741 					__func__);
742 		}
743 
744 		c->modulation = QPSK;
745 
746 		break;
747 	case SYS_DVBS2:
748 		ret = m88ds3103_rd_reg(priv, 0x7e, &buf[0]);
749 		if (ret)
750 			goto err;
751 
752 		ret = m88ds3103_rd_reg(priv, 0x89, &buf[1]);
753 		if (ret)
754 			goto err;
755 
756 		ret = m88ds3103_rd_reg(priv, 0xf2, &buf[2]);
757 		if (ret)
758 			goto err;
759 
760 		switch ((buf[0] >> 0) & 0x0f) {
761 		case 2:
762 			c->fec_inner = FEC_2_5;
763 			break;
764 		case 3:
765 			c->fec_inner = FEC_1_2;
766 			break;
767 		case 4:
768 			c->fec_inner = FEC_3_5;
769 			break;
770 		case 5:
771 			c->fec_inner = FEC_2_3;
772 			break;
773 		case 6:
774 			c->fec_inner = FEC_3_4;
775 			break;
776 		case 7:
777 			c->fec_inner = FEC_4_5;
778 			break;
779 		case 8:
780 			c->fec_inner = FEC_5_6;
781 			break;
782 		case 9:
783 			c->fec_inner = FEC_8_9;
784 			break;
785 		case 10:
786 			c->fec_inner = FEC_9_10;
787 			break;
788 		default:
789 			dev_dbg(&priv->i2c->dev, "%s: invalid fec_inner\n",
790 					__func__);
791 		}
792 
793 		switch ((buf[0] >> 5) & 0x01) {
794 		case 0:
795 			c->pilot = PILOT_OFF;
796 			break;
797 		case 1:
798 			c->pilot = PILOT_ON;
799 			break;
800 		default:
801 			dev_dbg(&priv->i2c->dev, "%s: invalid pilot\n",
802 					__func__);
803 		}
804 
805 		switch ((buf[0] >> 6) & 0x07) {
806 		case 0:
807 			c->modulation = QPSK;
808 			break;
809 		case 1:
810 			c->modulation = PSK_8;
811 			break;
812 		case 2:
813 			c->modulation = APSK_16;
814 			break;
815 		case 3:
816 			c->modulation = APSK_32;
817 			break;
818 		default:
819 			dev_dbg(&priv->i2c->dev, "%s: invalid modulation\n",
820 					__func__);
821 		}
822 
823 		switch ((buf[1] >> 7) & 0x01) {
824 		case 0:
825 			c->inversion = INVERSION_OFF;
826 			break;
827 		case 1:
828 			c->inversion = INVERSION_ON;
829 			break;
830 		default:
831 			dev_dbg(&priv->i2c->dev, "%s: invalid inversion\n",
832 					__func__);
833 		}
834 
835 		switch ((buf[2] >> 0) & 0x03) {
836 		case 0:
837 			c->rolloff = ROLLOFF_35;
838 			break;
839 		case 1:
840 			c->rolloff = ROLLOFF_25;
841 			break;
842 		case 2:
843 			c->rolloff = ROLLOFF_20;
844 			break;
845 		default:
846 			dev_dbg(&priv->i2c->dev, "%s: invalid rolloff\n",
847 					__func__);
848 		}
849 		break;
850 	default:
851 		dev_dbg(&priv->i2c->dev, "%s: invalid delivery_system\n",
852 				__func__);
853 		ret = -EINVAL;
854 		goto err;
855 	}
856 
857 	ret = m88ds3103_rd_regs(priv, 0x6d, buf, 2);
858 	if (ret)
859 		goto err;
860 
861 	c->symbol_rate = 1ull * ((buf[1] << 8) | (buf[0] << 0)) *
862 			M88DS3103_MCLK_KHZ * 1000 / 0x10000;
863 
864 	return 0;
865 err:
866 	dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
867 	return ret;
868 }
869 
870 static int m88ds3103_read_snr(struct dvb_frontend *fe, u16 *snr)
871 {
872 	struct m88ds3103_priv *priv = fe->demodulator_priv;
873 	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
874 	int ret, i, tmp;
875 	u8 buf[3];
876 	u16 noise, signal;
877 	u32 noise_tot, signal_tot;
878 	dev_dbg(&priv->i2c->dev, "%s:\n", __func__);
879 	/* reports SNR in resolution of 0.1 dB */
880 
881 	/* more iterations for more accurate estimation */
882 	#define M88DS3103_SNR_ITERATIONS 3
883 
884 	switch (c->delivery_system) {
885 	case SYS_DVBS:
886 		tmp = 0;
887 
888 		for (i = 0; i < M88DS3103_SNR_ITERATIONS; i++) {
889 			ret = m88ds3103_rd_reg(priv, 0xff, &buf[0]);
890 			if (ret)
891 				goto err;
892 
893 			tmp += buf[0];
894 		}
895 
896 		/* use of one register limits max value to 15 dB */
897 		/* SNR(X) dB = 10 * ln(X) / ln(10) dB */
898 		tmp = DIV_ROUND_CLOSEST(tmp, 8 * M88DS3103_SNR_ITERATIONS);
899 		if (tmp)
900 			*snr = 100ul * intlog2(tmp) / intlog2(10);
901 		else
902 			*snr = 0;
903 		break;
904 	case SYS_DVBS2:
905 		noise_tot = 0;
906 		signal_tot = 0;
907 
908 		for (i = 0; i < M88DS3103_SNR_ITERATIONS; i++) {
909 			ret = m88ds3103_rd_regs(priv, 0x8c, buf, 3);
910 			if (ret)
911 				goto err;
912 
913 			noise = buf[1] << 6;    /* [13:6] */
914 			noise |= buf[0] & 0x3f; /*  [5:0] */
915 			noise >>= 2;
916 			signal = buf[2] * buf[2];
917 			signal >>= 1;
918 
919 			noise_tot += noise;
920 			signal_tot += signal;
921 		}
922 
923 		noise = noise_tot / M88DS3103_SNR_ITERATIONS;
924 		signal = signal_tot / M88DS3103_SNR_ITERATIONS;
925 
926 		/* SNR(X) dB = 10 * log10(X) dB */
927 		if (signal > noise) {
928 			tmp = signal / noise;
929 			*snr = 100ul * intlog10(tmp) / (1 << 24);
930 		} else
931 			*snr = 0;
932 		break;
933 	default:
934 		dev_dbg(&priv->i2c->dev, "%s: invalid delivery_system\n",
935 				__func__);
936 		ret = -EINVAL;
937 		goto err;
938 	}
939 
940 	return 0;
941 err:
942 	dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
943 	return ret;
944 }
945 
946 
947 static int m88ds3103_set_tone(struct dvb_frontend *fe,
948 	fe_sec_tone_mode_t fe_sec_tone_mode)
949 {
950 	struct m88ds3103_priv *priv = fe->demodulator_priv;
951 	int ret;
952 	u8 u8tmp, tone, reg_a1_mask;
953 	dev_dbg(&priv->i2c->dev, "%s: fe_sec_tone_mode=%d\n", __func__,
954 			fe_sec_tone_mode);
955 
956 	if (!priv->warm) {
957 		ret = -EAGAIN;
958 		goto err;
959 	}
960 
961 	switch (fe_sec_tone_mode) {
962 	case SEC_TONE_ON:
963 		tone = 0;
964 		reg_a1_mask = 0x87;
965 		break;
966 	case SEC_TONE_OFF:
967 		tone = 1;
968 		reg_a1_mask = 0x00;
969 		break;
970 	default:
971 		dev_dbg(&priv->i2c->dev, "%s: invalid fe_sec_tone_mode\n",
972 				__func__);
973 		ret = -EINVAL;
974 		goto err;
975 	}
976 
977 	u8tmp = tone << 7 | priv->cfg->envelope_mode << 5;
978 	ret = m88ds3103_wr_reg_mask(priv, 0xa2, u8tmp, 0xe0);
979 	if (ret)
980 		goto err;
981 
982 	u8tmp = 1 << 2;
983 	ret = m88ds3103_wr_reg_mask(priv, 0xa1, u8tmp, reg_a1_mask);
984 	if (ret)
985 		goto err;
986 
987 	return 0;
988 err:
989 	dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
990 	return ret;
991 }
992 
993 static int m88ds3103_diseqc_send_master_cmd(struct dvb_frontend *fe,
994 		struct dvb_diseqc_master_cmd *diseqc_cmd)
995 {
996 	struct m88ds3103_priv *priv = fe->demodulator_priv;
997 	int ret, i;
998 	u8 u8tmp;
999 	dev_dbg(&priv->i2c->dev, "%s: msg=%*ph\n", __func__,
1000 			diseqc_cmd->msg_len, diseqc_cmd->msg);
1001 
1002 	if (!priv->warm) {
1003 		ret = -EAGAIN;
1004 		goto err;
1005 	}
1006 
1007 	if (diseqc_cmd->msg_len < 3 || diseqc_cmd->msg_len > 6) {
1008 		ret = -EINVAL;
1009 		goto err;
1010 	}
1011 
1012 	u8tmp = priv->cfg->envelope_mode << 5;
1013 	ret = m88ds3103_wr_reg_mask(priv, 0xa2, u8tmp, 0xe0);
1014 	if (ret)
1015 		goto err;
1016 
1017 	ret = m88ds3103_wr_regs(priv, 0xa3, diseqc_cmd->msg,
1018 			diseqc_cmd->msg_len);
1019 	if (ret)
1020 		goto err;
1021 
1022 	ret = m88ds3103_wr_reg(priv, 0xa1,
1023 			(diseqc_cmd->msg_len - 1) << 3 | 0x07);
1024 	if (ret)
1025 		goto err;
1026 
1027 	/* DiSEqC message typical period is 54 ms */
1028 	usleep_range(40000, 60000);
1029 
1030 	/* wait DiSEqC TX ready */
1031 	for (i = 20, u8tmp = 1; i && u8tmp; i--) {
1032 		usleep_range(5000, 10000);
1033 
1034 		ret = m88ds3103_rd_reg_mask(priv, 0xa1, &u8tmp, 0x40);
1035 		if (ret)
1036 			goto err;
1037 	}
1038 
1039 	dev_dbg(&priv->i2c->dev, "%s: loop=%d\n", __func__, i);
1040 
1041 	if (i == 0) {
1042 		dev_dbg(&priv->i2c->dev, "%s: diseqc tx timeout\n", __func__);
1043 
1044 		ret = m88ds3103_wr_reg_mask(priv, 0xa1, 0x40, 0xc0);
1045 		if (ret)
1046 			goto err;
1047 	}
1048 
1049 	ret = m88ds3103_wr_reg_mask(priv, 0xa2, 0x80, 0xc0);
1050 	if (ret)
1051 		goto err;
1052 
1053 	if (i == 0) {
1054 		ret = -ETIMEDOUT;
1055 		goto err;
1056 	}
1057 
1058 	return 0;
1059 err:
1060 	dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
1061 	return ret;
1062 }
1063 
1064 static int m88ds3103_diseqc_send_burst(struct dvb_frontend *fe,
1065 	fe_sec_mini_cmd_t fe_sec_mini_cmd)
1066 {
1067 	struct m88ds3103_priv *priv = fe->demodulator_priv;
1068 	int ret, i;
1069 	u8 u8tmp, burst;
1070 	dev_dbg(&priv->i2c->dev, "%s: fe_sec_mini_cmd=%d\n", __func__,
1071 			fe_sec_mini_cmd);
1072 
1073 	if (!priv->warm) {
1074 		ret = -EAGAIN;
1075 		goto err;
1076 	}
1077 
1078 	u8tmp = priv->cfg->envelope_mode << 5;
1079 	ret = m88ds3103_wr_reg_mask(priv, 0xa2, u8tmp, 0xe0);
1080 	if (ret)
1081 		goto err;
1082 
1083 	switch (fe_sec_mini_cmd) {
1084 	case SEC_MINI_A:
1085 		burst = 0x02;
1086 		break;
1087 	case SEC_MINI_B:
1088 		burst = 0x01;
1089 		break;
1090 	default:
1091 		dev_dbg(&priv->i2c->dev, "%s: invalid fe_sec_mini_cmd\n",
1092 				__func__);
1093 		ret = -EINVAL;
1094 		goto err;
1095 	}
1096 
1097 	ret = m88ds3103_wr_reg(priv, 0xa1, burst);
1098 	if (ret)
1099 		goto err;
1100 
1101 	/* DiSEqC ToneBurst period is 12.5 ms */
1102 	usleep_range(11000, 20000);
1103 
1104 	/* wait DiSEqC TX ready */
1105 	for (i = 5, u8tmp = 1; i && u8tmp; i--) {
1106 		usleep_range(800, 2000);
1107 
1108 		ret = m88ds3103_rd_reg_mask(priv, 0xa1, &u8tmp, 0x40);
1109 		if (ret)
1110 			goto err;
1111 	}
1112 
1113 	dev_dbg(&priv->i2c->dev, "%s: loop=%d\n", __func__, i);
1114 
1115 	ret = m88ds3103_wr_reg_mask(priv, 0xa2, 0x80, 0xc0);
1116 	if (ret)
1117 		goto err;
1118 
1119 	if (i == 0) {
1120 		dev_dbg(&priv->i2c->dev, "%s: diseqc tx timeout\n", __func__);
1121 		ret = -ETIMEDOUT;
1122 		goto err;
1123 	}
1124 
1125 	return 0;
1126 err:
1127 	dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
1128 	return ret;
1129 }
1130 
1131 static int m88ds3103_get_tune_settings(struct dvb_frontend *fe,
1132 	struct dvb_frontend_tune_settings *s)
1133 {
1134 	s->min_delay_ms = 3000;
1135 
1136 	return 0;
1137 }
1138 
1139 static void m88ds3103_release(struct dvb_frontend *fe)
1140 {
1141 	struct m88ds3103_priv *priv = fe->demodulator_priv;
1142 	i2c_del_mux_adapter(priv->i2c_adapter);
1143 	kfree(priv);
1144 }
1145 
1146 static int m88ds3103_select(struct i2c_adapter *adap, void *mux_priv, u32 chan)
1147 {
1148 	struct m88ds3103_priv *priv = mux_priv;
1149 	int ret;
1150 	struct i2c_msg gate_open_msg[1] = {
1151 		{
1152 			.addr = priv->cfg->i2c_addr,
1153 			.flags = 0,
1154 			.len = 2,
1155 			.buf = "\x03\x11",
1156 		}
1157 	};
1158 
1159 	mutex_lock(&priv->i2c_mutex);
1160 
1161 	/* open tuner I2C repeater for 1 xfer, closes automatically */
1162 	ret = i2c_transfer(priv->i2c, gate_open_msg, 1);
1163 	if (ret != 1) {
1164 		dev_warn(&priv->i2c->dev, "%s: i2c wr failed=%d\n",
1165 				KBUILD_MODNAME, ret);
1166 		if (ret >= 0)
1167 			ret = -EREMOTEIO;
1168 
1169 		return ret;
1170 	}
1171 
1172 	return 0;
1173 }
1174 
1175 static int m88ds3103_deselect(struct i2c_adapter *adap, void *mux_priv,
1176 		u32 chan)
1177 {
1178 	struct m88ds3103_priv *priv = mux_priv;
1179 
1180 	mutex_unlock(&priv->i2c_mutex);
1181 
1182 	return 0;
1183 }
1184 
1185 struct dvb_frontend *m88ds3103_attach(const struct m88ds3103_config *cfg,
1186 		struct i2c_adapter *i2c, struct i2c_adapter **tuner_i2c_adapter)
1187 {
1188 	int ret;
1189 	struct m88ds3103_priv *priv;
1190 	u8 chip_id, u8tmp;
1191 
1192 	/* allocate memory for the internal priv */
1193 	priv = kzalloc(sizeof(struct m88ds3103_priv), GFP_KERNEL);
1194 	if (!priv) {
1195 		ret = -ENOMEM;
1196 		dev_err(&i2c->dev, "%s: kzalloc() failed\n", KBUILD_MODNAME);
1197 		goto err;
1198 	}
1199 
1200 	priv->cfg = cfg;
1201 	priv->i2c = i2c;
1202 	mutex_init(&priv->i2c_mutex);
1203 
1204 	ret = m88ds3103_rd_reg(priv, 0x01, &chip_id);
1205 	if (ret)
1206 		goto err;
1207 
1208 	dev_dbg(&priv->i2c->dev, "%s: chip_id=%02x\n", __func__, chip_id);
1209 
1210 	switch (chip_id) {
1211 	case 0xd0:
1212 		break;
1213 	default:
1214 		goto err;
1215 	}
1216 
1217 	switch (priv->cfg->clock_out) {
1218 	case M88DS3103_CLOCK_OUT_DISABLED:
1219 		u8tmp = 0x80;
1220 		break;
1221 	case M88DS3103_CLOCK_OUT_ENABLED:
1222 		u8tmp = 0x00;
1223 		break;
1224 	case M88DS3103_CLOCK_OUT_ENABLED_DIV2:
1225 		u8tmp = 0x10;
1226 		break;
1227 	default:
1228 		goto err;
1229 	}
1230 
1231 	ret = m88ds3103_wr_reg(priv, 0x29, u8tmp);
1232 	if (ret)
1233 		goto err;
1234 
1235 	/* sleep */
1236 	ret = m88ds3103_wr_reg_mask(priv, 0x08, 0x00, 0x01);
1237 	if (ret)
1238 		goto err;
1239 
1240 	ret = m88ds3103_wr_reg_mask(priv, 0x04, 0x01, 0x01);
1241 	if (ret)
1242 		goto err;
1243 
1244 	ret = m88ds3103_wr_reg_mask(priv, 0x23, 0x10, 0x10);
1245 	if (ret)
1246 		goto err;
1247 
1248 	/* create mux i2c adapter for tuner */
1249 	priv->i2c_adapter = i2c_add_mux_adapter(i2c, &i2c->dev, priv, 0, 0, 0,
1250 			m88ds3103_select, m88ds3103_deselect);
1251 	if (priv->i2c_adapter == NULL)
1252 		goto err;
1253 
1254 	*tuner_i2c_adapter = priv->i2c_adapter;
1255 
1256 	/* create dvb_frontend */
1257 	memcpy(&priv->fe.ops, &m88ds3103_ops, sizeof(struct dvb_frontend_ops));
1258 	priv->fe.demodulator_priv = priv;
1259 
1260 	return &priv->fe;
1261 err:
1262 	dev_dbg(&i2c->dev, "%s: failed=%d\n", __func__, ret);
1263 	kfree(priv);
1264 	return NULL;
1265 }
1266 EXPORT_SYMBOL(m88ds3103_attach);
1267 
1268 static struct dvb_frontend_ops m88ds3103_ops = {
1269 	.delsys = { SYS_DVBS, SYS_DVBS2 },
1270 	.info = {
1271 		.name = "Montage M88DS3103",
1272 		.frequency_min =  950000,
1273 		.frequency_max = 2150000,
1274 		.frequency_tolerance = 5000,
1275 		.symbol_rate_min =  1000000,
1276 		.symbol_rate_max = 45000000,
1277 		.caps = FE_CAN_INVERSION_AUTO |
1278 			FE_CAN_FEC_1_2 |
1279 			FE_CAN_FEC_2_3 |
1280 			FE_CAN_FEC_3_4 |
1281 			FE_CAN_FEC_4_5 |
1282 			FE_CAN_FEC_5_6 |
1283 			FE_CAN_FEC_6_7 |
1284 			FE_CAN_FEC_7_8 |
1285 			FE_CAN_FEC_8_9 |
1286 			FE_CAN_FEC_AUTO |
1287 			FE_CAN_QPSK |
1288 			FE_CAN_RECOVER |
1289 			FE_CAN_2G_MODULATION
1290 	},
1291 
1292 	.release = m88ds3103_release,
1293 
1294 	.get_tune_settings = m88ds3103_get_tune_settings,
1295 
1296 	.init = m88ds3103_init,
1297 	.sleep = m88ds3103_sleep,
1298 
1299 	.set_frontend = m88ds3103_set_frontend,
1300 	.get_frontend = m88ds3103_get_frontend,
1301 
1302 	.read_status = m88ds3103_read_status,
1303 	.read_snr = m88ds3103_read_snr,
1304 
1305 	.diseqc_send_master_cmd = m88ds3103_diseqc_send_master_cmd,
1306 	.diseqc_send_burst = m88ds3103_diseqc_send_burst,
1307 
1308 	.set_tone = m88ds3103_set_tone,
1309 };
1310 
1311 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1312 MODULE_DESCRIPTION("Montage M88DS3103 DVB-S/S2 demodulator driver");
1313 MODULE_LICENSE("GPL");
1314 MODULE_FIRMWARE(M88DS3103_FIRMWARE);
1315