1/*
2    driver for LSI L64781 COFDM demodulator
3
4    Copyright (C) 2001 Holger Waechtler for Convergence Integrated Media GmbH
5		       Marko Kohtala <marko.kohtala@luukku.com>
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20
21*/
22
23#include <linux/init.h>
24#include <linux/kernel.h>
25#include <linux/module.h>
26#include <linux/string.h>
27#include <linux/slab.h>
28#include "dvb_frontend.h"
29#include "l64781.h"
30
31
32struct l64781_state {
33	struct i2c_adapter* i2c;
34	const struct l64781_config* config;
35	struct dvb_frontend frontend;
36
37	/* private demodulator data */
38	unsigned int first:1;
39};
40
41#define dprintk(args...) \
42	do { \
43		if (debug) printk(KERN_DEBUG "l64781: " args); \
44	} while (0)
45
46static int debug;
47
48module_param(debug, int, 0644);
49MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
50
51
52static int l64781_writereg (struct l64781_state* state, u8 reg, u8 data)
53{
54	int ret;
55	u8 buf [] = { reg, data };
56	struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0, .buf = buf, .len = 2 };
57
58	if ((ret = i2c_transfer(state->i2c, &msg, 1)) != 1)
59		dprintk ("%s: write_reg error (reg == %02x) = %02x!\n",
60			 __func__, reg, ret);
61
62	return (ret != 1) ? -1 : 0;
63}
64
65static int l64781_readreg (struct l64781_state* state, u8 reg)
66{
67	int ret;
68	u8 b0 [] = { reg };
69	u8 b1 [] = { 0 };
70	struct i2c_msg msg [] = { { .addr = state->config->demod_address, .flags = 0, .buf = b0, .len = 1 },
71			   { .addr = state->config->demod_address, .flags = I2C_M_RD, .buf = b1, .len = 1 } };
72
73	ret = i2c_transfer(state->i2c, msg, 2);
74
75	if (ret != 2) return ret;
76
77	return b1[0];
78}
79
80static void apply_tps (struct l64781_state* state)
81{
82	l64781_writereg (state, 0x2a, 0x00);
83	l64781_writereg (state, 0x2a, 0x01);
84
85	/* This here is a little bit questionable because it enables
86	   the automatic update of TPS registers. I think we'd need to
87	   handle the IRQ from FE to update some other registers as
88	   well, or at least implement some magic to tuning to correct
89	   to the TPS received from transmission. */
90	l64781_writereg (state, 0x2a, 0x02);
91}
92
93
94static void reset_afc (struct l64781_state* state)
95{
96	/* Set AFC stall for the AFC_INIT_FRQ setting, TIM_STALL for
97	   timing offset */
98	l64781_writereg (state, 0x07, 0x9e); /* stall AFC */
99	l64781_writereg (state, 0x08, 0);    /* AFC INIT FREQ */
100	l64781_writereg (state, 0x09, 0);
101	l64781_writereg (state, 0x0a, 0);
102	l64781_writereg (state, 0x07, 0x8e);
103	l64781_writereg (state, 0x0e, 0);    /* AGC gain to zero in beginning */
104	l64781_writereg (state, 0x11, 0x80); /* stall TIM */
105	l64781_writereg (state, 0x10, 0);    /* TIM_OFFSET_LSB */
106	l64781_writereg (state, 0x12, 0);
107	l64781_writereg (state, 0x13, 0);
108	l64781_writereg (state, 0x11, 0x00);
109}
110
111static int reset_and_configure (struct l64781_state* state)
112{
113	u8 buf [] = { 0x06 };
114	struct i2c_msg msg = { .addr = 0x00, .flags = 0, .buf = buf, .len = 1 };
115	// NOTE: this is correct in writing to address 0x00
116
117	return (i2c_transfer(state->i2c, &msg, 1) == 1) ? 0 : -ENODEV;
118}
119
120static int apply_frontend_param(struct dvb_frontend *fe)
121{
122	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
123	struct l64781_state* state = fe->demodulator_priv;
124	/* The coderates for FEC_NONE, FEC_4_5 and FEC_FEC_6_7 are arbitrary */
125	static const u8 fec_tab[] = { 7, 0, 1, 2, 9, 3, 10, 4 };
126	/* QPSK, QAM_16, QAM_64 */
127	static const u8 qam_tab [] = { 2, 4, 0, 6 };
128	static const u8 guard_tab [] = { 1, 2, 4, 8 };
129	/* The Grundig 29504-401.04 Tuner comes with 18.432MHz crystal. */
130	static const u32 ppm = 8000;
131	u32 ddfs_offset_fixed;
132/*	u32 ddfs_offset_variable = 0x6000-((1000000UL+ppm)/ */
133/*			bw_tab[p->bandWidth]<<10)/15625; */
134	u32 init_freq;
135	u32 spi_bias;
136	u8 val0x04;
137	u8 val0x05;
138	u8 val0x06;
139	int bw;
140
141	switch (p->bandwidth_hz) {
142	case 8000000:
143		bw = 8;
144		break;
145	case 7000000:
146		bw = 7;
147		break;
148	case 6000000:
149		bw = 6;
150		break;
151	default:
152		return -EINVAL;
153	}
154
155	if (fe->ops.tuner_ops.set_params) {
156		fe->ops.tuner_ops.set_params(fe);
157		if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0);
158	}
159
160	if (p->inversion != INVERSION_ON &&
161	    p->inversion != INVERSION_OFF)
162		return -EINVAL;
163
164	if (p->code_rate_HP != FEC_1_2 && p->code_rate_HP != FEC_2_3 &&
165	    p->code_rate_HP != FEC_3_4 && p->code_rate_HP != FEC_5_6 &&
166	    p->code_rate_HP != FEC_7_8)
167		return -EINVAL;
168
169	if (p->hierarchy != HIERARCHY_NONE &&
170	    (p->code_rate_LP != FEC_1_2 && p->code_rate_LP != FEC_2_3 &&
171	     p->code_rate_LP != FEC_3_4 && p->code_rate_LP != FEC_5_6 &&
172	     p->code_rate_LP != FEC_7_8))
173		return -EINVAL;
174
175	if (p->modulation != QPSK && p->modulation != QAM_16 &&
176	    p->modulation != QAM_64)
177		return -EINVAL;
178
179	if (p->transmission_mode != TRANSMISSION_MODE_2K &&
180	    p->transmission_mode != TRANSMISSION_MODE_8K)
181		return -EINVAL;
182
183	if ((int)p->guard_interval < GUARD_INTERVAL_1_32 ||
184	    p->guard_interval > GUARD_INTERVAL_1_4)
185		return -EINVAL;
186
187	if ((int)p->hierarchy < HIERARCHY_NONE ||
188	    p->hierarchy > HIERARCHY_4)
189		return -EINVAL;
190
191	ddfs_offset_fixed = 0x4000-(ppm<<16)/bw/1000000;
192
193	/* This works up to 20000 ppm, it overflows if too large ppm! */
194	init_freq = (((8UL<<25) + (8UL<<19) / 25*ppm / (15625/25)) /
195			bw & 0xFFFFFF);
196
197	/* SPI bias calculation is slightly modified to fit in 32bit */
198	/* will work for high ppm only... */
199	spi_bias = 378 * (1 << 10);
200	spi_bias *= 16;
201	spi_bias *= bw;
202	spi_bias *= qam_tab[p->modulation];
203	spi_bias /= p->code_rate_HP + 1;
204	spi_bias /= (guard_tab[p->guard_interval] + 32);
205	spi_bias *= 1000;
206	spi_bias /= 1000 + ppm/1000;
207	spi_bias *= p->code_rate_HP;
208
209	val0x04 = (p->transmission_mode << 2) | p->guard_interval;
210	val0x05 = fec_tab[p->code_rate_HP];
211
212	if (p->hierarchy != HIERARCHY_NONE)
213		val0x05 |= (p->code_rate_LP - FEC_1_2) << 3;
214
215	val0x06 = (p->hierarchy << 2) | p->modulation;
216
217	l64781_writereg (state, 0x04, val0x04);
218	l64781_writereg (state, 0x05, val0x05);
219	l64781_writereg (state, 0x06, val0x06);
220
221	reset_afc (state);
222
223	/* Technical manual section 2.6.1, TIM_IIR_GAIN optimal values */
224	l64781_writereg (state, 0x15,
225			 p->transmission_mode == TRANSMISSION_MODE_2K ? 1 : 3);
226	l64781_writereg (state, 0x16, init_freq & 0xff);
227	l64781_writereg (state, 0x17, (init_freq >> 8) & 0xff);
228	l64781_writereg (state, 0x18, (init_freq >> 16) & 0xff);
229
230	l64781_writereg (state, 0x1b, spi_bias & 0xff);
231	l64781_writereg (state, 0x1c, (spi_bias >> 8) & 0xff);
232	l64781_writereg (state, 0x1d, ((spi_bias >> 16) & 0x7f) |
233		(p->inversion == INVERSION_ON ? 0x80 : 0x00));
234
235	l64781_writereg (state, 0x22, ddfs_offset_fixed & 0xff);
236	l64781_writereg (state, 0x23, (ddfs_offset_fixed >> 8) & 0x3f);
237
238	l64781_readreg (state, 0x00);  /*  clear interrupt registers... */
239	l64781_readreg (state, 0x01);  /*  dto. */
240
241	apply_tps (state);
242
243	return 0;
244}
245
246static int get_frontend(struct dvb_frontend *fe)
247{
248	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
249	struct l64781_state* state = fe->demodulator_priv;
250	int tmp;
251
252
253	tmp = l64781_readreg(state, 0x04);
254	switch(tmp & 3) {
255	case 0:
256		p->guard_interval = GUARD_INTERVAL_1_32;
257		break;
258	case 1:
259		p->guard_interval = GUARD_INTERVAL_1_16;
260		break;
261	case 2:
262		p->guard_interval = GUARD_INTERVAL_1_8;
263		break;
264	case 3:
265		p->guard_interval = GUARD_INTERVAL_1_4;
266		break;
267	}
268	switch((tmp >> 2) & 3) {
269	case 0:
270		p->transmission_mode = TRANSMISSION_MODE_2K;
271		break;
272	case 1:
273		p->transmission_mode = TRANSMISSION_MODE_8K;
274		break;
275	default:
276		printk(KERN_WARNING "Unexpected value for transmission_mode\n");
277	}
278
279	tmp = l64781_readreg(state, 0x05);
280	switch(tmp & 7) {
281	case 0:
282		p->code_rate_HP = FEC_1_2;
283		break;
284	case 1:
285		p->code_rate_HP = FEC_2_3;
286		break;
287	case 2:
288		p->code_rate_HP = FEC_3_4;
289		break;
290	case 3:
291		p->code_rate_HP = FEC_5_6;
292		break;
293	case 4:
294		p->code_rate_HP = FEC_7_8;
295		break;
296	default:
297		printk("Unexpected value for code_rate_HP\n");
298	}
299	switch((tmp >> 3) & 7) {
300	case 0:
301		p->code_rate_LP = FEC_1_2;
302		break;
303	case 1:
304		p->code_rate_LP = FEC_2_3;
305		break;
306	case 2:
307		p->code_rate_LP = FEC_3_4;
308		break;
309	case 3:
310		p->code_rate_LP = FEC_5_6;
311		break;
312	case 4:
313		p->code_rate_LP = FEC_7_8;
314		break;
315	default:
316		printk("Unexpected value for code_rate_LP\n");
317	}
318
319	tmp = l64781_readreg(state, 0x06);
320	switch(tmp & 3) {
321	case 0:
322		p->modulation = QPSK;
323		break;
324	case 1:
325		p->modulation = QAM_16;
326		break;
327	case 2:
328		p->modulation = QAM_64;
329		break;
330	default:
331		printk(KERN_WARNING "Unexpected value for modulation\n");
332	}
333	switch((tmp >> 2) & 7) {
334	case 0:
335		p->hierarchy = HIERARCHY_NONE;
336		break;
337	case 1:
338		p->hierarchy = HIERARCHY_1;
339		break;
340	case 2:
341		p->hierarchy = HIERARCHY_2;
342		break;
343	case 3:
344		p->hierarchy = HIERARCHY_4;
345		break;
346	default:
347		printk("Unexpected value for hierarchy\n");
348	}
349
350
351	tmp = l64781_readreg (state, 0x1d);
352	p->inversion = (tmp & 0x80) ? INVERSION_ON : INVERSION_OFF;
353
354	tmp = (int) (l64781_readreg (state, 0x08) |
355		     (l64781_readreg (state, 0x09) << 8) |
356		     (l64781_readreg (state, 0x0a) << 16));
357	p->frequency += tmp;
358
359	return 0;
360}
361
362static int l64781_read_status(struct dvb_frontend *fe, enum fe_status *status)
363{
364	struct l64781_state* state = fe->demodulator_priv;
365	int sync = l64781_readreg (state, 0x32);
366	int gain = l64781_readreg (state, 0x0e);
367
368	l64781_readreg (state, 0x00);  /*  clear interrupt registers... */
369	l64781_readreg (state, 0x01);  /*  dto. */
370
371	*status = 0;
372
373	if (gain > 5)
374		*status |= FE_HAS_SIGNAL;
375
376	if (sync & 0x02) /* VCXO locked, this criteria should be ok */
377		*status |= FE_HAS_CARRIER;
378
379	if (sync & 0x20)
380		*status |= FE_HAS_VITERBI;
381
382	if (sync & 0x40)
383		*status |= FE_HAS_SYNC;
384
385	if (sync == 0x7f)
386		*status |= FE_HAS_LOCK;
387
388	return 0;
389}
390
391static int l64781_read_ber(struct dvb_frontend* fe, u32* ber)
392{
393	struct l64781_state* state = fe->demodulator_priv;
394
395	/*   XXX FIXME: set up counting period (reg 0x26...0x28)
396	 */
397	*ber = l64781_readreg (state, 0x39)
398	    | (l64781_readreg (state, 0x3a) << 8);
399
400	return 0;
401}
402
403static int l64781_read_signal_strength(struct dvb_frontend* fe, u16* signal_strength)
404{
405	struct l64781_state* state = fe->demodulator_priv;
406
407	u8 gain = l64781_readreg (state, 0x0e);
408	*signal_strength = (gain << 8) | gain;
409
410	return 0;
411}
412
413static int l64781_read_snr(struct dvb_frontend* fe, u16* snr)
414{
415	struct l64781_state* state = fe->demodulator_priv;
416
417	u8 avg_quality = 0xff - l64781_readreg (state, 0x33);
418	*snr = (avg_quality << 8) | avg_quality; /* not exact, but...*/
419
420	return 0;
421}
422
423static int l64781_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
424{
425	struct l64781_state* state = fe->demodulator_priv;
426
427	*ucblocks = l64781_readreg (state, 0x37)
428	   | (l64781_readreg (state, 0x38) << 8);
429
430	return 0;
431}
432
433static int l64781_sleep(struct dvb_frontend* fe)
434{
435	struct l64781_state* state = fe->demodulator_priv;
436
437	/* Power down */
438	return l64781_writereg (state, 0x3e, 0x5a);
439}
440
441static int l64781_init(struct dvb_frontend* fe)
442{
443	struct l64781_state* state = fe->demodulator_priv;
444
445	reset_and_configure (state);
446
447	/* Power up */
448	l64781_writereg (state, 0x3e, 0xa5);
449
450	/* Reset hard */
451	l64781_writereg (state, 0x2a, 0x04);
452	l64781_writereg (state, 0x2a, 0x00);
453
454	/* Set tuner specific things */
455	/* AFC_POL, set also in reset_afc */
456	l64781_writereg (state, 0x07, 0x8e);
457
458	/* Use internal ADC */
459	l64781_writereg (state, 0x0b, 0x81);
460
461	/* AGC loop gain, and polarity is positive */
462	l64781_writereg (state, 0x0c, 0x84);
463
464	/* Internal ADC outputs two's complement */
465	l64781_writereg (state, 0x0d, 0x8c);
466
467	/* With ppm=8000, it seems the DTR_SENSITIVITY will result in
468	   value of 2 with all possible bandwidths and guard
469	   intervals, which is the initial value anyway. */
470	/*l64781_writereg (state, 0x19, 0x92);*/
471
472	/* Everything is two's complement, soft bit and CSI_OUT too */
473	l64781_writereg (state, 0x1e, 0x09);
474
475	/* delay a bit after first init attempt */
476	if (state->first) {
477		state->first = 0;
478		msleep(200);
479	}
480
481	return 0;
482}
483
484static int l64781_get_tune_settings(struct dvb_frontend* fe,
485				    struct dvb_frontend_tune_settings* fesettings)
486{
487	fesettings->min_delay_ms = 4000;
488	fesettings->step_size = 0;
489	fesettings->max_drift = 0;
490	return 0;
491}
492
493static void l64781_release(struct dvb_frontend* fe)
494{
495	struct l64781_state* state = fe->demodulator_priv;
496	kfree(state);
497}
498
499static struct dvb_frontend_ops l64781_ops;
500
501struct dvb_frontend* l64781_attach(const struct l64781_config* config,
502				   struct i2c_adapter* i2c)
503{
504	struct l64781_state* state = NULL;
505	int reg0x3e = -1;
506	u8 b0 [] = { 0x1a };
507	u8 b1 [] = { 0x00 };
508	struct i2c_msg msg [] = { { .addr = config->demod_address, .flags = 0, .buf = b0, .len = 1 },
509			   { .addr = config->demod_address, .flags = I2C_M_RD, .buf = b1, .len = 1 } };
510
511	/* allocate memory for the internal state */
512	state = kzalloc(sizeof(struct l64781_state), GFP_KERNEL);
513	if (state == NULL) goto error;
514
515	/* setup the state */
516	state->config = config;
517	state->i2c = i2c;
518	state->first = 1;
519
520	/**
521	 *  the L64781 won't show up before we send the reset_and_configure()
522	 *  broadcast. If nothing responds there is no L64781 on the bus...
523	 */
524	if (reset_and_configure(state) < 0) {
525		dprintk("No response to reset and configure broadcast...\n");
526		goto error;
527	}
528
529	/* The chip always responds to reads */
530	if (i2c_transfer(state->i2c, msg, 2) != 2) {
531		dprintk("No response to read on I2C bus\n");
532		goto error;
533	}
534
535	/* Save current register contents for bailout */
536	reg0x3e = l64781_readreg(state, 0x3e);
537
538	/* Reading the POWER_DOWN register always returns 0 */
539	if (reg0x3e != 0) {
540		dprintk("Device doesn't look like L64781\n");
541		goto error;
542	}
543
544	/* Turn the chip off */
545	l64781_writereg (state, 0x3e, 0x5a);
546
547	/* Responds to all reads with 0 */
548	if (l64781_readreg(state, 0x1a) != 0) {
549		dprintk("Read 1 returned unexpcted value\n");
550		goto error;
551	}
552
553	/* Turn the chip on */
554	l64781_writereg (state, 0x3e, 0xa5);
555
556	/* Responds with register default value */
557	if (l64781_readreg(state, 0x1a) != 0xa1) {
558		dprintk("Read 2 returned unexpcted value\n");
559		goto error;
560	}
561
562	/* create dvb_frontend */
563	memcpy(&state->frontend.ops, &l64781_ops, sizeof(struct dvb_frontend_ops));
564	state->frontend.demodulator_priv = state;
565	return &state->frontend;
566
567error:
568	if (reg0x3e >= 0)
569		l64781_writereg (state, 0x3e, reg0x3e);  /* restore reg 0x3e */
570	kfree(state);
571	return NULL;
572}
573
574static struct dvb_frontend_ops l64781_ops = {
575	.delsys = { SYS_DVBT },
576	.info = {
577		.name = "LSI L64781 DVB-T",
578	/*	.frequency_min = ???,*/
579	/*	.frequency_max = ???,*/
580		.frequency_stepsize = 166666,
581	/*      .frequency_tolerance = ???,*/
582	/*      .symbol_rate_tolerance = ???,*/
583		.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
584		      FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
585		      FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
586		      FE_CAN_MUTE_TS
587	},
588
589	.release = l64781_release,
590
591	.init = l64781_init,
592	.sleep = l64781_sleep,
593
594	.set_frontend = apply_frontend_param,
595	.get_frontend = get_frontend,
596	.get_tune_settings = l64781_get_tune_settings,
597
598	.read_status = l64781_read_status,
599	.read_ber = l64781_read_ber,
600	.read_signal_strength = l64781_read_signal_strength,
601	.read_snr = l64781_read_snr,
602	.read_ucblocks = l64781_read_ucblocks,
603};
604
605MODULE_DESCRIPTION("LSI L64781 DVB-T Demodulator driver");
606MODULE_AUTHOR("Holger Waechtler, Marko Kohtala");
607MODULE_LICENSE("GPL");
608
609EXPORT_SYMBOL(l64781_attach);
610