linux/drivers/media/dvb-frontends/stv0900_sw.c
<<
>>
Prefs
   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
2016