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

stv0367.c (90490B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * stv0367.c
      4 *
      5 * Driver for ST STV0367 DVB-T & DVB-C demodulator IC.
      6 *
      7 * Copyright (C) ST Microelectronics.
      8 * Copyright (C) 2010,2011 NetUP Inc.
      9 * Copyright (C) 2010,2011 Igor M. Liplianin <liplianin@netup.ru>
     10 */
     11
     12#include <linux/kernel.h>
     13#include <linux/module.h>
     14#include <linux/string.h>
     15#include <linux/slab.h>
     16#include <linux/i2c.h>
     17
     18#include <media/dvb_math.h>
     19
     20#include "stv0367.h"
     21#include "stv0367_defs.h"
     22#include "stv0367_regs.h"
     23#include "stv0367_priv.h"
     24
     25/* Max transfer size done by I2C transfer functions */
     26#define MAX_XFER_SIZE  64
     27
     28static int stvdebug;
     29module_param_named(debug, stvdebug, int, 0644);
     30
     31static int i2cdebug;
     32module_param_named(i2c_debug, i2cdebug, int, 0644);
     33
     34#define dprintk(args...) \
     35	do { \
     36		if (stvdebug) \
     37			printk(KERN_DEBUG args); \
     38	} while (0)
     39	/* DVB-C */
     40
     41enum active_demod_state { demod_none, demod_ter, demod_cab };
     42
     43struct stv0367cab_state {
     44	enum stv0367_cab_signal_type	state;
     45	u32	mclk;
     46	u32	adc_clk;
     47	s32	search_range;
     48	s32	derot_offset;
     49	/* results */
     50	int locked;			/* channel found		*/
     51	u32 freq_khz;			/* found frequency (in kHz)	*/
     52	u32 symbol_rate;		/* found symbol rate (in Bds)	*/
     53	enum fe_spectral_inversion spect_inv; /* Spectrum Inversion	*/
     54	u32 qamfec_status_reg;          /* status reg to poll for FEC Lock */
     55};
     56
     57struct stv0367ter_state {
     58	/* DVB-T */
     59	enum stv0367_ter_signal_type state;
     60	enum stv0367_ter_if_iq_mode if_iq_mode;
     61	enum stv0367_ter_mode mode;/* mode 2K or 8K */
     62	enum fe_guard_interval guard;
     63	enum stv0367_ter_hierarchy hierarchy;
     64	u32 frequency;
     65	enum fe_spectral_inversion sense; /*  current search spectrum */
     66	u8  force; /* force mode/guard */
     67	u8  bw; /* channel width 6, 7 or 8 in MHz */
     68	u8  pBW; /* channel width used during previous lock */
     69	u32 pBER;
     70	u32 pPER;
     71	u32 ucblocks;
     72	s8  echo_pos; /* echo position */
     73	u8  first_lock;
     74	u8  unlock_counter;
     75	u32 agc_val;
     76};
     77
     78struct stv0367_state {
     79	struct dvb_frontend fe;
     80	struct i2c_adapter *i2c;
     81	/* config settings */
     82	const struct stv0367_config *config;
     83	u8 chip_id;
     84	/* DVB-C */
     85	struct stv0367cab_state *cab_state;
     86	/* DVB-T */
     87	struct stv0367ter_state *ter_state;
     88	/* flags for operation control */
     89	u8 use_i2c_gatectrl;
     90	u8 deftabs;
     91	u8 reinit_on_setfrontend;
     92	u8 auto_if_khz;
     93	enum active_demod_state activedemod;
     94};
     95
     96#define RF_LOOKUP_TABLE_SIZE  31
     97#define RF_LOOKUP_TABLE2_SIZE 16
     98/* RF Level (for RF AGC->AGC1) Lookup Table, depends on the board and tuner.*/
     99static const s32 stv0367cab_RF_LookUp1[RF_LOOKUP_TABLE_SIZE][RF_LOOKUP_TABLE_SIZE] = {
    100	{/*AGC1*/
    101		48, 50, 51, 53, 54, 56, 57, 58, 60, 61, 62, 63,
    102		64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75,
    103		76, 77, 78, 80, 83, 85, 88,
    104	}, {/*RF(dbm)*/
    105		22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
    106		34, 35, 36, 37, 38, 39, 41, 42, 43, 44, 46, 47,
    107		49, 50, 52, 53, 54, 55, 56,
    108	}
    109};
    110/* RF Level (for IF AGC->AGC2) Lookup Table, depends on the board and tuner.*/
    111static const s32 stv0367cab_RF_LookUp2[RF_LOOKUP_TABLE2_SIZE][RF_LOOKUP_TABLE2_SIZE] = {
    112	{/*AGC2*/
    113		28, 29, 31, 32, 34, 35, 36, 37,
    114		38, 39, 40, 41, 42, 43, 44, 45,
    115	}, {/*RF(dbm)*/
    116		57, 58, 59, 60, 61, 62, 63, 64,
    117		65, 66, 67, 68, 69, 70, 71, 72,
    118	}
    119};
    120
    121static
    122int stv0367_writeregs(struct stv0367_state *state, u16 reg, u8 *data, int len)
    123{
    124	u8 buf[MAX_XFER_SIZE];
    125	struct i2c_msg msg = {
    126		.addr = state->config->demod_address,
    127		.flags = 0,
    128		.buf = buf,
    129		.len = len + 2
    130	};
    131	int ret;
    132
    133	if (2 + len > sizeof(buf)) {
    134		printk(KERN_WARNING
    135		       "%s: i2c wr reg=%04x: len=%d is too big!\n",
    136		       KBUILD_MODNAME, reg, len);
    137		return -EINVAL;
    138	}
    139
    140
    141	buf[0] = MSB(reg);
    142	buf[1] = LSB(reg);
    143	memcpy(buf + 2, data, len);
    144
    145	if (i2cdebug)
    146		printk(KERN_DEBUG "%s: [%02x] %02x: %02x\n", __func__,
    147			state->config->demod_address, reg, buf[2]);
    148
    149	ret = i2c_transfer(state->i2c, &msg, 1);
    150	if (ret != 1)
    151		printk(KERN_ERR "%s: i2c write error! ([%02x] %02x: %02x)\n",
    152			__func__, state->config->demod_address, reg, buf[2]);
    153
    154	return (ret != 1) ? -EREMOTEIO : 0;
    155}
    156
    157static int stv0367_writereg(struct stv0367_state *state, u16 reg, u8 data)
    158{
    159	u8 tmp = data; /* see gcc.gnu.org/bugzilla/show_bug.cgi?id=81715 */
    160
    161	return stv0367_writeregs(state, reg, &tmp, 1);
    162}
    163
    164static u8 stv0367_readreg(struct stv0367_state *state, u16 reg)
    165{
    166	u8 b0[] = { 0, 0 };
    167	u8 b1[] = { 0 };
    168	struct i2c_msg msg[] = {
    169		{
    170			.addr = state->config->demod_address,
    171			.flags = 0,
    172			.buf = b0,
    173			.len = 2
    174		}, {
    175			.addr = state->config->demod_address,
    176			.flags = I2C_M_RD,
    177			.buf = b1,
    178			.len = 1
    179		}
    180	};
    181	int ret;
    182
    183	b0[0] = MSB(reg);
    184	b0[1] = LSB(reg);
    185
    186	ret = i2c_transfer(state->i2c, msg, 2);
    187	if (ret != 2)
    188		printk(KERN_ERR "%s: i2c read error ([%02x] %02x: %02x)\n",
    189			__func__, state->config->demod_address, reg, b1[0]);
    190
    191	if (i2cdebug)
    192		printk(KERN_DEBUG "%s: [%02x] %02x: %02x\n", __func__,
    193			state->config->demod_address, reg, b1[0]);
    194
    195	return b1[0];
    196}
    197
    198static void extract_mask_pos(u32 label, u8 *mask, u8 *pos)
    199{
    200	u8 position = 0, i = 0;
    201
    202	(*mask) = label & 0xff;
    203
    204	while ((position == 0) && (i < 8)) {
    205		position = ((*mask) >> i) & 0x01;
    206		i++;
    207	}
    208
    209	(*pos) = (i - 1);
    210}
    211
    212static void stv0367_writebits(struct stv0367_state *state, u32 label, u8 val)
    213{
    214	u8 reg, mask, pos;
    215
    216	reg = stv0367_readreg(state, (label >> 16) & 0xffff);
    217	extract_mask_pos(label, &mask, &pos);
    218
    219	val = mask & (val << pos);
    220
    221	reg = (reg & (~mask)) | val;
    222	stv0367_writereg(state, (label >> 16) & 0xffff, reg);
    223
    224}
    225
    226static void stv0367_setbits(u8 *reg, u32 label, u8 val)
    227{
    228	u8 mask, pos;
    229
    230	extract_mask_pos(label, &mask, &pos);
    231
    232	val = mask & (val << pos);
    233
    234	(*reg) = ((*reg) & (~mask)) | val;
    235}
    236
    237static u8 stv0367_readbits(struct stv0367_state *state, u32 label)
    238{
    239	u8 val = 0xff;
    240	u8 mask, pos;
    241
    242	extract_mask_pos(label, &mask, &pos);
    243
    244	val = stv0367_readreg(state, label >> 16);
    245	val = (val & mask) >> pos;
    246
    247	return val;
    248}
    249
    250#if 0 /* Currently, unused */
    251static u8 stv0367_getbits(u8 reg, u32 label)
    252{
    253	u8 mask, pos;
    254
    255	extract_mask_pos(label, &mask, &pos);
    256
    257	return (reg & mask) >> pos;
    258}
    259#endif
    260
    261static void stv0367_write_table(struct stv0367_state *state,
    262				const struct st_register *deftab)
    263{
    264	int i = 0;
    265
    266	while (1) {
    267		if (!deftab[i].addr)
    268			break;
    269		stv0367_writereg(state, deftab[i].addr, deftab[i].value);
    270		i++;
    271	}
    272}
    273
    274static void stv0367_pll_setup(struct stv0367_state *state,
    275				u32 icspeed, u32 xtal)
    276{
    277	/* note on regs: R367TER_* and R367CAB_* defines each point to
    278	 * 0xf0d8, so just use R367TER_ for both cases
    279	 */
    280
    281	switch (icspeed) {
    282	case STV0367_ICSPEED_58000:
    283		switch (xtal) {
    284		default:
    285		case 27000000:
    286			dprintk("STV0367 SetCLKgen for 58MHz IC and 27Mhz crystal\n");
    287			/* PLLMDIV: 27, PLLNDIV: 232 */
    288			stv0367_writereg(state, R367TER_PLLMDIV, 0x1b);
    289			stv0367_writereg(state, R367TER_PLLNDIV, 0xe8);
    290			break;
    291		}
    292		break;
    293	default:
    294	case STV0367_ICSPEED_53125:
    295		switch (xtal) {
    296			/* set internal freq to 53.125MHz */
    297		case 16000000:
    298			stv0367_writereg(state, R367TER_PLLMDIV, 0x2);
    299			stv0367_writereg(state, R367TER_PLLNDIV, 0x1b);
    300			break;
    301		case 25000000:
    302			stv0367_writereg(state, R367TER_PLLMDIV, 0xa);
    303			stv0367_writereg(state, R367TER_PLLNDIV, 0x55);
    304			break;
    305		default:
    306		case 27000000:
    307			dprintk("FE_STV0367TER_SetCLKgen for 27Mhz\n");
    308			stv0367_writereg(state, R367TER_PLLMDIV, 0x1);
    309			stv0367_writereg(state, R367TER_PLLNDIV, 0x8);
    310			break;
    311		case 30000000:
    312			stv0367_writereg(state, R367TER_PLLMDIV, 0xc);
    313			stv0367_writereg(state, R367TER_PLLNDIV, 0x55);
    314			break;
    315		}
    316	}
    317
    318	stv0367_writereg(state, R367TER_PLLSETUP, 0x18);
    319}
    320
    321static int stv0367_get_if_khz(struct stv0367_state *state, u32 *ifkhz)
    322{
    323	if (state->auto_if_khz && state->fe.ops.tuner_ops.get_if_frequency) {
    324		state->fe.ops.tuner_ops.get_if_frequency(&state->fe, ifkhz);
    325		*ifkhz = *ifkhz / 1000; /* hz -> khz */
    326	} else
    327		*ifkhz = state->config->if_khz;
    328
    329	return 0;
    330}
    331
    332static int stv0367ter_gate_ctrl(struct dvb_frontend *fe, int enable)
    333{
    334	struct stv0367_state *state = fe->demodulator_priv;
    335	u8 tmp = stv0367_readreg(state, R367TER_I2CRPT);
    336
    337	dprintk("%s:\n", __func__);
    338
    339	if (enable) {
    340		stv0367_setbits(&tmp, F367TER_STOP_ENABLE, 0);
    341		stv0367_setbits(&tmp, F367TER_I2CT_ON, 1);
    342	} else {
    343		stv0367_setbits(&tmp, F367TER_STOP_ENABLE, 1);
    344		stv0367_setbits(&tmp, F367TER_I2CT_ON, 0);
    345	}
    346
    347	stv0367_writereg(state, R367TER_I2CRPT, tmp);
    348
    349	return 0;
    350}
    351
    352static u32 stv0367_get_tuner_freq(struct dvb_frontend *fe)
    353{
    354	struct dvb_frontend_ops	*frontend_ops = &fe->ops;
    355	struct dvb_tuner_ops	*tuner_ops = &frontend_ops->tuner_ops;
    356	u32 freq = 0;
    357	int err = 0;
    358
    359	dprintk("%s:\n", __func__);
    360
    361	if (tuner_ops->get_frequency) {
    362		err = tuner_ops->get_frequency(fe, &freq);
    363		if (err < 0) {
    364			printk(KERN_ERR "%s: Invalid parameter\n", __func__);
    365			return err;
    366		}
    367
    368		dprintk("%s: frequency=%d\n", __func__, freq);
    369
    370	} else
    371		return -1;
    372
    373	return freq;
    374}
    375
    376static u16 CellsCoeffs_8MHz_367cofdm[3][6][5] = {
    377	{
    378		{0x10EF, 0xE205, 0x10EF, 0xCE49, 0x6DA7}, /* CELL 1 COEFFS 27M*/
    379		{0x2151, 0xc557, 0x2151, 0xc705, 0x6f93}, /* CELL 2 COEFFS */
    380		{0x2503, 0xc000, 0x2503, 0xc375, 0x7194}, /* CELL 3 COEFFS */
    381		{0x20E9, 0xca94, 0x20e9, 0xc153, 0x7194}, /* CELL 4 COEFFS */
    382		{0x06EF, 0xF852, 0x06EF, 0xC057, 0x7207}, /* CELL 5 COEFFS */
    383		{0x0000, 0x0ECC, 0x0ECC, 0x0000, 0x3647} /* CELL 6 COEFFS */
    384	}, {
    385		{0x10A0, 0xE2AF, 0x10A1, 0xCE76, 0x6D6D}, /* CELL 1 COEFFS 25M*/
    386		{0x20DC, 0xC676, 0x20D9, 0xC80A, 0x6F29},
    387		{0x2532, 0xC000, 0x251D, 0xC391, 0x706F},
    388		{0x1F7A, 0xCD2B, 0x2032, 0xC15E, 0x711F},
    389		{0x0698, 0xFA5E, 0x0568, 0xC059, 0x7193},
    390		{0x0000, 0x0918, 0x149C, 0x0000, 0x3642} /* CELL 6 COEFFS */
    391	}, {
    392		{0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, /* 30M */
    393		{0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
    394		{0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
    395		{0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
    396		{0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
    397		{0x0000, 0x0000, 0x0000, 0x0000, 0x0000}
    398	}
    399};
    400
    401static u16 CellsCoeffs_7MHz_367cofdm[3][6][5] = {
    402	{
    403		{0x12CA, 0xDDAF, 0x12CA, 0xCCEB, 0x6FB1}, /* CELL 1 COEFFS 27M*/
    404		{0x2329, 0xC000, 0x2329, 0xC6B0, 0x725F}, /* CELL 2 COEFFS */
    405		{0x2394, 0xC000, 0x2394, 0xC2C7, 0x7410}, /* CELL 3 COEFFS */
    406		{0x251C, 0xC000, 0x251C, 0xC103, 0x74D9}, /* CELL 4 COEFFS */
    407		{0x0804, 0xF546, 0x0804, 0xC040, 0x7544}, /* CELL 5 COEFFS */
    408		{0x0000, 0x0CD9, 0x0CD9, 0x0000, 0x370A} /* CELL 6 COEFFS */
    409	}, {
    410		{0x1285, 0xDE47, 0x1285, 0xCD17, 0x6F76}, /*25M*/
    411		{0x234C, 0xC000, 0x2348, 0xC6DA, 0x7206},
    412		{0x23B4, 0xC000, 0x23AC, 0xC2DB, 0x73B3},
    413		{0x253D, 0xC000, 0x25B6, 0xC10B, 0x747F},
    414		{0x0721, 0xF79C, 0x065F, 0xC041, 0x74EB},
    415		{0x0000, 0x08FA, 0x1162, 0x0000, 0x36FF}
    416	}, {
    417		{0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, /* 30M */
    418		{0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
    419		{0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
    420		{0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
    421		{0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
    422		{0x0000, 0x0000, 0x0000, 0x0000, 0x0000}
    423	}
    424};
    425
    426static u16 CellsCoeffs_6MHz_367cofdm[3][6][5] = {
    427	{
    428		{0x1699, 0xD5B8, 0x1699, 0xCBC3, 0x713B}, /* CELL 1 COEFFS 27M*/
    429		{0x2245, 0xC000, 0x2245, 0xC568, 0x74D5}, /* CELL 2 COEFFS */
    430		{0x227F, 0xC000, 0x227F, 0xC1FC, 0x76C6}, /* CELL 3 COEFFS */
    431		{0x235E, 0xC000, 0x235E, 0xC0A7, 0x778A}, /* CELL 4 COEFFS */
    432		{0x0ECB, 0xEA0B, 0x0ECB, 0xC027, 0x77DD}, /* CELL 5 COEFFS */
    433		{0x0000, 0x0B68, 0x0B68, 0x0000, 0xC89A}, /* CELL 6 COEFFS */
    434	}, {
    435		{0x1655, 0xD64E, 0x1658, 0xCBEF, 0x70FE}, /*25M*/
    436		{0x225E, 0xC000, 0x2256, 0xC589, 0x7489},
    437		{0x2293, 0xC000, 0x2295, 0xC209, 0x767E},
    438		{0x2377, 0xC000, 0x23AA, 0xC0AB, 0x7746},
    439		{0x0DC7, 0xEBC8, 0x0D07, 0xC027, 0x7799},
    440		{0x0000, 0x0888, 0x0E9C, 0x0000, 0x3757}
    441
    442	}, {
    443		{0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, /* 30M */
    444		{0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
    445		{0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
    446		{0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
    447		{0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
    448		{0x0000, 0x0000, 0x0000, 0x0000, 0x0000}
    449	}
    450};
    451
    452static u32 stv0367ter_get_mclk(struct stv0367_state *state, u32 ExtClk_Hz)
    453{
    454	u32 mclk_Hz = 0; /* master clock frequency (Hz) */
    455	u32 m, n, p;
    456
    457	dprintk("%s:\n", __func__);
    458
    459	if (stv0367_readbits(state, F367TER_BYPASS_PLLXN) == 0) {
    460		n = (u32)stv0367_readbits(state, F367TER_PLL_NDIV);
    461		if (n == 0)
    462			n = n + 1;
    463
    464		m = (u32)stv0367_readbits(state, F367TER_PLL_MDIV);
    465		if (m == 0)
    466			m = m + 1;
    467
    468		p = (u32)stv0367_readbits(state, F367TER_PLL_PDIV);
    469		if (p > 5)
    470			p = 5;
    471
    472		mclk_Hz = ((ExtClk_Hz / 2) * n) / (m * (1 << p));
    473
    474		dprintk("N=%d M=%d P=%d mclk_Hz=%d ExtClk_Hz=%d\n",
    475				n, m, p, mclk_Hz, ExtClk_Hz);
    476	} else
    477		mclk_Hz = ExtClk_Hz;
    478
    479	dprintk("%s: mclk_Hz=%d\n", __func__, mclk_Hz);
    480
    481	return mclk_Hz;
    482}
    483
    484static int stv0367ter_filt_coeff_init(struct stv0367_state *state,
    485				u16 CellsCoeffs[3][6][5], u32 DemodXtal)
    486{
    487	int i, j, k, freq;
    488
    489	dprintk("%s:\n", __func__);
    490
    491	freq = stv0367ter_get_mclk(state, DemodXtal);
    492
    493	if (freq == 53125000)
    494		k = 1; /* equivalent to Xtal 25M on 362*/
    495	else if (freq == 54000000)
    496		k = 0; /* equivalent to Xtal 27M on 362*/
    497	else if (freq == 52500000)
    498		k = 2; /* equivalent to Xtal 30M on 362*/
    499	else
    500		return 0;
    501
    502	for (i = 1; i <= 6; i++) {
    503		stv0367_writebits(state, F367TER_IIR_CELL_NB, i - 1);
    504
    505		for (j = 1; j <= 5; j++) {
    506			stv0367_writereg(state,
    507				(R367TER_IIRCX_COEFF1_MSB + 2 * (j - 1)),
    508				MSB(CellsCoeffs[k][i-1][j-1]));
    509			stv0367_writereg(state,
    510				(R367TER_IIRCX_COEFF1_LSB + 2 * (j - 1)),
    511				LSB(CellsCoeffs[k][i-1][j-1]));
    512		}
    513	}
    514
    515	return 1;
    516
    517}
    518
    519static void stv0367ter_agc_iir_lock_detect_set(struct stv0367_state *state)
    520{
    521	dprintk("%s:\n", __func__);
    522
    523	stv0367_writebits(state, F367TER_LOCK_DETECT_LSB, 0x00);
    524
    525	/* Lock detect 1 */
    526	stv0367_writebits(state, F367TER_LOCK_DETECT_CHOICE, 0x00);
    527	stv0367_writebits(state, F367TER_LOCK_DETECT_MSB, 0x06);
    528	stv0367_writebits(state, F367TER_AUT_AGC_TARGET_LSB, 0x04);
    529
    530	/* Lock detect 2 */
    531	stv0367_writebits(state, F367TER_LOCK_DETECT_CHOICE, 0x01);
    532	stv0367_writebits(state, F367TER_LOCK_DETECT_MSB, 0x06);
    533	stv0367_writebits(state, F367TER_AUT_AGC_TARGET_LSB, 0x04);
    534
    535	/* Lock detect 3 */
    536	stv0367_writebits(state, F367TER_LOCK_DETECT_CHOICE, 0x02);
    537	stv0367_writebits(state, F367TER_LOCK_DETECT_MSB, 0x01);
    538	stv0367_writebits(state, F367TER_AUT_AGC_TARGET_LSB, 0x00);
    539
    540	/* Lock detect 4 */
    541	stv0367_writebits(state, F367TER_LOCK_DETECT_CHOICE, 0x03);
    542	stv0367_writebits(state, F367TER_LOCK_DETECT_MSB, 0x01);
    543	stv0367_writebits(state, F367TER_AUT_AGC_TARGET_LSB, 0x00);
    544
    545}
    546
    547static int stv0367_iir_filt_init(struct stv0367_state *state, u8 Bandwidth,
    548							u32 DemodXtalValue)
    549{
    550	dprintk("%s:\n", __func__);
    551
    552	stv0367_writebits(state, F367TER_NRST_IIR, 0);
    553
    554	switch (Bandwidth) {
    555	case 6:
    556		if (!stv0367ter_filt_coeff_init(state,
    557				CellsCoeffs_6MHz_367cofdm,
    558				DemodXtalValue))
    559			return 0;
    560		break;
    561	case 7:
    562		if (!stv0367ter_filt_coeff_init(state,
    563				CellsCoeffs_7MHz_367cofdm,
    564				DemodXtalValue))
    565			return 0;
    566		break;
    567	case 8:
    568		if (!stv0367ter_filt_coeff_init(state,
    569				CellsCoeffs_8MHz_367cofdm,
    570				DemodXtalValue))
    571			return 0;
    572		break;
    573	default:
    574		return 0;
    575	}
    576
    577	stv0367_writebits(state, F367TER_NRST_IIR, 1);
    578
    579	return 1;
    580}
    581
    582static void stv0367ter_agc_iir_rst(struct stv0367_state *state)
    583{
    584
    585	u8 com_n;
    586
    587	dprintk("%s:\n", __func__);
    588
    589	com_n = stv0367_readbits(state, F367TER_COM_N);
    590
    591	stv0367_writebits(state, F367TER_COM_N, 0x07);
    592
    593	stv0367_writebits(state, F367TER_COM_SOFT_RSTN, 0x00);
    594	stv0367_writebits(state, F367TER_COM_AGC_ON, 0x00);
    595
    596	stv0367_writebits(state, F367TER_COM_SOFT_RSTN, 0x01);
    597	stv0367_writebits(state, F367TER_COM_AGC_ON, 0x01);
    598
    599	stv0367_writebits(state, F367TER_COM_N, com_n);
    600
    601}
    602
    603static int stv0367ter_duration(s32 mode, int tempo1, int tempo2, int tempo3)
    604{
    605	int local_tempo = 0;
    606	switch (mode) {
    607	case 0:
    608		local_tempo = tempo1;
    609		break;
    610	case 1:
    611		local_tempo = tempo2;
    612		break ;
    613
    614	case 2:
    615		local_tempo = tempo3;
    616		break;
    617
    618	default:
    619		break;
    620	}
    621	/*	msleep(local_tempo);  */
    622	return local_tempo;
    623}
    624
    625static enum
    626stv0367_ter_signal_type stv0367ter_check_syr(struct stv0367_state *state)
    627{
    628	int wd = 100;
    629	unsigned short int SYR_var;
    630	s32 SYRStatus;
    631
    632	dprintk("%s:\n", __func__);
    633
    634	SYR_var = stv0367_readbits(state, F367TER_SYR_LOCK);
    635
    636	while ((!SYR_var) && (wd > 0)) {
    637		usleep_range(2000, 3000);
    638		wd -= 2;
    639		SYR_var = stv0367_readbits(state, F367TER_SYR_LOCK);
    640	}
    641
    642	if (!SYR_var)
    643		SYRStatus = FE_TER_NOSYMBOL;
    644	else
    645		SYRStatus =  FE_TER_SYMBOLOK;
    646
    647	dprintk("stv0367ter_check_syr SYRStatus %s\n",
    648				SYR_var == 0 ? "No Symbol" : "OK");
    649
    650	return SYRStatus;
    651}
    652
    653static enum
    654stv0367_ter_signal_type stv0367ter_check_cpamp(struct stv0367_state *state,
    655								s32 FFTmode)
    656{
    657
    658	s32  CPAMPvalue = 0, CPAMPStatus, CPAMPMin;
    659	int wd = 0;
    660
    661	dprintk("%s:\n", __func__);
    662
    663	switch (FFTmode) {
    664	case 0: /*2k mode*/
    665		CPAMPMin = 20;
    666		wd = 10;
    667		break;
    668	case 1: /*8k mode*/
    669		CPAMPMin = 80;
    670		wd = 55;
    671		break;
    672	case 2: /*4k mode*/
    673		CPAMPMin = 40;
    674		wd = 30;
    675		break;
    676	default:
    677		CPAMPMin = 0xffff;  /*drives to NOCPAMP	*/
    678		break;
    679	}
    680
    681	dprintk("%s: CPAMPMin=%d wd=%d\n", __func__, CPAMPMin, wd);
    682
    683	CPAMPvalue = stv0367_readbits(state, F367TER_PPM_CPAMP_DIRECT);
    684	while ((CPAMPvalue < CPAMPMin) && (wd > 0)) {
    685		usleep_range(1000, 2000);
    686		wd -= 1;
    687		CPAMPvalue = stv0367_readbits(state, F367TER_PPM_CPAMP_DIRECT);
    688		/*dprintk("CPAMPvalue= %d at wd=%d\n",CPAMPvalue,wd); */
    689	}
    690	dprintk("******last CPAMPvalue= %d at wd=%d\n", CPAMPvalue, wd);
    691	if (CPAMPvalue < CPAMPMin) {
    692		CPAMPStatus = FE_TER_NOCPAMP;
    693		dprintk("%s: CPAMP failed\n", __func__);
    694	} else {
    695		dprintk("%s: CPAMP OK !\n", __func__);
    696		CPAMPStatus = FE_TER_CPAMPOK;
    697	}
    698
    699	return CPAMPStatus;
    700}
    701
    702static enum stv0367_ter_signal_type
    703stv0367ter_lock_algo(struct stv0367_state *state)
    704{
    705	enum stv0367_ter_signal_type ret_flag;
    706	short int wd, tempo;
    707	u8 try, u_var1 = 0, u_var2 = 0, u_var3 = 0, u_var4 = 0, mode, guard;
    708	u8 tmp, tmp2;
    709
    710	dprintk("%s:\n", __func__);
    711
    712	if (state == NULL)
    713		return FE_TER_SWNOK;
    714
    715	try = 0;
    716	do {
    717		ret_flag = FE_TER_LOCKOK;
    718
    719		stv0367_writebits(state, F367TER_CORE_ACTIVE, 0);
    720
    721		if (state->config->if_iq_mode != 0)
    722			stv0367_writebits(state, F367TER_COM_N, 0x07);
    723
    724		stv0367_writebits(state, F367TER_GUARD, 3);/* suggest 2k 1/4 */
    725		stv0367_writebits(state, F367TER_MODE, 0);
    726		stv0367_writebits(state, F367TER_SYR_TR_DIS, 0);
    727		usleep_range(5000, 10000);
    728
    729		stv0367_writebits(state, F367TER_CORE_ACTIVE, 1);
    730
    731
    732		if (stv0367ter_check_syr(state) == FE_TER_NOSYMBOL)
    733			return FE_TER_NOSYMBOL;
    734		else { /*
    735			if chip locked on wrong mode first try,
    736			it must lock correctly second try */
    737			mode = stv0367_readbits(state, F367TER_SYR_MODE);
    738			if (stv0367ter_check_cpamp(state, mode) ==
    739							FE_TER_NOCPAMP) {
    740				if (try == 0)
    741					ret_flag = FE_TER_NOCPAMP;
    742
    743			}
    744		}
    745
    746		try++;
    747	} while ((try < 10) && (ret_flag != FE_TER_LOCKOK));
    748
    749	tmp  = stv0367_readreg(state, R367TER_SYR_STAT);
    750	tmp2 = stv0367_readreg(state, R367TER_STATUS);
    751	dprintk("state=%p\n", state);
    752	dprintk("LOCK OK! mode=%d SYR_STAT=0x%x R367TER_STATUS=0x%x\n",
    753							mode, tmp, tmp2);
    754
    755	tmp  = stv0367_readreg(state, R367TER_PRVIT);
    756	tmp2 = stv0367_readreg(state, R367TER_I2CRPT);
    757	dprintk("PRVIT=0x%x I2CRPT=0x%x\n", tmp, tmp2);
    758
    759	tmp  = stv0367_readreg(state, R367TER_GAIN_SRC1);
    760	dprintk("GAIN_SRC1=0x%x\n", tmp);
    761
    762	if ((mode != 0) && (mode != 1) && (mode != 2))
    763		return FE_TER_SWNOK;
    764
    765	/*guard=stv0367_readbits(state,F367TER_SYR_GUARD); */
    766
    767	/*suppress EPQ auto for SYR_GARD 1/16 or 1/32
    768	and set channel predictor in automatic */
    769#if 0
    770	switch (guard) {
    771
    772	case 0:
    773	case 1:
    774		stv0367_writebits(state, F367TER_AUTO_LE_EN, 0);
    775		stv0367_writereg(state, R367TER_CHC_CTL, 0x01);
    776		break;
    777	case 2:
    778	case 3:
    779		stv0367_writebits(state, F367TER_AUTO_LE_EN, 1);
    780		stv0367_writereg(state, R367TER_CHC_CTL, 0x11);
    781		break;
    782
    783	default:
    784		return FE_TER_SWNOK;
    785	}
    786#endif
    787
    788	/*reset fec an reedsolo FOR 367 only*/
    789	stv0367_writebits(state, F367TER_RST_SFEC, 1);
    790	stv0367_writebits(state, F367TER_RST_REEDSOLO, 1);
    791	usleep_range(1000, 2000);
    792	stv0367_writebits(state, F367TER_RST_SFEC, 0);
    793	stv0367_writebits(state, F367TER_RST_REEDSOLO, 0);
    794
    795	u_var1 = stv0367_readbits(state, F367TER_LK);
    796	u_var2 = stv0367_readbits(state, F367TER_PRF);
    797	u_var3 = stv0367_readbits(state, F367TER_TPS_LOCK);
    798	/*	u_var4=stv0367_readbits(state,F367TER_TSFIFO_LINEOK); */
    799
    800	wd = stv0367ter_duration(mode, 125, 500, 250);
    801	tempo = stv0367ter_duration(mode, 4, 16, 8);
    802
    803	/*while ( ((!u_var1)||(!u_var2)||(!u_var3)||(!u_var4))  && (wd>=0)) */
    804	while (((!u_var1) || (!u_var2) || (!u_var3)) && (wd >= 0)) {
    805		usleep_range(1000 * tempo, 1000 * (tempo + 1));
    806		wd -= tempo;
    807		u_var1 = stv0367_readbits(state, F367TER_LK);
    808		u_var2 = stv0367_readbits(state, F367TER_PRF);
    809		u_var3 = stv0367_readbits(state, F367TER_TPS_LOCK);
    810		/*u_var4=stv0367_readbits(state, F367TER_TSFIFO_LINEOK); */
    811	}
    812
    813	if (!u_var1)
    814		return FE_TER_NOLOCK;
    815
    816
    817	if (!u_var2)
    818		return FE_TER_NOPRFOUND;
    819
    820	if (!u_var3)
    821		return FE_TER_NOTPS;
    822
    823	guard = stv0367_readbits(state, F367TER_SYR_GUARD);
    824	stv0367_writereg(state, R367TER_CHC_CTL, 0x11);
    825	switch (guard) {
    826	case 0:
    827	case 1:
    828		stv0367_writebits(state, F367TER_AUTO_LE_EN, 0);
    829		/*stv0367_writereg(state,R367TER_CHC_CTL, 0x1);*/
    830		stv0367_writebits(state, F367TER_SYR_FILTER, 0);
    831		break;
    832	case 2:
    833	case 3:
    834		stv0367_writebits(state, F367TER_AUTO_LE_EN, 1);
    835		/*stv0367_writereg(state,R367TER_CHC_CTL, 0x11);*/
    836		stv0367_writebits(state, F367TER_SYR_FILTER, 1);
    837		break;
    838
    839	default:
    840		return FE_TER_SWNOK;
    841	}
    842
    843	/* apply Sfec workaround if 8K 64QAM CR!=1/2*/
    844	if ((stv0367_readbits(state, F367TER_TPS_CONST) == 2) &&
    845			(mode == 1) &&
    846			(stv0367_readbits(state, F367TER_TPS_HPCODE) != 0)) {
    847		stv0367_writereg(state, R367TER_SFDLYSETH, 0xc0);
    848		stv0367_writereg(state, R367TER_SFDLYSETM, 0x60);
    849		stv0367_writereg(state, R367TER_SFDLYSETL, 0x0);
    850	} else
    851		stv0367_writereg(state, R367TER_SFDLYSETH, 0x0);
    852
    853	wd = stv0367ter_duration(mode, 125, 500, 250);
    854	u_var4 = stv0367_readbits(state, F367TER_TSFIFO_LINEOK);
    855
    856	while ((!u_var4) && (wd >= 0)) {
    857		usleep_range(1000 * tempo, 1000 * (tempo + 1));
    858		wd -= tempo;
    859		u_var4 = stv0367_readbits(state, F367TER_TSFIFO_LINEOK);
    860	}
    861
    862	if (!u_var4)
    863		return FE_TER_NOLOCK;
    864
    865	/* for 367 leave COM_N at 0x7 for IQ_mode*/
    866	/*if(ter_state->if_iq_mode!=FE_TER_NORMAL_IF_TUNER) {
    867		tempo=0;
    868		while ((stv0367_readbits(state,F367TER_COM_USEGAINTRK)!=1) &&
    869		(stv0367_readbits(state,F367TER_COM_AGCLOCK)!=1)&&(tempo<100)) {
    870			ChipWaitOrAbort(state,1);
    871			tempo+=1;
    872		}
    873
    874		stv0367_writebits(state,F367TER_COM_N,0x17);
    875	} */
    876
    877	stv0367_writebits(state, F367TER_SYR_TR_DIS, 1);
    878
    879	dprintk("FE_TER_LOCKOK !!!\n");
    880
    881	return	FE_TER_LOCKOK;
    882
    883}
    884
    885static void stv0367ter_set_ts_mode(struct stv0367_state *state,
    886					enum stv0367_ts_mode PathTS)
    887{
    888
    889	dprintk("%s:\n", __func__);
    890
    891	if (state == NULL)
    892		return;
    893
    894	stv0367_writebits(state, F367TER_TS_DIS, 0);
    895	switch (PathTS) {
    896	default:
    897		/*for removing warning :default we can assume in parallel mode*/
    898	case STV0367_PARALLEL_PUNCT_CLOCK:
    899		stv0367_writebits(state, F367TER_TSFIFO_SERIAL, 0);
    900		stv0367_writebits(state, F367TER_TSFIFO_DVBCI, 0);
    901		break;
    902	case STV0367_SERIAL_PUNCT_CLOCK:
    903		stv0367_writebits(state, F367TER_TSFIFO_SERIAL, 1);
    904		stv0367_writebits(state, F367TER_TSFIFO_DVBCI, 1);
    905		break;
    906	}
    907}
    908
    909static void stv0367ter_set_clk_pol(struct stv0367_state *state,
    910					enum stv0367_clk_pol clock)
    911{
    912
    913	dprintk("%s:\n", __func__);
    914
    915	if (state == NULL)
    916		return;
    917
    918	switch (clock) {
    919	case STV0367_RISINGEDGE_CLOCK:
    920		stv0367_writebits(state, F367TER_TS_BYTE_CLK_INV, 1);
    921		break;
    922	case STV0367_FALLINGEDGE_CLOCK:
    923		stv0367_writebits(state, F367TER_TS_BYTE_CLK_INV, 0);
    924		break;
    925		/*case FE_TER_CLOCK_POLARITY_DEFAULT:*/
    926	default:
    927		stv0367_writebits(state, F367TER_TS_BYTE_CLK_INV, 0);
    928		break;
    929	}
    930}
    931
    932#if 0
    933static void stv0367ter_core_sw(struct stv0367_state *state)
    934{
    935
    936	dprintk("%s:\n", __func__);
    937
    938	stv0367_writebits(state, F367TER_CORE_ACTIVE, 0);
    939	stv0367_writebits(state, F367TER_CORE_ACTIVE, 1);
    940	msleep(350);
    941}
    942#endif
    943static int stv0367ter_standby(struct dvb_frontend *fe, u8 standby_on)
    944{
    945	struct stv0367_state *state = fe->demodulator_priv;
    946
    947	dprintk("%s:\n", __func__);
    948
    949	if (standby_on) {
    950		stv0367_writebits(state, F367TER_STDBY, 1);
    951		stv0367_writebits(state, F367TER_STDBY_FEC, 1);
    952		stv0367_writebits(state, F367TER_STDBY_CORE, 1);
    953	} else {
    954		stv0367_writebits(state, F367TER_STDBY, 0);
    955		stv0367_writebits(state, F367TER_STDBY_FEC, 0);
    956		stv0367_writebits(state, F367TER_STDBY_CORE, 0);
    957	}
    958
    959	return 0;
    960}
    961
    962static int stv0367ter_sleep(struct dvb_frontend *fe)
    963{
    964	return stv0367ter_standby(fe, 1);
    965}
    966
    967static int stv0367ter_init(struct dvb_frontend *fe)
    968{
    969	struct stv0367_state *state = fe->demodulator_priv;
    970	struct stv0367ter_state *ter_state = state->ter_state;
    971
    972	dprintk("%s:\n", __func__);
    973
    974	ter_state->pBER = 0;
    975
    976	stv0367_write_table(state,
    977		stv0367_deftabs[state->deftabs][STV0367_TAB_TER]);
    978
    979	stv0367_pll_setup(state, STV0367_ICSPEED_53125, state->config->xtal);
    980
    981	stv0367_writereg(state, R367TER_I2CRPT, 0xa0);
    982	stv0367_writereg(state, R367TER_ANACTRL, 0x00);
    983
    984	/*Set TS1 and TS2 to serial or parallel mode */
    985	stv0367ter_set_ts_mode(state, state->config->ts_mode);
    986	stv0367ter_set_clk_pol(state, state->config->clk_pol);
    987
    988	state->chip_id = stv0367_readreg(state, R367TER_ID);
    989	ter_state->first_lock = 0;
    990	ter_state->unlock_counter = 2;
    991
    992	return 0;
    993}
    994
    995static int stv0367ter_algo(struct dvb_frontend *fe)
    996{
    997	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
    998	struct stv0367_state *state = fe->demodulator_priv;
    999	struct stv0367ter_state *ter_state = state->ter_state;
   1000	int offset = 0, tempo = 0;
   1001	u8 u_var;
   1002	u8 /*constell,*/ counter;
   1003	s8 step;
   1004	s32 timing_offset = 0;
   1005	u32 trl_nomrate = 0, InternalFreq = 0, temp = 0, ifkhz = 0;
   1006
   1007	dprintk("%s:\n", __func__);
   1008
   1009	stv0367_get_if_khz(state, &ifkhz);
   1010
   1011	ter_state->frequency = p->frequency;
   1012	ter_state->force = FE_TER_FORCENONE
   1013			+ stv0367_readbits(state, F367TER_FORCE) * 2;
   1014	ter_state->if_iq_mode = state->config->if_iq_mode;
   1015	switch (state->config->if_iq_mode) {
   1016	case FE_TER_NORMAL_IF_TUNER:  /* Normal IF mode */
   1017		dprintk("ALGO: FE_TER_NORMAL_IF_TUNER selected\n");
   1018		stv0367_writebits(state, F367TER_TUNER_BB, 0);
   1019		stv0367_writebits(state, F367TER_LONGPATH_IF, 0);
   1020		stv0367_writebits(state, F367TER_DEMUX_SWAP, 0);
   1021		break;
   1022	case FE_TER_LONGPATH_IF_TUNER:  /* Long IF mode */
   1023		dprintk("ALGO: FE_TER_LONGPATH_IF_TUNER selected\n");
   1024		stv0367_writebits(state, F367TER_TUNER_BB, 0);
   1025		stv0367_writebits(state, F367TER_LONGPATH_IF, 1);
   1026		stv0367_writebits(state, F367TER_DEMUX_SWAP, 1);
   1027		break;
   1028	case FE_TER_IQ_TUNER:  /* IQ mode */
   1029		dprintk("ALGO: FE_TER_IQ_TUNER selected\n");
   1030		stv0367_writebits(state, F367TER_TUNER_BB, 1);
   1031		stv0367_writebits(state, F367TER_PPM_INVSEL, 0);
   1032		break;
   1033	default:
   1034		printk(KERN_ERR "ALGO: wrong TUNER type selected\n");
   1035		return -EINVAL;
   1036	}
   1037
   1038	usleep_range(5000, 7000);
   1039
   1040	switch (p->inversion) {
   1041	case INVERSION_AUTO:
   1042	default:
   1043		dprintk("%s: inversion AUTO\n", __func__);
   1044		if (ter_state->if_iq_mode == FE_TER_IQ_TUNER)
   1045			stv0367_writebits(state, F367TER_IQ_INVERT,
   1046						ter_state->sense);
   1047		else
   1048			stv0367_writebits(state, F367TER_INV_SPECTR,
   1049						ter_state->sense);
   1050
   1051		break;
   1052	case INVERSION_ON:
   1053	case INVERSION_OFF:
   1054		if (ter_state->if_iq_mode == FE_TER_IQ_TUNER)
   1055			stv0367_writebits(state, F367TER_IQ_INVERT,
   1056						p->inversion);
   1057		else
   1058			stv0367_writebits(state, F367TER_INV_SPECTR,
   1059						p->inversion);
   1060
   1061		break;
   1062	}
   1063
   1064	if ((ter_state->if_iq_mode != FE_TER_NORMAL_IF_TUNER) &&
   1065				(ter_state->pBW != ter_state->bw)) {
   1066		stv0367ter_agc_iir_lock_detect_set(state);
   1067
   1068		/*set fine agc target to 180 for LPIF or IQ mode*/
   1069		/* set Q_AGCTarget */
   1070		stv0367_writebits(state, F367TER_SEL_IQNTAR, 1);
   1071		stv0367_writebits(state, F367TER_AUT_AGC_TARGET_MSB, 0xB);
   1072		/*stv0367_writebits(state,AUT_AGC_TARGET_LSB,0x04); */
   1073
   1074		/* set Q_AGCTarget */
   1075		stv0367_writebits(state, F367TER_SEL_IQNTAR, 0);
   1076		stv0367_writebits(state, F367TER_AUT_AGC_TARGET_MSB, 0xB);
   1077		/*stv0367_writebits(state,AUT_AGC_TARGET_LSB,0x04); */
   1078
   1079		if (!stv0367_iir_filt_init(state, ter_state->bw,
   1080						state->config->xtal))
   1081			return -EINVAL;
   1082		/*set IIR filter once for 6,7 or 8MHz BW*/
   1083		ter_state->pBW = ter_state->bw;
   1084
   1085		stv0367ter_agc_iir_rst(state);
   1086	}
   1087
   1088	if (ter_state->hierarchy == FE_TER_HIER_LOW_PRIO)
   1089		stv0367_writebits(state, F367TER_BDI_LPSEL, 0x01);
   1090	else
   1091		stv0367_writebits(state, F367TER_BDI_LPSEL, 0x00);
   1092
   1093	InternalFreq = stv0367ter_get_mclk(state, state->config->xtal) / 1000;
   1094	temp = (int)
   1095		((((ter_state->bw * 64 * (1 << 15) * 100)
   1096						/ (InternalFreq)) * 10) / 7);
   1097
   1098	stv0367_writebits(state, F367TER_TRL_NOMRATE_LSB, temp % 2);
   1099	temp = temp / 2;
   1100	stv0367_writebits(state, F367TER_TRL_NOMRATE_HI, temp / 256);
   1101	stv0367_writebits(state, F367TER_TRL_NOMRATE_LO, temp % 256);
   1102
   1103	temp = stv0367_readbits(state, F367TER_TRL_NOMRATE_HI) * 512 +
   1104			stv0367_readbits(state, F367TER_TRL_NOMRATE_LO) * 2 +
   1105			stv0367_readbits(state, F367TER_TRL_NOMRATE_LSB);
   1106	temp = (int)(((1 << 17) * ter_state->bw * 1000) / (7 * (InternalFreq)));
   1107	stv0367_writebits(state, F367TER_GAIN_SRC_HI, temp / 256);
   1108	stv0367_writebits(state, F367TER_GAIN_SRC_LO, temp % 256);
   1109	temp = stv0367_readbits(state, F367TER_GAIN_SRC_HI) * 256 +
   1110			stv0367_readbits(state, F367TER_GAIN_SRC_LO);
   1111
   1112	temp = (int)
   1113		((InternalFreq - ifkhz) * (1 << 16) / (InternalFreq));
   1114
   1115	dprintk("DEROT temp=0x%x\n", temp);
   1116	stv0367_writebits(state, F367TER_INC_DEROT_HI, temp / 256);
   1117	stv0367_writebits(state, F367TER_INC_DEROT_LO, temp % 256);
   1118
   1119	ter_state->echo_pos = 0;
   1120	ter_state->ucblocks = 0; /* liplianin */
   1121	ter_state->pBER = 0; /* liplianin */
   1122	stv0367_writebits(state, F367TER_LONG_ECHO, ter_state->echo_pos);
   1123
   1124	if (stv0367ter_lock_algo(state) != FE_TER_LOCKOK)
   1125		return 0;
   1126
   1127	ter_state->state = FE_TER_LOCKOK;
   1128
   1129	ter_state->mode = stv0367_readbits(state, F367TER_SYR_MODE);
   1130	ter_state->guard = stv0367_readbits(state, F367TER_SYR_GUARD);
   1131
   1132	ter_state->first_lock = 1; /* we know sense now :) */
   1133
   1134	ter_state->agc_val =
   1135			(stv0367_readbits(state, F367TER_AGC1_VAL_LO) << 16) +
   1136			(stv0367_readbits(state, F367TER_AGC1_VAL_HI) << 24) +
   1137			stv0367_readbits(state, F367TER_AGC2_VAL_LO) +
   1138			(stv0367_readbits(state, F367TER_AGC2_VAL_HI) << 8);
   1139
   1140	/* Carrier offset calculation */
   1141	stv0367_writebits(state, F367TER_FREEZE, 1);
   1142	offset = (stv0367_readbits(state, F367TER_CRL_FOFFSET_VHI) << 16) ;
   1143	offset += (stv0367_readbits(state, F367TER_CRL_FOFFSET_HI) << 8);
   1144	offset += (stv0367_readbits(state, F367TER_CRL_FOFFSET_LO));
   1145	stv0367_writebits(state, F367TER_FREEZE, 0);
   1146	if (offset > 8388607)
   1147		offset -= 16777216;
   1148
   1149	offset = offset * 2 / 16384;
   1150
   1151	if (ter_state->mode == FE_TER_MODE_2K)
   1152		offset = (offset * 4464) / 1000;/*** 1 FFT BIN=4.464khz***/
   1153	else if (ter_state->mode == FE_TER_MODE_4K)
   1154		offset = (offset * 223) / 100;/*** 1 FFT BIN=2.23khz***/
   1155	else  if (ter_state->mode == FE_TER_MODE_8K)
   1156		offset = (offset * 111) / 100;/*** 1 FFT BIN=1.1khz***/
   1157
   1158	if (stv0367_readbits(state, F367TER_PPM_INVSEL) == 1) {
   1159		if ((stv0367_readbits(state, F367TER_INV_SPECTR) ==
   1160				(stv0367_readbits(state,
   1161					F367TER_STATUS_INV_SPECRUM) == 1)))
   1162			offset = offset * -1;
   1163	}
   1164
   1165	if (ter_state->bw == 6)
   1166		offset = (offset * 6) / 8;
   1167	else if (ter_state->bw == 7)
   1168		offset = (offset * 7) / 8;
   1169
   1170	ter_state->frequency += offset;
   1171
   1172	tempo = 10;  /* exit even if timing_offset stays null */
   1173	while ((timing_offset == 0) && (tempo > 0)) {
   1174		usleep_range(10000, 20000);	/*was 20ms  */
   1175		/* fine tuning of timing offset if required */
   1176		timing_offset = stv0367_readbits(state, F367TER_TRL_TOFFSET_LO)
   1177				+ 256 * stv0367_readbits(state,
   1178							F367TER_TRL_TOFFSET_HI);
   1179		if (timing_offset >= 32768)
   1180			timing_offset -= 65536;
   1181		trl_nomrate = (512 * stv0367_readbits(state,
   1182							F367TER_TRL_NOMRATE_HI)
   1183			+ stv0367_readbits(state, F367TER_TRL_NOMRATE_LO) * 2
   1184			+ stv0367_readbits(state, F367TER_TRL_NOMRATE_LSB));
   1185
   1186		timing_offset = ((signed)(1000000 / trl_nomrate) *
   1187							timing_offset) / 2048;
   1188		tempo--;
   1189	}
   1190
   1191	if (timing_offset <= 0) {
   1192		timing_offset = (timing_offset - 11) / 22;
   1193		step = -1;
   1194	} else {
   1195		timing_offset = (timing_offset + 11) / 22;
   1196		step = 1;
   1197	}
   1198
   1199	for (counter = 0; counter < abs(timing_offset); counter++) {
   1200		trl_nomrate += step;
   1201		stv0367_writebits(state, F367TER_TRL_NOMRATE_LSB,
   1202						trl_nomrate % 2);
   1203		stv0367_writebits(state, F367TER_TRL_NOMRATE_LO,
   1204						trl_nomrate / 2);
   1205		usleep_range(1000, 2000);
   1206	}
   1207
   1208	usleep_range(5000, 6000);
   1209	/* unlocks could happen in case of trl centring big step,
   1210	then a core off/on restarts demod */
   1211	u_var = stv0367_readbits(state, F367TER_LK);
   1212
   1213	if (!u_var) {
   1214		stv0367_writebits(state, F367TER_CORE_ACTIVE, 0);
   1215		msleep(20);
   1216		stv0367_writebits(state, F367TER_CORE_ACTIVE, 1);
   1217	}
   1218
   1219	return 0;
   1220}
   1221
   1222static int stv0367ter_set_frontend(struct dvb_frontend *fe)
   1223{
   1224	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
   1225	struct stv0367_state *state = fe->demodulator_priv;
   1226	struct stv0367ter_state *ter_state = state->ter_state;
   1227
   1228	/*u8 trials[2]; */
   1229	s8 num_trials, index;
   1230	u8 SenseTrials[] = { INVERSION_ON, INVERSION_OFF };
   1231
   1232	if (state->reinit_on_setfrontend)
   1233		stv0367ter_init(fe);
   1234
   1235	if (fe->ops.tuner_ops.set_params) {
   1236		if (state->use_i2c_gatectrl && fe->ops.i2c_gate_ctrl)
   1237			fe->ops.i2c_gate_ctrl(fe, 1);
   1238		fe->ops.tuner_ops.set_params(fe);
   1239		if (state->use_i2c_gatectrl && fe->ops.i2c_gate_ctrl)
   1240			fe->ops.i2c_gate_ctrl(fe, 0);
   1241	}
   1242
   1243	switch (p->transmission_mode) {
   1244	default:
   1245	case TRANSMISSION_MODE_AUTO:
   1246	case TRANSMISSION_MODE_2K:
   1247		ter_state->mode = FE_TER_MODE_2K;
   1248		break;
   1249/*	case TRANSMISSION_MODE_4K:
   1250		pLook.mode = FE_TER_MODE_4K;
   1251		break;*/
   1252	case TRANSMISSION_MODE_8K:
   1253		ter_state->mode = FE_TER_MODE_8K;
   1254		break;
   1255	}
   1256
   1257	switch (p->guard_interval) {
   1258	default:
   1259	case GUARD_INTERVAL_1_32:
   1260	case GUARD_INTERVAL_1_16:
   1261	case GUARD_INTERVAL_1_8:
   1262	case GUARD_INTERVAL_1_4:
   1263		ter_state->guard = p->guard_interval;
   1264		break;
   1265	case GUARD_INTERVAL_AUTO:
   1266		ter_state->guard = GUARD_INTERVAL_1_32;
   1267		break;
   1268	}
   1269
   1270	switch (p->bandwidth_hz) {
   1271	case 6000000:
   1272		ter_state->bw = FE_TER_CHAN_BW_6M;
   1273		break;
   1274	case 7000000:
   1275		ter_state->bw = FE_TER_CHAN_BW_7M;
   1276		break;
   1277	case 8000000:
   1278	default:
   1279		ter_state->bw = FE_TER_CHAN_BW_8M;
   1280	}
   1281
   1282	ter_state->hierarchy = FE_TER_HIER_NONE;
   1283
   1284	switch (p->inversion) {
   1285	case INVERSION_OFF:
   1286	case INVERSION_ON:
   1287		num_trials = 1;
   1288		break;
   1289	default:
   1290		num_trials = 2;
   1291		if (ter_state->first_lock)
   1292			num_trials = 1;
   1293		break;
   1294	}
   1295
   1296	ter_state->state = FE_TER_NOLOCK;
   1297	index = 0;
   1298
   1299	while (((index) < num_trials) && (ter_state->state != FE_TER_LOCKOK)) {
   1300		if (!ter_state->first_lock) {
   1301			if (p->inversion == INVERSION_AUTO)
   1302				ter_state->sense = SenseTrials[index];
   1303
   1304		}
   1305		stv0367ter_algo(fe);
   1306
   1307		if ((ter_state->state == FE_TER_LOCKOK) &&
   1308				(p->inversion == INVERSION_AUTO) &&
   1309								(index == 1)) {
   1310			/* invert spectrum sense */
   1311			SenseTrials[index] = SenseTrials[0];
   1312			SenseTrials[(index + 1) % 2] = (SenseTrials[1] + 1) % 2;
   1313		}
   1314
   1315		index++;
   1316	}
   1317
   1318	return 0;
   1319}
   1320
   1321static int stv0367ter_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
   1322{
   1323	struct stv0367_state *state = fe->demodulator_priv;
   1324	struct stv0367ter_state *ter_state = state->ter_state;
   1325	u32 errs = 0;
   1326
   1327	/*wait for counting completion*/
   1328	if (stv0367_readbits(state, F367TER_SFERRC_OLDVALUE) == 0) {
   1329		errs =
   1330			((u32)stv0367_readbits(state, F367TER_ERR_CNT1)
   1331			* (1 << 16))
   1332			+ ((u32)stv0367_readbits(state, F367TER_ERR_CNT1_HI)
   1333			* (1 << 8))
   1334			+ ((u32)stv0367_readbits(state, F367TER_ERR_CNT1_LO));
   1335		ter_state->ucblocks = errs;
   1336	}
   1337
   1338	(*ucblocks) = ter_state->ucblocks;
   1339
   1340	return 0;
   1341}
   1342
   1343static int stv0367ter_get_frontend(struct dvb_frontend *fe,
   1344				   struct dtv_frontend_properties *p)
   1345{
   1346	struct stv0367_state *state = fe->demodulator_priv;
   1347	struct stv0367ter_state *ter_state = state->ter_state;
   1348	enum stv0367_ter_mode mode;
   1349	int constell = 0,/* snr = 0,*/ Data = 0;
   1350
   1351	p->frequency = stv0367_get_tuner_freq(fe);
   1352	if ((int)p->frequency < 0)
   1353		p->frequency = -p->frequency;
   1354
   1355	constell = stv0367_readbits(state, F367TER_TPS_CONST);
   1356	if (constell == 0)
   1357		p->modulation = QPSK;
   1358	else if (constell == 1)
   1359		p->modulation = QAM_16;
   1360	else
   1361		p->modulation = QAM_64;
   1362
   1363	p->inversion = stv0367_readbits(state, F367TER_INV_SPECTR);
   1364
   1365	/* Get the Hierarchical mode */
   1366	Data = stv0367_readbits(state, F367TER_TPS_HIERMODE);
   1367
   1368	switch (Data) {
   1369	case 0:
   1370		p->hierarchy = HIERARCHY_NONE;
   1371		break;
   1372	case 1:
   1373		p->hierarchy = HIERARCHY_1;
   1374		break;
   1375	case 2:
   1376		p->hierarchy = HIERARCHY_2;
   1377		break;
   1378	case 3:
   1379		p->hierarchy = HIERARCHY_4;
   1380		break;
   1381	default:
   1382		p->hierarchy = HIERARCHY_AUTO;
   1383		break; /* error */
   1384	}
   1385
   1386	/* Get the FEC Rate */
   1387	if (ter_state->hierarchy == FE_TER_HIER_LOW_PRIO)
   1388		Data = stv0367_readbits(state, F367TER_TPS_LPCODE);
   1389	else
   1390		Data = stv0367_readbits(state, F367TER_TPS_HPCODE);
   1391
   1392	switch (Data) {
   1393	case 0:
   1394		p->code_rate_HP = FEC_1_2;
   1395		break;
   1396	case 1:
   1397		p->code_rate_HP = FEC_2_3;
   1398		break;
   1399	case 2:
   1400		p->code_rate_HP = FEC_3_4;
   1401		break;
   1402	case 3:
   1403		p->code_rate_HP = FEC_5_6;
   1404		break;
   1405	case 4:
   1406		p->code_rate_HP = FEC_7_8;
   1407		break;
   1408	default:
   1409		p->code_rate_HP = FEC_AUTO;
   1410		break; /* error */
   1411	}
   1412
   1413	mode = stv0367_readbits(state, F367TER_SYR_MODE);
   1414
   1415	switch (mode) {
   1416	case FE_TER_MODE_2K:
   1417		p->transmission_mode = TRANSMISSION_MODE_2K;
   1418		break;
   1419/*	case FE_TER_MODE_4K:
   1420		p->transmission_mode = TRANSMISSION_MODE_4K;
   1421		break;*/
   1422	case FE_TER_MODE_8K:
   1423		p->transmission_mode = TRANSMISSION_MODE_8K;
   1424		break;
   1425	default:
   1426		p->transmission_mode = TRANSMISSION_MODE_AUTO;
   1427	}
   1428
   1429	p->guard_interval = stv0367_readbits(state, F367TER_SYR_GUARD);
   1430
   1431	return 0;
   1432}
   1433
   1434static u32 stv0367ter_snr_readreg(struct dvb_frontend *fe)
   1435{
   1436	struct stv0367_state *state = fe->demodulator_priv;
   1437	u32 snru32 = 0;
   1438	int cpt = 0;
   1439	u8 cut = stv0367_readbits(state, F367TER_IDENTIFICATIONREG);
   1440
   1441	while (cpt < 10) {
   1442		usleep_range(2000, 3000);
   1443		if (cut == 0x50) /*cut 1.0 cut 1.1*/
   1444			snru32 += stv0367_readbits(state, F367TER_CHCSNR) / 4;
   1445		else /*cu2.0*/
   1446			snru32 += 125 * stv0367_readbits(state, F367TER_CHCSNR);
   1447
   1448		cpt++;
   1449	}
   1450	snru32 /= 10;/*average on 10 values*/
   1451
   1452	return snru32;
   1453}
   1454
   1455static int stv0367ter_read_snr(struct dvb_frontend *fe, u16 *snr)
   1456{
   1457	u32 snrval = stv0367ter_snr_readreg(fe);
   1458
   1459	*snr = snrval / 1000;
   1460
   1461	return 0;
   1462}
   1463
   1464#if 0
   1465static int stv0367ter_status(struct dvb_frontend *fe)
   1466{
   1467
   1468	struct stv0367_state *state = fe->demodulator_priv;
   1469	struct stv0367ter_state *ter_state = state->ter_state;
   1470	int locked = FALSE;
   1471
   1472	locked = (stv0367_readbits(state, F367TER_LK));
   1473	if (!locked)
   1474		ter_state->unlock_counter += 1;
   1475	else
   1476		ter_state->unlock_counter = 0;
   1477
   1478	if (ter_state->unlock_counter > 2) {
   1479		if (!stv0367_readbits(state, F367TER_TPS_LOCK) ||
   1480				(!stv0367_readbits(state, F367TER_LK))) {
   1481			stv0367_writebits(state, F367TER_CORE_ACTIVE, 0);
   1482			usleep_range(2000, 3000);
   1483			stv0367_writebits(state, F367TER_CORE_ACTIVE, 1);
   1484			msleep(350);
   1485			locked = (stv0367_readbits(state, F367TER_TPS_LOCK)) &&
   1486					(stv0367_readbits(state, F367TER_LK));
   1487		}
   1488
   1489	}
   1490
   1491	return locked;
   1492}
   1493#endif
   1494static int stv0367ter_read_status(struct dvb_frontend *fe,
   1495				  enum fe_status *status)
   1496{
   1497	struct stv0367_state *state = fe->demodulator_priv;
   1498
   1499	dprintk("%s:\n", __func__);
   1500
   1501	*status = 0;
   1502
   1503	if (stv0367_readbits(state, F367TER_LK)) {
   1504		*status = FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI
   1505			  | FE_HAS_SYNC | FE_HAS_LOCK;
   1506		dprintk("%s: stv0367 has locked\n", __func__);
   1507	}
   1508
   1509	return 0;
   1510}
   1511
   1512static int stv0367ter_read_ber(struct dvb_frontend *fe, u32 *ber)
   1513{
   1514	struct stv0367_state *state = fe->demodulator_priv;
   1515	struct stv0367ter_state *ter_state = state->ter_state;
   1516	u32 Errors = 0, tber = 0, temporary = 0;
   1517	int abc = 0, def = 0;
   1518
   1519
   1520	/*wait for counting completion*/
   1521	if (stv0367_readbits(state, F367TER_SFERRC_OLDVALUE) == 0)
   1522		Errors = ((u32)stv0367_readbits(state, F367TER_SFEC_ERR_CNT)
   1523			* (1 << 16))
   1524			+ ((u32)stv0367_readbits(state, F367TER_SFEC_ERR_CNT_HI)
   1525			* (1 << 8))
   1526			+ ((u32)stv0367_readbits(state,
   1527						F367TER_SFEC_ERR_CNT_LO));
   1528	/*measurement not completed, load previous value*/
   1529	else {
   1530		tber = ter_state->pBER;
   1531		return 0;
   1532	}
   1533
   1534	abc = stv0367_readbits(state, F367TER_SFEC_ERR_SOURCE);
   1535	def = stv0367_readbits(state, F367TER_SFEC_NUM_EVENT);
   1536
   1537	if (Errors == 0) {
   1538		tber = 0;
   1539	} else if (abc == 0x7) {
   1540		if (Errors <= 4) {
   1541			temporary = (Errors * 1000000000) / (8 * (1 << 14));
   1542		} else if (Errors <= 42) {
   1543			temporary = (Errors * 100000000) / (8 * (1 << 14));
   1544			temporary = temporary * 10;
   1545		} else if (Errors <= 429) {
   1546			temporary = (Errors * 10000000) / (8 * (1 << 14));
   1547			temporary = temporary * 100;
   1548		} else if (Errors <= 4294) {
   1549			temporary = (Errors * 1000000) / (8 * (1 << 14));
   1550			temporary = temporary * 1000;
   1551		} else if (Errors <= 42949) {
   1552			temporary = (Errors * 100000) / (8 * (1 << 14));
   1553			temporary = temporary * 10000;
   1554		} else if (Errors <= 429496) {
   1555			temporary = (Errors * 10000) / (8 * (1 << 14));
   1556			temporary = temporary * 100000;
   1557		} else { /*if (Errors<4294967) 2^22 max error*/
   1558			temporary = (Errors * 1000) / (8 * (1 << 14));
   1559			temporary = temporary * 100000;	/* still to *10 */
   1560		}
   1561
   1562		/* Byte error*/
   1563		if (def == 2)
   1564			/*tber=Errors/(8*(1 <<14));*/
   1565			tber = temporary;
   1566		else if (def == 3)
   1567			/*tber=Errors/(8*(1 <<16));*/
   1568			tber = temporary / 4;
   1569		else if (def == 4)
   1570			/*tber=Errors/(8*(1 <<18));*/
   1571			tber = temporary / 16;
   1572		else if (def == 5)
   1573			/*tber=Errors/(8*(1 <<20));*/
   1574			tber = temporary / 64;
   1575		else if (def == 6)
   1576			/*tber=Errors/(8*(1 <<22));*/
   1577			tber = temporary / 256;
   1578		else
   1579			/* should not pass here*/
   1580			tber = 0;
   1581
   1582		if ((Errors < 4294967) && (Errors > 429496))
   1583			tber *= 10;
   1584
   1585	}
   1586
   1587	/* save actual value */
   1588	ter_state->pBER = tber;
   1589
   1590	(*ber) = tber;
   1591
   1592	return 0;
   1593}
   1594#if 0
   1595static u32 stv0367ter_get_per(struct stv0367_state *state)
   1596{
   1597	struct stv0367ter_state *ter_state = state->ter_state;
   1598	u32 Errors = 0, Per = 0, temporary = 0;
   1599	int abc = 0, def = 0, cpt = 0;
   1600
   1601	while (((stv0367_readbits(state, F367TER_SFERRC_OLDVALUE) == 1) &&
   1602			(cpt < 400)) || ((Errors == 0) && (cpt < 400))) {
   1603		usleep_range(1000, 2000);
   1604		Errors = ((u32)stv0367_readbits(state, F367TER_ERR_CNT1)
   1605			* (1 << 16))
   1606			+ ((u32)stv0367_readbits(state, F367TER_ERR_CNT1_HI)
   1607			* (1 << 8))
   1608			+ ((u32)stv0367_readbits(state, F367TER_ERR_CNT1_LO));
   1609		cpt++;
   1610	}
   1611	abc = stv0367_readbits(state, F367TER_ERR_SRC1);
   1612	def = stv0367_readbits(state, F367TER_NUM_EVT1);
   1613
   1614	if (Errors == 0)
   1615		Per = 0;
   1616	else if (abc == 0x9) {
   1617		if (Errors <= 4) {
   1618			temporary = (Errors * 1000000000) / (8 * (1 << 8));
   1619		} else if (Errors <= 42) {
   1620			temporary = (Errors * 100000000) / (8 * (1 << 8));
   1621			temporary = temporary * 10;
   1622		} else if (Errors <= 429) {
   1623			temporary = (Errors * 10000000) / (8 * (1 << 8));
   1624			temporary = temporary * 100;
   1625		} else if (Errors <= 4294) {
   1626			temporary = (Errors * 1000000) / (8 * (1 << 8));
   1627			temporary = temporary * 1000;
   1628		} else if (Errors <= 42949) {
   1629			temporary = (Errors * 100000) / (8 * (1 << 8));
   1630			temporary = temporary * 10000;
   1631		} else { /*if(Errors<=429496)  2^16 errors max*/
   1632			temporary = (Errors * 10000) / (8 * (1 << 8));
   1633			temporary = temporary * 100000;
   1634		}
   1635
   1636		/* pkt error*/
   1637		if (def == 2)
   1638			/*Per=Errors/(1 << 8);*/
   1639			Per = temporary;
   1640		else if (def == 3)
   1641			/*Per=Errors/(1 << 10);*/
   1642			Per = temporary / 4;
   1643		else if (def == 4)
   1644			/*Per=Errors/(1 << 12);*/
   1645			Per = temporary / 16;
   1646		else if (def == 5)
   1647			/*Per=Errors/(1 << 14);*/
   1648			Per = temporary / 64;
   1649		else if (def == 6)
   1650			/*Per=Errors/(1 << 16);*/
   1651			Per = temporary / 256;
   1652		else
   1653			Per = 0;
   1654
   1655	}
   1656	/* save actual value */
   1657	ter_state->pPER = Per;
   1658
   1659	return Per;
   1660}
   1661#endif
   1662static int stv0367_get_tune_settings(struct dvb_frontend *fe,
   1663					struct dvb_frontend_tune_settings
   1664					*fe_tune_settings)
   1665{
   1666	fe_tune_settings->min_delay_ms = 1000;
   1667	fe_tune_settings->step_size = 0;
   1668	fe_tune_settings->max_drift = 0;
   1669
   1670	return 0;
   1671}
   1672
   1673static void stv0367_release(struct dvb_frontend *fe)
   1674{
   1675	struct stv0367_state *state = fe->demodulator_priv;
   1676
   1677	kfree(state->ter_state);
   1678	kfree(state->cab_state);
   1679	kfree(state);
   1680}
   1681
   1682static const struct dvb_frontend_ops stv0367ter_ops = {
   1683	.delsys = { SYS_DVBT },
   1684	.info = {
   1685		.name			= "ST STV0367 DVB-T",
   1686		.frequency_min_hz	=  47 * MHz,
   1687		.frequency_max_hz	= 862 * MHz,
   1688		.frequency_stepsize_hz	= 15625,
   1689		.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |
   1690			FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
   1691			FE_CAN_FEC_AUTO |
   1692			FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
   1693			FE_CAN_QAM_128 | FE_CAN_QAM_256 | FE_CAN_QAM_AUTO |
   1694			FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_RECOVER |
   1695			FE_CAN_INVERSION_AUTO |
   1696			FE_CAN_MUTE_TS
   1697	},
   1698	.release = stv0367_release,
   1699	.init = stv0367ter_init,
   1700	.sleep = stv0367ter_sleep,
   1701	.i2c_gate_ctrl = stv0367ter_gate_ctrl,
   1702	.set_frontend = stv0367ter_set_frontend,
   1703	.get_frontend = stv0367ter_get_frontend,
   1704	.get_tune_settings = stv0367_get_tune_settings,
   1705	.read_status = stv0367ter_read_status,
   1706	.read_ber = stv0367ter_read_ber,/* too slow */
   1707/*	.read_signal_strength = stv0367_read_signal_strength,*/
   1708	.read_snr = stv0367ter_read_snr,
   1709	.read_ucblocks = stv0367ter_read_ucblocks,
   1710};
   1711
   1712struct dvb_frontend *stv0367ter_attach(const struct stv0367_config *config,
   1713				   struct i2c_adapter *i2c)
   1714{
   1715	struct stv0367_state *state = NULL;
   1716	struct stv0367ter_state *ter_state = NULL;
   1717
   1718	/* allocate memory for the internal state */
   1719	state = kzalloc(sizeof(struct stv0367_state), GFP_KERNEL);
   1720	if (state == NULL)
   1721		goto error;
   1722	ter_state = kzalloc(sizeof(struct stv0367ter_state), GFP_KERNEL);
   1723	if (ter_state == NULL)
   1724		goto error;
   1725
   1726	/* setup the state */
   1727	state->i2c = i2c;
   1728	state->config = config;
   1729	state->ter_state = ter_state;
   1730	state->fe.ops = stv0367ter_ops;
   1731	state->fe.demodulator_priv = state;
   1732	state->chip_id = stv0367_readreg(state, 0xf000);
   1733
   1734	/* demod operation options */
   1735	state->use_i2c_gatectrl = 1;
   1736	state->deftabs = STV0367_DEFTAB_GENERIC;
   1737	state->reinit_on_setfrontend = 1;
   1738	state->auto_if_khz = 0;
   1739
   1740	dprintk("%s: chip_id = 0x%x\n", __func__, state->chip_id);
   1741
   1742	/* check if the demod is there */
   1743	if ((state->chip_id != 0x50) && (state->chip_id != 0x60))
   1744		goto error;
   1745
   1746	return &state->fe;
   1747
   1748error:
   1749	kfree(ter_state);
   1750	kfree(state);
   1751	return NULL;
   1752}
   1753EXPORT_SYMBOL(stv0367ter_attach);
   1754
   1755static int stv0367cab_gate_ctrl(struct dvb_frontend *fe, int enable)
   1756{
   1757	struct stv0367_state *state = fe->demodulator_priv;
   1758
   1759	dprintk("%s:\n", __func__);
   1760
   1761	stv0367_writebits(state, F367CAB_I2CT_ON, (enable > 0) ? 1 : 0);
   1762
   1763	return 0;
   1764}
   1765
   1766static u32 stv0367cab_get_mclk(struct dvb_frontend *fe, u32 ExtClk_Hz)
   1767{
   1768	struct stv0367_state *state = fe->demodulator_priv;
   1769	u32 mclk_Hz = 0;/* master clock frequency (Hz) */
   1770	u32 M, N, P;
   1771
   1772
   1773	if (stv0367_readbits(state, F367CAB_BYPASS_PLLXN) == 0) {
   1774		N = (u32)stv0367_readbits(state, F367CAB_PLL_NDIV);
   1775		if (N == 0)
   1776			N = N + 1;
   1777
   1778		M = (u32)stv0367_readbits(state, F367CAB_PLL_MDIV);
   1779		if (M == 0)
   1780			M = M + 1;
   1781
   1782		P = (u32)stv0367_readbits(state, F367CAB_PLL_PDIV);
   1783
   1784		if (P > 5)
   1785			P = 5;
   1786
   1787		mclk_Hz = ((ExtClk_Hz / 2) * N) / (M * (1 << P));
   1788		dprintk("stv0367cab_get_mclk BYPASS_PLLXN mclk_Hz=%d\n",
   1789								mclk_Hz);
   1790	} else
   1791		mclk_Hz = ExtClk_Hz;
   1792
   1793	dprintk("stv0367cab_get_mclk final mclk_Hz=%d\n", mclk_Hz);
   1794
   1795	return mclk_Hz;
   1796}
   1797
   1798static u32 stv0367cab_get_adc_freq(struct dvb_frontend *fe, u32 ExtClk_Hz)
   1799{
   1800	return stv0367cab_get_mclk(fe, ExtClk_Hz);
   1801}
   1802
   1803static enum stv0367cab_mod stv0367cab_SetQamSize(struct stv0367_state *state,
   1804						 u32 SymbolRate,
   1805						 enum stv0367cab_mod QAMSize)
   1806{
   1807	/* Set QAM size */
   1808	stv0367_writebits(state, F367CAB_QAM_MODE, QAMSize);
   1809
   1810	/* Set Registers settings specific to the QAM size */
   1811	switch (QAMSize) {
   1812	case FE_CAB_MOD_QAM4:
   1813		stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
   1814		break;
   1815	case FE_CAB_MOD_QAM16:
   1816		stv0367_writereg(state, R367CAB_AGC_PWR_REF_L, 0x64);
   1817		stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
   1818		stv0367_writereg(state, R367CAB_FSM_STATE, 0x90);
   1819		stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
   1820		stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa7);
   1821		stv0367_writereg(state, R367CAB_EQU_CRL_LD_SEN, 0x95);
   1822		stv0367_writereg(state, R367CAB_EQU_CRL_LIMITER, 0x40);
   1823		stv0367_writereg(state, R367CAB_EQU_PNT_GAIN, 0x8a);
   1824		break;
   1825	case FE_CAB_MOD_QAM32:
   1826		stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
   1827		stv0367_writereg(state, R367CAB_AGC_PWR_REF_L, 0x6e);
   1828		stv0367_writereg(state, R367CAB_FSM_STATE, 0xb0);
   1829		stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
   1830		stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xb7);
   1831		stv0367_writereg(state, R367CAB_EQU_CRL_LD_SEN, 0x9d);
   1832		stv0367_writereg(state, R367CAB_EQU_CRL_LIMITER, 0x7f);
   1833		stv0367_writereg(state, R367CAB_EQU_PNT_GAIN, 0xa7);
   1834		break;
   1835	case FE_CAB_MOD_QAM64:
   1836		stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x82);
   1837		stv0367_writereg(state, R367CAB_AGC_PWR_REF_L, 0x5a);
   1838		if (SymbolRate > 4500000) {
   1839			stv0367_writereg(state, R367CAB_FSM_STATE, 0xb0);
   1840			stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
   1841			stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa5);
   1842		} else if (SymbolRate > 2500000) {
   1843			stv0367_writereg(state, R367CAB_FSM_STATE, 0xa0);
   1844			stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
   1845			stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa6);
   1846		} else {
   1847			stv0367_writereg(state, R367CAB_FSM_STATE, 0xa0);
   1848			stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xd1);
   1849			stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa7);
   1850		}
   1851		stv0367_writereg(state, R367CAB_EQU_CRL_LD_SEN, 0x95);
   1852		stv0367_writereg(state, R367CAB_EQU_CRL_LIMITER, 0x40);
   1853		stv0367_writereg(state, R367CAB_EQU_PNT_GAIN, 0x99);
   1854		break;
   1855	case FE_CAB_MOD_QAM128:
   1856		stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
   1857		stv0367_writereg(state, R367CAB_AGC_PWR_REF_L, 0x76);
   1858		stv0367_writereg(state, R367CAB_FSM_STATE, 0x90);
   1859		stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xb1);
   1860		if (SymbolRate > 4500000)
   1861			stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa7);
   1862		else if (SymbolRate > 2500000)
   1863			stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa6);
   1864		else
   1865			stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0x97);
   1866
   1867		stv0367_writereg(state, R367CAB_EQU_CRL_LD_SEN, 0x8e);
   1868		stv0367_writereg(state, R367CAB_EQU_CRL_LIMITER, 0x7f);
   1869		stv0367_writereg(state, R367CAB_EQU_PNT_GAIN, 0xa7);
   1870		break;
   1871	case FE_CAB_MOD_QAM256:
   1872		stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x94);
   1873		stv0367_writereg(state, R367CAB_AGC_PWR_REF_L, 0x5a);
   1874		stv0367_writereg(state, R367CAB_FSM_STATE, 0xa0);
   1875		if (SymbolRate > 4500000)
   1876			stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
   1877		else if (SymbolRate > 2500000)
   1878			stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
   1879		else
   1880			stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xd1);
   1881
   1882		stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa7);
   1883		stv0367_writereg(state, R367CAB_EQU_CRL_LD_SEN, 0x85);
   1884		stv0367_writereg(state, R367CAB_EQU_CRL_LIMITER, 0x40);
   1885		stv0367_writereg(state, R367CAB_EQU_PNT_GAIN, 0xa7);
   1886		break;
   1887	case FE_CAB_MOD_QAM512:
   1888		stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
   1889		break;
   1890	case FE_CAB_MOD_QAM1024:
   1891		stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
   1892		break;
   1893	default:
   1894		break;
   1895	}
   1896
   1897	return QAMSize;
   1898}
   1899
   1900static u32 stv0367cab_set_derot_freq(struct stv0367_state *state,
   1901					u32 adc_hz, s32 derot_hz)
   1902{
   1903	u32 sampled_if = 0;
   1904	u32 adc_khz;
   1905
   1906	adc_khz = adc_hz / 1000;
   1907
   1908	dprintk("%s: adc_hz=%d derot_hz=%d\n", __func__, adc_hz, derot_hz);
   1909
   1910	if (adc_khz != 0) {
   1911		if (derot_hz < 1000000)
   1912			derot_hz = adc_hz / 4; /* ZIF operation */
   1913		if (derot_hz > adc_hz)
   1914			derot_hz = derot_hz - adc_hz;
   1915		sampled_if = (u32)derot_hz / 1000;
   1916		sampled_if *= 32768;
   1917		sampled_if /= adc_khz;
   1918		sampled_if *= 256;
   1919	}
   1920
   1921	if (sampled_if > 8388607)
   1922		sampled_if = 8388607;
   1923
   1924	dprintk("%s: sampled_if=0x%x\n", __func__, sampled_if);
   1925
   1926	stv0367_writereg(state, R367CAB_MIX_NCO_LL, sampled_if);
   1927	stv0367_writereg(state, R367CAB_MIX_NCO_HL, (sampled_if >> 8));
   1928	stv0367_writebits(state, F367CAB_MIX_NCO_INC_HH, (sampled_if >> 16));
   1929
   1930	return derot_hz;
   1931}
   1932
   1933static u32 stv0367cab_get_derot_freq(struct stv0367_state *state, u32 adc_hz)
   1934{
   1935	u32 sampled_if;
   1936
   1937	sampled_if = stv0367_readbits(state, F367CAB_MIX_NCO_INC_LL) +
   1938			(stv0367_readbits(state, F367CAB_MIX_NCO_INC_HL) << 8) +
   1939			(stv0367_readbits(state, F367CAB_MIX_NCO_INC_HH) << 16);
   1940
   1941	sampled_if /= 256;
   1942	sampled_if *= (adc_hz / 1000);
   1943	sampled_if += 1;
   1944	sampled_if /= 32768;
   1945
   1946	return sampled_if;
   1947}
   1948
   1949static u32 stv0367cab_set_srate(struct stv0367_state *state, u32 adc_hz,
   1950			u32 mclk_hz, u32 SymbolRate,
   1951			enum stv0367cab_mod QAMSize)
   1952{
   1953	u32 QamSizeCorr = 0;
   1954	u32 u32_tmp = 0, u32_tmp1 = 0;
   1955	u32 adp_khz;
   1956
   1957	dprintk("%s:\n", __func__);
   1958
   1959	/* Set Correction factor of SRC gain */
   1960	switch (QAMSize) {
   1961	case FE_CAB_MOD_QAM4:
   1962		QamSizeCorr = 1110;
   1963		break;
   1964	case FE_CAB_MOD_QAM16:
   1965		QamSizeCorr = 1032;
   1966		break;
   1967	case FE_CAB_MOD_QAM32:
   1968		QamSizeCorr =  954;
   1969		break;
   1970	case FE_CAB_MOD_QAM64:
   1971		QamSizeCorr =  983;
   1972		break;
   1973	case FE_CAB_MOD_QAM128:
   1974		QamSizeCorr =  957;
   1975		break;
   1976	case FE_CAB_MOD_QAM256:
   1977		QamSizeCorr =  948;
   1978		break;
   1979	case FE_CAB_MOD_QAM512:
   1980		QamSizeCorr =    0;
   1981		break;
   1982	case FE_CAB_MOD_QAM1024:
   1983		QamSizeCorr =  944;
   1984		break;
   1985	default:
   1986		break;
   1987	}
   1988
   1989	/* Transfer ratio calculation */
   1990	if (adc_hz != 0) {
   1991		u32_tmp = 256 * SymbolRate;
   1992		u32_tmp = u32_tmp / adc_hz;
   1993	}
   1994	stv0367_writereg(state, R367CAB_EQU_CRL_TFR, (u8)u32_tmp);
   1995
   1996	/* Symbol rate and SRC gain calculation */
   1997	adp_khz = (mclk_hz >> 1) / 1000;/* TRL works at half the system clock */
   1998	if (adp_khz != 0) {
   1999		u32_tmp = SymbolRate;
   2000		u32_tmp1 = SymbolRate;
   2001
   2002		if (u32_tmp < 2097152) { /* 2097152 = 2^21 */
   2003			/* Symbol rate calculation */
   2004			u32_tmp *= 2048; /* 2048 = 2^11 */
   2005			u32_tmp = u32_tmp / adp_khz;
   2006			u32_tmp = u32_tmp * 16384; /* 16384 = 2^14 */
   2007			u32_tmp /= 125 ; /* 125 = 1000/2^3 */
   2008			u32_tmp = u32_tmp * 8; /* 8 = 2^3 */
   2009
   2010			/* SRC Gain Calculation */
   2011			u32_tmp1 *= 2048; /* *2*2^10 */
   2012			u32_tmp1 /= 439; /* *2/878 */
   2013			u32_tmp1 *= 256; /* *2^8 */
   2014			u32_tmp1 = u32_tmp1 / adp_khz; /* /(AdpClk in kHz) */
   2015			u32_tmp1 *= QamSizeCorr * 9; /* *1000*corr factor */
   2016			u32_tmp1 = u32_tmp1 / 10000000;
   2017
   2018		} else if (u32_tmp < 4194304) { /* 4194304 = 2**22 */
   2019			/* Symbol rate calculation */
   2020			u32_tmp *= 1024 ; /* 1024 = 2**10 */
   2021			u32_tmp = u32_tmp / adp_khz;
   2022			u32_tmp = u32_tmp * 16384; /* 16384 = 2**14 */
   2023			u32_tmp /= 125 ; /* 125 = 1000/2**3 */
   2024			u32_tmp = u32_tmp * 16; /* 16 = 2**4 */
   2025
   2026			/* SRC Gain Calculation */
   2027			u32_tmp1 *= 1024; /* *2*2^9 */
   2028			u32_tmp1 /= 439; /* *2/878 */
   2029			u32_tmp1 *= 256; /* *2^8 */
   2030			u32_tmp1 = u32_tmp1 / adp_khz; /* /(AdpClk in kHz)*/
   2031			u32_tmp1 *= QamSizeCorr * 9; /* *1000*corr factor */
   2032			u32_tmp1 = u32_tmp1 / 5000000;
   2033		} else if (u32_tmp < 8388607) { /* 8388607 = 2**23 */
   2034			/* Symbol rate calculation */
   2035			u32_tmp *= 512 ; /* 512 = 2**9 */
   2036			u32_tmp = u32_tmp / adp_khz;
   2037			u32_tmp = u32_tmp * 16384; /* 16384 = 2**14 */
   2038			u32_tmp /= 125 ; /* 125 = 1000/2**3 */
   2039			u32_tmp = u32_tmp * 32; /* 32 = 2**5 */
   2040
   2041			/* SRC Gain Calculation */
   2042			u32_tmp1 *= 512; /* *2*2^8 */
   2043			u32_tmp1 /= 439; /* *2/878 */
   2044			u32_tmp1 *= 256; /* *2^8 */
   2045			u32_tmp1 = u32_tmp1 / adp_khz; /* /(AdpClk in kHz) */
   2046			u32_tmp1 *= QamSizeCorr * 9; /* *1000*corr factor */
   2047			u32_tmp1 = u32_tmp1 / 2500000;
   2048		} else {
   2049			/* Symbol rate calculation */
   2050			u32_tmp *= 256 ; /* 256 = 2**8 */
   2051			u32_tmp = u32_tmp / adp_khz;
   2052			u32_tmp = u32_tmp * 16384; /* 16384 = 2**13 */
   2053			u32_tmp /= 125 ; /* 125 = 1000/2**3 */
   2054			u32_tmp = u32_tmp * 64; /* 64 = 2**6 */
   2055
   2056			/* SRC Gain Calculation */
   2057			u32_tmp1 *= 256; /* 2*2^7 */
   2058			u32_tmp1 /= 439; /* *2/878 */
   2059			u32_tmp1 *= 256; /* *2^8 */
   2060			u32_tmp1 = u32_tmp1 / adp_khz; /* /(AdpClk in kHz) */
   2061			u32_tmp1 *= QamSizeCorr * 9; /* *1000*corr factor */
   2062			u32_tmp1 = u32_tmp1 / 1250000;
   2063		}
   2064	}
   2065#if 0
   2066	/* Filters' coefficients are calculated and written
   2067	into registers only if the filters are enabled */
   2068	if (stv0367_readbits(state, F367CAB_ADJ_EN)) {
   2069		stv0367cab_SetIirAdjacentcoefficient(state, mclk_hz,
   2070								SymbolRate);
   2071		/* AllPass filter must be enabled
   2072		when the adjacents filter is used */
   2073		stv0367_writebits(state, F367CAB_ALLPASSFILT_EN, 1);
   2074		stv0367cab_SetAllPasscoefficient(state, mclk_hz, SymbolRate);
   2075	} else
   2076		/* AllPass filter must be disabled
   2077		when the adjacents filter is not used */
   2078#endif
   2079	stv0367_writebits(state, F367CAB_ALLPASSFILT_EN, 0);
   2080
   2081	stv0367_writereg(state, R367CAB_SRC_NCO_LL, u32_tmp);
   2082	stv0367_writereg(state, R367CAB_SRC_NCO_LH, (u32_tmp >> 8));
   2083	stv0367_writereg(state, R367CAB_SRC_NCO_HL, (u32_tmp >> 16));
   2084	stv0367_writereg(state, R367CAB_SRC_NCO_HH, (u32_tmp >> 24));
   2085
   2086	stv0367_writereg(state, R367CAB_IQDEM_GAIN_SRC_L, u32_tmp1 & 0x00ff);
   2087	stv0367_writebits(state, F367CAB_GAIN_SRC_HI, (u32_tmp1 >> 8) & 0x00ff);
   2088
   2089	return SymbolRate ;
   2090}
   2091
   2092static u32 stv0367cab_GetSymbolRate(struct stv0367_state *state, u32 mclk_hz)
   2093{
   2094	u32 regsym;
   2095	u32 adp_khz;
   2096
   2097	regsym = stv0367_readreg(state, R367CAB_SRC_NCO_LL) +
   2098		(stv0367_readreg(state, R367CAB_SRC_NCO_LH) << 8) +
   2099		(stv0367_readreg(state, R367CAB_SRC_NCO_HL) << 16) +
   2100		(stv0367_readreg(state, R367CAB_SRC_NCO_HH) << 24);
   2101
   2102	adp_khz = (mclk_hz >> 1) / 1000;/* TRL works at half the system clock */
   2103
   2104	if (regsym < 134217728) {		/* 134217728L = 2**27*/
   2105		regsym = regsym * 32;		/* 32 = 2**5 */
   2106		regsym = regsym / 32768;	/* 32768L = 2**15 */
   2107		regsym = adp_khz * regsym;	/* AdpClk in kHz */
   2108		regsym = regsym / 128;		/* 128 = 2**7 */
   2109		regsym *= 125 ;			/* 125 = 1000/2**3 */
   2110		regsym /= 2048 ;		/* 2048 = 2**11	*/
   2111	} else if (regsym < 268435456) {	/* 268435456L = 2**28 */
   2112		regsym = regsym * 16;		/* 16 = 2**4 */
   2113		regsym = regsym / 32768;	/* 32768L = 2**15 */
   2114		regsym = adp_khz * regsym;	/* AdpClk in kHz */
   2115		regsym = regsym / 128;		/* 128 = 2**7 */
   2116		regsym *= 125 ;			/* 125 = 1000/2**3*/
   2117		regsym /= 1024 ;		/* 256 = 2**10*/
   2118	} else if (regsym < 536870912) {	/* 536870912L = 2**29*/
   2119		regsym = regsym * 8;		/* 8 = 2**3 */
   2120		regsym = regsym / 32768;	/* 32768L = 2**15 */
   2121		regsym = adp_khz * regsym;	/* AdpClk in kHz */
   2122		regsym = regsym / 128;		/* 128 = 2**7 */
   2123		regsym *= 125 ;			/* 125 = 1000/2**3 */
   2124		regsym /= 512 ;			/* 128 = 2**9 */
   2125	} else {
   2126		regsym = regsym * 4;		/* 4 = 2**2 */
   2127		regsym = regsym / 32768;	/* 32768L = 2**15 */
   2128		regsym = adp_khz * regsym;	/* AdpClk in kHz */
   2129		regsym = regsym / 128;		/* 128 = 2**7 */
   2130		regsym *= 125 ;			/* 125 = 1000/2**3 */
   2131		regsym /= 256 ;			/* 64 = 2**8 */
   2132	}
   2133
   2134	return regsym;
   2135}
   2136
   2137static u32 stv0367cab_fsm_status(struct stv0367_state *state)
   2138{
   2139	return stv0367_readbits(state, F367CAB_FSM_STATUS);
   2140}
   2141
   2142static u32 stv0367cab_qamfec_lock(struct stv0367_state *state)
   2143{
   2144	return stv0367_readbits(state,
   2145		(state->cab_state->qamfec_status_reg ?
   2146		 state->cab_state->qamfec_status_reg :
   2147		 F367CAB_QAMFEC_LOCK));
   2148}
   2149
   2150static
   2151enum stv0367_cab_signal_type stv0367cab_fsm_signaltype(u32 qam_fsm_status)
   2152{
   2153	enum stv0367_cab_signal_type signaltype = FE_CAB_NOAGC;
   2154
   2155	switch (qam_fsm_status) {
   2156	case 1:
   2157		signaltype = FE_CAB_NOAGC;
   2158		break;
   2159	case 2:
   2160		signaltype = FE_CAB_NOTIMING;
   2161		break;
   2162	case 3:
   2163		signaltype = FE_CAB_TIMINGOK;
   2164		break;
   2165	case 4:
   2166		signaltype = FE_CAB_NOCARRIER;
   2167		break;
   2168	case 5:
   2169		signaltype = FE_CAB_CARRIEROK;
   2170		break;
   2171	case 7:
   2172		signaltype = FE_CAB_NOBLIND;
   2173		break;
   2174	case 8:
   2175		signaltype = FE_CAB_BLINDOK;
   2176		break;
   2177	case 10:
   2178		signaltype = FE_CAB_NODEMOD;
   2179		break;
   2180	case 11:
   2181		signaltype = FE_CAB_DEMODOK;
   2182		break;
   2183	case 12:
   2184		signaltype = FE_CAB_DEMODOK;
   2185		break;
   2186	case 13:
   2187		signaltype = FE_CAB_NODEMOD;
   2188		break;
   2189	case 14:
   2190		signaltype = FE_CAB_NOBLIND;
   2191		break;
   2192	case 15:
   2193		signaltype = FE_CAB_NOSIGNAL;
   2194		break;
   2195	default:
   2196		break;
   2197	}
   2198
   2199	return signaltype;
   2200}
   2201
   2202static int stv0367cab_read_status(struct dvb_frontend *fe,
   2203				  enum fe_status *status)
   2204{
   2205	struct stv0367_state *state = fe->demodulator_priv;
   2206
   2207	dprintk("%s:\n", __func__);
   2208
   2209	*status = 0;
   2210
   2211	/* update cab_state->state from QAM_FSM_STATUS */
   2212	state->cab_state->state = stv0367cab_fsm_signaltype(
   2213		stv0367cab_fsm_status(state));
   2214
   2215	if (stv0367cab_qamfec_lock(state)) {
   2216		*status = FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI
   2217			  | FE_HAS_SYNC | FE_HAS_LOCK;
   2218		dprintk("%s: stv0367 has locked\n", __func__);
   2219	} else {
   2220		if (state->cab_state->state > FE_CAB_NOSIGNAL)
   2221			*status |= FE_HAS_SIGNAL;
   2222
   2223		if (state->cab_state->state > FE_CAB_NOCARRIER)
   2224			*status |= FE_HAS_CARRIER;
   2225
   2226		if (state->cab_state->state >= FE_CAB_DEMODOK)
   2227			*status |= FE_HAS_VITERBI;
   2228
   2229		if (state->cab_state->state >= FE_CAB_DATAOK)
   2230			*status |= FE_HAS_SYNC;
   2231	}
   2232
   2233	return 0;
   2234}
   2235
   2236static int stv0367cab_standby(struct dvb_frontend *fe, u8 standby_on)
   2237{
   2238	struct stv0367_state *state = fe->demodulator_priv;
   2239
   2240	dprintk("%s:\n", __func__);
   2241
   2242	if (standby_on) {
   2243		stv0367_writebits(state, F367CAB_BYPASS_PLLXN, 0x03);
   2244		stv0367_writebits(state, F367CAB_STDBY_PLLXN, 0x01);
   2245		stv0367_writebits(state, F367CAB_STDBY, 1);
   2246		stv0367_writebits(state, F367CAB_STDBY_CORE, 1);
   2247		stv0367_writebits(state, F367CAB_EN_BUFFER_I, 0);
   2248		stv0367_writebits(state, F367CAB_EN_BUFFER_Q, 0);
   2249		stv0367_writebits(state, F367CAB_POFFQ, 1);
   2250		stv0367_writebits(state, F367CAB_POFFI, 1);
   2251	} else {
   2252		stv0367_writebits(state, F367CAB_STDBY_PLLXN, 0x00);
   2253		stv0367_writebits(state, F367CAB_BYPASS_PLLXN, 0x00);
   2254		stv0367_writebits(state, F367CAB_STDBY, 0);
   2255		stv0367_writebits(state, F367CAB_STDBY_CORE, 0);
   2256		stv0367_writebits(state, F367CAB_EN_BUFFER_I, 1);
   2257		stv0367_writebits(state, F367CAB_EN_BUFFER_Q, 1);
   2258		stv0367_writebits(state, F367CAB_POFFQ, 0);
   2259		stv0367_writebits(state, F367CAB_POFFI, 0);
   2260	}
   2261
   2262	return 0;
   2263}
   2264
   2265static int stv0367cab_sleep(struct dvb_frontend *fe)
   2266{
   2267	return stv0367cab_standby(fe, 1);
   2268}
   2269
   2270static int stv0367cab_init(struct dvb_frontend *fe)
   2271{
   2272	struct stv0367_state *state = fe->demodulator_priv;
   2273	struct stv0367cab_state *cab_state = state->cab_state;
   2274
   2275	dprintk("%s:\n", __func__);
   2276
   2277	stv0367_write_table(state,
   2278		stv0367_deftabs[state->deftabs][STV0367_TAB_CAB]);
   2279
   2280	switch (state->config->ts_mode) {
   2281	case STV0367_DVBCI_CLOCK:
   2282		dprintk("Setting TSMode = STV0367_DVBCI_CLOCK\n");
   2283		stv0367_writebits(state, F367CAB_OUTFORMAT, 0x03);
   2284		break;
   2285	case STV0367_SERIAL_PUNCT_CLOCK:
   2286	case STV0367_SERIAL_CONT_CLOCK:
   2287		stv0367_writebits(state, F367CAB_OUTFORMAT, 0x01);
   2288		break;
   2289	case STV0367_PARALLEL_PUNCT_CLOCK:
   2290	case STV0367_OUTPUTMODE_DEFAULT:
   2291		stv0367_writebits(state, F367CAB_OUTFORMAT, 0x00);
   2292		break;
   2293	}
   2294
   2295	switch (state->config->clk_pol) {
   2296	case STV0367_RISINGEDGE_CLOCK:
   2297		stv0367_writebits(state, F367CAB_CLK_POLARITY, 0x00);
   2298		break;
   2299	case STV0367_FALLINGEDGE_CLOCK:
   2300	case STV0367_CLOCKPOLARITY_DEFAULT:
   2301		stv0367_writebits(state, F367CAB_CLK_POLARITY, 0x01);
   2302		break;
   2303	}
   2304
   2305	stv0367_writebits(state, F367CAB_SYNC_STRIP, 0x00);
   2306
   2307	stv0367_writebits(state, F367CAB_CT_NBST, 0x01);
   2308
   2309	stv0367_writebits(state, F367CAB_TS_SWAP, 0x01);
   2310
   2311	stv0367_writebits(state, F367CAB_FIFO_BYPASS, 0x00);
   2312
   2313	stv0367_writereg(state, R367CAB_ANACTRL, 0x00);/*PLL enabled and used */
   2314
   2315	cab_state->mclk = stv0367cab_get_mclk(fe, state->config->xtal);
   2316	cab_state->adc_clk = stv0367cab_get_adc_freq(fe, state->config->xtal);
   2317
   2318	return 0;
   2319}
   2320static
   2321enum stv0367_cab_signal_type stv0367cab_algo(struct stv0367_state *state,
   2322					     struct dtv_frontend_properties *p)
   2323{
   2324	struct stv0367cab_state *cab_state = state->cab_state;
   2325	enum stv0367_cab_signal_type signalType = FE_CAB_NOAGC;
   2326	u32	QAMFEC_Lock, QAM_Lock, u32_tmp, ifkhz,
   2327		LockTime, TRLTimeOut, AGCTimeOut, CRLSymbols,
   2328		CRLTimeOut, EQLTimeOut, DemodTimeOut, FECTimeOut;
   2329	u8	TrackAGCAccum;
   2330	s32	tmp;
   2331
   2332	dprintk("%s:\n", __func__);
   2333
   2334	stv0367_get_if_khz(state, &ifkhz);
   2335
   2336	/* Timeouts calculation */
   2337	/* A max lock time of 25 ms is allowed for delayed AGC */
   2338	AGCTimeOut = 25;
   2339	/* 100000 symbols needed by the TRL as a maximum value */
   2340	TRLTimeOut = 100000000 / p->symbol_rate;
   2341	/* CRLSymbols is the needed number of symbols to achieve a lock
   2342	   within [-4%, +4%] of the symbol rate.
   2343	   CRL timeout is calculated
   2344	   for a lock within [-search_range, +search_range].
   2345	   EQL timeout can be changed depending on
   2346	   the micro-reflections we want to handle.
   2347	   A characterization must be performed
   2348	   with these echoes to get new timeout values.
   2349	*/
   2350	switch (p->modulation) {
   2351	case QAM_16:
   2352		CRLSymbols = 150000;
   2353		EQLTimeOut = 100;
   2354		break;
   2355	case QAM_32:
   2356		CRLSymbols = 250000;
   2357		EQLTimeOut = 100;
   2358		break;
   2359	case QAM_64:
   2360		CRLSymbols = 200000;
   2361		EQLTimeOut = 100;
   2362		break;
   2363	case QAM_128:
   2364		CRLSymbols = 250000;
   2365		EQLTimeOut = 100;
   2366		break;
   2367	case QAM_256:
   2368		CRLSymbols = 250000;
   2369		EQLTimeOut = 100;
   2370		break;
   2371	default:
   2372		CRLSymbols = 200000;
   2373		EQLTimeOut = 100;
   2374		break;
   2375	}
   2376#if 0
   2377	if (pIntParams->search_range < 0) {
   2378		CRLTimeOut = (25 * CRLSymbols *
   2379				(-pIntParams->search_range / 1000)) /
   2380					(pIntParams->symbol_rate / 1000);
   2381	} else
   2382#endif
   2383	CRLTimeOut = (25 * CRLSymbols * (cab_state->search_range / 1000)) /
   2384					(p->symbol_rate / 1000);
   2385
   2386	CRLTimeOut = (1000 * CRLTimeOut) / p->symbol_rate;
   2387	/* Timeouts below 50ms are coerced */
   2388	if (CRLTimeOut < 50)
   2389		CRLTimeOut = 50;
   2390	/* A maximum of 100 TS packets is needed to get FEC lock even in case
   2391	the spectrum inversion needs to be changed.
   2392	   This is equal to 20 ms in case of the lowest symbol rate of 0.87Msps
   2393	*/
   2394	FECTimeOut = 20;
   2395	DemodTimeOut = AGCTimeOut + TRLTimeOut + CRLTimeOut + EQLTimeOut;
   2396
   2397	dprintk("%s: DemodTimeOut=%d\n", __func__, DemodTimeOut);
   2398
   2399	/* Reset the TRL to ensure nothing starts until the
   2400	   AGC is stable which ensures a better lock time
   2401	*/
   2402	stv0367_writereg(state, R367CAB_CTRL_1, 0x04);
   2403	/* Set AGC accumulation time to minimum and lock threshold to maximum
   2404	in order to speed up the AGC lock */
   2405	TrackAGCAccum = stv0367_readbits(state, F367CAB_AGC_ACCUMRSTSEL);
   2406	stv0367_writebits(state, F367CAB_AGC_ACCUMRSTSEL, 0x0);
   2407	/* Modulus Mapper is disabled */
   2408	stv0367_writebits(state, F367CAB_MODULUSMAP_EN, 0);
   2409	/* Disable the sweep function */
   2410	stv0367_writebits(state, F367CAB_SWEEP_EN, 0);
   2411	/* The sweep function is never used, Sweep rate must be set to 0 */
   2412	/* Set the derotator frequency in Hz */
   2413	stv0367cab_set_derot_freq(state, cab_state->adc_clk,
   2414		(1000 * (s32)ifkhz + cab_state->derot_offset));
   2415	/* Disable the Allpass Filter when the symbol rate is out of range */
   2416	if ((p->symbol_rate > 10800000) | (p->symbol_rate < 1800000)) {
   2417		stv0367_writebits(state, F367CAB_ADJ_EN, 0);
   2418		stv0367_writebits(state, F367CAB_ALLPASSFILT_EN, 0);
   2419	}
   2420#if 0
   2421	/* Check if the tuner is locked */
   2422	tuner_lock = stv0367cab_tuner_get_status(fe);
   2423	if (tuner_lock == 0)
   2424		return FE_367CAB_NOTUNER;
   2425#endif
   2426	/* Release the TRL to start demodulator acquisition */
   2427	/* Wait for QAM lock */
   2428	LockTime = 0;
   2429	stv0367_writereg(state, R367CAB_CTRL_1, 0x00);
   2430	do {
   2431		QAM_Lock = stv0367cab_fsm_status(state);
   2432		if ((LockTime >= (DemodTimeOut - EQLTimeOut)) &&
   2433							(QAM_Lock == 0x04))
   2434			/*
   2435			 * We don't wait longer, the frequency/phase offset
   2436			 * must be too big
   2437			 */
   2438			LockTime = DemodTimeOut;
   2439		else if ((LockTime >= (AGCTimeOut + TRLTimeOut)) &&
   2440							(QAM_Lock == 0x02))
   2441			/*
   2442			 * We don't wait longer, either there is no signal or
   2443			 * it is not the right symbol rate or it is an analog
   2444			 * carrier
   2445			 */
   2446		{
   2447			LockTime = DemodTimeOut;
   2448			u32_tmp = stv0367_readbits(state,
   2449						F367CAB_AGC_PWR_WORD_LO) +
   2450					(stv0367_readbits(state,
   2451						F367CAB_AGC_PWR_WORD_ME) << 8) +
   2452					(stv0367_readbits(state,
   2453						F367CAB_AGC_PWR_WORD_HI) << 16);
   2454			if (u32_tmp >= 131072)
   2455				u32_tmp = 262144 - u32_tmp;
   2456			u32_tmp = u32_tmp / (1 << (11 - stv0367_readbits(state,
   2457							F367CAB_AGC_IF_BWSEL)));
   2458
   2459			if (u32_tmp < stv0367_readbits(state,
   2460						F367CAB_AGC_PWRREF_LO) +
   2461					256 * stv0367_readbits(state,
   2462						F367CAB_AGC_PWRREF_HI) - 10)
   2463				QAM_Lock = 0x0f;
   2464		} else {
   2465			usleep_range(10000, 20000);
   2466			LockTime += 10;
   2467		}
   2468		dprintk("QAM_Lock=0x%x LockTime=%d\n", QAM_Lock, LockTime);
   2469		tmp = stv0367_readreg(state, R367CAB_IT_STATUS1);
   2470
   2471		dprintk("R367CAB_IT_STATUS1=0x%x\n", tmp);
   2472
   2473	} while (((QAM_Lock != 0x0c) && (QAM_Lock != 0x0b)) &&
   2474						(LockTime < DemodTimeOut));
   2475
   2476	dprintk("QAM_Lock=0x%x\n", QAM_Lock);
   2477
   2478	tmp = stv0367_readreg(state, R367CAB_IT_STATUS1);
   2479	dprintk("R367CAB_IT_STATUS1=0x%x\n", tmp);
   2480	tmp = stv0367_readreg(state, R367CAB_IT_STATUS2);
   2481	dprintk("R367CAB_IT_STATUS2=0x%x\n", tmp);
   2482
   2483	tmp  = stv0367cab_get_derot_freq(state, cab_state->adc_clk);
   2484	dprintk("stv0367cab_get_derot_freq=0x%x\n", tmp);
   2485
   2486	if ((QAM_Lock == 0x0c) || (QAM_Lock == 0x0b)) {
   2487		/* Wait for FEC lock */
   2488		LockTime = 0;
   2489		do {
   2490			usleep_range(5000, 7000);
   2491			LockTime += 5;
   2492			QAMFEC_Lock = stv0367cab_qamfec_lock(state);
   2493		} while (!QAMFEC_Lock && (LockTime < FECTimeOut));
   2494	} else
   2495		QAMFEC_Lock = 0;
   2496
   2497	if (QAMFEC_Lock) {
   2498		signalType = FE_CAB_DATAOK;
   2499		cab_state->spect_inv = stv0367_readbits(state,
   2500							F367CAB_QUAD_INV);
   2501#if 0
   2502/* not clear for me */
   2503		if (ifkhz != 0) {
   2504			if (ifkhz > cab_state->adc_clk / 1000) {
   2505				cab_state->freq_khz =
   2506					FE_Cab_TunerGetFrequency(pIntParams->hTuner)
   2507				- stv0367cab_get_derot_freq(state, cab_state->adc_clk)
   2508				- cab_state->adc_clk / 1000 + ifkhz;
   2509			} else {
   2510				cab_state->freq_khz =
   2511						FE_Cab_TunerGetFrequency(pIntParams->hTuner)
   2512						- stv0367cab_get_derot_freq(state, cab_state->adc_clk)
   2513						+ ifkhz;
   2514			}
   2515		} else {
   2516			cab_state->freq_khz =
   2517				FE_Cab_TunerGetFrequency(pIntParams->hTuner) +
   2518				stv0367cab_get_derot_freq(state,
   2519							cab_state->adc_clk) -
   2520				cab_state->adc_clk / 4000;
   2521		}
   2522#endif
   2523		cab_state->symbol_rate = stv0367cab_GetSymbolRate(state,
   2524							cab_state->mclk);
   2525		cab_state->locked = 1;
   2526
   2527		/* stv0367_setbits(state, F367CAB_AGC_ACCUMRSTSEL,7);*/
   2528	} else
   2529		signalType = stv0367cab_fsm_signaltype(QAM_Lock);
   2530
   2531	/* Set the AGC control values to tracking values */
   2532	stv0367_writebits(state, F367CAB_AGC_ACCUMRSTSEL, TrackAGCAccum);
   2533	return signalType;
   2534}
   2535
   2536static int stv0367cab_set_frontend(struct dvb_frontend *fe)
   2537{
   2538	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
   2539	struct stv0367_state *state = fe->demodulator_priv;
   2540	struct stv0367cab_state *cab_state = state->cab_state;
   2541	enum stv0367cab_mod QAMSize = 0;
   2542
   2543	dprintk("%s: freq = %d, srate = %d\n", __func__,
   2544					p->frequency, p->symbol_rate);
   2545
   2546	cab_state->derot_offset = 0;
   2547
   2548	switch (p->modulation) {
   2549	case QAM_16:
   2550		QAMSize = FE_CAB_MOD_QAM16;
   2551		break;
   2552	case QAM_32:
   2553		QAMSize = FE_CAB_MOD_QAM32;
   2554		break;
   2555	case QAM_64:
   2556		QAMSize = FE_CAB_MOD_QAM64;
   2557		break;
   2558	case QAM_128:
   2559		QAMSize = FE_CAB_MOD_QAM128;
   2560		break;
   2561	case QAM_256:
   2562		QAMSize = FE_CAB_MOD_QAM256;
   2563		break;
   2564	default:
   2565		break;
   2566	}
   2567
   2568	if (state->reinit_on_setfrontend)
   2569		stv0367cab_init(fe);
   2570
   2571	/* Tuner Frequency Setting */
   2572	if (fe->ops.tuner_ops.set_params) {
   2573		if (state->use_i2c_gatectrl && fe->ops.i2c_gate_ctrl)
   2574			fe->ops.i2c_gate_ctrl(fe, 1);
   2575		fe->ops.tuner_ops.set_params(fe);
   2576		if (state->use_i2c_gatectrl && fe->ops.i2c_gate_ctrl)
   2577			fe->ops.i2c_gate_ctrl(fe, 0);
   2578	}
   2579
   2580	stv0367cab_SetQamSize(
   2581			state,
   2582			p->symbol_rate,
   2583			QAMSize);
   2584
   2585	stv0367cab_set_srate(state,
   2586			cab_state->adc_clk,
   2587			cab_state->mclk,
   2588			p->symbol_rate,
   2589			QAMSize);
   2590	/* Search algorithm launch, [-1.1*RangeOffset, +1.1*RangeOffset] scan */
   2591	cab_state->state = stv0367cab_algo(state, p);
   2592	return 0;
   2593}
   2594
   2595static int stv0367cab_get_frontend(struct dvb_frontend *fe,
   2596				   struct dtv_frontend_properties *p)
   2597{
   2598	struct stv0367_state *state = fe->demodulator_priv;
   2599	struct stv0367cab_state *cab_state = state->cab_state;
   2600	u32 ifkhz = 0;
   2601
   2602	enum stv0367cab_mod QAMSize;
   2603
   2604	dprintk("%s:\n", __func__);
   2605
   2606	stv0367_get_if_khz(state, &ifkhz);
   2607	p->symbol_rate = stv0367cab_GetSymbolRate(state, cab_state->mclk);
   2608
   2609	QAMSize = stv0367_readbits(state, F367CAB_QAM_MODE);
   2610	switch (QAMSize) {
   2611	case FE_CAB_MOD_QAM16:
   2612		p->modulation = QAM_16;
   2613		break;
   2614	case FE_CAB_MOD_QAM32:
   2615		p->modulation = QAM_32;
   2616		break;
   2617	case FE_CAB_MOD_QAM64:
   2618		p->modulation = QAM_64;
   2619		break;
   2620	case FE_CAB_MOD_QAM128:
   2621		p->modulation = QAM_128;
   2622		break;
   2623	case FE_CAB_MOD_QAM256:
   2624		p->modulation = QAM_256;
   2625		break;
   2626	default:
   2627		break;
   2628	}
   2629
   2630	p->frequency = stv0367_get_tuner_freq(fe);
   2631
   2632	dprintk("%s: tuner frequency = %d\n", __func__, p->frequency);
   2633
   2634	if (ifkhz == 0) {
   2635		p->frequency +=
   2636			(stv0367cab_get_derot_freq(state, cab_state->adc_clk) -
   2637			cab_state->adc_clk / 4000);
   2638		return 0;
   2639	}
   2640
   2641	if (ifkhz > cab_state->adc_clk / 1000)
   2642		p->frequency += (ifkhz
   2643			- stv0367cab_get_derot_freq(state, cab_state->adc_clk)
   2644			- cab_state->adc_clk / 1000);
   2645	else
   2646		p->frequency += (ifkhz
   2647			- stv0367cab_get_derot_freq(state, cab_state->adc_clk));
   2648
   2649	return 0;
   2650}
   2651
   2652#if 0
   2653void stv0367cab_GetErrorCount(state, enum stv0367cab_mod QAMSize,
   2654			u32 symbol_rate, FE_367qam_Monitor *Monitor_results)
   2655{
   2656	stv0367cab_OptimiseNByteAndGetBER(state, QAMSize, symbol_rate, Monitor_results);
   2657	stv0367cab_GetPacketsCount(state, Monitor_results);
   2658
   2659	return;
   2660}
   2661
   2662static int stv0367cab_read_ber(struct dvb_frontend *fe, u32 *ber)
   2663{
   2664	struct stv0367_state *state = fe->demodulator_priv;
   2665
   2666	return 0;
   2667}
   2668#endif
   2669static s32 stv0367cab_get_rf_lvl(struct stv0367_state *state)
   2670{
   2671	s32 rfLevel = 0;
   2672	s32 RfAgcPwm = 0, IfAgcPwm = 0;
   2673	u8 i;
   2674
   2675	stv0367_writebits(state, F367CAB_STDBY_ADCGP, 0x0);
   2676
   2677	RfAgcPwm =
   2678		(stv0367_readbits(state, F367CAB_RF_AGC1_LEVEL_LO) & 0x03) +
   2679		(stv0367_readbits(state, F367CAB_RF_AGC1_LEVEL_HI) << 2);
   2680	RfAgcPwm = 100 * RfAgcPwm / 1023;
   2681
   2682	IfAgcPwm =
   2683		stv0367_readbits(state, F367CAB_AGC_IF_PWMCMD_LO) +
   2684		(stv0367_readbits(state, F367CAB_AGC_IF_PWMCMD_HI) << 8);
   2685	if (IfAgcPwm >= 2048)
   2686		IfAgcPwm -= 2048;
   2687	else
   2688		IfAgcPwm += 2048;
   2689
   2690	IfAgcPwm = 100 * IfAgcPwm / 4095;
   2691
   2692	/* For DTT75467 on NIM */
   2693	if (RfAgcPwm < 90  && IfAgcPwm < 28) {
   2694		for (i = 0; i < RF_LOOKUP_TABLE_SIZE; i++) {
   2695			if (RfAgcPwm <= stv0367cab_RF_LookUp1[0][i]) {
   2696				rfLevel = (-1) * stv0367cab_RF_LookUp1[1][i];
   2697				break;
   2698			}
   2699		}
   2700		if (i == RF_LOOKUP_TABLE_SIZE)
   2701			rfLevel = -56;
   2702	} else { /*if IF AGC>10*/
   2703		for (i = 0; i < RF_LOOKUP_TABLE2_SIZE; i++) {
   2704			if (IfAgcPwm <= stv0367cab_RF_LookUp2[0][i]) {
   2705				rfLevel = (-1) * stv0367cab_RF_LookUp2[1][i];
   2706				break;
   2707			}
   2708		}
   2709		if (i == RF_LOOKUP_TABLE2_SIZE)
   2710			rfLevel = -72;
   2711	}
   2712	return rfLevel;
   2713}
   2714
   2715static int stv0367cab_read_strength(struct dvb_frontend *fe, u16 *strength)
   2716{
   2717	struct stv0367_state *state = fe->demodulator_priv;
   2718
   2719	s32 signal =  stv0367cab_get_rf_lvl(state);
   2720
   2721	dprintk("%s: signal=%d dBm\n", __func__, signal);
   2722
   2723	if (signal <= -72)
   2724		*strength = 65535;
   2725	else
   2726		*strength = (22 + signal) * (-1311);
   2727
   2728	dprintk("%s: strength=%d\n", __func__, (*strength));
   2729
   2730	return 0;
   2731}
   2732
   2733static int stv0367cab_snr_power(struct dvb_frontend *fe)
   2734{
   2735	struct stv0367_state *state = fe->demodulator_priv;
   2736	enum stv0367cab_mod QAMSize;
   2737
   2738	QAMSize = stv0367_readbits(state, F367CAB_QAM_MODE);
   2739	switch (QAMSize) {
   2740	case FE_CAB_MOD_QAM4:
   2741		return 21904;
   2742	case FE_CAB_MOD_QAM16:
   2743		return 20480;
   2744	case FE_CAB_MOD_QAM32:
   2745		return 23040;
   2746	case FE_CAB_MOD_QAM64:
   2747		return 21504;
   2748	case FE_CAB_MOD_QAM128:
   2749		return 23616;
   2750	case FE_CAB_MOD_QAM256:
   2751		return 21760;
   2752	case FE_CAB_MOD_QAM1024:
   2753		return 21280;
   2754	default:
   2755		break;
   2756	}
   2757
   2758	return 1;
   2759}
   2760
   2761static int stv0367cab_snr_readreg(struct dvb_frontend *fe, int avgdiv)
   2762{
   2763	struct stv0367_state *state = fe->demodulator_priv;
   2764	u32 regval = 0;
   2765	int i;
   2766
   2767	for (i = 0; i < 10; i++) {
   2768		regval += (stv0367_readbits(state, F367CAB_SNR_LO)
   2769			+ 256 * stv0367_readbits(state, F367CAB_SNR_HI));
   2770	}
   2771
   2772	if (avgdiv)
   2773		regval /= 10;
   2774
   2775	return regval;
   2776}
   2777
   2778static int stv0367cab_read_snr(struct dvb_frontend *fe, u16 *snr)
   2779{
   2780	struct stv0367_state *state = fe->demodulator_priv;
   2781	u32 noisepercentage;
   2782	u32 regval = 0, temp = 0;
   2783	int power;
   2784
   2785	power = stv0367cab_snr_power(fe);
   2786	regval = stv0367cab_snr_readreg(fe, 1);
   2787
   2788	if (regval != 0) {
   2789		temp = power
   2790			* (1 << (3 + stv0367_readbits(state, F367CAB_SNR_PER)));
   2791		temp /= regval;
   2792	}
   2793
   2794	/* table values, not needed to calculate logarithms */
   2795	if (temp >= 5012)
   2796		noisepercentage = 100;
   2797	else if (temp >= 3981)
   2798		noisepercentage = 93;
   2799	else if (temp >= 3162)
   2800		noisepercentage = 86;
   2801	else if (temp >= 2512)
   2802		noisepercentage = 79;
   2803	else if (temp >= 1995)
   2804		noisepercentage = 72;
   2805	else if (temp >= 1585)
   2806		noisepercentage = 65;
   2807	else if (temp >= 1259)
   2808		noisepercentage = 58;
   2809	else if (temp >= 1000)
   2810		noisepercentage = 50;
   2811	else if (temp >= 794)
   2812		noisepercentage = 43;
   2813	else if (temp >= 501)
   2814		noisepercentage = 36;
   2815	else if (temp >= 316)
   2816		noisepercentage = 29;
   2817	else if (temp >= 200)
   2818		noisepercentage = 22;
   2819	else if (temp >= 158)
   2820		noisepercentage = 14;
   2821	else if (temp >= 126)
   2822		noisepercentage = 7;
   2823	else
   2824		noisepercentage = 0;
   2825
   2826	dprintk("%s: noisepercentage=%d\n", __func__, noisepercentage);
   2827
   2828	*snr = (noisepercentage * 65535) / 100;
   2829
   2830	return 0;
   2831}
   2832
   2833static int stv0367cab_read_ucblcks(struct dvb_frontend *fe, u32 *ucblocks)
   2834{
   2835	struct stv0367_state *state = fe->demodulator_priv;
   2836	int corrected, tscount;
   2837
   2838	*ucblocks = (stv0367_readreg(state, R367CAB_RS_COUNTER_5) << 8)
   2839			| stv0367_readreg(state, R367CAB_RS_COUNTER_4);
   2840	corrected = (stv0367_readreg(state, R367CAB_RS_COUNTER_3) << 8)
   2841			| stv0367_readreg(state, R367CAB_RS_COUNTER_2);
   2842	tscount = (stv0367_readreg(state, R367CAB_RS_COUNTER_2) << 8)
   2843			| stv0367_readreg(state, R367CAB_RS_COUNTER_1);
   2844
   2845	dprintk("%s: uncorrected blocks=%d corrected blocks=%d tscount=%d\n",
   2846				__func__, *ucblocks, corrected, tscount);
   2847
   2848	return 0;
   2849};
   2850
   2851static const struct dvb_frontend_ops stv0367cab_ops = {
   2852	.delsys = { SYS_DVBC_ANNEX_A },
   2853	.info = {
   2854		.name = "ST STV0367 DVB-C",
   2855		.frequency_min_hz =  47 * MHz,
   2856		.frequency_max_hz = 862 * MHz,
   2857		.frequency_stepsize_hz = 62500,
   2858		.symbol_rate_min = 870000,
   2859		.symbol_rate_max = 11700000,
   2860		.caps = 0x400 |/* FE_CAN_QAM_4 */
   2861			FE_CAN_QAM_16 | FE_CAN_QAM_32  |
   2862			FE_CAN_QAM_64 | FE_CAN_QAM_128 |
   2863			FE_CAN_QAM_256 | FE_CAN_FEC_AUTO
   2864	},
   2865	.release				= stv0367_release,
   2866	.init					= stv0367cab_init,
   2867	.sleep					= stv0367cab_sleep,
   2868	.i2c_gate_ctrl				= stv0367cab_gate_ctrl,
   2869	.set_frontend				= stv0367cab_set_frontend,
   2870	.get_frontend				= stv0367cab_get_frontend,
   2871	.read_status				= stv0367cab_read_status,
   2872/*	.read_ber				= stv0367cab_read_ber, */
   2873	.read_signal_strength			= stv0367cab_read_strength,
   2874	.read_snr				= stv0367cab_read_snr,
   2875	.read_ucblocks				= stv0367cab_read_ucblcks,
   2876	.get_tune_settings			= stv0367_get_tune_settings,
   2877};
   2878
   2879struct dvb_frontend *stv0367cab_attach(const struct stv0367_config *config,
   2880				   struct i2c_adapter *i2c)
   2881{
   2882	struct stv0367_state *state = NULL;
   2883	struct stv0367cab_state *cab_state = NULL;
   2884
   2885	/* allocate memory for the internal state */
   2886	state = kzalloc(sizeof(struct stv0367_state), GFP_KERNEL);
   2887	if (state == NULL)
   2888		goto error;
   2889	cab_state = kzalloc(sizeof(struct stv0367cab_state), GFP_KERNEL);
   2890	if (cab_state == NULL)
   2891		goto error;
   2892
   2893	/* setup the state */
   2894	state->i2c = i2c;
   2895	state->config = config;
   2896	cab_state->search_range = 280000;
   2897	cab_state->qamfec_status_reg = F367CAB_QAMFEC_LOCK;
   2898	state->cab_state = cab_state;
   2899	state->fe.ops = stv0367cab_ops;
   2900	state->fe.demodulator_priv = state;
   2901	state->chip_id = stv0367_readreg(state, 0xf000);
   2902
   2903	/* demod operation options */
   2904	state->use_i2c_gatectrl = 1;
   2905	state->deftabs = STV0367_DEFTAB_GENERIC;
   2906	state->reinit_on_setfrontend = 1;
   2907	state->auto_if_khz = 0;
   2908
   2909	dprintk("%s: chip_id = 0x%x\n", __func__, state->chip_id);
   2910
   2911	/* check if the demod is there */
   2912	if ((state->chip_id != 0x50) && (state->chip_id != 0x60))
   2913		goto error;
   2914
   2915	return &state->fe;
   2916
   2917error:
   2918	kfree(cab_state);
   2919	kfree(state);
   2920	return NULL;
   2921}
   2922EXPORT_SYMBOL(stv0367cab_attach);
   2923
   2924/*
   2925 * Functions for operation on Digital Devices hardware
   2926 */
   2927
   2928static void stv0367ddb_setup_ter(struct stv0367_state *state)
   2929{
   2930	stv0367_writereg(state, R367TER_DEBUG_LT4, 0x00);
   2931	stv0367_writereg(state, R367TER_DEBUG_LT5, 0x00);
   2932	stv0367_writereg(state, R367TER_DEBUG_LT6, 0x00); /* R367CAB_CTRL_1 */
   2933	stv0367_writereg(state, R367TER_DEBUG_LT7, 0x00); /* R367CAB_CTRL_2 */
   2934	stv0367_writereg(state, R367TER_DEBUG_LT8, 0x00);
   2935	stv0367_writereg(state, R367TER_DEBUG_LT9, 0x00);
   2936
   2937	/* Tuner Setup */
   2938	/* Buffer Q disabled, I Enabled, unsigned ADC */
   2939	stv0367_writereg(state, R367TER_ANADIGCTRL, 0x89);
   2940	stv0367_writereg(state, R367TER_DUAL_AD12, 0x04); /* ADCQ disabled */
   2941
   2942	/* Clock setup */
   2943	/* PLL bypassed and disabled */
   2944	stv0367_writereg(state, R367TER_ANACTRL, 0x0D);
   2945	stv0367_writereg(state, R367TER_TOPCTRL, 0x00); /* Set OFDM */
   2946
   2947	/* IC runs at 54 MHz with a 27 MHz crystal */
   2948	stv0367_pll_setup(state, STV0367_ICSPEED_53125, state->config->xtal);
   2949
   2950	msleep(50);
   2951	/* PLL enabled and used */
   2952	stv0367_writereg(state, R367TER_ANACTRL, 0x00);
   2953
   2954	state->activedemod = demod_ter;
   2955}
   2956
   2957static void stv0367ddb_setup_cab(struct stv0367_state *state)
   2958{
   2959	stv0367_writereg(state, R367TER_DEBUG_LT4, 0x00);
   2960	stv0367_writereg(state, R367TER_DEBUG_LT5, 0x01);
   2961	stv0367_writereg(state, R367TER_DEBUG_LT6, 0x06); /* R367CAB_CTRL_1 */
   2962	stv0367_writereg(state, R367TER_DEBUG_LT7, 0x03); /* R367CAB_CTRL_2 */
   2963	stv0367_writereg(state, R367TER_DEBUG_LT8, 0x00);
   2964	stv0367_writereg(state, R367TER_DEBUG_LT9, 0x00);
   2965
   2966	/* Tuner Setup */
   2967	/* Buffer Q disabled, I Enabled, signed ADC */
   2968	stv0367_writereg(state, R367TER_ANADIGCTRL, 0x8B);
   2969	/* ADCQ disabled */
   2970	stv0367_writereg(state, R367TER_DUAL_AD12, 0x04);
   2971
   2972	/* Clock setup */
   2973	/* PLL bypassed and disabled */
   2974	stv0367_writereg(state, R367TER_ANACTRL, 0x0D);
   2975	/* Set QAM */
   2976	stv0367_writereg(state, R367TER_TOPCTRL, 0x10);
   2977
   2978	/* IC runs at 58 MHz with a 27 MHz crystal */
   2979	stv0367_pll_setup(state, STV0367_ICSPEED_58000, state->config->xtal);
   2980
   2981	msleep(50);
   2982	/* PLL enabled and used */
   2983	stv0367_writereg(state, R367TER_ANACTRL, 0x00);
   2984
   2985	state->cab_state->mclk = stv0367cab_get_mclk(&state->fe,
   2986		state->config->xtal);
   2987	state->cab_state->adc_clk = stv0367cab_get_adc_freq(&state->fe,
   2988		state->config->xtal);
   2989
   2990	state->activedemod = demod_cab;
   2991}
   2992
   2993static int stv0367ddb_set_frontend(struct dvb_frontend *fe)
   2994{
   2995	struct stv0367_state *state = fe->demodulator_priv;
   2996
   2997	switch (fe->dtv_property_cache.delivery_system) {
   2998	case SYS_DVBT:
   2999		if (state->activedemod != demod_ter)
   3000			stv0367ddb_setup_ter(state);
   3001
   3002		return stv0367ter_set_frontend(fe);
   3003	case SYS_DVBC_ANNEX_A:
   3004		if (state->activedemod != demod_cab)
   3005			stv0367ddb_setup_cab(state);
   3006
   3007		/* protect against division error oopses */
   3008		if (fe->dtv_property_cache.symbol_rate == 0) {
   3009			printk(KERN_ERR "Invalid symbol rate\n");
   3010			return -EINVAL;
   3011		}
   3012
   3013		return stv0367cab_set_frontend(fe);
   3014	default:
   3015		break;
   3016	}
   3017
   3018	return -EINVAL;
   3019}
   3020
   3021static void stv0367ddb_read_signal_strength(struct dvb_frontend *fe)
   3022{
   3023	struct stv0367_state *state = fe->demodulator_priv;
   3024	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
   3025	s32 signalstrength;
   3026
   3027	switch (state->activedemod) {
   3028	case demod_cab:
   3029		signalstrength = stv0367cab_get_rf_lvl(state) * 1000;
   3030		break;
   3031	default:
   3032		p->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
   3033		return;
   3034	}
   3035
   3036	p->strength.stat[0].scale = FE_SCALE_DECIBEL;
   3037	p->strength.stat[0].uvalue = signalstrength;
   3038}
   3039
   3040static void stv0367ddb_read_snr(struct dvb_frontend *fe)
   3041{
   3042	struct stv0367_state *state = fe->demodulator_priv;
   3043	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
   3044	int cab_pwr;
   3045	u32 regval, tmpval, snrval = 0;
   3046
   3047	switch (state->activedemod) {
   3048	case demod_ter:
   3049		snrval = stv0367ter_snr_readreg(fe);
   3050		break;
   3051	case demod_cab:
   3052		cab_pwr = stv0367cab_snr_power(fe);
   3053		regval = stv0367cab_snr_readreg(fe, 0);
   3054
   3055		/* prevent division by zero */
   3056		if (!regval) {
   3057			snrval = 0;
   3058			break;
   3059		}
   3060
   3061		tmpval = (cab_pwr * 320) / regval;
   3062		snrval = ((tmpval != 0) ? (intlog2(tmpval) / 5581) : 0);
   3063		break;
   3064	default:
   3065		p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
   3066		return;
   3067	}
   3068
   3069	p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
   3070	p->cnr.stat[0].uvalue = snrval;
   3071}
   3072
   3073static void stv0367ddb_read_ucblocks(struct dvb_frontend *fe)
   3074{
   3075	struct stv0367_state *state = fe->demodulator_priv;
   3076	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
   3077	u32 ucblocks = 0;
   3078
   3079	switch (state->activedemod) {
   3080	case demod_ter:
   3081		stv0367ter_read_ucblocks(fe, &ucblocks);
   3082		break;
   3083	case demod_cab:
   3084		stv0367cab_read_ucblcks(fe, &ucblocks);
   3085		break;
   3086	default:
   3087		p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
   3088		return;
   3089	}
   3090
   3091	p->block_error.stat[0].scale = FE_SCALE_COUNTER;
   3092	p->block_error.stat[0].uvalue = ucblocks;
   3093}
   3094
   3095static int stv0367ddb_read_status(struct dvb_frontend *fe,
   3096				  enum fe_status *status)
   3097{
   3098	struct stv0367_state *state = fe->demodulator_priv;
   3099	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
   3100	int ret = 0;
   3101
   3102	switch (state->activedemod) {
   3103	case demod_ter:
   3104		ret = stv0367ter_read_status(fe, status);
   3105		break;
   3106	case demod_cab:
   3107		ret = stv0367cab_read_status(fe, status);
   3108		break;
   3109	default:
   3110		break;
   3111	}
   3112
   3113	/* stop and report on *_read_status failure */
   3114	if (ret)
   3115		return ret;
   3116
   3117	stv0367ddb_read_signal_strength(fe);
   3118
   3119	/* read carrier/noise when a carrier is detected */
   3120	if (*status & FE_HAS_CARRIER)
   3121		stv0367ddb_read_snr(fe);
   3122	else
   3123		p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
   3124
   3125	/* read uncorrected blocks on FE_HAS_LOCK */
   3126	if (*status & FE_HAS_LOCK)
   3127		stv0367ddb_read_ucblocks(fe);
   3128	else
   3129		p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
   3130
   3131	return 0;
   3132}
   3133
   3134static int stv0367ddb_get_frontend(struct dvb_frontend *fe,
   3135				   struct dtv_frontend_properties *p)
   3136{
   3137	struct stv0367_state *state = fe->demodulator_priv;
   3138
   3139	switch (state->activedemod) {
   3140	case demod_ter:
   3141		return stv0367ter_get_frontend(fe, p);
   3142	case demod_cab:
   3143		return stv0367cab_get_frontend(fe, p);
   3144	default:
   3145		break;
   3146	}
   3147
   3148	return 0;
   3149}
   3150
   3151static int stv0367ddb_sleep(struct dvb_frontend *fe)
   3152{
   3153	struct stv0367_state *state = fe->demodulator_priv;
   3154
   3155	switch (state->activedemod) {
   3156	case demod_ter:
   3157		state->activedemod = demod_none;
   3158		return stv0367ter_sleep(fe);
   3159	case demod_cab:
   3160		state->activedemod = demod_none;
   3161		return stv0367cab_sleep(fe);
   3162	default:
   3163		break;
   3164	}
   3165
   3166	return -EINVAL;
   3167}
   3168
   3169static int stv0367ddb_init(struct stv0367_state *state)
   3170{
   3171	struct stv0367ter_state *ter_state = state->ter_state;
   3172	struct dtv_frontend_properties *p = &state->fe.dtv_property_cache;
   3173
   3174	stv0367_writereg(state, R367TER_TOPCTRL, 0x10);
   3175
   3176	if (stv0367_deftabs[state->deftabs][STV0367_TAB_BASE])
   3177		stv0367_write_table(state,
   3178			stv0367_deftabs[state->deftabs][STV0367_TAB_BASE]);
   3179
   3180	stv0367_write_table(state,
   3181		stv0367_deftabs[state->deftabs][STV0367_TAB_CAB]);
   3182
   3183	stv0367_writereg(state, R367TER_TOPCTRL, 0x00);
   3184	stv0367_write_table(state,
   3185		stv0367_deftabs[state->deftabs][STV0367_TAB_TER]);
   3186
   3187	stv0367_writereg(state, R367TER_GAIN_SRC1, 0x2A);
   3188	stv0367_writereg(state, R367TER_GAIN_SRC2, 0xD6);
   3189	stv0367_writereg(state, R367TER_INC_DEROT1, 0x55);
   3190	stv0367_writereg(state, R367TER_INC_DEROT2, 0x55);
   3191	stv0367_writereg(state, R367TER_TRL_CTL, 0x14);
   3192	stv0367_writereg(state, R367TER_TRL_NOMRATE1, 0xAE);
   3193	stv0367_writereg(state, R367TER_TRL_NOMRATE2, 0x56);
   3194	stv0367_writereg(state, R367TER_FEPATH_CFG, 0x0);
   3195
   3196	/* OFDM TS Setup */
   3197
   3198	stv0367_writereg(state, R367TER_TSCFGH, 0x70);
   3199	stv0367_writereg(state, R367TER_TSCFGM, 0xC0);
   3200	stv0367_writereg(state, R367TER_TSCFGL, 0x20);
   3201	stv0367_writereg(state, R367TER_TSSPEED, 0x40); /* Fixed at 54 MHz */
   3202
   3203	stv0367_writereg(state, R367TER_TSCFGH, 0x71);
   3204	stv0367_writereg(state, R367TER_TSCFGH, 0x70);
   3205
   3206	stv0367_writereg(state, R367TER_TOPCTRL, 0x10);
   3207
   3208	/* Also needed for QAM */
   3209	stv0367_writereg(state, R367TER_AGC12C, 0x01); /* AGC Pin setup */
   3210
   3211	stv0367_writereg(state, R367TER_AGCCTRL1, 0x8A);
   3212
   3213	/* QAM TS setup, note exact format also depends on descrambler */
   3214	/* settings */
   3215	/* Inverted Clock, Swap, serial */
   3216	stv0367_writereg(state, R367CAB_OUTFORMAT_0, 0x85);
   3217
   3218	/* Clock setup (PLL bypassed and disabled) */
   3219	stv0367_writereg(state, R367TER_ANACTRL, 0x0D);
   3220
   3221	/* IC runs at 58 MHz with a 27 MHz crystal */
   3222	stv0367_pll_setup(state, STV0367_ICSPEED_58000, state->config->xtal);
   3223
   3224	/* Tuner setup */
   3225	/* Buffer Q disabled, I Enabled, signed ADC */
   3226	stv0367_writereg(state, R367TER_ANADIGCTRL, 0x8b);
   3227	stv0367_writereg(state, R367TER_DUAL_AD12, 0x04); /* ADCQ disabled */
   3228
   3229	/* Improves the C/N lock limit */
   3230	stv0367_writereg(state, R367CAB_FSM_SNR2_HTH, 0x23);
   3231	/* ZIF/IF Automatic mode */
   3232	stv0367_writereg(state, R367CAB_IQ_QAM, 0x01);
   3233	/* Improving burst noise performances */
   3234	stv0367_writereg(state, R367CAB_EQU_FFE_LEAKAGE, 0x83);
   3235	/* Improving ACI performances */
   3236	stv0367_writereg(state, R367CAB_IQDEM_ADJ_EN, 0x05);
   3237
   3238	/* PLL enabled and used */
   3239	stv0367_writereg(state, R367TER_ANACTRL, 0x00);
   3240
   3241	stv0367_writereg(state, R367TER_I2CRPT, (0x08 | ((5 & 0x07) << 4)));
   3242
   3243	ter_state->pBER = 0;
   3244	ter_state->first_lock = 0;
   3245	ter_state->unlock_counter = 2;
   3246
   3247	p->strength.len = 1;
   3248	p->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
   3249	p->cnr.len = 1;
   3250	p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
   3251	p->block_error.len = 1;
   3252	p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
   3253
   3254	return 0;
   3255}
   3256
   3257static const struct dvb_frontend_ops stv0367ddb_ops = {
   3258	.delsys = { SYS_DVBC_ANNEX_A, SYS_DVBT },
   3259	.info = {
   3260		.name			= "ST STV0367 DDB DVB-C/T",
   3261		.frequency_min_hz	=  47 * MHz,
   3262		.frequency_max_hz	= 865 * MHz,
   3263		.frequency_stepsize_hz	= 166667,
   3264		.symbol_rate_min	= 870000,
   3265		.symbol_rate_max	= 11700000,
   3266		.caps = /* DVB-C */
   3267			0x400 |/* FE_CAN_QAM_4 */
   3268			FE_CAN_QAM_16 | FE_CAN_QAM_32  |
   3269			FE_CAN_QAM_64 | FE_CAN_QAM_128 |
   3270			FE_CAN_QAM_256 |
   3271			/* DVB-T */
   3272			FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
   3273			FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
   3274			FE_CAN_QPSK | FE_CAN_TRANSMISSION_MODE_AUTO |
   3275			FE_CAN_RECOVER | FE_CAN_INVERSION_AUTO |
   3276			FE_CAN_MUTE_TS
   3277	},
   3278	.release = stv0367_release,
   3279	.sleep = stv0367ddb_sleep,
   3280	.i2c_gate_ctrl = stv0367cab_gate_ctrl, /* valid for TER and CAB */
   3281	.set_frontend = stv0367ddb_set_frontend,
   3282	.get_frontend = stv0367ddb_get_frontend,
   3283	.get_tune_settings = stv0367_get_tune_settings,
   3284	.read_status = stv0367ddb_read_status,
   3285};
   3286
   3287struct dvb_frontend *stv0367ddb_attach(const struct stv0367_config *config,
   3288				   struct i2c_adapter *i2c)
   3289{
   3290	struct stv0367_state *state = NULL;
   3291	struct stv0367ter_state *ter_state = NULL;
   3292	struct stv0367cab_state *cab_state = NULL;
   3293
   3294	/* allocate memory for the internal state */
   3295	state = kzalloc(sizeof(struct stv0367_state), GFP_KERNEL);
   3296	if (state == NULL)
   3297		goto error;
   3298	ter_state = kzalloc(sizeof(struct stv0367ter_state), GFP_KERNEL);
   3299	if (ter_state == NULL)
   3300		goto error;
   3301	cab_state = kzalloc(sizeof(struct stv0367cab_state), GFP_KERNEL);
   3302	if (cab_state == NULL)
   3303		goto error;
   3304
   3305	/* setup the state */
   3306	state->i2c = i2c;
   3307	state->config = config;
   3308	state->ter_state = ter_state;
   3309	cab_state->search_range = 280000;
   3310	cab_state->qamfec_status_reg = F367CAB_DESCR_SYNCSTATE;
   3311	state->cab_state = cab_state;
   3312	state->fe.ops = stv0367ddb_ops;
   3313	state->fe.demodulator_priv = state;
   3314	state->chip_id = stv0367_readreg(state, R367TER_ID);
   3315
   3316	/* demod operation options */
   3317	state->use_i2c_gatectrl = 0;
   3318	state->deftabs = STV0367_DEFTAB_DDB;
   3319	state->reinit_on_setfrontend = 0;
   3320	state->auto_if_khz = 1;
   3321	state->activedemod = demod_none;
   3322
   3323	dprintk("%s: chip_id = 0x%x\n", __func__, state->chip_id);
   3324
   3325	/* check if the demod is there */
   3326	if ((state->chip_id != 0x50) && (state->chip_id != 0x60))
   3327		goto error;
   3328
   3329	dev_info(&i2c->dev, "Found %s with ChipID %02X at adr %02X\n",
   3330		state->fe.ops.info.name, state->chip_id,
   3331		config->demod_address);
   3332
   3333	stv0367ddb_init(state);
   3334
   3335	return &state->fe;
   3336
   3337error:
   3338	kfree(cab_state);
   3339	kfree(ter_state);
   3340	kfree(state);
   3341	return NULL;
   3342}
   3343EXPORT_SYMBOL(stv0367ddb_attach);
   3344
   3345MODULE_PARM_DESC(debug, "Set debug");
   3346MODULE_PARM_DESC(i2c_debug, "Set i2c debug");
   3347
   3348MODULE_AUTHOR("Igor M. Liplianin");
   3349MODULE_DESCRIPTION("ST STV0367 DVB-C/T demodulator driver");
   3350MODULE_LICENSE("GPL");