1 /*
2 	Driver for ST STV0288 demodulator
3 	Copyright (C) 2006 Georg Acher, BayCom GmbH, acher (at) baycom (dot) de
4 		for Reel Multimedia
5 	Copyright (C) 2008 TurboSight.com, Bob Liu <bob@turbosight.com>
6 	Copyright (C) 2008 Igor M. Liplianin <liplianin@me.by>
7 		Removed stb6000 specific tuner code and revised some
8 		procedures.
9 	2010-09-01 Josef Pavlik <josef@pavlik.it>
10 		Fixed diseqc_msg, diseqc_burst and set_tone problems
11 
12 	This program is free software; you can redistribute it and/or modify
13 	it under the terms of the GNU General Public License as published by
14 	the Free Software Foundation; either version 2 of the License, or
15 	(at your option) any later version.
16 
17 	This program is distributed in the hope that it will be useful,
18 	but WITHOUT ANY WARRANTY; without even the implied warranty of
19 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 	GNU General Public License for more details.
21 
22 	You should have received a copy of the GNU General Public License
23 	along with this program; if not, write to the Free Software
24 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 
26 */
27 
28 #include <linux/init.h>
29 #include <linux/kernel.h>
30 #include <linux/module.h>
31 #include <linux/string.h>
32 #include <linux/slab.h>
33 #include <linux/jiffies.h>
34 #include <asm/div64.h>
35 
36 #include <media/dvb_frontend.h>
37 #include "stv0288.h"
38 
39 struct stv0288_state {
40 	struct i2c_adapter *i2c;
41 	const struct stv0288_config *config;
42 	struct dvb_frontend frontend;
43 
44 	u8 initialised:1;
45 	u32 tuner_frequency;
46 	u32 symbol_rate;
47 	enum fe_code_rate fec_inner;
48 	int errmode;
49 };
50 
51 #define STATUS_BER 0
52 #define STATUS_UCBLOCKS 1
53 
54 static int debug;
55 static int debug_legacy_dish_switch;
56 #define dprintk(args...) \
57 	do { \
58 		if (debug) \
59 			printk(KERN_DEBUG "stv0288: " args); \
60 	} while (0)
61 
62 
63 static int stv0288_writeregI(struct stv0288_state *state, u8 reg, u8 data)
64 {
65 	int ret;
66 	u8 buf[] = { reg, data };
67 	struct i2c_msg msg = {
68 		.addr = state->config->demod_address,
69 		.flags = 0,
70 		.buf = buf,
71 		.len = 2
72 	};
73 
74 	ret = i2c_transfer(state->i2c, &msg, 1);
75 
76 	if (ret != 1)
77 		dprintk("%s: writereg error (reg == 0x%02x, val == 0x%02x, ret == %i)\n",
78 			__func__, reg, data, ret);
79 
80 	return (ret != 1) ? -EREMOTEIO : 0;
81 }
82 
83 static int stv0288_write(struct dvb_frontend *fe, const u8 buf[], int len)
84 {
85 	struct stv0288_state *state = fe->demodulator_priv;
86 
87 	if (len != 2)
88 		return -EINVAL;
89 
90 	return stv0288_writeregI(state, buf[0], buf[1]);
91 }
92 
93 static u8 stv0288_readreg(struct stv0288_state *state, u8 reg)
94 {
95 	int ret;
96 	u8 b0[] = { reg };
97 	u8 b1[] = { 0 };
98 	struct i2c_msg msg[] = {
99 		{
100 			.addr = state->config->demod_address,
101 			.flags = 0,
102 			.buf = b0,
103 			.len = 1
104 		}, {
105 			.addr = state->config->demod_address,
106 			.flags = I2C_M_RD,
107 			.buf = b1,
108 			.len = 1
109 		}
110 	};
111 
112 	ret = i2c_transfer(state->i2c, msg, 2);
113 
114 	if (ret != 2)
115 		dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n",
116 				__func__, reg, ret);
117 
118 	return b1[0];
119 }
120 
121 static int stv0288_set_symbolrate(struct dvb_frontend *fe, u32 srate)
122 {
123 	struct stv0288_state *state = fe->demodulator_priv;
124 	unsigned int temp;
125 	unsigned char b[3];
126 
127 	if ((srate < 1000000) || (srate > 45000000))
128 		return -EINVAL;
129 
130 	stv0288_writeregI(state, 0x22, 0);
131 	stv0288_writeregI(state, 0x23, 0);
132 	stv0288_writeregI(state, 0x2b, 0xff);
133 	stv0288_writeregI(state, 0x2c, 0xf7);
134 
135 	temp = (unsigned int)srate / 1000;
136 
137 	temp = temp * 32768;
138 	temp = temp / 25;
139 	temp = temp / 125;
140 	b[0] = (unsigned char)((temp >> 12) & 0xff);
141 	b[1] = (unsigned char)((temp >> 4) & 0xff);
142 	b[2] = (unsigned char)((temp << 4) & 0xf0);
143 	stv0288_writeregI(state, 0x28, 0x80); /* SFRH */
144 	stv0288_writeregI(state, 0x29, 0); /* SFRM */
145 	stv0288_writeregI(state, 0x2a, 0); /* SFRL */
146 
147 	stv0288_writeregI(state, 0x28, b[0]);
148 	stv0288_writeregI(state, 0x29, b[1]);
149 	stv0288_writeregI(state, 0x2a, b[2]);
150 	dprintk("stv0288: stv0288_set_symbolrate\n");
151 
152 	return 0;
153 }
154 
155 static int stv0288_send_diseqc_msg(struct dvb_frontend *fe,
156 				    struct dvb_diseqc_master_cmd *m)
157 {
158 	struct stv0288_state *state = fe->demodulator_priv;
159 
160 	int i;
161 
162 	dprintk("%s\n", __func__);
163 
164 	stv0288_writeregI(state, 0x09, 0);
165 	msleep(30);
166 	stv0288_writeregI(state, 0x05, 0x12);/* modulated mode, single shot */
167 
168 	for (i = 0; i < m->msg_len; i++) {
169 		if (stv0288_writeregI(state, 0x06, m->msg[i]))
170 			return -EREMOTEIO;
171 	}
172 	msleep(m->msg_len*12);
173 	return 0;
174 }
175 
176 static int stv0288_send_diseqc_burst(struct dvb_frontend *fe,
177 				     enum fe_sec_mini_cmd burst)
178 {
179 	struct stv0288_state *state = fe->demodulator_priv;
180 
181 	dprintk("%s\n", __func__);
182 
183 	if (stv0288_writeregI(state, 0x05, 0x03))/* burst mode, single shot */
184 		return -EREMOTEIO;
185 
186 	if (stv0288_writeregI(state, 0x06, burst == SEC_MINI_A ? 0x00 : 0xff))
187 		return -EREMOTEIO;
188 
189 	msleep(15);
190 	if (stv0288_writeregI(state, 0x05, 0x12))
191 		return -EREMOTEIO;
192 
193 	return 0;
194 }
195 
196 static int stv0288_set_tone(struct dvb_frontend *fe, enum fe_sec_tone_mode tone)
197 {
198 	struct stv0288_state *state = fe->demodulator_priv;
199 
200 	switch (tone) {
201 	case SEC_TONE_ON:
202 		if (stv0288_writeregI(state, 0x05, 0x10))/* cont carrier */
203 			return -EREMOTEIO;
204 	break;
205 
206 	case SEC_TONE_OFF:
207 		if (stv0288_writeregI(state, 0x05, 0x12))/* burst mode off*/
208 			return -EREMOTEIO;
209 	break;
210 
211 	default:
212 		return -EINVAL;
213 	}
214 	return 0;
215 }
216 
217 static u8 stv0288_inittab[] = {
218 	0x01, 0x15,
219 	0x02, 0x20,
220 	0x09, 0x0,
221 	0x0a, 0x4,
222 	0x0b, 0x0,
223 	0x0c, 0x0,
224 	0x0d, 0x0,
225 	0x0e, 0xd4,
226 	0x0f, 0x30,
227 	0x11, 0x80,
228 	0x12, 0x03,
229 	0x13, 0x48,
230 	0x14, 0x84,
231 	0x15, 0x45,
232 	0x16, 0xb7,
233 	0x17, 0x9c,
234 	0x18, 0x0,
235 	0x19, 0xa6,
236 	0x1a, 0x88,
237 	0x1b, 0x8f,
238 	0x1c, 0xf0,
239 	0x20, 0x0b,
240 	0x21, 0x54,
241 	0x22, 0x0,
242 	0x23, 0x0,
243 	0x2b, 0xff,
244 	0x2c, 0xf7,
245 	0x30, 0x0,
246 	0x31, 0x1e,
247 	0x32, 0x14,
248 	0x33, 0x0f,
249 	0x34, 0x09,
250 	0x35, 0x0c,
251 	0x36, 0x05,
252 	0x37, 0x2f,
253 	0x38, 0x16,
254 	0x39, 0xbe,
255 	0x3a, 0x0,
256 	0x3b, 0x13,
257 	0x3c, 0x11,
258 	0x3d, 0x30,
259 	0x40, 0x63,
260 	0x41, 0x04,
261 	0x42, 0x20,
262 	0x43, 0x00,
263 	0x44, 0x00,
264 	0x45, 0x00,
265 	0x46, 0x00,
266 	0x47, 0x00,
267 	0x4a, 0x00,
268 	0x50, 0x10,
269 	0x51, 0x38,
270 	0x52, 0x21,
271 	0x58, 0x54,
272 	0x59, 0x86,
273 	0x5a, 0x0,
274 	0x5b, 0x9b,
275 	0x5c, 0x08,
276 	0x5d, 0x7f,
277 	0x5e, 0x0,
278 	0x5f, 0xff,
279 	0x70, 0x0,
280 	0x71, 0x0,
281 	0x72, 0x0,
282 	0x74, 0x0,
283 	0x75, 0x0,
284 	0x76, 0x0,
285 	0x81, 0x0,
286 	0x82, 0x3f,
287 	0x83, 0x3f,
288 	0x84, 0x0,
289 	0x85, 0x0,
290 	0x88, 0x0,
291 	0x89, 0x0,
292 	0x8a, 0x0,
293 	0x8b, 0x0,
294 	0x8c, 0x0,
295 	0x90, 0x0,
296 	0x91, 0x0,
297 	0x92, 0x0,
298 	0x93, 0x0,
299 	0x94, 0x1c,
300 	0x97, 0x0,
301 	0xa0, 0x48,
302 	0xa1, 0x0,
303 	0xb0, 0xb8,
304 	0xb1, 0x3a,
305 	0xb2, 0x10,
306 	0xb3, 0x82,
307 	0xb4, 0x80,
308 	0xb5, 0x82,
309 	0xb6, 0x82,
310 	0xb7, 0x82,
311 	0xb8, 0x20,
312 	0xb9, 0x0,
313 	0xf0, 0x0,
314 	0xf1, 0x0,
315 	0xf2, 0xc0,
316 	0x51, 0x36,
317 	0x52, 0x09,
318 	0x53, 0x94,
319 	0x54, 0x62,
320 	0x55, 0x29,
321 	0x56, 0x64,
322 	0x57, 0x2b,
323 	0xff, 0xff,
324 };
325 
326 static int stv0288_set_voltage(struct dvb_frontend *fe,
327 			       enum fe_sec_voltage volt)
328 {
329 	dprintk("%s: %s\n", __func__,
330 		volt == SEC_VOLTAGE_13 ? "SEC_VOLTAGE_13" :
331 		volt == SEC_VOLTAGE_18 ? "SEC_VOLTAGE_18" : "??");
332 
333 	return 0;
334 }
335 
336 static int stv0288_init(struct dvb_frontend *fe)
337 {
338 	struct stv0288_state *state = fe->demodulator_priv;
339 	int i;
340 	u8 reg;
341 	u8 val;
342 
343 	dprintk("stv0288: init chip\n");
344 	stv0288_writeregI(state, 0x41, 0x04);
345 	msleep(50);
346 
347 	/* we have default inittab */
348 	if (state->config->inittab == NULL) {
349 		for (i = 0; !(stv0288_inittab[i] == 0xff &&
350 				stv0288_inittab[i + 1] == 0xff); i += 2)
351 			stv0288_writeregI(state, stv0288_inittab[i],
352 					stv0288_inittab[i + 1]);
353 	} else {
354 		for (i = 0; ; i += 2)  {
355 			reg = state->config->inittab[i];
356 			val = state->config->inittab[i+1];
357 			if (reg == 0xff && val == 0xff)
358 				break;
359 			stv0288_writeregI(state, reg, val);
360 		}
361 	}
362 	return 0;
363 }
364 
365 static int stv0288_read_status(struct dvb_frontend *fe, enum fe_status *status)
366 {
367 	struct stv0288_state *state = fe->demodulator_priv;
368 
369 	u8 sync = stv0288_readreg(state, 0x24);
370 	if (sync == 255)
371 		sync = 0;
372 
373 	dprintk("%s : FE_READ_STATUS : VSTATUS: 0x%02x\n", __func__, sync);
374 
375 	*status = 0;
376 	if (sync & 0x80)
377 		*status |= FE_HAS_CARRIER | FE_HAS_SIGNAL;
378 	if (sync & 0x10)
379 		*status |= FE_HAS_VITERBI;
380 	if (sync & 0x08) {
381 		*status |= FE_HAS_LOCK;
382 		dprintk("stv0288 has locked\n");
383 	}
384 
385 	return 0;
386 }
387 
388 static int stv0288_read_ber(struct dvb_frontend *fe, u32 *ber)
389 {
390 	struct stv0288_state *state = fe->demodulator_priv;
391 
392 	if (state->errmode != STATUS_BER)
393 		return 0;
394 	*ber = (stv0288_readreg(state, 0x26) << 8) |
395 					stv0288_readreg(state, 0x27);
396 	dprintk("stv0288_read_ber %d\n", *ber);
397 
398 	return 0;
399 }
400 
401 
402 static int stv0288_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
403 {
404 	struct stv0288_state *state = fe->demodulator_priv;
405 
406 	s32 signal =  0xffff - ((stv0288_readreg(state, 0x10) << 8));
407 
408 
409 	signal = signal * 5 / 4;
410 	*strength = (signal > 0xffff) ? 0xffff : (signal < 0) ? 0 : signal;
411 	dprintk("stv0288_read_signal_strength %d\n", *strength);
412 
413 	return 0;
414 }
415 static int stv0288_sleep(struct dvb_frontend *fe)
416 {
417 	struct stv0288_state *state = fe->demodulator_priv;
418 
419 	stv0288_writeregI(state, 0x41, 0x84);
420 	state->initialised = 0;
421 
422 	return 0;
423 }
424 static int stv0288_read_snr(struct dvb_frontend *fe, u16 *snr)
425 {
426 	struct stv0288_state *state = fe->demodulator_priv;
427 
428 	s32 xsnr = 0xffff - ((stv0288_readreg(state, 0x2d) << 8)
429 			   | stv0288_readreg(state, 0x2e));
430 	xsnr = 3 * (xsnr - 0xa100);
431 	*snr = (xsnr > 0xffff) ? 0xffff : (xsnr < 0) ? 0 : xsnr;
432 	dprintk("stv0288_read_snr %d\n", *snr);
433 
434 	return 0;
435 }
436 
437 static int stv0288_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
438 {
439 	struct stv0288_state *state = fe->demodulator_priv;
440 
441 	if (state->errmode != STATUS_BER)
442 		return 0;
443 	*ucblocks = (stv0288_readreg(state, 0x26) << 8) |
444 					stv0288_readreg(state, 0x27);
445 	dprintk("stv0288_read_ber %d\n", *ucblocks);
446 
447 	return 0;
448 }
449 
450 static int stv0288_set_frontend(struct dvb_frontend *fe)
451 {
452 	struct stv0288_state *state = fe->demodulator_priv;
453 	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
454 
455 	char tm;
456 	unsigned char tda[3];
457 	u8 reg, time_out = 0;
458 
459 	dprintk("%s : FE_SET_FRONTEND\n", __func__);
460 
461 	if (c->delivery_system != SYS_DVBS) {
462 		dprintk("%s: unsupported delivery system selected (%d)\n",
463 			__func__, c->delivery_system);
464 		return -EOPNOTSUPP;
465 	}
466 
467 	if (state->config->set_ts_params)
468 		state->config->set_ts_params(fe, 0);
469 
470 	/* only frequency & symbol_rate are used for tuner*/
471 	if (fe->ops.tuner_ops.set_params) {
472 		fe->ops.tuner_ops.set_params(fe);
473 		if (fe->ops.i2c_gate_ctrl)
474 			fe->ops.i2c_gate_ctrl(fe, 0);
475 	}
476 
477 	udelay(10);
478 	stv0288_set_symbolrate(fe, c->symbol_rate);
479 	/* Carrier lock control register */
480 	stv0288_writeregI(state, 0x15, 0xc5);
481 
482 	tda[2] = 0x0; /* CFRL */
483 	for (tm = -9; tm < 7;) {
484 		/* Viterbi status */
485 		reg = stv0288_readreg(state, 0x24);
486 		if (reg & 0x8)
487 				break;
488 		if (reg & 0x80) {
489 			time_out++;
490 			if (time_out > 10)
491 				break;
492 			tda[2] += 40;
493 			if (tda[2] < 40)
494 				tm++;
495 		} else {
496 			tm++;
497 			tda[2] = 0;
498 			time_out = 0;
499 		}
500 		tda[1] = (unsigned char)tm;
501 		stv0288_writeregI(state, 0x2b, tda[1]);
502 		stv0288_writeregI(state, 0x2c, tda[2]);
503 		msleep(30);
504 	}
505 	state->tuner_frequency = c->frequency;
506 	state->fec_inner = FEC_AUTO;
507 	state->symbol_rate = c->symbol_rate;
508 
509 	return 0;
510 }
511 
512 static int stv0288_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
513 {
514 	struct stv0288_state *state = fe->demodulator_priv;
515 
516 	if (enable)
517 		stv0288_writeregI(state, 0x01, 0xb5);
518 	else
519 		stv0288_writeregI(state, 0x01, 0x35);
520 
521 	udelay(1);
522 
523 	return 0;
524 }
525 
526 static void stv0288_release(struct dvb_frontend *fe)
527 {
528 	struct stv0288_state *state = fe->demodulator_priv;
529 	kfree(state);
530 }
531 
532 static const struct dvb_frontend_ops stv0288_ops = {
533 	.delsys = { SYS_DVBS },
534 	.info = {
535 		.name			= "ST STV0288 DVB-S",
536 		.frequency_min_hz	=  950 * MHz,
537 		.frequency_max_hz	= 2150 * MHz,
538 		.frequency_stepsize_hz	=    1 * MHz,
539 		.symbol_rate_min	= 1000000,
540 		.symbol_rate_max	= 45000000,
541 		.symbol_rate_tolerance	= 500,	/* ppm */
542 		.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
543 		      FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
544 		      FE_CAN_QPSK |
545 		      FE_CAN_FEC_AUTO
546 	},
547 
548 	.release = stv0288_release,
549 	.init = stv0288_init,
550 	.sleep = stv0288_sleep,
551 	.write = stv0288_write,
552 	.i2c_gate_ctrl = stv0288_i2c_gate_ctrl,
553 	.read_status = stv0288_read_status,
554 	.read_ber = stv0288_read_ber,
555 	.read_signal_strength = stv0288_read_signal_strength,
556 	.read_snr = stv0288_read_snr,
557 	.read_ucblocks = stv0288_read_ucblocks,
558 	.diseqc_send_master_cmd = stv0288_send_diseqc_msg,
559 	.diseqc_send_burst = stv0288_send_diseqc_burst,
560 	.set_tone = stv0288_set_tone,
561 	.set_voltage = stv0288_set_voltage,
562 
563 	.set_frontend = stv0288_set_frontend,
564 };
565 
566 struct dvb_frontend *stv0288_attach(const struct stv0288_config *config,
567 				    struct i2c_adapter *i2c)
568 {
569 	struct stv0288_state *state = NULL;
570 	int id;
571 
572 	/* allocate memory for the internal state */
573 	state = kzalloc(sizeof(struct stv0288_state), GFP_KERNEL);
574 	if (state == NULL)
575 		goto error;
576 
577 	/* setup the state */
578 	state->config = config;
579 	state->i2c = i2c;
580 	state->initialised = 0;
581 	state->tuner_frequency = 0;
582 	state->symbol_rate = 0;
583 	state->fec_inner = 0;
584 	state->errmode = STATUS_BER;
585 
586 	stv0288_writeregI(state, 0x41, 0x04);
587 	msleep(200);
588 	id = stv0288_readreg(state, 0x00);
589 	dprintk("stv0288 id %x\n", id);
590 
591 	/* register 0x00 contains 0x11 for STV0288  */
592 	if (id != 0x11)
593 		goto error;
594 
595 	/* create dvb_frontend */
596 	memcpy(&state->frontend.ops, &stv0288_ops,
597 			sizeof(struct dvb_frontend_ops));
598 	state->frontend.demodulator_priv = state;
599 	return &state->frontend;
600 
601 error:
602 	kfree(state);
603 
604 	return NULL;
605 }
606 EXPORT_SYMBOL(stv0288_attach);
607 
608 module_param(debug_legacy_dish_switch, int, 0444);
609 MODULE_PARM_DESC(debug_legacy_dish_switch,
610 		"Enable timing analysis for Dish Network legacy switches");
611 
612 module_param(debug, int, 0644);
613 MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
614 
615 MODULE_DESCRIPTION("ST STV0288 DVB Demodulator driver");
616 MODULE_AUTHOR("Georg Acher, Bob Liu, Igor liplianin");
617 MODULE_LICENSE("GPL");
618 
619