1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 *    Support for LGDT3302 and LGDT3303 - VSB/QAM
4 *
5 *    Copyright (C) 2005 Wilson Michaels <wilsonmichaels@earthlink.net>
6 */
7
8/*
9 *                      NOTES ABOUT THIS DRIVER
10 *
11 * This Linux driver supports:
12 *   DViCO FusionHDTV 3 Gold-Q
13 *   DViCO FusionHDTV 3 Gold-T
14 *   DViCO FusionHDTV 5 Gold
15 *   DViCO FusionHDTV 5 Lite
16 *   DViCO FusionHDTV 5 USB Gold
17 *   Air2PC/AirStar 2 ATSC 3rd generation (HD5000)
18 *   pcHDTV HD5500
19 *
20 */
21
22#include <linux/kernel.h>
23#include <linux/module.h>
24#include <linux/init.h>
25#include <linux/delay.h>
26#include <linux/string.h>
27#include <linux/slab.h>
28#include <asm/byteorder.h>
29
30#include <media/dvb_frontend.h>
31#include <linux/int_log.h>
32#include "lgdt330x_priv.h"
33#include "lgdt330x.h"
34
35/* Use Equalizer Mean Squared Error instead of Phaser Tracker MSE */
36/* #define USE_EQMSE */
37
38static int debug;
39module_param(debug, int, 0644);
40MODULE_PARM_DESC(debug, "Turn on/off lgdt330x frontend debugging (default:off).");
41
42#define dprintk(state, fmt, arg...) do {				\
43	if (debug)							\
44		dev_printk(KERN_DEBUG, &state->client->dev, fmt, ##arg);\
45} while (0)
46
47struct lgdt330x_state {
48	struct i2c_client *client;
49
50	/* Configuration settings */
51	struct lgdt330x_config config;
52
53	struct dvb_frontend frontend;
54
55	/* Demodulator private data */
56	enum fe_modulation current_modulation;
57	u32 snr;	/* Result of last SNR calculation */
58	u16 ucblocks;
59	unsigned long last_stats_time;
60
61	/* Tuner private data */
62	u32 current_frequency;
63};
64
65static int i2c_write_demod_bytes(struct lgdt330x_state *state,
66				 const u8 *buf, /* data bytes to send */
67				 int len  /* number of bytes to send */)
68{
69	int i;
70	int err;
71
72	for (i = 0; i < len - 1; i += 2) {
73		err = i2c_master_send(state->client, buf, 2);
74		if (err != 2) {
75			dev_warn(&state->client->dev,
76				 "%s: error (addr %02x <- %02x, err = %i)\n",
77				__func__, buf[0], buf[1], err);
78			if (err < 0)
79				return err;
80			else
81				return -EREMOTEIO;
82		}
83		buf += 2;
84	}
85	return 0;
86}
87
88/*
89 * This routine writes the register (reg) to the demod bus
90 * then reads the data returned for (len) bytes.
91 */
92static int i2c_read_demod_bytes(struct lgdt330x_state *state,
93				enum I2C_REG reg, u8 *buf, int len)
94{
95	u8 wr[] = { reg };
96	struct i2c_msg msg[] = {
97		{
98			.addr = state->client->addr,
99			.flags = 0,
100			.buf = wr,
101			.len = 1
102		}, {
103			.addr = state->client->addr,
104			.flags = I2C_M_RD,
105			.buf = buf,
106			.len = len
107		},
108	};
109	int ret;
110
111	ret = i2c_transfer(state->client->adapter, msg, 2);
112	if (ret != 2) {
113		dev_warn(&state->client->dev,
114			 "%s: addr 0x%02x select 0x%02x error (ret == %i)\n",
115			 __func__, state->client->addr, reg, ret);
116		if (ret >= 0)
117			ret = -EIO;
118	} else {
119		ret = 0;
120	}
121	return ret;
122}
123
124/* Software reset */
125static int lgdt3302_sw_reset(struct lgdt330x_state *state)
126{
127	u8 ret;
128	u8 reset[] = {
129		IRQ_MASK,
130		/*
131		 * bit 6 is active low software reset
132		 * bits 5-0 are 1 to mask interrupts
133		 */
134		0x00
135	};
136
137	ret = i2c_write_demod_bytes(state,
138				    reset, sizeof(reset));
139	if (ret == 0) {
140		/* force reset high (inactive) and unmask interrupts */
141		reset[1] = 0x7f;
142		ret = i2c_write_demod_bytes(state,
143					    reset, sizeof(reset));
144	}
145	return ret;
146}
147
148static int lgdt3303_sw_reset(struct lgdt330x_state *state)
149{
150	u8 ret;
151	u8 reset[] = {
152		0x02,
153		0x00 /* bit 0 is active low software reset */
154	};
155
156	ret = i2c_write_demod_bytes(state,
157				    reset, sizeof(reset));
158	if (ret == 0) {
159		/* force reset high (inactive) */
160		reset[1] = 0x01;
161		ret = i2c_write_demod_bytes(state,
162					    reset, sizeof(reset));
163	}
164	return ret;
165}
166
167static int lgdt330x_sw_reset(struct lgdt330x_state *state)
168{
169	switch (state->config.demod_chip) {
170	case LGDT3302:
171		return lgdt3302_sw_reset(state);
172	case LGDT3303:
173		return lgdt3303_sw_reset(state);
174	default:
175		return -ENODEV;
176	}
177}
178
179static int lgdt330x_init(struct dvb_frontend *fe)
180{
181	struct lgdt330x_state *state = fe->demodulator_priv;
182	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
183	char  *chip_name;
184	int    err;
185	/*
186	 * Array of byte pairs <address, value>
187	 * to initialize each different chip
188	 */
189	static const u8 lgdt3302_init_data[] = {
190		/* Use 50MHz param values from spec sheet since xtal is 50 */
191		/*
192		 * Change the value of NCOCTFV[25:0] of carrier
193		 * recovery center frequency register
194		 */
195		VSB_CARRIER_FREQ0, 0x00,
196		VSB_CARRIER_FREQ1, 0x87,
197		VSB_CARRIER_FREQ2, 0x8e,
198		VSB_CARRIER_FREQ3, 0x01,
199		/*
200		 * Change the TPCLK pin polarity
201		 * data is valid on falling clock
202		 */
203		DEMUX_CONTROL, 0xfb,
204		/*
205		 * Change the value of IFBW[11:0] of
206		 * AGC IF/RF loop filter bandwidth register
207		 */
208		AGC_RF_BANDWIDTH0, 0x40,
209		AGC_RF_BANDWIDTH1, 0x93,
210		AGC_RF_BANDWIDTH2, 0x00,
211		/*
212		 * Change the value of bit 6, 'nINAGCBY' and
213		 * 'NSSEL[1:0] of ACG function control register 2
214		 */
215		AGC_FUNC_CTRL2, 0xc6,
216		/*
217		 * Change the value of bit 6 'RFFIX'
218		 * of AGC function control register 3
219		 */
220		AGC_FUNC_CTRL3, 0x40,
221		/*
222		 * Set the value of 'INLVTHD' register 0x2a/0x2c
223		 * to 0x7fe
224		 */
225		AGC_DELAY0, 0x07,
226		AGC_DELAY2, 0xfe,
227		/*
228		 * Change the value of IAGCBW[15:8]
229		 * of inner AGC loop filter bandwidth
230		 */
231		AGC_LOOP_BANDWIDTH0, 0x08,
232		AGC_LOOP_BANDWIDTH1, 0x9a
233	};
234	static const u8 lgdt3303_init_data[] = {
235		0x4c, 0x14
236	};
237	static const u8 flip_1_lgdt3303_init_data[] = {
238		0x4c, 0x14,
239		0x87, 0xf3
240	};
241	static const u8 flip_2_lgdt3303_init_data[] = {
242		0x4c, 0x14,
243		0x87, 0xda
244	};
245
246	/*
247	 * Hardware reset is done using gpio[0] of cx23880x chip.
248	 * I'd like to do it here, but don't know how to find chip address.
249	 * cx88-cards.c arranges for the reset bit to be inactive (high).
250	 * Maybe there needs to be a callable function in cx88-core or
251	 * the caller of this function needs to do it.
252	 */
253
254	switch (state->config.demod_chip) {
255	case LGDT3302:
256		chip_name = "LGDT3302";
257		err = i2c_write_demod_bytes(state, lgdt3302_init_data,
258					    sizeof(lgdt3302_init_data));
259		break;
260	case LGDT3303:
261		chip_name = "LGDT3303";
262		switch (state->config.clock_polarity_flip) {
263		case 2:
264			err = i2c_write_demod_bytes(state,
265						    flip_2_lgdt3303_init_data,
266						    sizeof(flip_2_lgdt3303_init_data));
267			break;
268		case 1:
269			err = i2c_write_demod_bytes(state,
270						    flip_1_lgdt3303_init_data,
271						    sizeof(flip_1_lgdt3303_init_data));
272			break;
273		case 0:
274		default:
275			err = i2c_write_demod_bytes(state, lgdt3303_init_data,
276						    sizeof(lgdt3303_init_data));
277		}
278		break;
279	default:
280		chip_name = "undefined";
281		dev_warn(&state->client->dev,
282			 "Only LGDT3302 and LGDT3303 are supported chips.\n");
283		err = -ENODEV;
284	}
285	dprintk(state, "Initialized the %s chip\n", chip_name);
286	if (err < 0)
287		return err;
288
289	p->cnr.len = 1;
290	p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
291	p->block_error.len = 1;
292	p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
293	p->block_count.len = 1;
294	p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
295	state->last_stats_time = 0;
296
297	return lgdt330x_sw_reset(state);
298}
299
300static int lgdt330x_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
301{
302	struct lgdt330x_state *state = fe->demodulator_priv;
303
304	*ucblocks = state->ucblocks;
305
306	return 0;
307}
308
309static int lgdt330x_set_parameters(struct dvb_frontend *fe)
310{
311	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
312	struct lgdt330x_state *state = fe->demodulator_priv;
313	/*
314	 * Array of byte pairs <address, value>
315	 * to initialize 8VSB for lgdt3303 chip 50 MHz IF
316	 */
317	static const u8 lgdt3303_8vsb_44_data[] = {
318		0x04, 0x00,
319		0x0d, 0x40,
320		0x0e, 0x87,
321		0x0f, 0x8e,
322		0x10, 0x01,
323		0x47, 0x8b
324	};
325	/*
326	 * Array of byte pairs <address, value>
327	 * to initialize QAM for lgdt3303 chip
328	 */
329	static const u8 lgdt3303_qam_data[] = {
330		0x04, 0x00,
331		0x0d, 0x00,
332		0x0e, 0x00,
333		0x0f, 0x00,
334		0x10, 0x00,
335		0x51, 0x63,
336		0x47, 0x66,
337		0x48, 0x66,
338		0x4d, 0x1a,
339		0x49, 0x08,
340		0x4a, 0x9b
341	};
342	u8 top_ctrl_cfg[]   = { TOP_CONTROL, 0x03 };
343
344	int err = 0;
345	/* Change only if we are actually changing the modulation */
346	if (state->current_modulation != p->modulation) {
347		switch (p->modulation) {
348		case VSB_8:
349			dprintk(state, "VSB_8 MODE\n");
350
351			/* Select VSB mode */
352			top_ctrl_cfg[1] = 0x03;
353
354			/* Select ANT connector if supported by card */
355			if (state->config.pll_rf_set)
356				state->config.pll_rf_set(fe, 1);
357
358			if (state->config.demod_chip == LGDT3303) {
359				err = i2c_write_demod_bytes(state,
360							    lgdt3303_8vsb_44_data,
361							    sizeof(lgdt3303_8vsb_44_data));
362			}
363			break;
364
365		case QAM_64:
366			dprintk(state, "QAM_64 MODE\n");
367
368			/* Select QAM_64 mode */
369			top_ctrl_cfg[1] = 0x00;
370
371			/* Select CABLE connector if supported by card */
372			if (state->config.pll_rf_set)
373				state->config.pll_rf_set(fe, 0);
374
375			if (state->config.demod_chip == LGDT3303) {
376				err = i2c_write_demod_bytes(state,
377							    lgdt3303_qam_data,
378							    sizeof(lgdt3303_qam_data));
379			}
380			break;
381
382		case QAM_256:
383			dprintk(state, "QAM_256 MODE\n");
384
385			/* Select QAM_256 mode */
386			top_ctrl_cfg[1] = 0x01;
387
388			/* Select CABLE connector if supported by card */
389			if (state->config.pll_rf_set)
390				state->config.pll_rf_set(fe, 0);
391
392			if (state->config.demod_chip == LGDT3303) {
393				err = i2c_write_demod_bytes(state,
394							    lgdt3303_qam_data,
395							    sizeof(lgdt3303_qam_data));
396			}
397			break;
398		default:
399			dev_warn(&state->client->dev,
400				 "%s: Modulation type(%d) UNSUPPORTED\n",
401				 __func__, p->modulation);
402			return -1;
403		}
404		if (err < 0)
405			dev_warn(&state->client->dev,
406				 "%s: error blasting bytes to lgdt3303 for modulation type(%d)\n",
407				 __func__, p->modulation);
408
409		/*
410		 * select serial or parallel MPEG hardware interface
411		 * Serial:   0x04 for LGDT3302 or 0x40 for LGDT3303
412		 * Parallel: 0x00
413		 */
414		top_ctrl_cfg[1] |= state->config.serial_mpeg;
415
416		/* Select the requested mode */
417		i2c_write_demod_bytes(state, top_ctrl_cfg,
418				      sizeof(top_ctrl_cfg));
419		if (state->config.set_ts_params)
420			state->config.set_ts_params(fe, 0);
421		state->current_modulation = p->modulation;
422	}
423
424	/* Tune to the specified frequency */
425	if (fe->ops.tuner_ops.set_params) {
426		fe->ops.tuner_ops.set_params(fe);
427		if (fe->ops.i2c_gate_ctrl)
428			fe->ops.i2c_gate_ctrl(fe, 0);
429	}
430
431	/* Keep track of the new frequency */
432	/*
433	 * FIXME this is the wrong way to do this...
434	 * The tuner is shared with the video4linux analog API
435	 */
436	state->current_frequency = p->frequency;
437
438	lgdt330x_sw_reset(state);
439	return 0;
440}
441
442static int lgdt330x_get_frontend(struct dvb_frontend *fe,
443				 struct dtv_frontend_properties *p)
444{
445	struct lgdt330x_state *state = fe->demodulator_priv;
446
447	p->frequency = state->current_frequency;
448	return 0;
449}
450
451/*
452 * Calculate SNR estimation (scaled by 2^24)
453 *
454 * 8-VSB SNR equations from LGDT3302 and LGDT3303 datasheets, QAM
455 * equations from LGDT3303 datasheet.  VSB is the same between the '02
456 * and '03, so maybe QAM is too?  Perhaps someone with a newer datasheet
457 * that has QAM information could verify?
458 *
459 * For 8-VSB: (two ways, take your pick)
460 * LGDT3302:
461 *   SNR_EQ = 10 * log10(25 * 24^2 / EQ_MSE)
462 * LGDT3303:
463 *   SNR_EQ = 10 * log10(25 * 32^2 / EQ_MSE)
464 * LGDT3302 & LGDT3303:
465 *   SNR_PT = 10 * log10(25 * 32^2 / PT_MSE)  (we use this one)
466 * For 64-QAM:
467 *   SNR    = 10 * log10( 688128   / MSEQAM)
468 * For 256-QAM:
469 *   SNR    = 10 * log10( 696320   / MSEQAM)
470 *
471 * We re-write the snr equation as:
472 *   SNR * 2^24 = 10*(c - intlog10(MSE))
473 * Where for 256-QAM, c = log10(696320) * 2^24, and so on.
474 */
475static u32 calculate_snr(u32 mse, u32 c)
476{
477	if (mse == 0) /* No signal */
478		return 0;
479
480	mse = intlog10(mse);
481	if (mse > c) {
482		/*
483		 * Negative SNR, which is possible, but realisticly the
484		 * demod will lose lock before the signal gets this bad.
485		 * The API only allows for unsigned values, so just return 0
486		 */
487		return 0;
488	}
489	return 10 * (c - mse);
490}
491
492static int lgdt3302_read_snr(struct dvb_frontend *fe)
493{
494	struct lgdt330x_state *state = fe->demodulator_priv;
495	u8 buf[5];	/* read data buffer */
496	u32 noise;	/* noise value */
497	u32 c;		/* per-modulation SNR calculation constant */
498
499	switch (state->current_modulation) {
500	case VSB_8:
501		i2c_read_demod_bytes(state, LGDT3302_EQPH_ERR0, buf, 5);
502#ifdef USE_EQMSE
503		/* Use Equalizer Mean-Square Error Register */
504		/* SNR for ranges from -15.61 to +41.58 */
505		noise = ((buf[0] & 7) << 16) | (buf[1] << 8) | buf[2];
506		c = 69765745; /* log10(25*24^2)*2^24 */
507#else
508		/* Use Phase Tracker Mean-Square Error Register */
509		/* SNR for ranges from -13.11 to +44.08 */
510		noise = ((buf[0] & 7 << 3) << 13) | (buf[3] << 8) | buf[4];
511		c = 73957994; /* log10(25*32^2)*2^24 */
512#endif
513		break;
514	case QAM_64:
515	case QAM_256:
516		i2c_read_demod_bytes(state, CARRIER_MSEQAM1, buf, 2);
517		noise = ((buf[0] & 3) << 8) | buf[1];
518		c = state->current_modulation == QAM_64 ? 97939837 : 98026066;
519		/* log10(688128)*2^24 and log10(696320)*2^24 */
520		break;
521	default:
522		dev_err(&state->client->dev,
523			"%s: Modulation set to unsupported value\n",
524			__func__);
525
526		state->snr = 0;
527
528		return -EREMOTEIO; /* return -EDRIVER_IS_GIBBERED; */
529	}
530
531	state->snr = calculate_snr(noise, c);
532
533	dprintk(state, "noise = 0x%08x, snr = %d.%02d dB\n", noise,
534		state->snr >> 24, (((state->snr >> 8) & 0xffff) * 100) >> 16);
535
536	return 0;
537}
538
539static int lgdt3303_read_snr(struct dvb_frontend *fe)
540{
541	struct lgdt330x_state *state = fe->demodulator_priv;
542	u8 buf[5];	/* read data buffer */
543	u32 noise;	/* noise value */
544	u32 c;		/* per-modulation SNR calculation constant */
545
546	switch (state->current_modulation) {
547	case VSB_8:
548		i2c_read_demod_bytes(state, LGDT3303_EQPH_ERR0, buf, 5);
549#ifdef USE_EQMSE
550		/* Use Equalizer Mean-Square Error Register */
551		/* SNR for ranges from -16.12 to +44.08 */
552		noise = ((buf[0] & 0x78) << 13) | (buf[1] << 8) | buf[2];
553		c = 73957994; /* log10(25*32^2)*2^24 */
554#else
555		/* Use Phase Tracker Mean-Square Error Register */
556		/* SNR for ranges from -13.11 to +44.08 */
557		noise = ((buf[0] & 7) << 16) | (buf[3] << 8) | buf[4];
558		c = 73957994; /* log10(25*32^2)*2^24 */
559#endif
560		break;
561	case QAM_64:
562	case QAM_256:
563		i2c_read_demod_bytes(state, CARRIER_MSEQAM1, buf, 2);
564		noise = (buf[0] << 8) | buf[1];
565		c = state->current_modulation == QAM_64 ? 97939837 : 98026066;
566		/* log10(688128)*2^24 and log10(696320)*2^24 */
567		break;
568	default:
569		dev_err(&state->client->dev,
570			"%s: Modulation set to unsupported value\n",
571			__func__);
572		state->snr = 0;
573		return -EREMOTEIO; /* return -EDRIVER_IS_GIBBERED; */
574	}
575
576	state->snr = calculate_snr(noise, c);
577
578	dprintk(state, "noise = 0x%08x, snr = %d.%02d dB\n", noise,
579		state->snr >> 24, (((state->snr >> 8) & 0xffff) * 100) >> 16);
580
581	return 0;
582}
583
584static int lgdt330x_read_snr(struct dvb_frontend *fe, u16 *snr)
585{
586	struct lgdt330x_state *state = fe->demodulator_priv;
587
588	*snr = (state->snr) >> 16; /* Convert from 8.24 fixed-point to 8.8 */
589
590	return 0;
591}
592
593static int lgdt330x_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
594{
595	/* Calculate Strength from SNR up to 35dB */
596	/*
597	 * Even though the SNR can go higher than 35dB, there is some comfort
598	 * factor in having a range of strong signals that can show at 100%
599	 */
600	struct lgdt330x_state *state = fe->demodulator_priv;
601	u16 snr;
602	int ret;
603
604	ret = fe->ops.read_snr(fe, &snr);
605	if (ret != 0)
606		return ret;
607	/* Rather than use the 8.8 value snr, use state->snr which is 8.24 */
608	/* scale the range 0 - 35*2^24 into 0 - 65535 */
609	if (state->snr >= 8960 * 0x10000)
610		*strength = 0xffff;
611	else
612		*strength = state->snr / 8960;
613
614	return 0;
615}
616
617
618static int lgdt3302_read_status(struct dvb_frontend *fe,
619				enum fe_status *status)
620{
621	struct lgdt330x_state *state = fe->demodulator_priv;
622	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
623	u8 buf[3];
624	int err;
625
626	*status = 0; /* Reset status result */
627
628	/* AGC status register */
629	i2c_read_demod_bytes(state, AGC_STATUS, buf, 1);
630	dprintk(state, "AGC_STATUS = 0x%02x\n", buf[0]);
631	if ((buf[0] & 0x0c) == 0x8) {
632		/*
633		 * Test signal does not exist flag
634		 * as well as the AGC lock flag.
635		 */
636		*status |= FE_HAS_SIGNAL;
637	}
638
639	/*
640	 * You must set the Mask bits to 1 in the IRQ_MASK in order
641	 * to see that status bit in the IRQ_STATUS register.
642	 * This is done in SwReset();
643	 */
644
645	/* signal status */
646	i2c_read_demod_bytes(state, TOP_CONTROL, buf, sizeof(buf));
647	dprintk(state,
648		"TOP_CONTROL = 0x%02x, IRO_MASK = 0x%02x, IRQ_STATUS = 0x%02x\n",
649		buf[0], buf[1], buf[2]);
650
651	/* sync status */
652	if ((buf[2] & 0x03) == 0x01)
653		*status |= FE_HAS_SYNC;
654
655	/* FEC error status */
656	if ((buf[2] & 0x0c) == 0x08)
657		*status |= FE_HAS_LOCK | FE_HAS_VITERBI;
658
659	/* Carrier Recovery Lock Status Register */
660	i2c_read_demod_bytes(state, CARRIER_LOCK, buf, 1);
661	dprintk(state, "CARRIER_LOCK = 0x%02x\n", buf[0]);
662	switch (state->current_modulation) {
663	case QAM_256:
664	case QAM_64:
665		/* Need to understand why there are 3 lock levels here */
666		if ((buf[0] & 0x07) == 0x07)
667			*status |= FE_HAS_CARRIER;
668		break;
669	case VSB_8:
670		if ((buf[0] & 0x80) == 0x80)
671			*status |= FE_HAS_CARRIER;
672		break;
673	default:
674		dev_warn(&state->client->dev,
675			 "%s: Modulation set to unsupported value\n",
676			 __func__);
677	}
678
679	if (!(*status & FE_HAS_LOCK)) {
680		p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
681		p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
682		p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
683		return 0;
684	}
685
686	if (state->last_stats_time &&
687	    time_is_after_jiffies(state->last_stats_time))
688		return 0;
689
690	state->last_stats_time = jiffies + msecs_to_jiffies(1000);
691
692	err = lgdt3302_read_snr(fe);
693	if (!err) {
694		p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
695		p->cnr.stat[0].svalue = (((u64)state->snr) * 1000) >> 24;
696	} else {
697		p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
698	}
699
700	err = i2c_read_demod_bytes(state, LGDT3302_PACKET_ERR_COUNTER1,
701					   buf, sizeof(buf));
702	if (!err) {
703		state->ucblocks = (buf[0] << 8) | buf[1];
704
705		dprintk(state, "UCB = 0x%02x\n", state->ucblocks);
706
707		p->block_error.stat[0].uvalue += state->ucblocks;
708		/* FIXME: what's the basis for block count */
709		p->block_count.stat[0].uvalue += 10000;
710
711		p->block_error.stat[0].scale = FE_SCALE_COUNTER;
712		p->block_count.stat[0].scale = FE_SCALE_COUNTER;
713	} else {
714		p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
715		p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
716	}
717
718	return 0;
719}
720
721static int lgdt3303_read_status(struct dvb_frontend *fe,
722				enum fe_status *status)
723{
724	struct lgdt330x_state *state = fe->demodulator_priv;
725	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
726	u8 buf[3];
727	int err;
728
729	*status = 0; /* Reset status result */
730
731	/* lgdt3303 AGC status register */
732	err = i2c_read_demod_bytes(state, 0x58, buf, 1);
733	if (err < 0)
734		return err;
735
736	dprintk(state, "AGC_STATUS = 0x%02x\n", buf[0]);
737	if ((buf[0] & 0x21) == 0x01) {
738		/*
739		 * Test input signal does not exist flag
740		 * as well as the AGC lock flag.
741		 */
742		*status |= FE_HAS_SIGNAL;
743	}
744
745	/* Carrier Recovery Lock Status Register */
746	i2c_read_demod_bytes(state, CARRIER_LOCK, buf, 1);
747	dprintk(state, "CARRIER_LOCK = 0x%02x\n", buf[0]);
748	switch (state->current_modulation) {
749	case QAM_256:
750	case QAM_64:
751		/* Need to understand why there are 3 lock levels here */
752		if ((buf[0] & 0x07) == 0x07)
753			*status |= FE_HAS_CARRIER;
754		else
755			break;
756		i2c_read_demod_bytes(state, 0x8a, buf, 1);
757		dprintk(state, "QAM LOCK = 0x%02x\n", buf[0]);
758
759		if ((buf[0] & 0x04) == 0x04)
760			*status |= FE_HAS_SYNC;
761		if ((buf[0] & 0x01) == 0x01)
762			*status |= FE_HAS_LOCK;
763		if ((buf[0] & 0x08) == 0x08)
764			*status |= FE_HAS_VITERBI;
765		break;
766	case VSB_8:
767		if ((buf[0] & 0x80) == 0x80)
768			*status |= FE_HAS_CARRIER;
769		else
770			break;
771		i2c_read_demod_bytes(state, 0x38, buf, 1);
772		dprintk(state, "8-VSB LOCK = 0x%02x\n", buf[0]);
773
774		if ((buf[0] & 0x02) == 0x00)
775			*status |= FE_HAS_SYNC;
776		if ((buf[0] & 0x01) == 0x01)
777			*status |= FE_HAS_VITERBI | FE_HAS_LOCK;
778		break;
779	default:
780		dev_warn(&state->client->dev,
781			 "%s: Modulation set to unsupported value\n",
782			 __func__);
783	}
784
785	if (!(*status & FE_HAS_LOCK)) {
786		p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
787		p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
788		p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
789		return 0;
790	}
791
792	if (state->last_stats_time &&
793	    time_is_after_jiffies(state->last_stats_time))
794		return 0;
795
796	state->last_stats_time = jiffies + msecs_to_jiffies(1000);
797
798	err = lgdt3303_read_snr(fe);
799	if (!err) {
800		p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
801		p->cnr.stat[0].svalue = (((u64)state->snr) * 1000) >> 24;
802	} else {
803		p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
804	}
805
806	err = i2c_read_demod_bytes(state, LGDT3303_PACKET_ERR_COUNTER1,
807					   buf, sizeof(buf));
808	if (!err) {
809		state->ucblocks = (buf[0] << 8) | buf[1];
810
811		dprintk(state, "UCB = 0x%02x\n", state->ucblocks);
812
813		p->block_error.stat[0].uvalue += state->ucblocks;
814		/* FIXME: what's the basis for block count */
815		p->block_count.stat[0].uvalue += 10000;
816
817		p->block_error.stat[0].scale = FE_SCALE_COUNTER;
818		p->block_count.stat[0].scale = FE_SCALE_COUNTER;
819	} else {
820		p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
821		p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
822	}
823
824	return 0;
825}
826
827static int
828lgdt330x_get_tune_settings(struct dvb_frontend *fe,
829			   struct dvb_frontend_tune_settings *fe_tune_settings)
830{
831	/* I have no idea about this - it may not be needed */
832	fe_tune_settings->min_delay_ms = 500;
833	fe_tune_settings->step_size = 0;
834	fe_tune_settings->max_drift = 0;
835	return 0;
836}
837
838static void lgdt330x_release(struct dvb_frontend *fe)
839{
840	struct lgdt330x_state *state = fe->demodulator_priv;
841	struct i2c_client *client = state->client;
842
843	dev_dbg(&client->dev, "\n");
844
845	i2c_unregister_device(client);
846}
847
848static struct dvb_frontend *lgdt330x_get_dvb_frontend(struct i2c_client *client)
849{
850	struct lgdt330x_state *state = i2c_get_clientdata(client);
851
852	dev_dbg(&client->dev, "\n");
853
854	return &state->frontend;
855}
856
857static const struct dvb_frontend_ops lgdt3302_ops;
858static const struct dvb_frontend_ops lgdt3303_ops;
859
860static int lgdt330x_probe(struct i2c_client *client)
861{
862	struct lgdt330x_state *state = NULL;
863	u8 buf[1];
864
865	/* Allocate memory for the internal state */
866	state = kzalloc(sizeof(*state), GFP_KERNEL);
867	if (!state)
868		goto error;
869
870	/* Setup the state */
871	memcpy(&state->config, client->dev.platform_data,
872	       sizeof(state->config));
873	i2c_set_clientdata(client, state);
874	state->client = client;
875
876	/* Create dvb_frontend */
877	switch (state->config.demod_chip) {
878	case LGDT3302:
879		memcpy(&state->frontend.ops, &lgdt3302_ops,
880		       sizeof(struct dvb_frontend_ops));
881		break;
882	case LGDT3303:
883		memcpy(&state->frontend.ops, &lgdt3303_ops,
884		       sizeof(struct dvb_frontend_ops));
885		break;
886	default:
887		goto error;
888	}
889	state->frontend.demodulator_priv = state;
890
891	/* Setup get frontend callback */
892	state->config.get_dvb_frontend = lgdt330x_get_dvb_frontend;
893
894	/* Verify communication with demod chip */
895	if (i2c_read_demod_bytes(state, 2, buf, 1))
896		goto error;
897
898	state->current_frequency = -1;
899	state->current_modulation = -1;
900
901	dev_info(&state->client->dev,
902		"Demod loaded for LGDT330%s chip\n",
903		state->config.demod_chip == LGDT3302 ? "2" : "3");
904
905	return 0;
906
907error:
908	kfree(state);
909	if (debug)
910		dev_printk(KERN_DEBUG, &client->dev, "Error loading lgdt330x driver\n");
911	return -ENODEV;
912}
913struct dvb_frontend *lgdt330x_attach(const struct lgdt330x_config *_config,
914				     u8 demod_address,
915				     struct i2c_adapter *i2c)
916{
917	struct i2c_client *client;
918	struct i2c_board_info board_info = {};
919	struct lgdt330x_config config = *_config;
920
921	strscpy(board_info.type, "lgdt330x", sizeof(board_info.type));
922	board_info.addr = demod_address;
923	board_info.platform_data = &config;
924	client = i2c_new_client_device(i2c, &board_info);
925	if (!i2c_client_has_driver(client))
926		return NULL;
927
928	return lgdt330x_get_dvb_frontend(client);
929}
930EXPORT_SYMBOL_GPL(lgdt330x_attach);
931
932static const struct dvb_frontend_ops lgdt3302_ops = {
933	.delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B },
934	.info = {
935		.name = "LG Electronics LGDT3302 VSB/QAM Frontend",
936		.frequency_min_hz =  54 * MHz,
937		.frequency_max_hz = 858 * MHz,
938		.frequency_stepsize_hz = 62500,
939		.symbol_rate_min    = 5056941,	/* QAM 64 */
940		.symbol_rate_max    = 10762000,	/* VSB 8  */
941		.caps = FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB
942	},
943	.init                 = lgdt330x_init,
944	.set_frontend         = lgdt330x_set_parameters,
945	.get_frontend         = lgdt330x_get_frontend,
946	.get_tune_settings    = lgdt330x_get_tune_settings,
947	.read_status          = lgdt3302_read_status,
948	.read_signal_strength = lgdt330x_read_signal_strength,
949	.read_snr             = lgdt330x_read_snr,
950	.read_ucblocks        = lgdt330x_read_ucblocks,
951	.release              = lgdt330x_release,
952};
953
954static const struct dvb_frontend_ops lgdt3303_ops = {
955	.delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B },
956	.info = {
957		.name = "LG Electronics LGDT3303 VSB/QAM Frontend",
958		.frequency_min_hz =  54 * MHz,
959		.frequency_max_hz = 858 * MHz,
960		.frequency_stepsize_hz = 62500,
961		.symbol_rate_min    = 5056941,	/* QAM 64 */
962		.symbol_rate_max    = 10762000,	/* VSB 8  */
963		.caps = FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB
964	},
965	.init                 = lgdt330x_init,
966	.set_frontend         = lgdt330x_set_parameters,
967	.get_frontend         = lgdt330x_get_frontend,
968	.get_tune_settings    = lgdt330x_get_tune_settings,
969	.read_status          = lgdt3303_read_status,
970	.read_signal_strength = lgdt330x_read_signal_strength,
971	.read_snr             = lgdt330x_read_snr,
972	.read_ucblocks        = lgdt330x_read_ucblocks,
973	.release              = lgdt330x_release,
974};
975
976static void lgdt330x_remove(struct i2c_client *client)
977{
978	struct lgdt330x_state *state = i2c_get_clientdata(client);
979
980	dev_dbg(&client->dev, "\n");
981
982	kfree(state);
983}
984
985static const struct i2c_device_id lgdt330x_id_table[] = {
986	{"lgdt330x", 0},
987	{}
988};
989MODULE_DEVICE_TABLE(i2c, lgdt330x_id_table);
990
991static struct i2c_driver lgdt330x_driver = {
992	.driver = {
993		.name	= "lgdt330x",
994		.suppress_bind_attrs = true,
995	},
996	.probe		= lgdt330x_probe,
997	.remove		= lgdt330x_remove,
998	.id_table	= lgdt330x_id_table,
999};
1000
1001module_i2c_driver(lgdt330x_driver);
1002
1003
1004MODULE_DESCRIPTION("LGDT330X (ATSC 8VSB & ITU-T J.83 AnnexB 64/256 QAM) Demodulator Driver");
1005MODULE_AUTHOR("Wilson Michaels");
1006MODULE_LICENSE("GPL");
1007