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