cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

lgdt330x.c (26108B)


      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 <media/dvb_math.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			  const struct i2c_device_id *id)
    862{
    863	struct lgdt330x_state *state = NULL;
    864	u8 buf[1];
    865
    866	/* Allocate memory for the internal state */
    867	state = kzalloc(sizeof(*state), GFP_KERNEL);
    868	if (!state)
    869		goto error;
    870
    871	/* Setup the state */
    872	memcpy(&state->config, client->dev.platform_data,
    873	       sizeof(state->config));
    874	i2c_set_clientdata(client, state);
    875	state->client = client;
    876
    877	/* Create dvb_frontend */
    878	switch (state->config.demod_chip) {
    879	case LGDT3302:
    880		memcpy(&state->frontend.ops, &lgdt3302_ops,
    881		       sizeof(struct dvb_frontend_ops));
    882		break;
    883	case LGDT3303:
    884		memcpy(&state->frontend.ops, &lgdt3303_ops,
    885		       sizeof(struct dvb_frontend_ops));
    886		break;
    887	default:
    888		goto error;
    889	}
    890	state->frontend.demodulator_priv = state;
    891
    892	/* Setup get frontend callback */
    893	state->config.get_dvb_frontend = lgdt330x_get_dvb_frontend;
    894
    895	/* Verify communication with demod chip */
    896	if (i2c_read_demod_bytes(state, 2, buf, 1))
    897		goto error;
    898
    899	state->current_frequency = -1;
    900	state->current_modulation = -1;
    901
    902	dev_info(&state->client->dev,
    903		"Demod loaded for LGDT330%s chip\n",
    904		state->config.demod_chip == LGDT3302 ? "2" : "3");
    905
    906	return 0;
    907
    908error:
    909	kfree(state);
    910	if (debug)
    911		dev_printk(KERN_DEBUG, &client->dev, "Error loading lgdt330x driver\n");
    912	return -ENODEV;
    913}
    914struct dvb_frontend *lgdt330x_attach(const struct lgdt330x_config *_config,
    915				     u8 demod_address,
    916				     struct i2c_adapter *i2c)
    917{
    918	struct i2c_client *client;
    919	struct i2c_board_info board_info = {};
    920	struct lgdt330x_config config = *_config;
    921
    922	strscpy(board_info.type, "lgdt330x", sizeof(board_info.type));
    923	board_info.addr = demod_address;
    924	board_info.platform_data = &config;
    925	client = i2c_new_client_device(i2c, &board_info);
    926	if (!i2c_client_has_driver(client))
    927		return NULL;
    928
    929	return lgdt330x_get_dvb_frontend(client);
    930}
    931EXPORT_SYMBOL(lgdt330x_attach);
    932
    933static const struct dvb_frontend_ops lgdt3302_ops = {
    934	.delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B },
    935	.info = {
    936		.name = "LG Electronics LGDT3302 VSB/QAM Frontend",
    937		.frequency_min_hz =  54 * MHz,
    938		.frequency_max_hz = 858 * MHz,
    939		.frequency_stepsize_hz = 62500,
    940		.symbol_rate_min    = 5056941,	/* QAM 64 */
    941		.symbol_rate_max    = 10762000,	/* VSB 8  */
    942		.caps = FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB
    943	},
    944	.init                 = lgdt330x_init,
    945	.set_frontend         = lgdt330x_set_parameters,
    946	.get_frontend         = lgdt330x_get_frontend,
    947	.get_tune_settings    = lgdt330x_get_tune_settings,
    948	.read_status          = lgdt3302_read_status,
    949	.read_signal_strength = lgdt330x_read_signal_strength,
    950	.read_snr             = lgdt330x_read_snr,
    951	.read_ucblocks        = lgdt330x_read_ucblocks,
    952	.release              = lgdt330x_release,
    953};
    954
    955static const struct dvb_frontend_ops lgdt3303_ops = {
    956	.delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B },
    957	.info = {
    958		.name = "LG Electronics LGDT3303 VSB/QAM Frontend",
    959		.frequency_min_hz =  54 * MHz,
    960		.frequency_max_hz = 858 * MHz,
    961		.frequency_stepsize_hz = 62500,
    962		.symbol_rate_min    = 5056941,	/* QAM 64 */
    963		.symbol_rate_max    = 10762000,	/* VSB 8  */
    964		.caps = FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB
    965	},
    966	.init                 = lgdt330x_init,
    967	.set_frontend         = lgdt330x_set_parameters,
    968	.get_frontend         = lgdt330x_get_frontend,
    969	.get_tune_settings    = lgdt330x_get_tune_settings,
    970	.read_status          = lgdt3303_read_status,
    971	.read_signal_strength = lgdt330x_read_signal_strength,
    972	.read_snr             = lgdt330x_read_snr,
    973	.read_ucblocks        = lgdt330x_read_ucblocks,
    974	.release              = lgdt330x_release,
    975};
    976
    977static int lgdt330x_remove(struct i2c_client *client)
    978{
    979	struct lgdt330x_state *state = i2c_get_clientdata(client);
    980
    981	dev_dbg(&client->dev, "\n");
    982
    983	kfree(state);
    984
    985	return 0;
    986}
    987
    988static const struct i2c_device_id lgdt330x_id_table[] = {
    989	{"lgdt330x", 0},
    990	{}
    991};
    992MODULE_DEVICE_TABLE(i2c, lgdt330x_id_table);
    993
    994static struct i2c_driver lgdt330x_driver = {
    995	.driver = {
    996		.name	= "lgdt330x",
    997		.suppress_bind_attrs = true,
    998	},
    999	.probe		= lgdt330x_probe,
   1000	.remove		= lgdt330x_remove,
   1001	.id_table	= lgdt330x_id_table,
   1002};
   1003
   1004module_i2c_driver(lgdt330x_driver);
   1005
   1006
   1007MODULE_DESCRIPTION("LGDT330X (ATSC 8VSB & ITU-T J.83 AnnexB 64/256 QAM) Demodulator Driver");
   1008MODULE_AUTHOR("Wilson Michaels");
   1009MODULE_LICENSE("GPL");