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

stv0900_sw.c (50708B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * stv0900_sw.c
      4 *
      5 * Driver for ST STV0900 satellite demodulator IC.
      6 *
      7 * Copyright (C) ST Microelectronics.
      8 * Copyright (C) 2009 NetUP Inc.
      9 * Copyright (C) 2009 Igor M. Liplianin <liplianin@netup.ru>
     10 */
     11
     12#include "stv0900.h"
     13#include "stv0900_reg.h"
     14#include "stv0900_priv.h"
     15
     16s32 shiftx(s32 x, int demod, s32 shift)
     17{
     18	if (demod == 1)
     19		return x - shift;
     20
     21	return x;
     22}
     23
     24int stv0900_check_signal_presence(struct stv0900_internal *intp,
     25					enum fe_stv0900_demod_num demod)
     26{
     27	s32	carr_offset,
     28		agc2_integr,
     29		max_carrier;
     30
     31	int no_signal = FALSE;
     32
     33	carr_offset = (stv0900_read_reg(intp, CFR2) << 8)
     34					| stv0900_read_reg(intp, CFR1);
     35	carr_offset = ge2comp(carr_offset, 16);
     36	agc2_integr = (stv0900_read_reg(intp, AGC2I1) << 8)
     37					| stv0900_read_reg(intp, AGC2I0);
     38	max_carrier = intp->srch_range[demod] / 1000;
     39
     40	max_carrier += (max_carrier / 10);
     41	max_carrier = 65536 * (max_carrier / 2);
     42	max_carrier /= intp->mclk / 1000;
     43	if (max_carrier > 0x4000)
     44		max_carrier = 0x4000;
     45
     46	if ((agc2_integr > 0x2000)
     47			|| (carr_offset > (2 * max_carrier))
     48			|| (carr_offset < (-2 * max_carrier)))
     49		no_signal = TRUE;
     50
     51	return no_signal;
     52}
     53
     54static void stv0900_get_sw_loop_params(struct stv0900_internal *intp,
     55				s32 *frequency_inc, s32 *sw_timeout,
     56				s32 *steps,
     57				enum fe_stv0900_demod_num demod)
     58{
     59	s32 timeout, freq_inc, max_steps, srate, max_carrier;
     60
     61	enum fe_stv0900_search_standard	standard;
     62
     63	srate = intp->symbol_rate[demod];
     64	max_carrier = intp->srch_range[demod] / 1000;
     65	max_carrier += max_carrier / 10;
     66	standard = intp->srch_standard[demod];
     67
     68	max_carrier = 65536 * (max_carrier / 2);
     69	max_carrier /= intp->mclk / 1000;
     70
     71	if (max_carrier > 0x4000)
     72		max_carrier = 0x4000;
     73
     74	freq_inc = srate;
     75	freq_inc /= intp->mclk >> 10;
     76	freq_inc = freq_inc << 6;
     77
     78	switch (standard) {
     79	case STV0900_SEARCH_DVBS1:
     80	case STV0900_SEARCH_DSS:
     81		freq_inc *= 3;
     82		timeout = 20;
     83		break;
     84	case STV0900_SEARCH_DVBS2:
     85		freq_inc *= 4;
     86		timeout = 25;
     87		break;
     88	case STV0900_AUTO_SEARCH:
     89	default:
     90		freq_inc *= 3;
     91		timeout = 25;
     92		break;
     93	}
     94
     95	freq_inc /= 100;
     96
     97	if ((freq_inc > max_carrier) || (freq_inc < 0))
     98		freq_inc = max_carrier / 2;
     99
    100	timeout *= 27500;
    101
    102	if (srate > 0)
    103		timeout /= srate / 1000;
    104
    105	if ((timeout > 100) || (timeout < 0))
    106		timeout = 100;
    107
    108	max_steps = (max_carrier / freq_inc) + 1;
    109
    110	if ((max_steps > 100) || (max_steps < 0)) {
    111		max_steps =  100;
    112		freq_inc = max_carrier / max_steps;
    113	}
    114
    115	*frequency_inc = freq_inc;
    116	*sw_timeout = timeout;
    117	*steps = max_steps;
    118
    119}
    120
    121static int stv0900_search_carr_sw_loop(struct stv0900_internal *intp,
    122				s32 FreqIncr, s32 Timeout, int zigzag,
    123				s32 MaxStep, enum fe_stv0900_demod_num demod)
    124{
    125	int	no_signal,
    126		lock = FALSE;
    127	s32	stepCpt,
    128		freqOffset,
    129		max_carrier;
    130
    131	max_carrier = intp->srch_range[demod] / 1000;
    132	max_carrier += (max_carrier / 10);
    133
    134	max_carrier = 65536 * (max_carrier / 2);
    135	max_carrier /= intp->mclk / 1000;
    136
    137	if (max_carrier > 0x4000)
    138		max_carrier = 0x4000;
    139
    140	if (zigzag == TRUE)
    141		freqOffset = 0;
    142	else
    143		freqOffset = -max_carrier + FreqIncr;
    144
    145	stepCpt = 0;
    146
    147	do {
    148		stv0900_write_reg(intp, DMDISTATE, 0x1c);
    149		stv0900_write_reg(intp, CFRINIT1, (freqOffset / 256) & 0xff);
    150		stv0900_write_reg(intp, CFRINIT0, freqOffset & 0xff);
    151		stv0900_write_reg(intp, DMDISTATE, 0x18);
    152		stv0900_write_bits(intp, ALGOSWRST, 1);
    153
    154		if (intp->chip_id == 0x12) {
    155			stv0900_write_bits(intp, RST_HWARE, 1);
    156			stv0900_write_bits(intp, RST_HWARE, 0);
    157		}
    158
    159		if (zigzag == TRUE) {
    160			if (freqOffset >= 0)
    161				freqOffset = -freqOffset - 2 * FreqIncr;
    162			else
    163				freqOffset = -freqOffset;
    164		} else
    165			freqOffset += + 2 * FreqIncr;
    166
    167		stepCpt++;
    168		lock = stv0900_get_demod_lock(intp, demod, Timeout);
    169		no_signal = stv0900_check_signal_presence(intp, demod);
    170
    171	} while ((lock == FALSE)
    172			&& (no_signal == FALSE)
    173			&& ((freqOffset - FreqIncr) <  max_carrier)
    174			&& ((freqOffset + FreqIncr) > -max_carrier)
    175			&& (stepCpt < MaxStep));
    176
    177	stv0900_write_bits(intp, ALGOSWRST, 0);
    178
    179	return lock;
    180}
    181
    182static int stv0900_sw_algo(struct stv0900_internal *intp,
    183				enum fe_stv0900_demod_num demod)
    184{
    185	int	lock = FALSE,
    186		no_signal,
    187		zigzag;
    188	s32	s2fw,
    189		fqc_inc,
    190		sft_stp_tout,
    191		trial_cntr,
    192		max_steps;
    193
    194	stv0900_get_sw_loop_params(intp, &fqc_inc, &sft_stp_tout,
    195					&max_steps, demod);
    196	switch (intp->srch_standard[demod]) {
    197	case STV0900_SEARCH_DVBS1:
    198	case STV0900_SEARCH_DSS:
    199		if (intp->chip_id >= 0x20)
    200			stv0900_write_reg(intp, CARFREQ, 0x3b);
    201		else
    202			stv0900_write_reg(intp, CARFREQ, 0xef);
    203
    204		stv0900_write_reg(intp, DMDCFGMD, 0x49);
    205		zigzag = FALSE;
    206		break;
    207	case STV0900_SEARCH_DVBS2:
    208		if (intp->chip_id >= 0x20)
    209			stv0900_write_reg(intp, CORRELABS, 0x79);
    210		else
    211			stv0900_write_reg(intp, CORRELABS, 0x68);
    212
    213		stv0900_write_reg(intp, DMDCFGMD, 0x89);
    214
    215		zigzag = TRUE;
    216		break;
    217	case STV0900_AUTO_SEARCH:
    218	default:
    219		if (intp->chip_id >= 0x20) {
    220			stv0900_write_reg(intp, CARFREQ, 0x3b);
    221			stv0900_write_reg(intp, CORRELABS, 0x79);
    222		} else {
    223			stv0900_write_reg(intp, CARFREQ, 0xef);
    224			stv0900_write_reg(intp, CORRELABS, 0x68);
    225		}
    226
    227		stv0900_write_reg(intp, DMDCFGMD, 0xc9);
    228		zigzag = FALSE;
    229		break;
    230	}
    231
    232	trial_cntr = 0;
    233	do {
    234		lock = stv0900_search_carr_sw_loop(intp,
    235						fqc_inc,
    236						sft_stp_tout,
    237						zigzag,
    238						max_steps,
    239						demod);
    240		no_signal = stv0900_check_signal_presence(intp, demod);
    241		trial_cntr++;
    242		if ((lock == TRUE)
    243				|| (no_signal == TRUE)
    244				|| (trial_cntr == 2)) {
    245
    246			if (intp->chip_id >= 0x20) {
    247				stv0900_write_reg(intp, CARFREQ, 0x49);
    248				stv0900_write_reg(intp, CORRELABS, 0x9e);
    249			} else {
    250				stv0900_write_reg(intp, CARFREQ, 0xed);
    251				stv0900_write_reg(intp, CORRELABS, 0x88);
    252			}
    253
    254			if ((stv0900_get_bits(intp, HEADER_MODE) ==
    255						STV0900_DVBS2_FOUND) &&
    256							(lock == TRUE)) {
    257				msleep(sft_stp_tout);
    258				s2fw = stv0900_get_bits(intp, FLYWHEEL_CPT);
    259
    260				if (s2fw < 0xd) {
    261					msleep(sft_stp_tout);
    262					s2fw = stv0900_get_bits(intp,
    263								FLYWHEEL_CPT);
    264				}
    265
    266				if (s2fw < 0xd) {
    267					lock = FALSE;
    268
    269					if (trial_cntr < 2) {
    270						if (intp->chip_id >= 0x20)
    271							stv0900_write_reg(intp,
    272								CORRELABS,
    273								0x79);
    274						else
    275							stv0900_write_reg(intp,
    276								CORRELABS,
    277								0x68);
    278
    279						stv0900_write_reg(intp,
    280								DMDCFGMD,
    281								0x89);
    282					}
    283				}
    284			}
    285		}
    286
    287	} while ((lock == FALSE)
    288		&& (trial_cntr < 2)
    289		&& (no_signal == FALSE));
    290
    291	return lock;
    292}
    293
    294static u32 stv0900_get_symbol_rate(struct stv0900_internal *intp,
    295					u32 mclk,
    296					enum fe_stv0900_demod_num demod)
    297{
    298	s32	rem1, rem2, intval1, intval2, srate;
    299
    300	srate = (stv0900_get_bits(intp, SYMB_FREQ3) << 24) +
    301		(stv0900_get_bits(intp, SYMB_FREQ2) << 16) +
    302		(stv0900_get_bits(intp, SYMB_FREQ1) << 8) +
    303		(stv0900_get_bits(intp, SYMB_FREQ0));
    304	dprintk("lock: srate=%d r0=0x%x r1=0x%x r2=0x%x r3=0x%x \n",
    305		srate, stv0900_get_bits(intp, SYMB_FREQ0),
    306		stv0900_get_bits(intp, SYMB_FREQ1),
    307		stv0900_get_bits(intp, SYMB_FREQ2),
    308		stv0900_get_bits(intp, SYMB_FREQ3));
    309
    310	intval1 = (mclk) >> 16;
    311	intval2 = (srate) >> 16;
    312
    313	rem1 = (mclk) % 0x10000;
    314	rem2 = (srate) % 0x10000;
    315	srate =	(intval1 * intval2) +
    316		((intval1 * rem2) >> 16) +
    317		((intval2 * rem1) >> 16);
    318
    319	return srate;
    320}
    321
    322static void stv0900_set_symbol_rate(struct stv0900_internal *intp,
    323					u32 mclk, u32 srate,
    324					enum fe_stv0900_demod_num demod)
    325{
    326	u32 symb;
    327
    328	dprintk("%s: Mclk %d, SR %d, Dmd %d\n", __func__, mclk,
    329							srate, demod);
    330
    331	if (srate > 60000000) {
    332		symb = srate << 4;
    333		symb /= (mclk >> 12);
    334	} else if (srate > 6000000) {
    335		symb = srate << 6;
    336		symb /= (mclk >> 10);
    337	} else {
    338		symb = srate << 9;
    339		symb /= (mclk >> 7);
    340	}
    341
    342	stv0900_write_reg(intp, SFRINIT1, (symb >> 8) & 0x7f);
    343	stv0900_write_reg(intp, SFRINIT1 + 1, (symb & 0xff));
    344}
    345
    346static void stv0900_set_max_symbol_rate(struct stv0900_internal *intp,
    347					u32 mclk, u32 srate,
    348					enum fe_stv0900_demod_num demod)
    349{
    350	u32 symb;
    351
    352	srate = 105 * (srate / 100);
    353
    354	if (srate > 60000000) {
    355		symb = srate << 4;
    356		symb /= (mclk >> 12);
    357	} else if (srate > 6000000) {
    358		symb = srate << 6;
    359		symb /= (mclk >> 10);
    360	} else {
    361		symb = srate << 9;
    362		symb /= (mclk >> 7);
    363	}
    364
    365	if (symb < 0x7fff) {
    366		stv0900_write_reg(intp, SFRUP1, (symb >> 8) & 0x7f);
    367		stv0900_write_reg(intp, SFRUP1 + 1, (symb & 0xff));
    368	} else {
    369		stv0900_write_reg(intp, SFRUP1, 0x7f);
    370		stv0900_write_reg(intp, SFRUP1 + 1, 0xff);
    371	}
    372}
    373
    374static void stv0900_set_min_symbol_rate(struct stv0900_internal *intp,
    375					u32 mclk, u32 srate,
    376					enum fe_stv0900_demod_num demod)
    377{
    378	u32	symb;
    379
    380	srate = 95 * (srate / 100);
    381	if (srate > 60000000) {
    382		symb = srate << 4;
    383		symb /= (mclk >> 12);
    384
    385	} else if (srate > 6000000) {
    386		symb = srate << 6;
    387		symb /= (mclk >> 10);
    388
    389	} else {
    390		symb = srate << 9;
    391		symb /= (mclk >> 7);
    392	}
    393
    394	stv0900_write_reg(intp, SFRLOW1, (symb >> 8) & 0xff);
    395	stv0900_write_reg(intp, SFRLOW1 + 1, (symb & 0xff));
    396}
    397
    398static s32 stv0900_get_timing_offst(struct stv0900_internal *intp,
    399					u32 srate,
    400					enum fe_stv0900_demod_num demod)
    401{
    402	s32 timingoffset;
    403
    404
    405	timingoffset = (stv0900_read_reg(intp, TMGREG2) << 16) +
    406		       (stv0900_read_reg(intp, TMGREG2 + 1) << 8) +
    407		       (stv0900_read_reg(intp, TMGREG2 + 2));
    408
    409	timingoffset = ge2comp(timingoffset, 24);
    410
    411
    412	if (timingoffset == 0)
    413		timingoffset = 1;
    414
    415	timingoffset = ((s32)srate * 10) / ((s32)0x1000000 / timingoffset);
    416	timingoffset /= 320;
    417
    418	return timingoffset;
    419}
    420
    421static void stv0900_set_dvbs2_rolloff(struct stv0900_internal *intp,
    422					enum fe_stv0900_demod_num demod)
    423{
    424	s32 rolloff;
    425
    426	if (intp->chip_id == 0x10) {
    427		stv0900_write_bits(intp, MANUALSX_ROLLOFF, 1);
    428		rolloff = stv0900_read_reg(intp, MATSTR1) & 0x03;
    429		stv0900_write_bits(intp, ROLLOFF_CONTROL, rolloff);
    430	} else if (intp->chip_id <= 0x20)
    431		stv0900_write_bits(intp, MANUALSX_ROLLOFF, 0);
    432	else /* cut 3.0 */
    433		stv0900_write_bits(intp, MANUALS2_ROLLOFF, 0);
    434}
    435
    436static u32 stv0900_carrier_width(u32 srate, enum fe_stv0900_rolloff ro)
    437{
    438	u32 rolloff;
    439
    440	switch (ro) {
    441	case STV0900_20:
    442		rolloff = 20;
    443		break;
    444	case STV0900_25:
    445		rolloff = 25;
    446		break;
    447	case STV0900_35:
    448	default:
    449		rolloff = 35;
    450		break;
    451	}
    452
    453	return srate  + (srate * rolloff) / 100;
    454}
    455
    456static int stv0900_check_timing_lock(struct stv0900_internal *intp,
    457				enum fe_stv0900_demod_num demod)
    458{
    459	int timingLock = FALSE;
    460	s32	i,
    461		timingcpt = 0;
    462	u8	car_freq,
    463		tmg_th_high,
    464		tmg_th_low;
    465
    466	car_freq = stv0900_read_reg(intp, CARFREQ);
    467	tmg_th_high = stv0900_read_reg(intp, TMGTHRISE);
    468	tmg_th_low = stv0900_read_reg(intp, TMGTHFALL);
    469	stv0900_write_reg(intp, TMGTHRISE, 0x20);
    470	stv0900_write_reg(intp, TMGTHFALL, 0x0);
    471	stv0900_write_bits(intp, CFR_AUTOSCAN, 0);
    472	stv0900_write_reg(intp, RTC, 0x80);
    473	stv0900_write_reg(intp, RTCS2, 0x40);
    474	stv0900_write_reg(intp, CARFREQ, 0x0);
    475	stv0900_write_reg(intp, CFRINIT1, 0x0);
    476	stv0900_write_reg(intp, CFRINIT0, 0x0);
    477	stv0900_write_reg(intp, AGC2REF, 0x65);
    478	stv0900_write_reg(intp, DMDISTATE, 0x18);
    479	msleep(7);
    480
    481	for (i = 0; i < 10; i++) {
    482		if (stv0900_get_bits(intp, TMGLOCK_QUALITY) >= 2)
    483			timingcpt++;
    484
    485		msleep(1);
    486	}
    487
    488	if (timingcpt >= 3)
    489		timingLock = TRUE;
    490
    491	stv0900_write_reg(intp, AGC2REF, 0x38);
    492	stv0900_write_reg(intp, RTC, 0x88);
    493	stv0900_write_reg(intp, RTCS2, 0x68);
    494	stv0900_write_reg(intp, CARFREQ, car_freq);
    495	stv0900_write_reg(intp, TMGTHRISE, tmg_th_high);
    496	stv0900_write_reg(intp, TMGTHFALL, tmg_th_low);
    497
    498	return	timingLock;
    499}
    500
    501static int stv0900_get_demod_cold_lock(struct dvb_frontend *fe,
    502					s32 demod_timeout)
    503{
    504	struct stv0900_state *state = fe->demodulator_priv;
    505	struct stv0900_internal *intp = state->internal;
    506	enum fe_stv0900_demod_num demod = state->demod;
    507	int	lock = FALSE,
    508		d = demod;
    509	s32	srate,
    510		search_range,
    511		locktimeout,
    512		currier_step,
    513		nb_steps,
    514		current_step,
    515		direction,
    516		tuner_freq,
    517		timeout,
    518		freq;
    519
    520	srate = intp->symbol_rate[d];
    521	search_range = intp->srch_range[d];
    522
    523	if (srate >= 10000000)
    524		locktimeout = demod_timeout / 3;
    525	else
    526		locktimeout = demod_timeout / 2;
    527
    528	lock = stv0900_get_demod_lock(intp, d, locktimeout);
    529
    530	if (lock != FALSE)
    531		return lock;
    532
    533	if (srate >= 10000000) {
    534		if (stv0900_check_timing_lock(intp, d) == TRUE) {
    535			stv0900_write_reg(intp, DMDISTATE, 0x1f);
    536			stv0900_write_reg(intp, DMDISTATE, 0x15);
    537			lock = stv0900_get_demod_lock(intp, d, demod_timeout);
    538		} else
    539			lock = FALSE;
    540
    541		return lock;
    542	}
    543
    544	if (intp->chip_id <= 0x20) {
    545		if (srate <= 1000000)
    546			currier_step = 500;
    547		else if (srate <= 4000000)
    548			currier_step = 1000;
    549		else if (srate <= 7000000)
    550			currier_step = 2000;
    551		else if (srate <= 10000000)
    552			currier_step = 3000;
    553		else
    554			currier_step = 5000;
    555
    556		if (srate >= 2000000) {
    557			timeout = (demod_timeout / 3);
    558			if (timeout > 1000)
    559				timeout = 1000;
    560		} else
    561			timeout = (demod_timeout / 2);
    562	} else {
    563		/*cut 3.0 */
    564		currier_step = srate / 4000;
    565		timeout = (demod_timeout * 3) / 4;
    566	}
    567
    568	nb_steps = ((search_range / 1000) / currier_step);
    569
    570	if ((nb_steps % 2) != 0)
    571		nb_steps += 1;
    572
    573	if (nb_steps <= 0)
    574		nb_steps = 2;
    575	else if (nb_steps > 12)
    576		nb_steps = 12;
    577
    578	current_step = 1;
    579	direction = 1;
    580
    581	if (intp->chip_id <= 0x20) {
    582		tuner_freq = intp->freq[d];
    583		intp->bw[d] = stv0900_carrier_width(intp->symbol_rate[d],
    584				intp->rolloff) + intp->symbol_rate[d];
    585	} else
    586		tuner_freq = 0;
    587
    588	while ((current_step <= nb_steps) && (lock == FALSE)) {
    589		if (direction > 0)
    590			tuner_freq += (current_step * currier_step);
    591		else
    592			tuner_freq -= (current_step * currier_step);
    593
    594		if (intp->chip_id <= 0x20) {
    595			if (intp->tuner_type[d] == 3)
    596				stv0900_set_tuner_auto(intp, tuner_freq,
    597						intp->bw[d], demod);
    598			else
    599				stv0900_set_tuner(fe, tuner_freq, intp->bw[d]);
    600
    601			stv0900_write_reg(intp, DMDISTATE, 0x1c);
    602			stv0900_write_reg(intp, CFRINIT1, 0);
    603			stv0900_write_reg(intp, CFRINIT0, 0);
    604			stv0900_write_reg(intp, DMDISTATE, 0x1f);
    605			stv0900_write_reg(intp, DMDISTATE, 0x15);
    606		} else {
    607			stv0900_write_reg(intp, DMDISTATE, 0x1c);
    608			freq = (tuner_freq * 65536) / (intp->mclk / 1000);
    609			stv0900_write_bits(intp, CFR_INIT1, MSB(freq));
    610			stv0900_write_bits(intp, CFR_INIT0, LSB(freq));
    611			stv0900_write_reg(intp, DMDISTATE, 0x1f);
    612			stv0900_write_reg(intp, DMDISTATE, 0x05);
    613		}
    614
    615		lock = stv0900_get_demod_lock(intp, d, timeout);
    616		direction *= -1;
    617		current_step++;
    618	}
    619
    620	return	lock;
    621}
    622
    623static void stv0900_get_lock_timeout(s32 *demod_timeout, s32 *fec_timeout,
    624					s32 srate,
    625					enum fe_stv0900_search_algo algo)
    626{
    627	switch (algo) {
    628	case STV0900_BLIND_SEARCH:
    629		if (srate <= 1500000) {
    630			(*demod_timeout) = 1500;
    631			(*fec_timeout) = 400;
    632		} else if (srate <= 5000000) {
    633			(*demod_timeout) = 1000;
    634			(*fec_timeout) = 300;
    635		} else {
    636			(*demod_timeout) = 700;
    637			(*fec_timeout) = 100;
    638		}
    639
    640		break;
    641	case STV0900_COLD_START:
    642	case STV0900_WARM_START:
    643	default:
    644		if (srate <= 1000000) {
    645			(*demod_timeout) = 3000;
    646			(*fec_timeout) = 1700;
    647		} else if (srate <= 2000000) {
    648			(*demod_timeout) = 2500;
    649			(*fec_timeout) = 1100;
    650		} else if (srate <= 5000000) {
    651			(*demod_timeout) = 1000;
    652			(*fec_timeout) = 550;
    653		} else if (srate <= 10000000) {
    654			(*demod_timeout) = 700;
    655			(*fec_timeout) = 250;
    656		} else if (srate <= 20000000) {
    657			(*demod_timeout) = 400;
    658			(*fec_timeout) = 130;
    659		} else {
    660			(*demod_timeout) = 300;
    661			(*fec_timeout) = 100;
    662		}
    663
    664		break;
    665
    666	}
    667
    668	if (algo == STV0900_WARM_START)
    669		(*demod_timeout) /= 2;
    670}
    671
    672static void stv0900_set_viterbi_tracq(struct stv0900_internal *intp,
    673					enum fe_stv0900_demod_num demod)
    674{
    675
    676	s32 vth_reg = VTH12;
    677
    678	dprintk("%s\n", __func__);
    679
    680	stv0900_write_reg(intp, vth_reg++, 0xd0);
    681	stv0900_write_reg(intp, vth_reg++, 0x7d);
    682	stv0900_write_reg(intp, vth_reg++, 0x53);
    683	stv0900_write_reg(intp, vth_reg++, 0x2f);
    684	stv0900_write_reg(intp, vth_reg++, 0x24);
    685	stv0900_write_reg(intp, vth_reg++, 0x1f);
    686}
    687
    688static void stv0900_set_viterbi_standard(struct stv0900_internal *intp,
    689				   enum fe_stv0900_search_standard standard,
    690				   enum fe_stv0900_fec fec,
    691				   enum fe_stv0900_demod_num demod)
    692{
    693	dprintk("%s: ViterbiStandard = ", __func__);
    694
    695	switch (standard) {
    696	case STV0900_AUTO_SEARCH:
    697		dprintk("Auto\n");
    698		stv0900_write_reg(intp, FECM, 0x10);
    699		stv0900_write_reg(intp, PRVIT, 0x3f);
    700		break;
    701	case STV0900_SEARCH_DVBS1:
    702		dprintk("DVBS1\n");
    703		stv0900_write_reg(intp, FECM, 0x00);
    704		switch (fec) {
    705		case STV0900_FEC_UNKNOWN:
    706		default:
    707			stv0900_write_reg(intp, PRVIT, 0x2f);
    708			break;
    709		case STV0900_FEC_1_2:
    710			stv0900_write_reg(intp, PRVIT, 0x01);
    711			break;
    712		case STV0900_FEC_2_3:
    713			stv0900_write_reg(intp, PRVIT, 0x02);
    714			break;
    715		case STV0900_FEC_3_4:
    716			stv0900_write_reg(intp, PRVIT, 0x04);
    717			break;
    718		case STV0900_FEC_5_6:
    719			stv0900_write_reg(intp, PRVIT, 0x08);
    720			break;
    721		case STV0900_FEC_7_8:
    722			stv0900_write_reg(intp, PRVIT, 0x20);
    723			break;
    724		}
    725
    726		break;
    727	case STV0900_SEARCH_DSS:
    728		dprintk("DSS\n");
    729		stv0900_write_reg(intp, FECM, 0x80);
    730		switch (fec) {
    731		case STV0900_FEC_UNKNOWN:
    732		default:
    733			stv0900_write_reg(intp, PRVIT, 0x13);
    734			break;
    735		case STV0900_FEC_1_2:
    736			stv0900_write_reg(intp, PRVIT, 0x01);
    737			break;
    738		case STV0900_FEC_2_3:
    739			stv0900_write_reg(intp, PRVIT, 0x02);
    740			break;
    741		case STV0900_FEC_6_7:
    742			stv0900_write_reg(intp, PRVIT, 0x10);
    743			break;
    744		}
    745		break;
    746	default:
    747		break;
    748	}
    749}
    750
    751static enum fe_stv0900_fec stv0900_get_vit_fec(struct stv0900_internal *intp,
    752						enum fe_stv0900_demod_num demod)
    753{
    754	enum fe_stv0900_fec prate;
    755	s32 rate_fld = stv0900_get_bits(intp, VIT_CURPUN);
    756
    757	switch (rate_fld) {
    758	case 13:
    759		prate = STV0900_FEC_1_2;
    760		break;
    761	case 18:
    762		prate = STV0900_FEC_2_3;
    763		break;
    764	case 21:
    765		prate = STV0900_FEC_3_4;
    766		break;
    767	case 24:
    768		prate = STV0900_FEC_5_6;
    769		break;
    770	case 25:
    771		prate = STV0900_FEC_6_7;
    772		break;
    773	case 26:
    774		prate = STV0900_FEC_7_8;
    775		break;
    776	default:
    777		prate = STV0900_FEC_UNKNOWN;
    778		break;
    779	}
    780
    781	return prate;
    782}
    783
    784static void stv0900_set_dvbs1_track_car_loop(struct stv0900_internal *intp,
    785					enum fe_stv0900_demod_num demod,
    786					u32 srate)
    787{
    788	if (intp->chip_id >= 0x30) {
    789		if (srate >= 15000000) {
    790			stv0900_write_reg(intp, ACLC, 0x2b);
    791			stv0900_write_reg(intp, BCLC, 0x1a);
    792		} else if ((srate >= 7000000) && (15000000 > srate)) {
    793			stv0900_write_reg(intp, ACLC, 0x0c);
    794			stv0900_write_reg(intp, BCLC, 0x1b);
    795		} else if (srate < 7000000) {
    796			stv0900_write_reg(intp, ACLC, 0x2c);
    797			stv0900_write_reg(intp, BCLC, 0x1c);
    798		}
    799
    800	} else { /*cut 2.0 and 1.x*/
    801		stv0900_write_reg(intp, ACLC, 0x1a);
    802		stv0900_write_reg(intp, BCLC, 0x09);
    803	}
    804
    805}
    806
    807static void stv0900_track_optimization(struct dvb_frontend *fe)
    808{
    809	struct stv0900_state *state = fe->demodulator_priv;
    810	struct stv0900_internal *intp = state->internal;
    811	enum fe_stv0900_demod_num demod = state->demod;
    812
    813	s32	srate,
    814		pilots,
    815		aclc,
    816		freq1,
    817		freq0,
    818		i = 0,
    819		timed,
    820		timef,
    821		blind_tun_sw = 0,
    822		modulation;
    823
    824	enum fe_stv0900_modcode foundModcod;
    825
    826	dprintk("%s\n", __func__);
    827
    828	srate = stv0900_get_symbol_rate(intp, intp->mclk, demod);
    829	srate += stv0900_get_timing_offst(intp, srate, demod);
    830
    831	switch (intp->result[demod].standard) {
    832	case STV0900_DVBS1_STANDARD:
    833	case STV0900_DSS_STANDARD:
    834		dprintk("%s: found DVB-S or DSS\n", __func__);
    835		if (intp->srch_standard[demod] == STV0900_AUTO_SEARCH) {
    836			stv0900_write_bits(intp, DVBS1_ENABLE, 1);
    837			stv0900_write_bits(intp, DVBS2_ENABLE, 0);
    838		}
    839
    840		stv0900_write_bits(intp, ROLLOFF_CONTROL, intp->rolloff);
    841		stv0900_write_bits(intp, MANUALSX_ROLLOFF, 1);
    842
    843		if (intp->chip_id < 0x30) {
    844			stv0900_write_reg(intp, ERRCTRL1, 0x75);
    845			break;
    846		}
    847
    848		if (stv0900_get_vit_fec(intp, demod) == STV0900_FEC_1_2) {
    849			stv0900_write_reg(intp, GAUSSR0, 0x98);
    850			stv0900_write_reg(intp, CCIR0, 0x18);
    851		} else {
    852			stv0900_write_reg(intp, GAUSSR0, 0x18);
    853			stv0900_write_reg(intp, CCIR0, 0x18);
    854		}
    855
    856		stv0900_write_reg(intp, ERRCTRL1, 0x75);
    857		break;
    858	case STV0900_DVBS2_STANDARD:
    859		dprintk("%s: found DVB-S2\n", __func__);
    860		stv0900_write_bits(intp, DVBS1_ENABLE, 0);
    861		stv0900_write_bits(intp, DVBS2_ENABLE, 1);
    862		stv0900_write_reg(intp, ACLC, 0);
    863		stv0900_write_reg(intp, BCLC, 0);
    864		if (intp->result[demod].frame_len == STV0900_LONG_FRAME) {
    865			foundModcod = stv0900_get_bits(intp, DEMOD_MODCOD);
    866			pilots = stv0900_get_bits(intp, DEMOD_TYPE) & 0x01;
    867			aclc = stv0900_get_optim_carr_loop(srate,
    868							foundModcod,
    869							pilots,
    870							intp->chip_id);
    871			if (foundModcod <= STV0900_QPSK_910)
    872				stv0900_write_reg(intp, ACLC2S2Q, aclc);
    873			else if (foundModcod <= STV0900_8PSK_910) {
    874				stv0900_write_reg(intp, ACLC2S2Q, 0x2a);
    875				stv0900_write_reg(intp, ACLC2S28, aclc);
    876			}
    877
    878			if ((intp->demod_mode == STV0900_SINGLE) &&
    879					(foundModcod > STV0900_8PSK_910)) {
    880				if (foundModcod <= STV0900_16APSK_910) {
    881					stv0900_write_reg(intp, ACLC2S2Q, 0x2a);
    882					stv0900_write_reg(intp, ACLC2S216A,
    883									aclc);
    884				} else if (foundModcod <= STV0900_32APSK_910) {
    885					stv0900_write_reg(intp, ACLC2S2Q, 0x2a);
    886					stv0900_write_reg(intp,	ACLC2S232A,
    887									aclc);
    888				}
    889			}
    890
    891		} else {
    892			modulation = intp->result[demod].modulation;
    893			aclc = stv0900_get_optim_short_carr_loop(srate,
    894					modulation, intp->chip_id);
    895			if (modulation == STV0900_QPSK)
    896				stv0900_write_reg(intp, ACLC2S2Q, aclc);
    897			else if (modulation == STV0900_8PSK) {
    898				stv0900_write_reg(intp, ACLC2S2Q, 0x2a);
    899				stv0900_write_reg(intp, ACLC2S28, aclc);
    900			} else if (modulation == STV0900_16APSK) {
    901				stv0900_write_reg(intp, ACLC2S2Q, 0x2a);
    902				stv0900_write_reg(intp, ACLC2S216A, aclc);
    903			} else if (modulation == STV0900_32APSK) {
    904				stv0900_write_reg(intp, ACLC2S2Q, 0x2a);
    905				stv0900_write_reg(intp, ACLC2S232A, aclc);
    906			}
    907
    908		}
    909
    910		if (intp->chip_id <= 0x11) {
    911			if (intp->demod_mode != STV0900_SINGLE)
    912				stv0900_activate_s2_modcod(intp, demod);
    913
    914		}
    915
    916		stv0900_write_reg(intp, ERRCTRL1, 0x67);
    917		break;
    918	case STV0900_UNKNOWN_STANDARD:
    919	default:
    920		dprintk("%s: found unknown standard\n", __func__);
    921		stv0900_write_bits(intp, DVBS1_ENABLE, 1);
    922		stv0900_write_bits(intp, DVBS2_ENABLE, 1);
    923		break;
    924	}
    925
    926	freq1 = stv0900_read_reg(intp, CFR2);
    927	freq0 = stv0900_read_reg(intp, CFR1);
    928	if (intp->srch_algo[demod] == STV0900_BLIND_SEARCH) {
    929		stv0900_write_reg(intp, SFRSTEP, 0x00);
    930		stv0900_write_bits(intp, SCAN_ENABLE, 0);
    931		stv0900_write_bits(intp, CFR_AUTOSCAN, 0);
    932		stv0900_write_reg(intp, TMGCFG2, 0xc1);
    933		stv0900_set_symbol_rate(intp, intp->mclk, srate, demod);
    934		blind_tun_sw = 1;
    935		if (intp->result[demod].standard != STV0900_DVBS2_STANDARD)
    936			stv0900_set_dvbs1_track_car_loop(intp, demod, srate);
    937
    938	}
    939
    940	if (intp->chip_id >= 0x20) {
    941		if ((intp->srch_standard[demod] == STV0900_SEARCH_DVBS1) ||
    942				(intp->srch_standard[demod] ==
    943							STV0900_SEARCH_DSS) ||
    944				(intp->srch_standard[demod] ==
    945							STV0900_AUTO_SEARCH)) {
    946			stv0900_write_reg(intp, VAVSRVIT, 0x0a);
    947			stv0900_write_reg(intp, VITSCALE, 0x0);
    948		}
    949	}
    950
    951	if (intp->chip_id < 0x20)
    952		stv0900_write_reg(intp, CARHDR, 0x08);
    953
    954	if (intp->chip_id == 0x10)
    955		stv0900_write_reg(intp, CORRELEXP, 0x0a);
    956
    957	stv0900_write_reg(intp, AGC2REF, 0x38);
    958
    959	if ((intp->chip_id >= 0x20) ||
    960			(blind_tun_sw == 1) ||
    961			(intp->symbol_rate[demod] < 10000000)) {
    962		stv0900_write_reg(intp, CFRINIT1, freq1);
    963		stv0900_write_reg(intp, CFRINIT0, freq0);
    964		intp->bw[demod] = stv0900_carrier_width(srate,
    965					intp->rolloff) + 10000000;
    966
    967		if ((intp->chip_id >= 0x20) || (blind_tun_sw == 1)) {
    968			if (intp->srch_algo[demod] != STV0900_WARM_START) {
    969				if (intp->tuner_type[demod] == 3)
    970					stv0900_set_tuner_auto(intp,
    971							intp->freq[demod],
    972							intp->bw[demod],
    973							demod);
    974				else
    975					stv0900_set_bandwidth(fe,
    976							intp->bw[demod]);
    977			}
    978		}
    979
    980		if ((intp->srch_algo[demod] == STV0900_BLIND_SEARCH) ||
    981				(intp->symbol_rate[demod] < 10000000))
    982			msleep(50);
    983		else
    984			msleep(5);
    985
    986		stv0900_get_lock_timeout(&timed, &timef, srate,
    987						STV0900_WARM_START);
    988
    989		if (stv0900_get_demod_lock(intp, demod, timed / 2) == FALSE) {
    990			stv0900_write_reg(intp, DMDISTATE, 0x1f);
    991			stv0900_write_reg(intp, CFRINIT1, freq1);
    992			stv0900_write_reg(intp, CFRINIT0, freq0);
    993			stv0900_write_reg(intp, DMDISTATE, 0x18);
    994			i = 0;
    995			while ((stv0900_get_demod_lock(intp,
    996							demod,
    997							timed / 2) == FALSE) &&
    998						(i <= 2)) {
    999				stv0900_write_reg(intp, DMDISTATE, 0x1f);
   1000				stv0900_write_reg(intp, CFRINIT1, freq1);
   1001				stv0900_write_reg(intp, CFRINIT0, freq0);
   1002				stv0900_write_reg(intp, DMDISTATE, 0x18);
   1003				i++;
   1004			}
   1005		}
   1006
   1007	}
   1008
   1009	if (intp->chip_id >= 0x20)
   1010		stv0900_write_reg(intp, CARFREQ, 0x49);
   1011
   1012	if ((intp->result[demod].standard == STV0900_DVBS1_STANDARD) ||
   1013			(intp->result[demod].standard == STV0900_DSS_STANDARD))
   1014		stv0900_set_viterbi_tracq(intp, demod);
   1015
   1016}
   1017
   1018static int stv0900_get_fec_lock(struct stv0900_internal *intp,
   1019				enum fe_stv0900_demod_num demod, s32 time_out)
   1020{
   1021	s32 timer = 0, lock = 0;
   1022
   1023	enum fe_stv0900_search_state dmd_state;
   1024
   1025	dprintk("%s\n", __func__);
   1026
   1027	dmd_state = stv0900_get_bits(intp, HEADER_MODE);
   1028
   1029	while ((timer < time_out) && (lock == 0)) {
   1030		switch (dmd_state) {
   1031		case STV0900_SEARCH:
   1032		case STV0900_PLH_DETECTED:
   1033		default:
   1034			lock = 0;
   1035			break;
   1036		case STV0900_DVBS2_FOUND:
   1037			lock = stv0900_get_bits(intp, PKTDELIN_LOCK);
   1038			break;
   1039		case STV0900_DVBS_FOUND:
   1040			lock = stv0900_get_bits(intp, LOCKEDVIT);
   1041			break;
   1042		}
   1043
   1044		if (lock == 0) {
   1045			msleep(10);
   1046			timer += 10;
   1047		}
   1048	}
   1049
   1050	if (lock)
   1051		dprintk("%s: DEMOD FEC LOCK OK\n", __func__);
   1052	else
   1053		dprintk("%s: DEMOD FEC LOCK FAIL\n", __func__);
   1054
   1055	return lock;
   1056}
   1057
   1058static int stv0900_wait_for_lock(struct stv0900_internal *intp,
   1059				enum fe_stv0900_demod_num demod,
   1060				s32 dmd_timeout, s32 fec_timeout)
   1061{
   1062
   1063	s32 timer = 0, lock = 0;
   1064
   1065	dprintk("%s\n", __func__);
   1066
   1067	lock = stv0900_get_demod_lock(intp, demod, dmd_timeout);
   1068
   1069	if (lock)
   1070		lock = stv0900_get_fec_lock(intp, demod, fec_timeout);
   1071
   1072	if (lock) {
   1073		lock = 0;
   1074
   1075		dprintk("%s: Timer = %d, time_out = %d\n",
   1076				__func__, timer, fec_timeout);
   1077
   1078		while ((timer < fec_timeout) && (lock == 0)) {
   1079			lock = stv0900_get_bits(intp, TSFIFO_LINEOK);
   1080			msleep(1);
   1081			timer++;
   1082		}
   1083	}
   1084
   1085	if (lock)
   1086		dprintk("%s: DEMOD LOCK OK\n", __func__);
   1087	else
   1088		dprintk("%s: DEMOD LOCK FAIL\n", __func__);
   1089
   1090	if (lock)
   1091		return TRUE;
   1092	else
   1093		return FALSE;
   1094}
   1095
   1096enum fe_stv0900_tracking_standard stv0900_get_standard(struct dvb_frontend *fe,
   1097						enum fe_stv0900_demod_num demod)
   1098{
   1099	struct stv0900_state *state = fe->demodulator_priv;
   1100	struct stv0900_internal *intp = state->internal;
   1101	enum fe_stv0900_tracking_standard fnd_standard;
   1102
   1103	int hdr_mode = stv0900_get_bits(intp, HEADER_MODE);
   1104
   1105	switch (hdr_mode) {
   1106	case 2:
   1107		fnd_standard = STV0900_DVBS2_STANDARD;
   1108		break;
   1109	case 3:
   1110		if (stv0900_get_bits(intp, DSS_DVB) == 1)
   1111			fnd_standard = STV0900_DSS_STANDARD;
   1112		else
   1113			fnd_standard = STV0900_DVBS1_STANDARD;
   1114
   1115		break;
   1116	default:
   1117		fnd_standard = STV0900_UNKNOWN_STANDARD;
   1118	}
   1119
   1120	dprintk("%s: standard %d\n", __func__, fnd_standard);
   1121
   1122	return fnd_standard;
   1123}
   1124
   1125static s32 stv0900_get_carr_freq(struct stv0900_internal *intp, u32 mclk,
   1126					enum fe_stv0900_demod_num demod)
   1127{
   1128	s32	derot,
   1129		rem1,
   1130		rem2,
   1131		intval1,
   1132		intval2;
   1133
   1134	derot = (stv0900_get_bits(intp, CAR_FREQ2) << 16) +
   1135		(stv0900_get_bits(intp, CAR_FREQ1) << 8) +
   1136		(stv0900_get_bits(intp, CAR_FREQ0));
   1137
   1138	derot = ge2comp(derot, 24);
   1139	intval1 = mclk >> 12;
   1140	intval2 = derot >> 12;
   1141	rem1 = mclk % 0x1000;
   1142	rem2 = derot % 0x1000;
   1143	derot = (intval1 * intval2) +
   1144		((intval1 * rem2) >> 12) +
   1145		((intval2 * rem1) >> 12);
   1146
   1147	return derot;
   1148}
   1149
   1150static u32 stv0900_get_tuner_freq(struct dvb_frontend *fe)
   1151{
   1152	struct dvb_frontend_ops	*frontend_ops = NULL;
   1153	struct dvb_tuner_ops *tuner_ops = NULL;
   1154	u32 freq = 0;
   1155
   1156	frontend_ops = &fe->ops;
   1157	tuner_ops = &frontend_ops->tuner_ops;
   1158
   1159	if (tuner_ops->get_frequency) {
   1160		if ((tuner_ops->get_frequency(fe, &freq)) < 0)
   1161			dprintk("%s: Invalid parameter\n", __func__);
   1162		else
   1163			dprintk("%s: Frequency=%d\n", __func__, freq);
   1164
   1165	}
   1166
   1167	return freq;
   1168}
   1169
   1170static enum
   1171fe_stv0900_signal_type stv0900_get_signal_params(struct dvb_frontend *fe)
   1172{
   1173	struct stv0900_state *state = fe->demodulator_priv;
   1174	struct stv0900_internal *intp = state->internal;
   1175	enum fe_stv0900_demod_num demod = state->demod;
   1176	enum fe_stv0900_signal_type range = STV0900_OUTOFRANGE;
   1177	struct stv0900_signal_info *result = &intp->result[demod];
   1178	s32	offsetFreq,
   1179		srate_offset;
   1180	int	i = 0,
   1181		d = demod;
   1182
   1183	u8 timing;
   1184
   1185	msleep(5);
   1186	if (intp->srch_algo[d] == STV0900_BLIND_SEARCH) {
   1187		timing = stv0900_read_reg(intp, TMGREG2);
   1188		i = 0;
   1189		stv0900_write_reg(intp, SFRSTEP, 0x5c);
   1190
   1191		while ((i <= 50) && (timing != 0) && (timing != 0xff)) {
   1192			timing = stv0900_read_reg(intp, TMGREG2);
   1193			msleep(5);
   1194			i += 5;
   1195		}
   1196	}
   1197
   1198	result->standard = stv0900_get_standard(fe, d);
   1199	if (intp->tuner_type[demod] == 3)
   1200		result->frequency = stv0900_get_freq_auto(intp, d);
   1201	else
   1202		result->frequency = stv0900_get_tuner_freq(fe);
   1203
   1204	offsetFreq = stv0900_get_carr_freq(intp, intp->mclk, d) / 1000;
   1205	result->frequency += offsetFreq;
   1206	result->symbol_rate = stv0900_get_symbol_rate(intp, intp->mclk, d);
   1207	srate_offset = stv0900_get_timing_offst(intp, result->symbol_rate, d);
   1208	result->symbol_rate += srate_offset;
   1209	result->fec = stv0900_get_vit_fec(intp, d);
   1210	result->modcode = stv0900_get_bits(intp, DEMOD_MODCOD);
   1211	result->pilot = stv0900_get_bits(intp, DEMOD_TYPE) & 0x01;
   1212	result->frame_len = ((u32)stv0900_get_bits(intp, DEMOD_TYPE)) >> 1;
   1213	result->rolloff = stv0900_get_bits(intp, ROLLOFF_STATUS);
   1214
   1215	dprintk("%s: modcode=0x%x \n", __func__, result->modcode);
   1216
   1217	switch (result->standard) {
   1218	case STV0900_DVBS2_STANDARD:
   1219		result->spectrum = stv0900_get_bits(intp, SPECINV_DEMOD);
   1220		if (result->modcode <= STV0900_QPSK_910)
   1221			result->modulation = STV0900_QPSK;
   1222		else if (result->modcode <= STV0900_8PSK_910)
   1223			result->modulation = STV0900_8PSK;
   1224		else if (result->modcode <= STV0900_16APSK_910)
   1225			result->modulation = STV0900_16APSK;
   1226		else if (result->modcode <= STV0900_32APSK_910)
   1227			result->modulation = STV0900_32APSK;
   1228		else
   1229			result->modulation = STV0900_UNKNOWN;
   1230		break;
   1231	case STV0900_DVBS1_STANDARD:
   1232	case STV0900_DSS_STANDARD:
   1233		result->spectrum = stv0900_get_bits(intp, IQINV);
   1234		result->modulation = STV0900_QPSK;
   1235		break;
   1236	default:
   1237		break;
   1238	}
   1239
   1240	if ((intp->srch_algo[d] == STV0900_BLIND_SEARCH) ||
   1241				(intp->symbol_rate[d] < 10000000)) {
   1242		offsetFreq = result->frequency - intp->freq[d];
   1243		if (intp->tuner_type[demod] == 3)
   1244			intp->freq[d] = stv0900_get_freq_auto(intp, d);
   1245		else
   1246			intp->freq[d] = stv0900_get_tuner_freq(fe);
   1247
   1248		if (abs(offsetFreq) <= ((intp->srch_range[d] / 2000) + 500))
   1249			range = STV0900_RANGEOK;
   1250		else if (abs(offsetFreq) <=
   1251				(stv0900_carrier_width(result->symbol_rate,
   1252						result->rolloff) / 2000))
   1253			range = STV0900_RANGEOK;
   1254
   1255	} else if (abs(offsetFreq) <= ((intp->srch_range[d] / 2000) + 500))
   1256		range = STV0900_RANGEOK;
   1257
   1258	dprintk("%s: range %d\n", __func__, range);
   1259
   1260	return range;
   1261}
   1262
   1263static enum
   1264fe_stv0900_signal_type stv0900_dvbs1_acq_workaround(struct dvb_frontend *fe)
   1265{
   1266	struct stv0900_state *state = fe->demodulator_priv;
   1267	struct stv0900_internal *intp = state->internal;
   1268	enum fe_stv0900_demod_num demod = state->demod;
   1269	enum fe_stv0900_signal_type signal_type = STV0900_NODATA;
   1270
   1271	s32	srate,
   1272		demod_timeout,
   1273		fec_timeout,
   1274		freq1,
   1275		freq0;
   1276
   1277	intp->result[demod].locked = FALSE;
   1278
   1279	if (stv0900_get_bits(intp, HEADER_MODE) == STV0900_DVBS_FOUND) {
   1280		srate = stv0900_get_symbol_rate(intp, intp->mclk, demod);
   1281		srate += stv0900_get_timing_offst(intp, srate, demod);
   1282		if (intp->srch_algo[demod] == STV0900_BLIND_SEARCH)
   1283			stv0900_set_symbol_rate(intp, intp->mclk, srate, demod);
   1284
   1285		stv0900_get_lock_timeout(&demod_timeout, &fec_timeout,
   1286					srate, STV0900_WARM_START);
   1287		freq1 = stv0900_read_reg(intp, CFR2);
   1288		freq0 = stv0900_read_reg(intp, CFR1);
   1289		stv0900_write_bits(intp, CFR_AUTOSCAN, 0);
   1290		stv0900_write_bits(intp, SPECINV_CONTROL,
   1291					STV0900_IQ_FORCE_SWAPPED);
   1292		stv0900_write_reg(intp, DMDISTATE, 0x1c);
   1293		stv0900_write_reg(intp, CFRINIT1, freq1);
   1294		stv0900_write_reg(intp, CFRINIT0, freq0);
   1295		stv0900_write_reg(intp, DMDISTATE, 0x18);
   1296		if (stv0900_wait_for_lock(intp, demod,
   1297				demod_timeout, fec_timeout) == TRUE) {
   1298			intp->result[demod].locked = TRUE;
   1299			signal_type = stv0900_get_signal_params(fe);
   1300			stv0900_track_optimization(fe);
   1301		} else {
   1302			stv0900_write_bits(intp, SPECINV_CONTROL,
   1303					STV0900_IQ_FORCE_NORMAL);
   1304			stv0900_write_reg(intp, DMDISTATE, 0x1c);
   1305			stv0900_write_reg(intp, CFRINIT1, freq1);
   1306			stv0900_write_reg(intp, CFRINIT0, freq0);
   1307			stv0900_write_reg(intp, DMDISTATE, 0x18);
   1308			if (stv0900_wait_for_lock(intp, demod,
   1309					demod_timeout, fec_timeout) == TRUE) {
   1310				intp->result[demod].locked = TRUE;
   1311				signal_type = stv0900_get_signal_params(fe);
   1312				stv0900_track_optimization(fe);
   1313			}
   1314
   1315		}
   1316
   1317	} else
   1318		intp->result[demod].locked = FALSE;
   1319
   1320	return signal_type;
   1321}
   1322
   1323static u16 stv0900_blind_check_agc2_min_level(struct stv0900_internal *intp,
   1324					enum fe_stv0900_demod_num demod)
   1325{
   1326	u32 minagc2level = 0xffff,
   1327		agc2level,
   1328		init_freq, freq_step;
   1329
   1330	s32 i, j, nb_steps, direction;
   1331
   1332	dprintk("%s\n", __func__);
   1333
   1334	stv0900_write_reg(intp, AGC2REF, 0x38);
   1335	stv0900_write_bits(intp, SCAN_ENABLE, 0);
   1336	stv0900_write_bits(intp, CFR_AUTOSCAN, 0);
   1337
   1338	stv0900_write_bits(intp, AUTO_GUP, 1);
   1339	stv0900_write_bits(intp, AUTO_GLOW, 1);
   1340
   1341	stv0900_write_reg(intp, DMDT0M, 0x0);
   1342
   1343	stv0900_set_symbol_rate(intp, intp->mclk, 1000000, demod);
   1344	nb_steps = -1 + (intp->srch_range[demod] / 1000000);
   1345	nb_steps /= 2;
   1346	nb_steps = (2 * nb_steps) + 1;
   1347
   1348	if (nb_steps < 0)
   1349		nb_steps = 1;
   1350
   1351	direction = 1;
   1352
   1353	freq_step = (1000000 << 8) / (intp->mclk >> 8);
   1354
   1355	init_freq = 0;
   1356
   1357	for (i = 0; i < nb_steps; i++) {
   1358		if (direction > 0)
   1359			init_freq = init_freq + (freq_step * i);
   1360		else
   1361			init_freq = init_freq - (freq_step * i);
   1362
   1363		direction *= -1;
   1364		stv0900_write_reg(intp, DMDISTATE, 0x5C);
   1365		stv0900_write_reg(intp, CFRINIT1, (init_freq >> 8) & 0xff);
   1366		stv0900_write_reg(intp, CFRINIT0, init_freq  & 0xff);
   1367		stv0900_write_reg(intp, DMDISTATE, 0x58);
   1368		msleep(10);
   1369		agc2level = 0;
   1370
   1371		for (j = 0; j < 10; j++)
   1372			agc2level += (stv0900_read_reg(intp, AGC2I1) << 8)
   1373					| stv0900_read_reg(intp, AGC2I0);
   1374
   1375		agc2level /= 10;
   1376
   1377		if (agc2level < minagc2level)
   1378			minagc2level = agc2level;
   1379
   1380	}
   1381
   1382	return (u16)minagc2level;
   1383}
   1384
   1385static u32 stv0900_search_srate_coarse(struct dvb_frontend *fe)
   1386{
   1387	struct stv0900_state *state = fe->demodulator_priv;
   1388	struct stv0900_internal *intp = state->internal;
   1389	enum fe_stv0900_demod_num demod = state->demod;
   1390	int timing_lck = FALSE;
   1391	s32 i, timingcpt = 0,
   1392		direction = 1,
   1393		nb_steps,
   1394		current_step = 0,
   1395		tuner_freq;
   1396	u32 agc2_th,
   1397		coarse_srate = 0,
   1398		agc2_integr = 0,
   1399		currier_step = 1200;
   1400
   1401	if (intp->chip_id >= 0x30)
   1402		agc2_th = 0x2e00;
   1403	else
   1404		agc2_th = 0x1f00;
   1405
   1406	stv0900_write_bits(intp, DEMOD_MODE, 0x1f);
   1407	stv0900_write_reg(intp, TMGCFG, 0x12);
   1408	stv0900_write_reg(intp, TMGTHRISE, 0xf0);
   1409	stv0900_write_reg(intp, TMGTHFALL, 0xe0);
   1410	stv0900_write_bits(intp, SCAN_ENABLE, 1);
   1411	stv0900_write_bits(intp, CFR_AUTOSCAN, 1);
   1412	stv0900_write_reg(intp, SFRUP1, 0x83);
   1413	stv0900_write_reg(intp, SFRUP0, 0xc0);
   1414	stv0900_write_reg(intp, SFRLOW1, 0x82);
   1415	stv0900_write_reg(intp, SFRLOW0, 0xa0);
   1416	stv0900_write_reg(intp, DMDT0M, 0x0);
   1417	stv0900_write_reg(intp, AGC2REF, 0x50);
   1418
   1419	if (intp->chip_id >= 0x30) {
   1420		stv0900_write_reg(intp, CARFREQ, 0x99);
   1421		stv0900_write_reg(intp, SFRSTEP, 0x98);
   1422	} else if (intp->chip_id >= 0x20) {
   1423		stv0900_write_reg(intp, CARFREQ, 0x6a);
   1424		stv0900_write_reg(intp, SFRSTEP, 0x95);
   1425	} else {
   1426		stv0900_write_reg(intp, CARFREQ, 0xed);
   1427		stv0900_write_reg(intp, SFRSTEP, 0x73);
   1428	}
   1429
   1430	if (intp->symbol_rate[demod] <= 2000000)
   1431		currier_step = 1000;
   1432	else if (intp->symbol_rate[demod] <= 5000000)
   1433		currier_step = 2000;
   1434	else if (intp->symbol_rate[demod] <= 12000000)
   1435		currier_step = 3000;
   1436	else
   1437			currier_step = 5000;
   1438
   1439	nb_steps = -1 + ((intp->srch_range[demod] / 1000) / currier_step);
   1440	nb_steps /= 2;
   1441	nb_steps = (2 * nb_steps) + 1;
   1442
   1443	if (nb_steps < 0)
   1444		nb_steps = 1;
   1445	else if (nb_steps > 10) {
   1446		nb_steps = 11;
   1447		currier_step = (intp->srch_range[demod] / 1000) / 10;
   1448	}
   1449
   1450	current_step = 0;
   1451	direction = 1;
   1452
   1453	tuner_freq = intp->freq[demod];
   1454
   1455	while ((timing_lck == FALSE) && (current_step < nb_steps)) {
   1456		stv0900_write_reg(intp, DMDISTATE, 0x5f);
   1457		stv0900_write_bits(intp, DEMOD_MODE, 0);
   1458
   1459		msleep(50);
   1460
   1461		for (i = 0; i < 10; i++) {
   1462			if (stv0900_get_bits(intp, TMGLOCK_QUALITY) >= 2)
   1463				timingcpt++;
   1464
   1465			agc2_integr += (stv0900_read_reg(intp, AGC2I1) << 8) |
   1466					stv0900_read_reg(intp, AGC2I0);
   1467		}
   1468
   1469		agc2_integr /= 10;
   1470		coarse_srate = stv0900_get_symbol_rate(intp, intp->mclk, demod);
   1471		current_step++;
   1472		direction *= -1;
   1473
   1474		dprintk("lock: I2C_DEMOD_MODE_FIELD =0. Search started. tuner freq=%d agc2=0x%x srate_coarse=%d tmg_cpt=%d\n",
   1475			tuner_freq, agc2_integr, coarse_srate, timingcpt);
   1476
   1477		if ((timingcpt >= 5) &&
   1478				(agc2_integr < agc2_th) &&
   1479				(coarse_srate < 55000000) &&
   1480				(coarse_srate > 850000))
   1481			timing_lck = TRUE;
   1482		else if (current_step < nb_steps) {
   1483			if (direction > 0)
   1484				tuner_freq += (current_step * currier_step);
   1485			else
   1486				tuner_freq -= (current_step * currier_step);
   1487
   1488			if (intp->tuner_type[demod] == 3)
   1489				stv0900_set_tuner_auto(intp, tuner_freq,
   1490						intp->bw[demod], demod);
   1491			else
   1492				stv0900_set_tuner(fe, tuner_freq,
   1493						intp->bw[demod]);
   1494		}
   1495	}
   1496
   1497	if (timing_lck == FALSE)
   1498		coarse_srate = 0;
   1499	else
   1500		coarse_srate = stv0900_get_symbol_rate(intp, intp->mclk, demod);
   1501
   1502	return coarse_srate;
   1503}
   1504
   1505static u32 stv0900_search_srate_fine(struct dvb_frontend *fe)
   1506{
   1507	struct stv0900_state *state = fe->demodulator_priv;
   1508	struct stv0900_internal *intp = state->internal;
   1509	enum fe_stv0900_demod_num demod = state->demod;
   1510	u32	coarse_srate,
   1511		coarse_freq,
   1512		symb,
   1513		symbmax,
   1514		symbmin,
   1515		symbcomp;
   1516
   1517	coarse_srate = stv0900_get_symbol_rate(intp, intp->mclk, demod);
   1518
   1519	if (coarse_srate > 3000000) {
   1520		symbmax = 13 * (coarse_srate / 10);
   1521		symbmax = (symbmax / 1000) * 65536;
   1522		symbmax /= (intp->mclk / 1000);
   1523
   1524		symbmin = 10 * (coarse_srate / 13);
   1525		symbmin = (symbmin / 1000)*65536;
   1526		symbmin /= (intp->mclk / 1000);
   1527
   1528		symb = (coarse_srate / 1000) * 65536;
   1529		symb /= (intp->mclk / 1000);
   1530	} else {
   1531		symbmax = 13 * (coarse_srate / 10);
   1532		symbmax = (symbmax / 100) * 65536;
   1533		symbmax /= (intp->mclk / 100);
   1534
   1535		symbmin = 10 * (coarse_srate / 14);
   1536		symbmin = (symbmin / 100) * 65536;
   1537		symbmin /= (intp->mclk / 100);
   1538
   1539		symb = (coarse_srate / 100) * 65536;
   1540		symb /= (intp->mclk / 100);
   1541	}
   1542
   1543	symbcomp = 13 * (coarse_srate / 10);
   1544	coarse_freq = (stv0900_read_reg(intp, CFR2) << 8)
   1545		      | stv0900_read_reg(intp, CFR1);
   1546
   1547	if (symbcomp < intp->symbol_rate[demod])
   1548		coarse_srate = 0;
   1549	else {
   1550		stv0900_write_reg(intp, DMDISTATE, 0x1f);
   1551		stv0900_write_reg(intp, TMGCFG2, 0xc1);
   1552		stv0900_write_reg(intp, TMGTHRISE, 0x20);
   1553		stv0900_write_reg(intp, TMGTHFALL, 0x00);
   1554		stv0900_write_reg(intp, TMGCFG, 0xd2);
   1555		stv0900_write_bits(intp, CFR_AUTOSCAN, 0);
   1556		stv0900_write_reg(intp, AGC2REF, 0x38);
   1557
   1558		if (intp->chip_id >= 0x30)
   1559			stv0900_write_reg(intp, CARFREQ, 0x79);
   1560		else if (intp->chip_id >= 0x20)
   1561			stv0900_write_reg(intp, CARFREQ, 0x49);
   1562		else
   1563			stv0900_write_reg(intp, CARFREQ, 0xed);
   1564
   1565		stv0900_write_reg(intp, SFRUP1, (symbmax >> 8) & 0x7f);
   1566		stv0900_write_reg(intp, SFRUP0, (symbmax & 0xff));
   1567
   1568		stv0900_write_reg(intp, SFRLOW1, (symbmin >> 8) & 0x7f);
   1569		stv0900_write_reg(intp, SFRLOW0, (symbmin & 0xff));
   1570
   1571		stv0900_write_reg(intp, SFRINIT1, (symb >> 8) & 0xff);
   1572		stv0900_write_reg(intp, SFRINIT0, (symb & 0xff));
   1573
   1574		stv0900_write_reg(intp, DMDT0M, 0x20);
   1575		stv0900_write_reg(intp, CFRINIT1, (coarse_freq >> 8) & 0xff);
   1576		stv0900_write_reg(intp, CFRINIT0, coarse_freq  & 0xff);
   1577		stv0900_write_reg(intp, DMDISTATE, 0x15);
   1578	}
   1579
   1580	return coarse_srate;
   1581}
   1582
   1583static int stv0900_blind_search_algo(struct dvb_frontend *fe)
   1584{
   1585	struct stv0900_state *state = fe->demodulator_priv;
   1586	struct stv0900_internal *intp = state->internal;
   1587	enum fe_stv0900_demod_num demod = state->demod;
   1588	u8	k_ref_tmg,
   1589		k_ref_tmg_max,
   1590		k_ref_tmg_min;
   1591	u32	coarse_srate,
   1592		agc2_th;
   1593	int	lock = FALSE,
   1594		coarse_fail = FALSE;
   1595	s32	demod_timeout = 500,
   1596		fec_timeout = 50,
   1597		fail_cpt,
   1598		i,
   1599		agc2_overflow;
   1600	u16	agc2_int;
   1601	u8	dstatus2;
   1602
   1603	dprintk("%s\n", __func__);
   1604
   1605	if (intp->chip_id < 0x20) {
   1606		k_ref_tmg_max = 233;
   1607		k_ref_tmg_min = 143;
   1608	} else {
   1609		k_ref_tmg_max = 110;
   1610		k_ref_tmg_min = 10;
   1611	}
   1612
   1613	if (intp->chip_id <= 0x20)
   1614		agc2_th = STV0900_BLIND_SEARCH_AGC2_TH;
   1615	else
   1616		agc2_th = STV0900_BLIND_SEARCH_AGC2_TH_CUT30;
   1617
   1618	agc2_int = stv0900_blind_check_agc2_min_level(intp, demod);
   1619
   1620	dprintk("%s agc2_int=%d agc2_th=%d \n", __func__, agc2_int, agc2_th);
   1621	if (agc2_int > agc2_th)
   1622		return FALSE;
   1623
   1624	if (intp->chip_id == 0x10)
   1625		stv0900_write_reg(intp, CORRELEXP, 0xaa);
   1626
   1627	if (intp->chip_id < 0x20)
   1628		stv0900_write_reg(intp, CARHDR, 0x55);
   1629	else
   1630		stv0900_write_reg(intp, CARHDR, 0x20);
   1631
   1632	if (intp->chip_id <= 0x20)
   1633		stv0900_write_reg(intp, CARCFG, 0xc4);
   1634	else
   1635		stv0900_write_reg(intp, CARCFG, 0x6);
   1636
   1637	stv0900_write_reg(intp, RTCS2, 0x44);
   1638
   1639	if (intp->chip_id >= 0x20) {
   1640		stv0900_write_reg(intp, EQUALCFG, 0x41);
   1641		stv0900_write_reg(intp, FFECFG, 0x41);
   1642		stv0900_write_reg(intp, VITSCALE, 0x82);
   1643		stv0900_write_reg(intp, VAVSRVIT, 0x0);
   1644	}
   1645
   1646	k_ref_tmg = k_ref_tmg_max;
   1647
   1648	do {
   1649		stv0900_write_reg(intp, KREFTMG, k_ref_tmg);
   1650		if (stv0900_search_srate_coarse(fe) != 0) {
   1651			coarse_srate = stv0900_search_srate_fine(fe);
   1652
   1653			if (coarse_srate != 0) {
   1654				stv0900_get_lock_timeout(&demod_timeout,
   1655							&fec_timeout,
   1656							coarse_srate,
   1657							STV0900_BLIND_SEARCH);
   1658				lock = stv0900_get_demod_lock(intp,
   1659							demod,
   1660							demod_timeout);
   1661			} else
   1662				lock = FALSE;
   1663		} else {
   1664			fail_cpt = 0;
   1665			agc2_overflow = 0;
   1666
   1667			for (i = 0; i < 10; i++) {
   1668				agc2_int = (stv0900_read_reg(intp, AGC2I1) << 8)
   1669					| stv0900_read_reg(intp, AGC2I0);
   1670
   1671				if (agc2_int >= 0xff00)
   1672					agc2_overflow++;
   1673
   1674				dstatus2 = stv0900_read_reg(intp, DSTATUS2);
   1675
   1676				if (((dstatus2 & 0x1) == 0x1) &&
   1677						((dstatus2 >> 7) == 1))
   1678					fail_cpt++;
   1679			}
   1680
   1681			if ((fail_cpt > 7) || (agc2_overflow > 7))
   1682				coarse_fail = TRUE;
   1683
   1684			lock = FALSE;
   1685		}
   1686		k_ref_tmg -= 30;
   1687	} while ((k_ref_tmg >= k_ref_tmg_min) &&
   1688				(lock == FALSE) &&
   1689				(coarse_fail == FALSE));
   1690
   1691	return lock;
   1692}
   1693
   1694static void stv0900_set_viterbi_acq(struct stv0900_internal *intp,
   1695					enum fe_stv0900_demod_num demod)
   1696{
   1697	s32 vth_reg = VTH12;
   1698
   1699	dprintk("%s\n", __func__);
   1700
   1701	stv0900_write_reg(intp, vth_reg++, 0x96);
   1702	stv0900_write_reg(intp, vth_reg++, 0x64);
   1703	stv0900_write_reg(intp, vth_reg++, 0x36);
   1704	stv0900_write_reg(intp, vth_reg++, 0x23);
   1705	stv0900_write_reg(intp, vth_reg++, 0x1e);
   1706	stv0900_write_reg(intp, vth_reg++, 0x19);
   1707}
   1708
   1709static void stv0900_set_search_standard(struct stv0900_internal *intp,
   1710					enum fe_stv0900_demod_num demod)
   1711{
   1712
   1713	dprintk("%s\n", __func__);
   1714
   1715	switch (intp->srch_standard[demod]) {
   1716	case STV0900_SEARCH_DVBS1:
   1717		dprintk("Search Standard = DVBS1\n");
   1718		break;
   1719	case STV0900_SEARCH_DSS:
   1720		dprintk("Search Standard = DSS\n");
   1721		break;
   1722	case STV0900_SEARCH_DVBS2:
   1723		dprintk("Search Standard = DVBS2\n");
   1724		break;
   1725	case STV0900_AUTO_SEARCH:
   1726	default:
   1727		dprintk("Search Standard = AUTO\n");
   1728		break;
   1729	}
   1730
   1731	switch (intp->srch_standard[demod]) {
   1732	case STV0900_SEARCH_DVBS1:
   1733	case STV0900_SEARCH_DSS:
   1734		stv0900_write_bits(intp, DVBS1_ENABLE, 1);
   1735		stv0900_write_bits(intp, DVBS2_ENABLE, 0);
   1736		stv0900_write_bits(intp, STOP_CLKVIT, 0);
   1737		stv0900_set_dvbs1_track_car_loop(intp,
   1738						demod,
   1739						intp->symbol_rate[demod]);
   1740		stv0900_write_reg(intp, CAR2CFG, 0x22);
   1741
   1742		stv0900_set_viterbi_acq(intp, demod);
   1743		stv0900_set_viterbi_standard(intp,
   1744					intp->srch_standard[demod],
   1745					intp->fec[demod], demod);
   1746
   1747		break;
   1748	case STV0900_SEARCH_DVBS2:
   1749		stv0900_write_bits(intp, DVBS1_ENABLE, 0);
   1750		stv0900_write_bits(intp, DVBS2_ENABLE, 1);
   1751		stv0900_write_bits(intp, STOP_CLKVIT, 1);
   1752		stv0900_write_reg(intp, ACLC, 0x1a);
   1753		stv0900_write_reg(intp, BCLC, 0x09);
   1754		if (intp->chip_id <= 0x20) /*cut 1.x and 2.0*/
   1755			stv0900_write_reg(intp, CAR2CFG, 0x26);
   1756		else
   1757			stv0900_write_reg(intp, CAR2CFG, 0x66);
   1758
   1759		if (intp->demod_mode != STV0900_SINGLE) {
   1760			if (intp->chip_id <= 0x11)
   1761				stv0900_stop_all_s2_modcod(intp, demod);
   1762			else
   1763				stv0900_activate_s2_modcod(intp, demod);
   1764
   1765		} else
   1766			stv0900_activate_s2_modcod_single(intp, demod);
   1767
   1768		stv0900_set_viterbi_tracq(intp, demod);
   1769
   1770		break;
   1771	case STV0900_AUTO_SEARCH:
   1772	default:
   1773		stv0900_write_bits(intp, DVBS1_ENABLE, 1);
   1774		stv0900_write_bits(intp, DVBS2_ENABLE, 1);
   1775		stv0900_write_bits(intp, STOP_CLKVIT, 0);
   1776		stv0900_write_reg(intp, ACLC, 0x1a);
   1777		stv0900_write_reg(intp, BCLC, 0x09);
   1778		stv0900_set_dvbs1_track_car_loop(intp,
   1779						demod,
   1780						intp->symbol_rate[demod]);
   1781		if (intp->chip_id <= 0x20) /*cut 1.x and 2.0*/
   1782			stv0900_write_reg(intp, CAR2CFG, 0x26);
   1783		else
   1784			stv0900_write_reg(intp, CAR2CFG, 0x66);
   1785
   1786		if (intp->demod_mode != STV0900_SINGLE) {
   1787			if (intp->chip_id <= 0x11)
   1788				stv0900_stop_all_s2_modcod(intp, demod);
   1789			else
   1790				stv0900_activate_s2_modcod(intp, demod);
   1791
   1792		} else
   1793			stv0900_activate_s2_modcod_single(intp, demod);
   1794
   1795		stv0900_set_viterbi_tracq(intp, demod);
   1796		stv0900_set_viterbi_standard(intp,
   1797						intp->srch_standard[demod],
   1798						intp->fec[demod], demod);
   1799
   1800		break;
   1801	}
   1802}
   1803
   1804enum fe_stv0900_signal_type stv0900_algo(struct dvb_frontend *fe)
   1805{
   1806	struct stv0900_state *state = fe->demodulator_priv;
   1807	struct stv0900_internal *intp = state->internal;
   1808	enum fe_stv0900_demod_num demod = state->demod;
   1809
   1810	s32 demod_timeout = 500, fec_timeout = 50;
   1811	s32 aq_power, agc1_power, i;
   1812
   1813	int lock = FALSE, low_sr = FALSE;
   1814
   1815	enum fe_stv0900_signal_type signal_type = STV0900_NOCARRIER;
   1816	enum fe_stv0900_search_algo algo;
   1817	int no_signal = FALSE;
   1818
   1819	dprintk("%s\n", __func__);
   1820
   1821	algo = intp->srch_algo[demod];
   1822	stv0900_write_bits(intp, RST_HWARE, 1);
   1823	stv0900_write_reg(intp, DMDISTATE, 0x5c);
   1824	if (intp->chip_id >= 0x20) {
   1825		if (intp->symbol_rate[demod] > 5000000)
   1826			stv0900_write_reg(intp, CORRELABS, 0x9e);
   1827		else
   1828			stv0900_write_reg(intp, CORRELABS, 0x82);
   1829	} else
   1830		stv0900_write_reg(intp, CORRELABS, 0x88);
   1831
   1832	stv0900_get_lock_timeout(&demod_timeout, &fec_timeout,
   1833				intp->symbol_rate[demod],
   1834				intp->srch_algo[demod]);
   1835
   1836	if (intp->srch_algo[demod] == STV0900_BLIND_SEARCH) {
   1837		intp->bw[demod] = 2 * 36000000;
   1838
   1839		stv0900_write_reg(intp, TMGCFG2, 0xc0);
   1840		stv0900_write_reg(intp, CORRELMANT, 0x70);
   1841
   1842		stv0900_set_symbol_rate(intp, intp->mclk, 1000000, demod);
   1843	} else {
   1844		stv0900_write_reg(intp, DMDT0M, 0x20);
   1845		stv0900_write_reg(intp, TMGCFG, 0xd2);
   1846
   1847		if (intp->symbol_rate[demod] < 2000000)
   1848			stv0900_write_reg(intp, CORRELMANT, 0x63);
   1849		else
   1850			stv0900_write_reg(intp, CORRELMANT, 0x70);
   1851
   1852		stv0900_write_reg(intp, AGC2REF, 0x38);
   1853
   1854		intp->bw[demod] =
   1855				stv0900_carrier_width(intp->symbol_rate[demod],
   1856								intp->rolloff);
   1857		if (intp->chip_id >= 0x20) {
   1858			stv0900_write_reg(intp, KREFTMG, 0x5a);
   1859
   1860			if (intp->srch_algo[demod] == STV0900_COLD_START) {
   1861				intp->bw[demod] += 10000000;
   1862				intp->bw[demod] *= 15;
   1863				intp->bw[demod] /= 10;
   1864			} else if (intp->srch_algo[demod] == STV0900_WARM_START)
   1865				intp->bw[demod] += 10000000;
   1866
   1867		} else {
   1868			stv0900_write_reg(intp, KREFTMG, 0xc1);
   1869			intp->bw[demod] += 10000000;
   1870			intp->bw[demod] *= 15;
   1871			intp->bw[demod] /= 10;
   1872		}
   1873
   1874		stv0900_write_reg(intp, TMGCFG2, 0xc1);
   1875
   1876		stv0900_set_symbol_rate(intp, intp->mclk,
   1877					intp->symbol_rate[demod], demod);
   1878		stv0900_set_max_symbol_rate(intp, intp->mclk,
   1879					intp->symbol_rate[demod], demod);
   1880		stv0900_set_min_symbol_rate(intp, intp->mclk,
   1881					intp->symbol_rate[demod], demod);
   1882		if (intp->symbol_rate[demod] >= 10000000)
   1883			low_sr = FALSE;
   1884		else
   1885			low_sr = TRUE;
   1886
   1887	}
   1888
   1889	if (intp->tuner_type[demod] == 3)
   1890		stv0900_set_tuner_auto(intp, intp->freq[demod],
   1891				intp->bw[demod], demod);
   1892	else
   1893		stv0900_set_tuner(fe, intp->freq[demod], intp->bw[demod]);
   1894
   1895	agc1_power = MAKEWORD(stv0900_get_bits(intp, AGCIQ_VALUE1),
   1896				stv0900_get_bits(intp, AGCIQ_VALUE0));
   1897
   1898	aq_power = 0;
   1899
   1900	if (agc1_power == 0) {
   1901		for (i = 0; i < 5; i++)
   1902			aq_power += (stv0900_get_bits(intp, POWER_I) +
   1903					stv0900_get_bits(intp, POWER_Q)) / 2;
   1904
   1905		aq_power /= 5;
   1906	}
   1907
   1908	if ((agc1_power == 0) && (aq_power < IQPOWER_THRESHOLD)) {
   1909		intp->result[demod].locked = FALSE;
   1910		signal_type = STV0900_NOAGC1;
   1911		dprintk("%s: NO AGC1, POWERI, POWERQ\n", __func__);
   1912	} else {
   1913		stv0900_write_bits(intp, SPECINV_CONTROL,
   1914					intp->srch_iq_inv[demod]);
   1915		if (intp->chip_id <= 0x20) /*cut 2.0*/
   1916			stv0900_write_bits(intp, MANUALSX_ROLLOFF, 1);
   1917		else /*cut 3.0*/
   1918			stv0900_write_bits(intp, MANUALS2_ROLLOFF, 1);
   1919
   1920		stv0900_set_search_standard(intp, demod);
   1921
   1922		if (intp->srch_algo[demod] != STV0900_BLIND_SEARCH)
   1923			stv0900_start_search(intp, demod);
   1924	}
   1925
   1926	if (signal_type == STV0900_NOAGC1)
   1927		return signal_type;
   1928
   1929	if (intp->chip_id == 0x12) {
   1930		stv0900_write_bits(intp, RST_HWARE, 0);
   1931		msleep(3);
   1932		stv0900_write_bits(intp, RST_HWARE, 1);
   1933		stv0900_write_bits(intp, RST_HWARE, 0);
   1934	}
   1935
   1936	if (algo == STV0900_BLIND_SEARCH)
   1937		lock = stv0900_blind_search_algo(fe);
   1938	else if (algo == STV0900_COLD_START)
   1939		lock = stv0900_get_demod_cold_lock(fe, demod_timeout);
   1940	else if (algo == STV0900_WARM_START)
   1941		lock = stv0900_get_demod_lock(intp, demod, demod_timeout);
   1942
   1943	if ((lock == FALSE) && (algo == STV0900_COLD_START)) {
   1944		if (low_sr == FALSE) {
   1945			if (stv0900_check_timing_lock(intp, demod) == TRUE)
   1946				lock = stv0900_sw_algo(intp, demod);
   1947		}
   1948	}
   1949
   1950	if (lock == TRUE)
   1951		signal_type = stv0900_get_signal_params(fe);
   1952
   1953	if ((lock == TRUE) && (signal_type == STV0900_RANGEOK)) {
   1954		stv0900_track_optimization(fe);
   1955		if (intp->chip_id <= 0x11) {
   1956			if ((stv0900_get_standard(fe, 0) ==
   1957						STV0900_DVBS1_STANDARD) &&
   1958			   (stv0900_get_standard(fe, 1) ==
   1959						STV0900_DVBS1_STANDARD)) {
   1960				msleep(20);
   1961				stv0900_write_bits(intp, RST_HWARE, 0);
   1962			} else {
   1963				stv0900_write_bits(intp, RST_HWARE, 0);
   1964				msleep(3);
   1965				stv0900_write_bits(intp, RST_HWARE, 1);
   1966				stv0900_write_bits(intp, RST_HWARE, 0);
   1967			}
   1968
   1969		} else if (intp->chip_id >= 0x20) {
   1970			stv0900_write_bits(intp, RST_HWARE, 0);
   1971			msleep(3);
   1972			stv0900_write_bits(intp, RST_HWARE, 1);
   1973			stv0900_write_bits(intp, RST_HWARE, 0);
   1974		}
   1975
   1976		if (stv0900_wait_for_lock(intp, demod,
   1977					fec_timeout, fec_timeout) == TRUE) {
   1978			lock = TRUE;
   1979			intp->result[demod].locked = TRUE;
   1980			if (intp->result[demod].standard ==
   1981						STV0900_DVBS2_STANDARD) {
   1982				stv0900_set_dvbs2_rolloff(intp, demod);
   1983				stv0900_write_bits(intp, RESET_UPKO_COUNT, 1);
   1984				stv0900_write_bits(intp, RESET_UPKO_COUNT, 0);
   1985				stv0900_write_reg(intp, ERRCTRL1, 0x67);
   1986			} else {
   1987				stv0900_write_reg(intp, ERRCTRL1, 0x75);
   1988			}
   1989
   1990			stv0900_write_reg(intp, FBERCPT4, 0);
   1991			stv0900_write_reg(intp, ERRCTRL2, 0xc1);
   1992		} else {
   1993			lock = FALSE;
   1994			signal_type = STV0900_NODATA;
   1995			no_signal = stv0900_check_signal_presence(intp, demod);
   1996
   1997			intp->result[demod].locked = FALSE;
   1998		}
   1999	}
   2000
   2001	if ((signal_type != STV0900_NODATA) || (no_signal != FALSE))
   2002		return signal_type;
   2003
   2004	if (intp->chip_id > 0x11) {
   2005		intp->result[demod].locked = FALSE;
   2006		return signal_type;
   2007	}
   2008
   2009	if ((stv0900_get_bits(intp, HEADER_MODE) == STV0900_DVBS_FOUND) &&
   2010	   (intp->srch_iq_inv[demod] <= STV0900_IQ_AUTO_NORMAL_FIRST))
   2011		signal_type = stv0900_dvbs1_acq_workaround(fe);
   2012
   2013	return signal_type;
   2014}
   2015