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