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