linux/drivers/media/dvb-frontends/dib8000.c
<<
>>
Prefs
   1/*
   2 * Linux-DVB Driver for DiBcom's DiB8000 chip (ISDB-T).
   3 *
   4 * Copyright (C) 2009 DiBcom (http://www.dibcom.fr/)
   5 *
   6 * This program is free software; you can redistribute it and/or
   7 *  modify it under the terms of the GNU General Public License as
   8 *  published by the Free Software Foundation, version 2.
   9 */
  10
  11#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  12
  13#include <linux/kernel.h>
  14#include <linux/slab.h>
  15#include <linux/i2c.h>
  16#include <linux/mutex.h>
  17#include <asm/div64.h>
  18
  19#include <media/dvb_math.h>
  20
  21#include <media/dvb_frontend.h>
  22
  23#include "dib8000.h"
  24
  25#define LAYER_ALL -1
  26#define LAYER_A   1
  27#define LAYER_B   2
  28#define LAYER_C   3
  29
  30#define MAX_NUMBER_OF_FRONTENDS 6
  31/* #define DIB8000_AGC_FREEZE */
  32
  33static int debug;
  34module_param(debug, int, 0644);
  35MODULE_PARM_DESC(debug, "turn on debugging (default: 0)");
  36
  37#define dprintk(fmt, arg...) do {                                       \
  38        if (debug)                                                      \
  39                printk(KERN_DEBUG pr_fmt("%s: " fmt),                   \
  40                       __func__, ##arg);                                \
  41} while (0)
  42
  43struct i2c_device {
  44        struct i2c_adapter *adap;
  45        u8 addr;
  46        u8 *i2c_write_buffer;
  47        u8 *i2c_read_buffer;
  48        struct mutex *i2c_buffer_lock;
  49};
  50
  51enum param_loop_step {
  52        LOOP_TUNE_1,
  53        LOOP_TUNE_2
  54};
  55
  56enum dib8000_autosearch_step {
  57        AS_START = 0,
  58        AS_SEARCHING_FFT,
  59        AS_SEARCHING_GUARD,
  60        AS_DONE = 100,
  61};
  62
  63enum timeout_mode {
  64        SYMBOL_DEPENDENT_OFF = 0,
  65        SYMBOL_DEPENDENT_ON,
  66};
  67
  68struct dib8000_state {
  69        struct dib8000_config cfg;
  70
  71        struct i2c_device i2c;
  72
  73        struct dibx000_i2c_master i2c_master;
  74
  75        u16 wbd_ref;
  76
  77        u8 current_band;
  78        u32 current_bandwidth;
  79        struct dibx000_agc_config *current_agc;
  80        u32 timf;
  81        u32 timf_default;
  82
  83        u8 div_force_off:1;
  84        u8 div_state:1;
  85        u16 div_sync_wait;
  86
  87        u8 agc_state;
  88        u8 differential_constellation;
  89        u8 diversity_onoff;
  90
  91        s16 ber_monitored_layer;
  92        u16 gpio_dir;
  93        u16 gpio_val;
  94
  95        u16 revision;
  96        u8 isdbt_cfg_loaded;
  97        enum frontend_tune_state tune_state;
  98        s32 status;
  99
 100        struct dvb_frontend *fe[MAX_NUMBER_OF_FRONTENDS];
 101
 102        /* for the I2C transfer */
 103        struct i2c_msg msg[2];
 104        u8 i2c_write_buffer[4];
 105        u8 i2c_read_buffer[2];
 106        struct mutex i2c_buffer_lock;
 107        u8 input_mode_mpeg;
 108
 109        u16 tuner_enable;
 110        struct i2c_adapter dib8096p_tuner_adap;
 111        u16 current_demod_bw;
 112
 113        u16 seg_mask;
 114        u16 seg_diff_mask;
 115        u16 mode;
 116        u8 layer_b_nb_seg;
 117        u8 layer_c_nb_seg;
 118
 119        u8 channel_parameters_set;
 120        u16 autosearch_state;
 121        u16 found_nfft;
 122        u16 found_guard;
 123        u8 subchannel;
 124        u8 symbol_duration;
 125        unsigned long timeout;
 126        u8 longest_intlv_layer;
 127        u16 output_mode;
 128
 129        /* for DVBv5 stats */
 130        s64 init_ucb;
 131        unsigned long per_jiffies_stats;
 132        unsigned long ber_jiffies_stats;
 133        unsigned long ber_jiffies_stats_layer[3];
 134
 135#ifdef DIB8000_AGC_FREEZE
 136        u16 agc1_max;
 137        u16 agc1_min;
 138        u16 agc2_max;
 139        u16 agc2_min;
 140#endif
 141};
 142
 143enum dib8000_power_mode {
 144        DIB8000_POWER_ALL = 0,
 145        DIB8000_POWER_INTERFACE_ONLY,
 146};
 147
 148static u16 dib8000_i2c_read16(struct i2c_device *i2c, u16 reg)
 149{
 150        u16 ret;
 151        struct i2c_msg msg[2] = {
 152                {.addr = i2c->addr >> 1, .flags = 0, .len = 2},
 153                {.addr = i2c->addr >> 1, .flags = I2C_M_RD, .len = 2},
 154        };
 155
 156        if (mutex_lock_interruptible(i2c->i2c_buffer_lock) < 0) {
 157                dprintk("could not acquire lock\n");
 158                return 0;
 159        }
 160
 161        msg[0].buf    = i2c->i2c_write_buffer;
 162        msg[0].buf[0] = reg >> 8;
 163        msg[0].buf[1] = reg & 0xff;
 164        msg[1].buf    = i2c->i2c_read_buffer;
 165
 166        if (i2c_transfer(i2c->adap, msg, 2) != 2)
 167                dprintk("i2c read error on %d\n", reg);
 168
 169        ret = (msg[1].buf[0] << 8) | msg[1].buf[1];
 170        mutex_unlock(i2c->i2c_buffer_lock);
 171        return ret;
 172}
 173
 174static u16 __dib8000_read_word(struct dib8000_state *state, u16 reg)
 175{
 176        u16 ret;
 177
 178        state->i2c_write_buffer[0] = reg >> 8;
 179        state->i2c_write_buffer[1] = reg & 0xff;
 180
 181        memset(state->msg, 0, 2 * sizeof(struct i2c_msg));
 182        state->msg[0].addr = state->i2c.addr >> 1;
 183        state->msg[0].flags = 0;
 184        state->msg[0].buf = state->i2c_write_buffer;
 185        state->msg[0].len = 2;
 186        state->msg[1].addr = state->i2c.addr >> 1;
 187        state->msg[1].flags = I2C_M_RD;
 188        state->msg[1].buf = state->i2c_read_buffer;
 189        state->msg[1].len = 2;
 190
 191        if (i2c_transfer(state->i2c.adap, state->msg, 2) != 2)
 192                dprintk("i2c read error on %d\n", reg);
 193
 194        ret = (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
 195
 196        return ret;
 197}
 198
 199static u16 dib8000_read_word(struct dib8000_state *state, u16 reg)
 200{
 201        u16 ret;
 202
 203        if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
 204                dprintk("could not acquire lock\n");
 205                return 0;
 206        }
 207
 208        ret = __dib8000_read_word(state, reg);
 209
 210        mutex_unlock(&state->i2c_buffer_lock);
 211
 212        return ret;
 213}
 214
 215static u32 dib8000_read32(struct dib8000_state *state, u16 reg)
 216{
 217        u16 rw[2];
 218
 219        if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
 220                dprintk("could not acquire lock\n");
 221                return 0;
 222        }
 223
 224        rw[0] = __dib8000_read_word(state, reg + 0);
 225        rw[1] = __dib8000_read_word(state, reg + 1);
 226
 227        mutex_unlock(&state->i2c_buffer_lock);
 228
 229        return ((rw[0] << 16) | (rw[1]));
 230}
 231
 232static int dib8000_i2c_write16(struct i2c_device *i2c, u16 reg, u16 val)
 233{
 234        struct i2c_msg msg = {.addr = i2c->addr >> 1, .flags = 0, .len = 4};
 235        int ret = 0;
 236
 237        if (mutex_lock_interruptible(i2c->i2c_buffer_lock) < 0) {
 238                dprintk("could not acquire lock\n");
 239                return -EINVAL;
 240        }
 241
 242        msg.buf    = i2c->i2c_write_buffer;
 243        msg.buf[0] = (reg >> 8) & 0xff;
 244        msg.buf[1] = reg & 0xff;
 245        msg.buf[2] = (val >> 8) & 0xff;
 246        msg.buf[3] = val & 0xff;
 247
 248        ret = i2c_transfer(i2c->adap, &msg, 1) != 1 ? -EREMOTEIO : 0;
 249        mutex_unlock(i2c->i2c_buffer_lock);
 250
 251        return ret;
 252}
 253
 254static int dib8000_write_word(struct dib8000_state *state, u16 reg, u16 val)
 255{
 256        int ret;
 257
 258        if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
 259                dprintk("could not acquire lock\n");
 260                return -EINVAL;
 261        }
 262
 263        state->i2c_write_buffer[0] = (reg >> 8) & 0xff;
 264        state->i2c_write_buffer[1] = reg & 0xff;
 265        state->i2c_write_buffer[2] = (val >> 8) & 0xff;
 266        state->i2c_write_buffer[3] = val & 0xff;
 267
 268        memset(&state->msg[0], 0, sizeof(struct i2c_msg));
 269        state->msg[0].addr = state->i2c.addr >> 1;
 270        state->msg[0].flags = 0;
 271        state->msg[0].buf = state->i2c_write_buffer;
 272        state->msg[0].len = 4;
 273
 274        ret = (i2c_transfer(state->i2c.adap, state->msg, 1) != 1 ?
 275                        -EREMOTEIO : 0);
 276        mutex_unlock(&state->i2c_buffer_lock);
 277
 278        return ret;
 279}
 280
 281static const s16 coeff_2k_sb_1seg_dqpsk[8] = {
 282        (769 << 5) | 0x0a, (745 << 5) | 0x03, (595 << 5) | 0x0d, (769 << 5) | 0x0a, (920 << 5) | 0x09, (784 << 5) | 0x02, (519 << 5) | 0x0c,
 283                (920 << 5) | 0x09
 284};
 285
 286static const s16 coeff_2k_sb_1seg[8] = {
 287        (692 << 5) | 0x0b, (683 << 5) | 0x01, (519 << 5) | 0x09, (692 << 5) | 0x0b, 0 | 0x1f, 0 | 0x1f, 0 | 0x1f, 0 | 0x1f
 288};
 289
 290static const s16 coeff_2k_sb_3seg_0dqpsk_1dqpsk[8] = {
 291        (832 << 5) | 0x10, (912 << 5) | 0x05, (900 << 5) | 0x12, (832 << 5) | 0x10, (-931 << 5) | 0x0f, (912 << 5) | 0x04, (807 << 5) | 0x11,
 292                (-931 << 5) | 0x0f
 293};
 294
 295static const s16 coeff_2k_sb_3seg_0dqpsk[8] = {
 296        (622 << 5) | 0x0c, (941 << 5) | 0x04, (796 << 5) | 0x10, (622 << 5) | 0x0c, (982 << 5) | 0x0c, (519 << 5) | 0x02, (572 << 5) | 0x0e,
 297                (982 << 5) | 0x0c
 298};
 299
 300static const s16 coeff_2k_sb_3seg_1dqpsk[8] = {
 301        (699 << 5) | 0x14, (607 << 5) | 0x04, (944 << 5) | 0x13, (699 << 5) | 0x14, (-720 << 5) | 0x0d, (640 << 5) | 0x03, (866 << 5) | 0x12,
 302                (-720 << 5) | 0x0d
 303};
 304
 305static const s16 coeff_2k_sb_3seg[8] = {
 306        (664 << 5) | 0x0c, (925 << 5) | 0x03, (937 << 5) | 0x10, (664 << 5) | 0x0c, (-610 << 5) | 0x0a, (697 << 5) | 0x01, (836 << 5) | 0x0e,
 307                (-610 << 5) | 0x0a
 308};
 309
 310static const s16 coeff_4k_sb_1seg_dqpsk[8] = {
 311        (-955 << 5) | 0x0e, (687 << 5) | 0x04, (818 << 5) | 0x10, (-955 << 5) | 0x0e, (-922 << 5) | 0x0d, (750 << 5) | 0x03, (665 << 5) | 0x0f,
 312                (-922 << 5) | 0x0d
 313};
 314
 315static const s16 coeff_4k_sb_1seg[8] = {
 316        (638 << 5) | 0x0d, (683 << 5) | 0x02, (638 << 5) | 0x0d, (638 << 5) | 0x0d, (-655 << 5) | 0x0a, (517 << 5) | 0x00, (698 << 5) | 0x0d,
 317                (-655 << 5) | 0x0a
 318};
 319
 320static const s16 coeff_4k_sb_3seg_0dqpsk_1dqpsk[8] = {
 321        (-707 << 5) | 0x14, (910 << 5) | 0x06, (889 << 5) | 0x16, (-707 << 5) | 0x14, (-958 << 5) | 0x13, (993 << 5) | 0x05, (523 << 5) | 0x14,
 322                (-958 << 5) | 0x13
 323};
 324
 325static const s16 coeff_4k_sb_3seg_0dqpsk[8] = {
 326        (-723 << 5) | 0x13, (910 << 5) | 0x05, (777 << 5) | 0x14, (-723 << 5) | 0x13, (-568 << 5) | 0x0f, (547 << 5) | 0x03, (696 << 5) | 0x12,
 327                (-568 << 5) | 0x0f
 328};
 329
 330static const s16 coeff_4k_sb_3seg_1dqpsk[8] = {
 331        (-940 << 5) | 0x15, (607 << 5) | 0x05, (915 << 5) | 0x16, (-940 << 5) | 0x15, (-848 << 5) | 0x13, (683 << 5) | 0x04, (543 << 5) | 0x14,
 332                (-848 << 5) | 0x13
 333};
 334
 335static const s16 coeff_4k_sb_3seg[8] = {
 336        (612 << 5) | 0x12, (910 << 5) | 0x04, (864 << 5) | 0x14, (612 << 5) | 0x12, (-869 << 5) | 0x13, (683 << 5) | 0x02, (869 << 5) | 0x12,
 337                (-869 << 5) | 0x13
 338};
 339
 340static const s16 coeff_8k_sb_1seg_dqpsk[8] = {
 341        (-835 << 5) | 0x12, (684 << 5) | 0x05, (735 << 5) | 0x14, (-835 << 5) | 0x12, (-598 << 5) | 0x10, (781 << 5) | 0x04, (739 << 5) | 0x13,
 342                (-598 << 5) | 0x10
 343};
 344
 345static const s16 coeff_8k_sb_1seg[8] = {
 346        (673 << 5) | 0x0f, (683 << 5) | 0x03, (808 << 5) | 0x12, (673 << 5) | 0x0f, (585 << 5) | 0x0f, (512 << 5) | 0x01, (780 << 5) | 0x0f,
 347                (585 << 5) | 0x0f
 348};
 349
 350static const s16 coeff_8k_sb_3seg_0dqpsk_1dqpsk[8] = {
 351        (863 << 5) | 0x17, (930 << 5) | 0x07, (878 << 5) | 0x19, (863 << 5) | 0x17, (0 << 5) | 0x14, (521 << 5) | 0x05, (980 << 5) | 0x18,
 352                (0 << 5) | 0x14
 353};
 354
 355static const s16 coeff_8k_sb_3seg_0dqpsk[8] = {
 356        (-924 << 5) | 0x17, (910 << 5) | 0x06, (774 << 5) | 0x17, (-924 << 5) | 0x17, (-877 << 5) | 0x15, (565 << 5) | 0x04, (553 << 5) | 0x15,
 357                (-877 << 5) | 0x15
 358};
 359
 360static const s16 coeff_8k_sb_3seg_1dqpsk[8] = {
 361        (-921 << 5) | 0x19, (607 << 5) | 0x06, (881 << 5) | 0x19, (-921 << 5) | 0x19, (-921 << 5) | 0x14, (713 << 5) | 0x05, (1018 << 5) | 0x18,
 362                (-921 << 5) | 0x14
 363};
 364
 365static const s16 coeff_8k_sb_3seg[8] = {
 366        (514 << 5) | 0x14, (910 << 5) | 0x05, (861 << 5) | 0x17, (514 << 5) | 0x14, (690 << 5) | 0x14, (683 << 5) | 0x03, (662 << 5) | 0x15,
 367                (690 << 5) | 0x14
 368};
 369
 370static const s16 ana_fe_coeff_3seg[24] = {
 371        81, 80, 78, 74, 68, 61, 54, 45, 37, 28, 19, 11, 4, 1022, 1017, 1013, 1010, 1008, 1008, 1008, 1008, 1010, 1014, 1017
 372};
 373
 374static const s16 ana_fe_coeff_1seg[24] = {
 375        249, 226, 164, 82, 5, 981, 970, 988, 1018, 20, 31, 26, 8, 1012, 1000, 1018, 1012, 8, 15, 14, 9, 3, 1017, 1003
 376};
 377
 378static const s16 ana_fe_coeff_13seg[24] = {
 379        396, 305, 105, -51, -77, -12, 41, 31, -11, -30, -11, 14, 15, -2, -13, -7, 5, 8, 1, -6, -7, -3, 0, 1
 380};
 381
 382static u16 fft_to_mode(struct dib8000_state *state)
 383{
 384        u16 mode;
 385        switch (state->fe[0]->dtv_property_cache.transmission_mode) {
 386        case TRANSMISSION_MODE_2K:
 387                mode = 1;
 388                break;
 389        case TRANSMISSION_MODE_4K:
 390                mode = 2;
 391                break;
 392        default:
 393        case TRANSMISSION_MODE_AUTO:
 394        case TRANSMISSION_MODE_8K:
 395                mode = 3;
 396                break;
 397        }
 398        return mode;
 399}
 400
 401static void dib8000_set_acquisition_mode(struct dib8000_state *state)
 402{
 403        u16 nud = dib8000_read_word(state, 298);
 404        nud |= (1 << 3) | (1 << 0);
 405        dprintk("acquisition mode activated\n");
 406        dib8000_write_word(state, 298, nud);
 407}
 408static int dib8000_set_output_mode(struct dvb_frontend *fe, int mode)
 409{
 410        struct dib8000_state *state = fe->demodulator_priv;
 411        u16 outreg, fifo_threshold, smo_mode, sram = 0x0205;    /* by default SDRAM deintlv is enabled */
 412
 413        state->output_mode = mode;
 414        outreg = 0;
 415        fifo_threshold = 1792;
 416        smo_mode = (dib8000_read_word(state, 299) & 0x0050) | (1 << 1);
 417
 418        dprintk("-I-    Setting output mode for demod %p to %d\n",
 419                        &state->fe[0], mode);
 420
 421        switch (mode) {
 422        case OUTMODE_MPEG2_PAR_GATED_CLK:       // STBs with parallel gated clock
 423                outreg = (1 << 10);     /* 0x0400 */
 424                break;
 425        case OUTMODE_MPEG2_PAR_CONT_CLK:        // STBs with parallel continues clock
 426                outreg = (1 << 10) | (1 << 6);  /* 0x0440 */
 427                break;
 428        case OUTMODE_MPEG2_SERIAL:      // STBs with serial input
 429                outreg = (1 << 10) | (2 << 6) | (0 << 1);       /* 0x0482 */
 430                break;
 431        case OUTMODE_DIVERSITY:
 432                if (state->cfg.hostbus_diversity) {
 433                        outreg = (1 << 10) | (4 << 6);  /* 0x0500 */
 434                        sram &= 0xfdff;
 435                } else
 436                        sram |= 0x0c00;
 437                break;
 438        case OUTMODE_MPEG2_FIFO:        // e.g. USB feeding
 439                smo_mode |= (3 << 1);
 440                fifo_threshold = 512;
 441                outreg = (1 << 10) | (5 << 6);
 442                break;
 443        case OUTMODE_HIGH_Z:    // disable
 444                outreg = 0;
 445                break;
 446
 447        case OUTMODE_ANALOG_ADC:
 448                outreg = (1 << 10) | (3 << 6);
 449                dib8000_set_acquisition_mode(state);
 450                break;
 451
 452        default:
 453                dprintk("Unhandled output_mode passed to be set for demod %p\n",
 454                                &state->fe[0]);
 455                return -EINVAL;
 456        }
 457
 458        if (state->cfg.output_mpeg2_in_188_bytes)
 459                smo_mode |= (1 << 5);
 460
 461        dib8000_write_word(state, 299, smo_mode);
 462        dib8000_write_word(state, 300, fifo_threshold); /* synchronous fread */
 463        dib8000_write_word(state, 1286, outreg);
 464        dib8000_write_word(state, 1291, sram);
 465
 466        return 0;
 467}
 468
 469static int dib8000_set_diversity_in(struct dvb_frontend *fe, int onoff)
 470{
 471        struct dib8000_state *state = fe->demodulator_priv;
 472        u16 tmp, sync_wait = dib8000_read_word(state, 273) & 0xfff0;
 473
 474        dprintk("set diversity input to %i\n", onoff);
 475        if (!state->differential_constellation) {
 476                dib8000_write_word(state, 272, 1 << 9); //dvsy_off_lmod4 = 1
 477                dib8000_write_word(state, 273, sync_wait | (1 << 2) | 2);       // sync_enable = 1; comb_mode = 2
 478        } else {
 479                dib8000_write_word(state, 272, 0);      //dvsy_off_lmod4 = 0
 480                dib8000_write_word(state, 273, sync_wait);      // sync_enable = 0; comb_mode = 0
 481        }
 482        state->diversity_onoff = onoff;
 483
 484        switch (onoff) {
 485        case 0:         /* only use the internal way - not the diversity input */
 486                dib8000_write_word(state, 270, 1);
 487                dib8000_write_word(state, 271, 0);
 488                break;
 489        case 1:         /* both ways */
 490                dib8000_write_word(state, 270, 6);
 491                dib8000_write_word(state, 271, 6);
 492                break;
 493        case 2:         /* only the diversity input */
 494                dib8000_write_word(state, 270, 0);
 495                dib8000_write_word(state, 271, 1);
 496                break;
 497        }
 498
 499        if (state->revision == 0x8002) {
 500                tmp = dib8000_read_word(state, 903);
 501                dib8000_write_word(state, 903, tmp & ~(1 << 3));
 502                msleep(30);
 503                dib8000_write_word(state, 903, tmp | (1 << 3));
 504        }
 505        return 0;
 506}
 507
 508static void dib8000_set_power_mode(struct dib8000_state *state, enum dib8000_power_mode mode)
 509{
 510        /* by default everything is going to be powered off */
 511        u16 reg_774 = 0x3fff, reg_775 = 0xffff, reg_776 = 0xffff,
 512                reg_900 = (dib8000_read_word(state, 900) & 0xfffc) | 0x3,
 513                reg_1280;
 514
 515        if (state->revision != 0x8090)
 516                reg_1280 = (dib8000_read_word(state, 1280) & 0x00ff) | 0xff00;
 517        else
 518                reg_1280 = (dib8000_read_word(state, 1280) & 0x707f) | 0x8f80;
 519
 520        /* now, depending on the requested mode, we power on */
 521        switch (mode) {
 522                /* power up everything in the demod */
 523        case DIB8000_POWER_ALL:
 524                reg_774 = 0x0000;
 525                reg_775 = 0x0000;
 526                reg_776 = 0x0000;
 527                reg_900 &= 0xfffc;
 528                if (state->revision != 0x8090)
 529                        reg_1280 &= 0x00ff;
 530                else
 531                        reg_1280 &= 0x707f;
 532                break;
 533        case DIB8000_POWER_INTERFACE_ONLY:
 534                if (state->revision != 0x8090)
 535                        reg_1280 &= 0x00ff;
 536                else
 537                        reg_1280 &= 0xfa7b;
 538                break;
 539        }
 540
 541        dprintk("powermode : 774 : %x ; 775 : %x; 776 : %x ; 900 : %x; 1280 : %x\n", reg_774, reg_775, reg_776, reg_900, reg_1280);
 542        dib8000_write_word(state, 774, reg_774);
 543        dib8000_write_word(state, 775, reg_775);
 544        dib8000_write_word(state, 776, reg_776);
 545        dib8000_write_word(state, 900, reg_900);
 546        dib8000_write_word(state, 1280, reg_1280);
 547}
 548
 549static int dib8000_set_adc_state(struct dib8000_state *state, enum dibx000_adc_states no)
 550{
 551        int ret = 0;
 552        u16 reg, reg_907 = dib8000_read_word(state, 907);
 553        u16 reg_908 = dib8000_read_word(state, 908);
 554
 555        switch (no) {
 556        case DIBX000_SLOW_ADC_ON:
 557                if (state->revision != 0x8090) {
 558                        reg_908 |= (1 << 1) | (1 << 0);
 559                        ret |= dib8000_write_word(state, 908, reg_908);
 560                        reg_908 &= ~(1 << 1);
 561                } else {
 562                        reg = dib8000_read_word(state, 1925);
 563                        /* en_slowAdc = 1 & reset_sladc = 1 */
 564                        dib8000_write_word(state, 1925, reg |
 565                                        (1<<4) | (1<<2));
 566
 567                        /* read acces to make it works... strange ... */
 568                        reg = dib8000_read_word(state, 1925);
 569                        msleep(20);
 570                        /* en_slowAdc = 1 & reset_sladc = 0 */
 571                        dib8000_write_word(state, 1925, reg & ~(1<<4));
 572
 573                        reg = dib8000_read_word(state, 921) & ~((0x3 << 14)
 574                                        | (0x3 << 12));
 575                        /* ref = Vin1 => Vbg ; sel = Vin0 or Vin3 ;
 576                           (Vin2 = Vcm) */
 577                        dib8000_write_word(state, 921, reg | (1 << 14)
 578                                        | (3 << 12));
 579                }
 580                break;
 581
 582        case DIBX000_SLOW_ADC_OFF:
 583                if (state->revision == 0x8090) {
 584                        reg = dib8000_read_word(state, 1925);
 585                        /* reset_sladc = 1 en_slowAdc = 0 */
 586                        dib8000_write_word(state, 1925,
 587                                        (reg & ~(1<<2)) | (1<<4));
 588                }
 589                reg_908 |= (1 << 1) | (1 << 0);
 590                break;
 591
 592        case DIBX000_ADC_ON:
 593                reg_907 &= 0x0fff;
 594                reg_908 &= 0x0003;
 595                break;
 596
 597        case DIBX000_ADC_OFF:   // leave the VBG voltage on
 598                reg_907 = (1 << 13) | (1 << 12);
 599                reg_908 = (1 << 6) | (1 << 5) | (1 << 4) | (1 << 3) | (1 << 1);
 600                break;
 601
 602        case DIBX000_VBG_ENABLE:
 603                reg_907 &= ~(1 << 15);
 604                break;
 605
 606        case DIBX000_VBG_DISABLE:
 607                reg_907 |= (1 << 15);
 608                break;
 609
 610        default:
 611                break;
 612        }
 613
 614        ret |= dib8000_write_word(state, 907, reg_907);
 615        ret |= dib8000_write_word(state, 908, reg_908);
 616
 617        return ret;
 618}
 619
 620static int dib8000_set_bandwidth(struct dvb_frontend *fe, u32 bw)
 621{
 622        struct dib8000_state *state = fe->demodulator_priv;
 623        u32 timf;
 624
 625        if (bw == 0)
 626                bw = 6000;
 627
 628        if (state->timf == 0) {
 629                dprintk("using default timf\n");
 630                timf = state->timf_default;
 631        } else {
 632                dprintk("using updated timf\n");
 633                timf = state->timf;
 634        }
 635
 636        dib8000_write_word(state, 29, (u16) ((timf >> 16) & 0xffff));
 637        dib8000_write_word(state, 30, (u16) ((timf) & 0xffff));
 638
 639        return 0;
 640}
 641
 642static int dib8000_sad_calib(struct dib8000_state *state)
 643{
 644        u8 sad_sel = 3;
 645
 646        if (state->revision == 0x8090) {
 647                dib8000_write_word(state, 922, (sad_sel << 2));
 648                dib8000_write_word(state, 923, 2048);
 649
 650                dib8000_write_word(state, 922, (sad_sel << 2) | 0x1);
 651                dib8000_write_word(state, 922, (sad_sel << 2));
 652        } else {
 653                /* internal */
 654                dib8000_write_word(state, 923, (0 << 1) | (0 << 0));
 655                dib8000_write_word(state, 924, 776);
 656
 657                /* do the calibration */
 658                dib8000_write_word(state, 923, (1 << 0));
 659                dib8000_write_word(state, 923, (0 << 0));
 660        }
 661
 662        msleep(1);
 663        return 0;
 664}
 665
 666static int dib8000_set_wbd_ref(struct dvb_frontend *fe, u16 value)
 667{
 668        struct dib8000_state *state = fe->demodulator_priv;
 669        if (value > 4095)
 670                value = 4095;
 671        state->wbd_ref = value;
 672        return dib8000_write_word(state, 106, value);
 673}
 674
 675static void dib8000_reset_pll_common(struct dib8000_state *state, const struct dibx000_bandwidth_config *bw)
 676{
 677        dprintk("ifreq: %d %x, inversion: %d\n", bw->ifreq, bw->ifreq, bw->ifreq >> 25);
 678        if (state->revision != 0x8090) {
 679                dib8000_write_word(state, 23,
 680                                (u16) (((bw->internal * 1000) >> 16) & 0xffff));
 681                dib8000_write_word(state, 24,
 682                                (u16) ((bw->internal * 1000) & 0xffff));
 683        } else {
 684                dib8000_write_word(state, 23, (u16) (((bw->internal / 2 * 1000) >> 16) & 0xffff));
 685                dib8000_write_word(state, 24,
 686                                (u16) ((bw->internal  / 2 * 1000) & 0xffff));
 687        }
 688        dib8000_write_word(state, 27, (u16) ((bw->ifreq >> 16) & 0x01ff));
 689        dib8000_write_word(state, 28, (u16) (bw->ifreq & 0xffff));
 690        dib8000_write_word(state, 26, (u16) ((bw->ifreq >> 25) & 0x0003));
 691
 692        if (state->revision != 0x8090)
 693                dib8000_write_word(state, 922, bw->sad_cfg);
 694}
 695
 696static void dib8000_reset_pll(struct dib8000_state *state)
 697{
 698        const struct dibx000_bandwidth_config *pll = state->cfg.pll;
 699        u16 clk_cfg1, reg;
 700
 701        if (state->revision != 0x8090) {
 702                dib8000_write_word(state, 901,
 703                                (pll->pll_prediv << 8) | (pll->pll_ratio << 0));
 704
 705                clk_cfg1 = (1 << 10) | (0 << 9) | (pll->IO_CLK_en_core << 8) |
 706                        (pll->bypclk_div << 5) | (pll->enable_refdiv << 4) |
 707                        (1 << 3) | (pll->pll_range << 1) |
 708                        (pll->pll_reset << 0);
 709
 710                dib8000_write_word(state, 902, clk_cfg1);
 711                clk_cfg1 = (clk_cfg1 & 0xfff7) | (pll->pll_bypass << 3);
 712                dib8000_write_word(state, 902, clk_cfg1);
 713
 714                dprintk("clk_cfg1: 0x%04x\n", clk_cfg1);
 715
 716                /* smpl_cfg: P_refclksel=2, P_ensmplsel=1 nodivsmpl=1 */
 717                if (state->cfg.pll->ADClkSrc == 0)
 718                        dib8000_write_word(state, 904,
 719                                        (0 << 15) | (0 << 12) | (0 << 10) |
 720                                        (pll->modulo << 8) |
 721                                        (pll->ADClkSrc << 7) | (0 << 1));
 722                else if (state->cfg.refclksel != 0)
 723                        dib8000_write_word(state, 904, (0 << 15) | (1 << 12) |
 724                                        ((state->cfg.refclksel & 0x3) << 10) |
 725                                        (pll->modulo << 8) |
 726                                        (pll->ADClkSrc << 7) | (0 << 1));
 727                else
 728                        dib8000_write_word(state, 904, (0 << 15) | (1 << 12) |
 729                                        (3 << 10) | (pll->modulo << 8) |
 730                                        (pll->ADClkSrc << 7) | (0 << 1));
 731        } else {
 732                dib8000_write_word(state, 1856, (!pll->pll_reset<<13) |
 733                                (pll->pll_range<<12) | (pll->pll_ratio<<6) |
 734                                (pll->pll_prediv));
 735
 736                reg = dib8000_read_word(state, 1857);
 737                dib8000_write_word(state, 1857, reg|(!pll->pll_bypass<<15));
 738
 739                reg = dib8000_read_word(state, 1858); /* Force clk out pll /2 */
 740                dib8000_write_word(state, 1858, reg | 1);
 741
 742                dib8000_write_word(state, 904, (pll->modulo << 8));
 743        }
 744
 745        dib8000_reset_pll_common(state, pll);
 746}
 747
 748static int dib8000_update_pll(struct dvb_frontend *fe,
 749                struct dibx000_bandwidth_config *pll, u32 bw, u8 ratio)
 750{
 751        struct dib8000_state *state = fe->demodulator_priv;
 752        u16 reg_1857, reg_1856 = dib8000_read_word(state, 1856);
 753        u8 loopdiv, prediv, oldprediv = state->cfg.pll->pll_prediv ;
 754        u32 internal, xtal;
 755
 756        /* get back old values */
 757        prediv = reg_1856 & 0x3f;
 758        loopdiv = (reg_1856 >> 6) & 0x3f;
 759
 760        if ((pll == NULL) || (pll->pll_prediv == prediv &&
 761                                pll->pll_ratio == loopdiv))
 762                return -EINVAL;
 763
 764        dprintk("Updating pll (prediv: old =  %d new = %d ; loopdiv : old = %d new = %d)\n", prediv, pll->pll_prediv, loopdiv, pll->pll_ratio);
 765        if (state->revision == 0x8090) {
 766                reg_1856 &= 0xf000;
 767                reg_1857 = dib8000_read_word(state, 1857);
 768                /* disable PLL */
 769                dib8000_write_word(state, 1857, reg_1857 & ~(1 << 15));
 770
 771                dib8000_write_word(state, 1856, reg_1856 |
 772                                ((pll->pll_ratio & 0x3f) << 6) |
 773                                (pll->pll_prediv & 0x3f));
 774
 775                /* write new system clk into P_sec_len */
 776                internal = dib8000_read32(state, 23) / 1000;
 777                dprintk("Old Internal = %d\n", internal);
 778                xtal = 2 * (internal / loopdiv) * prediv;
 779                internal = 1000 * (xtal/pll->pll_prediv) * pll->pll_ratio;
 780                dprintk("Xtal = %d , New Fmem = %d New Fdemod = %d, New Fsampling = %d\n", xtal, internal/1000, internal/2000, internal/8000);
 781                dprintk("New Internal = %d\n", internal);
 782
 783                dib8000_write_word(state, 23,
 784                                (u16) (((internal / 2) >> 16) & 0xffff));
 785                dib8000_write_word(state, 24, (u16) ((internal / 2) & 0xffff));
 786                /* enable PLL */
 787                dib8000_write_word(state, 1857, reg_1857 | (1 << 15));
 788
 789                while (((dib8000_read_word(state, 1856)>>15)&0x1) != 1)
 790                        dprintk("Waiting for PLL to lock\n");
 791
 792                /* verify */
 793                reg_1856 = dib8000_read_word(state, 1856);
 794                dprintk("PLL Updated with prediv = %d and loopdiv = %d\n",
 795                                reg_1856&0x3f, (reg_1856>>6)&0x3f);
 796        } else {
 797                if (bw != state->current_demod_bw) {
 798                        /** Bandwidth change => force PLL update **/
 799                        dprintk("PLL: Bandwidth Change %d MHz -> %d MHz (prediv: %d->%d)\n", state->current_demod_bw / 1000, bw / 1000, oldprediv, state->cfg.pll->pll_prediv);
 800
 801                        if (state->cfg.pll->pll_prediv != oldprediv) {
 802                                /** Full PLL change only if prediv is changed **/
 803
 804                                /** full update => bypass and reconfigure **/
 805                                dprintk("PLL: New Setting for %d MHz Bandwidth (prediv: %d, ratio: %d)\n", bw/1000, state->cfg.pll->pll_prediv, state->cfg.pll->pll_ratio);
 806                                dib8000_write_word(state, 902, dib8000_read_word(state, 902) | (1<<3)); /* bypass PLL */
 807                                dib8000_reset_pll(state);
 808                                dib8000_write_word(state, 898, 0x0004); /* sad */
 809                        } else
 810                                ratio = state->cfg.pll->pll_ratio;
 811
 812                        state->current_demod_bw = bw;
 813                }
 814
 815                if (ratio != 0) {
 816                        /** ratio update => only change ratio **/
 817                        dprintk("PLL: Update ratio (prediv: %d, ratio: %d)\n", state->cfg.pll->pll_prediv, ratio);
 818                        dib8000_write_word(state, 901, (state->cfg.pll->pll_prediv << 8) | (ratio << 0)); /* only the PLL ratio is updated. */
 819                }
 820        }
 821
 822        return 0;
 823}
 824
 825static int dib8000_reset_gpio(struct dib8000_state *st)
 826{
 827        /* reset the GPIOs */
 828        dib8000_write_word(st, 1029, st->cfg.gpio_dir);
 829        dib8000_write_word(st, 1030, st->cfg.gpio_val);
 830
 831        /* TODO 782 is P_gpio_od */
 832
 833        dib8000_write_word(st, 1032, st->cfg.gpio_pwm_pos);
 834
 835        dib8000_write_word(st, 1037, st->cfg.pwm_freq_div);
 836        return 0;
 837}
 838
 839static int dib8000_cfg_gpio(struct dib8000_state *st, u8 num, u8 dir, u8 val)
 840{
 841        st->cfg.gpio_dir = dib8000_read_word(st, 1029);
 842        st->cfg.gpio_dir &= ~(1 << num);        /* reset the direction bit */
 843        st->cfg.gpio_dir |= (dir & 0x1) << num; /* set the new direction */
 844        dib8000_write_word(st, 1029, st->cfg.gpio_dir);
 845
 846        st->cfg.gpio_val = dib8000_read_word(st, 1030);
 847        st->cfg.gpio_val &= ~(1 << num);        /* reset the direction bit */
 848        st->cfg.gpio_val |= (val & 0x01) << num;        /* set the new value */
 849        dib8000_write_word(st, 1030, st->cfg.gpio_val);
 850
 851        dprintk("gpio dir: %x: gpio val: %x\n", st->cfg.gpio_dir, st->cfg.gpio_val);
 852
 853        return 0;
 854}
 855
 856static int dib8000_set_gpio(struct dvb_frontend *fe, u8 num, u8 dir, u8 val)
 857{
 858        struct dib8000_state *state = fe->demodulator_priv;
 859        return dib8000_cfg_gpio(state, num, dir, val);
 860}
 861
 862static const u16 dib8000_defaults[] = {
 863        /* auto search configuration - lock0 by default waiting
 864         * for cpil_lock; lock1 cpil_lock; lock2 tmcc_sync_lock */
 865        3, 7,
 866        0x0004,
 867        0x0400,
 868        0x0814,
 869
 870        12, 11,
 871        0x001b,
 872        0x7740,
 873        0x005b,
 874        0x8d80,
 875        0x01c9,
 876        0xc380,
 877        0x0000,
 878        0x0080,
 879        0x0000,
 880        0x0090,
 881        0x0001,
 882        0xd4c0,
 883
 884        /*1, 32,
 885                0x6680 // P_corm_thres Lock algorithms configuration */
 886
 887        11, 80,                 /* set ADC level to -16 */
 888        (1 << 13) - 825 - 117,
 889        (1 << 13) - 837 - 117,
 890        (1 << 13) - 811 - 117,
 891        (1 << 13) - 766 - 117,
 892        (1 << 13) - 737 - 117,
 893        (1 << 13) - 693 - 117,
 894        (1 << 13) - 648 - 117,
 895        (1 << 13) - 619 - 117,
 896        (1 << 13) - 575 - 117,
 897        (1 << 13) - 531 - 117,
 898        (1 << 13) - 501 - 117,
 899
 900        4, 108,
 901        0,
 902        0,
 903        0,
 904        0,
 905
 906        1, 175,
 907        0x0410,
 908        1, 179,
 909        8192,                   // P_fft_nb_to_cut
 910
 911        6, 181,
 912        0x2800,                 // P_coff_corthres_ ( 2k 4k 8k ) 0x2800
 913        0x2800,
 914        0x2800,
 915        0x2800,                 // P_coff_cpilthres_ ( 2k 4k 8k ) 0x2800
 916        0x2800,
 917        0x2800,
 918
 919        2, 193,
 920        0x0666,                 // P_pha3_thres
 921        0x0000,                 // P_cti_use_cpe, P_cti_use_prog
 922
 923        2, 205,
 924        0x200f,                 // P_cspu_regul, P_cspu_win_cut
 925        0x000f,                 // P_des_shift_work
 926
 927        5, 215,
 928        0x023d,                 // P_adp_regul_cnt
 929        0x00a4,                 // P_adp_noise_cnt
 930        0x00a4,                 // P_adp_regul_ext
 931        0x7ff0,                 // P_adp_noise_ext
 932        0x3ccc,                 // P_adp_fil
 933
 934        1, 230,
 935        0x0000,                 // P_2d_byp_ti_num
 936
 937        1, 263,
 938        0x800,                  //P_equal_thres_wgn
 939
 940        1, 268,
 941        (2 << 9) | 39,          // P_equal_ctrl_synchro, P_equal_speedmode
 942
 943        1, 270,
 944        0x0001,                 // P_div_lock0_wait
 945        1, 285,
 946        0x0020,                 //p_fec_
 947        1, 299,
 948        0x0062,                 /* P_smo_mode, P_smo_rs_discard, P_smo_fifo_flush, P_smo_pid_parse, P_smo_error_discard */
 949
 950        1, 338,
 951        (1 << 12) |             // P_ctrl_corm_thres4pre_freq_inh=1
 952                (1 << 10) |
 953                (0 << 9) |              /* P_ctrl_pre_freq_inh=0 */
 954                (3 << 5) |              /* P_ctrl_pre_freq_step=3 */
 955                (1 << 0),               /* P_pre_freq_win_len=1 */
 956
 957        0,
 958};
 959
 960static u16 dib8000_identify(struct i2c_device *client)
 961{
 962        u16 value;
 963
 964        //because of glitches sometimes
 965        value = dib8000_i2c_read16(client, 896);
 966
 967        if ((value = dib8000_i2c_read16(client, 896)) != 0x01b3) {
 968                dprintk("wrong Vendor ID (read=0x%x)\n", value);
 969                return 0;
 970        }
 971
 972        value = dib8000_i2c_read16(client, 897);
 973        if (value != 0x8000 && value != 0x8001 &&
 974                        value != 0x8002 && value != 0x8090) {
 975                dprintk("wrong Device ID (%x)\n", value);
 976                return 0;
 977        }
 978
 979        switch (value) {
 980        case 0x8000:
 981                dprintk("found DiB8000A\n");
 982                break;
 983        case 0x8001:
 984                dprintk("found DiB8000B\n");
 985                break;
 986        case 0x8002:
 987                dprintk("found DiB8000C\n");
 988                break;
 989        case 0x8090:
 990                dprintk("found DiB8096P\n");
 991                break;
 992        }
 993        return value;
 994}
 995
 996static int dib8000_read_unc_blocks(struct dvb_frontend *fe, u32 *unc);
 997
 998static void dib8000_reset_stats(struct dvb_frontend *fe)
 999{
1000        struct dib8000_state *state = fe->demodulator_priv;
1001        struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
1002        u32 ucb;
1003
1004        memset(&c->strength, 0, sizeof(c->strength));
1005        memset(&c->cnr, 0, sizeof(c->cnr));
1006        memset(&c->post_bit_error, 0, sizeof(c->post_bit_error));
1007        memset(&c->post_bit_count, 0, sizeof(c->post_bit_count));
1008        memset(&c->block_error, 0, sizeof(c->block_error));
1009
1010        c->strength.len = 1;
1011        c->cnr.len = 1;
1012        c->block_error.len = 1;
1013        c->block_count.len = 1;
1014        c->post_bit_error.len = 1;
1015        c->post_bit_count.len = 1;
1016
1017        c->strength.stat[0].scale = FE_SCALE_DECIBEL;
1018        c->strength.stat[0].uvalue = 0;
1019
1020        c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1021        c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1022        c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1023        c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1024        c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1025
1026        dib8000_read_unc_blocks(fe, &ucb);
1027
1028        state->init_ucb = -ucb;
1029        state->ber_jiffies_stats = 0;
1030        state->per_jiffies_stats = 0;
1031        memset(&state->ber_jiffies_stats_layer, 0,
1032               sizeof(state->ber_jiffies_stats_layer));
1033}
1034
1035static int dib8000_reset(struct dvb_frontend *fe)
1036{
1037        struct dib8000_state *state = fe->demodulator_priv;
1038
1039        if ((state->revision = dib8000_identify(&state->i2c)) == 0)
1040                return -EINVAL;
1041
1042        /* sram lead in, rdy */
1043        if (state->revision != 0x8090)
1044                dib8000_write_word(state, 1287, 0x0003);
1045
1046        if (state->revision == 0x8000)
1047                dprintk("error : dib8000 MA not supported\n");
1048
1049        dibx000_reset_i2c_master(&state->i2c_master);
1050
1051        dib8000_set_power_mode(state, DIB8000_POWER_ALL);
1052
1053        /* always leave the VBG voltage on - it consumes almost nothing but takes a long time to start */
1054        dib8000_set_adc_state(state, DIBX000_ADC_OFF);
1055
1056        /* restart all parts */
1057        dib8000_write_word(state, 770, 0xffff);
1058        dib8000_write_word(state, 771, 0xffff);
1059        dib8000_write_word(state, 772, 0xfffc);
1060        dib8000_write_word(state, 898, 0x000c); /* restart sad */
1061        if (state->revision == 0x8090)
1062                dib8000_write_word(state, 1280, 0x0045);
1063        else
1064                dib8000_write_word(state, 1280, 0x004d);
1065        dib8000_write_word(state, 1281, 0x000c);
1066
1067        dib8000_write_word(state, 770, 0x0000);
1068        dib8000_write_word(state, 771, 0x0000);
1069        dib8000_write_word(state, 772, 0x0000);
1070        dib8000_write_word(state, 898, 0x0004); // sad
1071        dib8000_write_word(state, 1280, 0x0000);
1072        dib8000_write_word(state, 1281, 0x0000);
1073
1074        /* drives */
1075        if (state->revision != 0x8090) {
1076                if (state->cfg.drives)
1077                        dib8000_write_word(state, 906, state->cfg.drives);
1078                else {
1079                        dprintk("using standard PAD-drive-settings, please adjust settings in config-struct to be optimal.\n");
1080                        /* min drive SDRAM - not optimal - adjust */
1081                        dib8000_write_word(state, 906, 0x2d98);
1082                }
1083        }
1084
1085        dib8000_reset_pll(state);
1086        if (state->revision != 0x8090)
1087                dib8000_write_word(state, 898, 0x0004);
1088
1089        if (dib8000_reset_gpio(state) != 0)
1090                dprintk("GPIO reset was not successful.\n");
1091
1092        if ((state->revision != 0x8090) &&
1093                        (dib8000_set_output_mode(fe, OUTMODE_HIGH_Z) != 0))
1094                dprintk("OUTPUT_MODE could not be resetted.\n");
1095
1096        state->current_agc = NULL;
1097
1098        // P_iqc_alpha_pha, P_iqc_alpha_amp, P_iqc_dcc_alpha, ...
1099        /* P_iqc_ca2 = 0; P_iqc_impnc_on = 0; P_iqc_mode = 0; */
1100        if (state->cfg.pll->ifreq == 0)
1101                dib8000_write_word(state, 40, 0x0755);  /* P_iqc_corr_inh = 0 enable IQcorr block */
1102        else
1103                dib8000_write_word(state, 40, 0x1f55);  /* P_iqc_corr_inh = 1 disable IQcorr block */
1104
1105        {
1106                u16 l = 0, r;
1107                const u16 *n;
1108                n = dib8000_defaults;
1109                l = *n++;
1110                while (l) {
1111                        r = *n++;
1112                        do {
1113                                dib8000_write_word(state, r, *n++);
1114                                r++;
1115                        } while (--l);
1116                        l = *n++;
1117                }
1118        }
1119
1120        state->isdbt_cfg_loaded = 0;
1121
1122        //div_cfg override for special configs
1123        if ((state->revision != 8090) && (state->cfg.div_cfg != 0))
1124                dib8000_write_word(state, 903, state->cfg.div_cfg);
1125
1126        /* unforce divstr regardless whether i2c enumeration was done or not */
1127        dib8000_write_word(state, 1285, dib8000_read_word(state, 1285) & ~(1 << 1));
1128
1129        dib8000_set_bandwidth(fe, 6000);
1130
1131        dib8000_set_adc_state(state, DIBX000_SLOW_ADC_ON);
1132        dib8000_sad_calib(state);
1133        if (state->revision != 0x8090)
1134                dib8000_set_adc_state(state, DIBX000_SLOW_ADC_OFF);
1135
1136        /* ber_rs_len = 3 */
1137        dib8000_write_word(state, 285, (dib8000_read_word(state, 285) & ~0x60) | (3 << 5));
1138
1139        dib8000_set_power_mode(state, DIB8000_POWER_INTERFACE_ONLY);
1140
1141        dib8000_reset_stats(fe);
1142
1143        return 0;
1144}
1145
1146static void dib8000_restart_agc(struct dib8000_state *state)
1147{
1148        // P_restart_iqc & P_restart_agc
1149        dib8000_write_word(state, 770, 0x0a00);
1150        dib8000_write_word(state, 770, 0x0000);
1151}
1152
1153static int dib8000_update_lna(struct dib8000_state *state)
1154{
1155        u16 dyn_gain;
1156
1157        if (state->cfg.update_lna) {
1158                // read dyn_gain here (because it is demod-dependent and not tuner)
1159                dyn_gain = dib8000_read_word(state, 390);
1160
1161                if (state->cfg.update_lna(state->fe[0], dyn_gain)) {
1162                        dib8000_restart_agc(state);
1163                        return 1;
1164                }
1165        }
1166        return 0;
1167}
1168
1169static int dib8000_set_agc_config(struct dib8000_state *state, u8 band)
1170{
1171        struct dibx000_agc_config *agc = NULL;
1172        int i;
1173        u16 reg;
1174
1175        if (state->current_band == band && state->current_agc != NULL)
1176                return 0;
1177        state->current_band = band;
1178
1179        for (i = 0; i < state->cfg.agc_config_count; i++)
1180                if (state->cfg.agc[i].band_caps & band) {
1181                        agc = &state->cfg.agc[i];
1182                        break;
1183                }
1184
1185        if (agc == NULL) {
1186                dprintk("no valid AGC configuration found for band 0x%02x\n", band);
1187                return -EINVAL;
1188        }
1189
1190        state->current_agc = agc;
1191
1192        /* AGC */
1193        dib8000_write_word(state, 76, agc->setup);
1194        dib8000_write_word(state, 77, agc->inv_gain);
1195        dib8000_write_word(state, 78, agc->time_stabiliz);
1196        dib8000_write_word(state, 101, (agc->alpha_level << 12) | agc->thlock);
1197
1198        // Demod AGC loop configuration
1199        dib8000_write_word(state, 102, (agc->alpha_mant << 5) | agc->alpha_exp);
1200        dib8000_write_word(state, 103, (agc->beta_mant << 6) | agc->beta_exp);
1201
1202        dprintk("WBD: ref: %d, sel: %d, active: %d, alpha: %d\n",
1203                state->wbd_ref != 0 ? state->wbd_ref : agc->wbd_ref, agc->wbd_sel, !agc->perform_agc_softsplit, agc->wbd_sel);
1204
1205        /* AGC continued */
1206        if (state->wbd_ref != 0)
1207                dib8000_write_word(state, 106, state->wbd_ref);
1208        else                    // use default
1209                dib8000_write_word(state, 106, agc->wbd_ref);
1210
1211        if (state->revision == 0x8090) {
1212                reg = dib8000_read_word(state, 922) & (0x3 << 2);
1213                dib8000_write_word(state, 922, reg | (agc->wbd_sel << 2));
1214        }
1215
1216        dib8000_write_word(state, 107, (agc->wbd_alpha << 9) | (agc->perform_agc_softsplit << 8));
1217        dib8000_write_word(state, 108, agc->agc1_max);
1218        dib8000_write_word(state, 109, agc->agc1_min);
1219        dib8000_write_word(state, 110, agc->agc2_max);
1220        dib8000_write_word(state, 111, agc->agc2_min);
1221        dib8000_write_word(state, 112, (agc->agc1_pt1 << 8) | agc->agc1_pt2);
1222        dib8000_write_word(state, 113, (agc->agc1_slope1 << 8) | agc->agc1_slope2);
1223        dib8000_write_word(state, 114, (agc->agc2_pt1 << 8) | agc->agc2_pt2);
1224        dib8000_write_word(state, 115, (agc->agc2_slope1 << 8) | agc->agc2_slope2);
1225
1226        dib8000_write_word(state, 75, agc->agc1_pt3);
1227        if (state->revision != 0x8090)
1228                dib8000_write_word(state, 923,
1229                                (dib8000_read_word(state, 923) & 0xffe3) |
1230                                (agc->wbd_inv << 4) | (agc->wbd_sel << 2));
1231
1232        return 0;
1233}
1234
1235static void dib8000_pwm_agc_reset(struct dvb_frontend *fe)
1236{
1237        struct dib8000_state *state = fe->demodulator_priv;
1238        dib8000_set_adc_state(state, DIBX000_ADC_ON);
1239        dib8000_set_agc_config(state, (unsigned char)(BAND_OF_FREQUENCY(fe->dtv_property_cache.frequency / 1000)));
1240}
1241
1242static int dib8000_agc_soft_split(struct dib8000_state *state)
1243{
1244        u16 agc, split_offset;
1245
1246        if (!state->current_agc || !state->current_agc->perform_agc_softsplit || state->current_agc->split.max == 0)
1247                return 0;
1248
1249        // n_agc_global
1250        agc = dib8000_read_word(state, 390);
1251
1252        if (agc > state->current_agc->split.min_thres)
1253                split_offset = state->current_agc->split.min;
1254        else if (agc < state->current_agc->split.max_thres)
1255                split_offset = state->current_agc->split.max;
1256        else
1257                split_offset = state->current_agc->split.max *
1258                        (agc - state->current_agc->split.min_thres) /
1259                        (state->current_agc->split.max_thres - state->current_agc->split.min_thres);
1260
1261        dprintk("AGC split_offset: %d\n", split_offset);
1262
1263        // P_agc_force_split and P_agc_split_offset
1264        dib8000_write_word(state, 107, (dib8000_read_word(state, 107) & 0xff00) | split_offset);
1265        return 5000;
1266}
1267
1268static int dib8000_agc_startup(struct dvb_frontend *fe)
1269{
1270        struct dib8000_state *state = fe->demodulator_priv;
1271        enum frontend_tune_state *tune_state = &state->tune_state;
1272        int ret = 0;
1273        u16 reg;
1274        u32 upd_demod_gain_period = 0x8000;
1275
1276        switch (*tune_state) {
1277        case CT_AGC_START:
1278                // set power-up level: interf+analog+AGC
1279
1280                if (state->revision != 0x8090)
1281                        dib8000_set_adc_state(state, DIBX000_ADC_ON);
1282                else {
1283                        dib8000_set_power_mode(state, DIB8000_POWER_ALL);
1284
1285                        reg = dib8000_read_word(state, 1947)&0xff00;
1286                        dib8000_write_word(state, 1946,
1287                                        upd_demod_gain_period & 0xFFFF);
1288                        /* bit 14 = enDemodGain */
1289                        dib8000_write_word(state, 1947, reg | (1<<14) |
1290                                        ((upd_demod_gain_period >> 16) & 0xFF));
1291
1292                        /* enable adc i & q */
1293                        reg = dib8000_read_word(state, 1920);
1294                        dib8000_write_word(state, 1920, (reg | 0x3) &
1295                                        (~(1 << 7)));
1296                }
1297
1298                if (dib8000_set_agc_config(state, (unsigned char)(BAND_OF_FREQUENCY(fe->dtv_property_cache.frequency / 1000))) != 0) {
1299                        *tune_state = CT_AGC_STOP;
1300                        state->status = FE_STATUS_TUNE_FAILED;
1301                        break;
1302                }
1303
1304                ret = 70;
1305                *tune_state = CT_AGC_STEP_0;
1306                break;
1307
1308        case CT_AGC_STEP_0:
1309                //AGC initialization
1310                if (state->cfg.agc_control)
1311                        state->cfg.agc_control(fe, 1);
1312
1313                dib8000_restart_agc(state);
1314
1315                // wait AGC rough lock time
1316                ret = 50;
1317                *tune_state = CT_AGC_STEP_1;
1318                break;
1319
1320        case CT_AGC_STEP_1:
1321                // wait AGC accurate lock time
1322                ret = 70;
1323
1324                if (dib8000_update_lna(state))
1325                        // wait only AGC rough lock time
1326                        ret = 50;
1327                else
1328                        *tune_state = CT_AGC_STEP_2;
1329                break;
1330
1331        case CT_AGC_STEP_2:
1332                dib8000_agc_soft_split(state);
1333
1334                if (state->cfg.agc_control)
1335                        state->cfg.agc_control(fe, 0);
1336
1337                *tune_state = CT_AGC_STOP;
1338                break;
1339        default:
1340                ret = dib8000_agc_soft_split(state);
1341                break;
1342        }
1343        return ret;
1344
1345}
1346
1347static void dib8096p_host_bus_drive(struct dib8000_state *state, u8 drive)
1348{
1349        u16 reg;
1350
1351        drive &= 0x7;
1352
1353        /* drive host bus 2, 3, 4 */
1354        reg = dib8000_read_word(state, 1798) &
1355                ~(0x7 | (0x7 << 6) | (0x7 << 12));
1356        reg |= (drive<<12) | (drive<<6) | drive;
1357        dib8000_write_word(state, 1798, reg);
1358
1359        /* drive host bus 5,6 */
1360        reg = dib8000_read_word(state, 1799) & ~((0x7 << 2) | (0x7 << 8));
1361        reg |= (drive<<8) | (drive<<2);
1362        dib8000_write_word(state, 1799, reg);
1363
1364        /* drive host bus 7, 8, 9 */
1365        reg = dib8000_read_word(state, 1800) &
1366                ~(0x7 | (0x7 << 6) | (0x7 << 12));
1367        reg |= (drive<<12) | (drive<<6) | drive;
1368        dib8000_write_word(state, 1800, reg);
1369
1370        /* drive host bus 10, 11 */
1371        reg = dib8000_read_word(state, 1801) & ~((0x7 << 2) | (0x7 << 8));
1372        reg |= (drive<<8) | (drive<<2);
1373        dib8000_write_word(state, 1801, reg);
1374
1375        /* drive host bus 12, 13, 14 */
1376        reg = dib8000_read_word(state, 1802) &
1377                ~(0x7 | (0x7 << 6) | (0x7 << 12));
1378        reg |= (drive<<12) | (drive<<6) | drive;
1379        dib8000_write_word(state, 1802, reg);
1380}
1381
1382static u32 dib8096p_calcSyncFreq(u32 P_Kin, u32 P_Kout,
1383                u32 insertExtSynchro, u32 syncSize)
1384{
1385        u32 quantif = 3;
1386        u32 nom = (insertExtSynchro * P_Kin+syncSize);
1387        u32 denom = P_Kout;
1388        u32 syncFreq = ((nom << quantif) / denom);
1389
1390        if ((syncFreq & ((1 << quantif) - 1)) != 0)
1391                syncFreq = (syncFreq >> quantif) + 1;
1392        else
1393                syncFreq = (syncFreq >> quantif);
1394
1395        if (syncFreq != 0)
1396                syncFreq = syncFreq - 1;
1397
1398        return syncFreq;
1399}
1400
1401static void dib8096p_cfg_DibTx(struct dib8000_state *state, u32 P_Kin,
1402                u32 P_Kout, u32 insertExtSynchro, u32 synchroMode,
1403                u32 syncWord, u32 syncSize)
1404{
1405        dprintk("Configure DibStream Tx\n");
1406
1407        dib8000_write_word(state, 1615, 1);
1408        dib8000_write_word(state, 1603, P_Kin);
1409        dib8000_write_word(state, 1605, P_Kout);
1410        dib8000_write_word(state, 1606, insertExtSynchro);
1411        dib8000_write_word(state, 1608, synchroMode);
1412        dib8000_write_word(state, 1609, (syncWord >> 16) & 0xffff);
1413        dib8000_write_word(state, 1610, syncWord & 0xffff);
1414        dib8000_write_word(state, 1612, syncSize);
1415        dib8000_write_word(state, 1615, 0);
1416}
1417
1418static void dib8096p_cfg_DibRx(struct dib8000_state *state, u32 P_Kin,
1419                u32 P_Kout, u32 synchroMode, u32 insertExtSynchro,
1420                u32 syncWord, u32 syncSize, u32 dataOutRate)
1421{
1422        u32 syncFreq;
1423
1424        dprintk("Configure DibStream Rx synchroMode = %d\n", synchroMode);
1425
1426        if ((P_Kin != 0) && (P_Kout != 0)) {
1427                syncFreq = dib8096p_calcSyncFreq(P_Kin, P_Kout,
1428                                insertExtSynchro, syncSize);
1429                dib8000_write_word(state, 1542, syncFreq);
1430        }
1431
1432        dib8000_write_word(state, 1554, 1);
1433        dib8000_write_word(state, 1536, P_Kin);
1434        dib8000_write_word(state, 1537, P_Kout);
1435        dib8000_write_word(state, 1539, synchroMode);
1436        dib8000_write_word(state, 1540, (syncWord >> 16) & 0xffff);
1437        dib8000_write_word(state, 1541, syncWord & 0xffff);
1438        dib8000_write_word(state, 1543, syncSize);
1439        dib8000_write_word(state, 1544, dataOutRate);
1440        dib8000_write_word(state, 1554, 0);
1441}
1442
1443static void dib8096p_enMpegMux(struct dib8000_state *state, int onoff)
1444{
1445        u16 reg_1287;
1446
1447        reg_1287 = dib8000_read_word(state, 1287);
1448
1449        switch (onoff) {
1450        case 1:
1451                        reg_1287 &= ~(1 << 8);
1452                        break;
1453        case 0:
1454                        reg_1287 |= (1 << 8);
1455                        break;
1456        }
1457
1458        dib8000_write_word(state, 1287, reg_1287);
1459}
1460
1461static void dib8096p_configMpegMux(struct dib8000_state *state,
1462                u16 pulseWidth, u16 enSerialMode, u16 enSerialClkDiv2)
1463{
1464        u16 reg_1287;
1465
1466        dprintk("Enable Mpeg mux\n");
1467
1468        dib8096p_enMpegMux(state, 0);
1469
1470        /* If the input mode is MPEG do not divide the serial clock */
1471        if ((enSerialMode == 1) && (state->input_mode_mpeg == 1))
1472                enSerialClkDiv2 = 0;
1473
1474        reg_1287 = ((pulseWidth & 0x1f) << 3) |
1475                ((enSerialMode & 0x1) << 2) | (enSerialClkDiv2 & 0x1);
1476        dib8000_write_word(state, 1287, reg_1287);
1477
1478        dib8096p_enMpegMux(state, 1);
1479}
1480
1481static void dib8096p_setDibTxMux(struct dib8000_state *state, int mode)
1482{
1483        u16 reg_1288 = dib8000_read_word(state, 1288) & ~(0x7 << 7);
1484
1485        switch (mode) {
1486        case MPEG_ON_DIBTX:
1487                        dprintk("SET MPEG ON DIBSTREAM TX\n");
1488                        dib8096p_cfg_DibTx(state, 8, 5, 0, 0, 0, 0);
1489                        reg_1288 |= (1 << 9); break;
1490        case DIV_ON_DIBTX:
1491                        dprintk("SET DIV_OUT ON DIBSTREAM TX\n");
1492                        dib8096p_cfg_DibTx(state, 5, 5, 0, 0, 0, 0);
1493                        reg_1288 |= (1 << 8); break;
1494        case ADC_ON_DIBTX:
1495                        dprintk("SET ADC_OUT ON DIBSTREAM TX\n");
1496                        dib8096p_cfg_DibTx(state, 20, 5, 10, 0, 0, 0);
1497                        reg_1288 |= (1 << 7); break;
1498        default:
1499                        break;
1500        }
1501        dib8000_write_word(state, 1288, reg_1288);
1502}
1503
1504static void dib8096p_setHostBusMux(struct dib8000_state *state, int mode)
1505{
1506        u16 reg_1288 = dib8000_read_word(state, 1288) & ~(0x7 << 4);
1507
1508        switch (mode) {
1509        case DEMOUT_ON_HOSTBUS:
1510                        dprintk("SET DEM OUT OLD INTERF ON HOST BUS\n");
1511                        dib8096p_enMpegMux(state, 0);
1512                        reg_1288 |= (1 << 6);
1513                        break;
1514        case DIBTX_ON_HOSTBUS:
1515                        dprintk("SET DIBSTREAM TX ON HOST BUS\n");
1516                        dib8096p_enMpegMux(state, 0);
1517                        reg_1288 |= (1 << 5);
1518                        break;
1519        case MPEG_ON_HOSTBUS:
1520                        dprintk("SET MPEG MUX ON HOST BUS\n");
1521                        reg_1288 |= (1 << 4);
1522                        break;
1523        default:
1524                        break;
1525        }
1526        dib8000_write_word(state, 1288, reg_1288);
1527}
1528
1529static int dib8096p_set_diversity_in(struct dvb_frontend *fe, int onoff)
1530{
1531        struct dib8000_state *state = fe->demodulator_priv;
1532        u16 reg_1287;
1533
1534        switch (onoff) {
1535        case 0: /* only use the internal way - not the diversity input */
1536                        dprintk("%s mode OFF : by default Enable Mpeg INPUT\n",
1537                                        __func__);
1538                        /* outputRate = 8 */
1539                        dib8096p_cfg_DibRx(state, 8, 5, 0, 0, 0, 8, 0);
1540
1541                        /* Do not divide the serial clock of MPEG MUX in
1542                           SERIAL MODE in case input mode MPEG is used */
1543                        reg_1287 = dib8000_read_word(state, 1287);
1544                        /* enSerialClkDiv2 == 1 ? */
1545                        if ((reg_1287 & 0x1) == 1) {
1546                                /* force enSerialClkDiv2 = 0 */
1547                                reg_1287 &= ~0x1;
1548                                dib8000_write_word(state, 1287, reg_1287);
1549                        }
1550                        state->input_mode_mpeg = 1;
1551                        break;
1552        case 1: /* both ways */
1553        case 2: /* only the diversity input */
1554                        dprintk("%s ON : Enable diversity INPUT\n", __func__);
1555                        dib8096p_cfg_DibRx(state, 5, 5, 0, 0, 0, 0, 0);
1556                        state->input_mode_mpeg = 0;
1557                        break;
1558        }
1559
1560        dib8000_set_diversity_in(state->fe[0], onoff);
1561        return 0;
1562}
1563
1564static int dib8096p_set_output_mode(struct dvb_frontend *fe, int mode)
1565{
1566        struct dib8000_state *state = fe->demodulator_priv;
1567        u16 outreg, smo_mode, fifo_threshold;
1568        u8 prefer_mpeg_mux_use = 1;
1569        int ret = 0;
1570
1571        state->output_mode = mode;
1572        dib8096p_host_bus_drive(state, 1);
1573
1574        fifo_threshold = 1792;
1575        smo_mode = (dib8000_read_word(state, 299) & 0x0050) | (1 << 1);
1576        outreg   = dib8000_read_word(state, 1286) &
1577                ~((1 << 10) | (0x7 << 6) | (1 << 1));
1578
1579        switch (mode) {
1580        case OUTMODE_HIGH_Z:
1581                        outreg = 0;
1582                        break;
1583
1584        case OUTMODE_MPEG2_SERIAL:
1585                        if (prefer_mpeg_mux_use) {
1586                                dprintk("dib8096P setting output mode TS_SERIAL using Mpeg Mux\n");
1587                                dib8096p_configMpegMux(state, 3, 1, 1);
1588                                dib8096p_setHostBusMux(state, MPEG_ON_HOSTBUS);
1589                        } else {/* Use Smooth block */
1590                                dprintk("dib8096P setting output mode TS_SERIAL using Smooth bloc\n");
1591                                dib8096p_setHostBusMux(state,
1592                                                DEMOUT_ON_HOSTBUS);
1593                                outreg |= (2 << 6) | (0 << 1);
1594                        }
1595                        break;
1596
1597        case OUTMODE_MPEG2_PAR_GATED_CLK:
1598                        if (prefer_mpeg_mux_use) {
1599                                dprintk("dib8096P setting output mode TS_PARALLEL_GATED using Mpeg Mux\n");
1600                                dib8096p_configMpegMux(state, 2, 0, 0);
1601                                dib8096p_setHostBusMux(state, MPEG_ON_HOSTBUS);
1602                        } else { /* Use Smooth block */
1603                                dprintk("dib8096P setting output mode TS_PARALLEL_GATED using Smooth block\n");
1604                                dib8096p_setHostBusMux(state,
1605                                                DEMOUT_ON_HOSTBUS);
1606                                outreg |= (0 << 6);
1607                        }
1608                        break;
1609
1610        case OUTMODE_MPEG2_PAR_CONT_CLK: /* Using Smooth block only */
1611                        dprintk("dib8096P setting output mode TS_PARALLEL_CONT using Smooth block\n");
1612                        dib8096p_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
1613                        outreg |= (1 << 6);
1614                        break;
1615
1616        case OUTMODE_MPEG2_FIFO:
1617                        /* Using Smooth block because not supported
1618                           by new Mpeg Mux bloc */
1619                        dprintk("dib8096P setting output mode TS_FIFO using Smooth block\n");
1620                        dib8096p_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
1621                        outreg |= (5 << 6);
1622                        smo_mode |= (3 << 1);
1623                        fifo_threshold = 512;
1624                        break;
1625
1626        case OUTMODE_DIVERSITY:
1627                        dprintk("dib8096P setting output mode MODE_DIVERSITY\n");
1628                        dib8096p_setDibTxMux(state, DIV_ON_DIBTX);
1629                        dib8096p_setHostBusMux(state, DIBTX_ON_HOSTBUS);
1630                        break;
1631
1632        case OUTMODE_ANALOG_ADC:
1633                        dprintk("dib8096P setting output mode MODE_ANALOG_ADC\n");
1634                        dib8096p_setDibTxMux(state, ADC_ON_DIBTX);
1635                        dib8096p_setHostBusMux(state, DIBTX_ON_HOSTBUS);
1636                        break;
1637        }
1638
1639        if (mode != OUTMODE_HIGH_Z)
1640                outreg |= (1<<10);
1641
1642        dprintk("output_mpeg2_in_188_bytes = %d\n",
1643                        state->cfg.output_mpeg2_in_188_bytes);
1644        if (state->cfg.output_mpeg2_in_188_bytes)
1645                smo_mode |= (1 << 5);
1646
1647        ret |= dib8000_write_word(state, 299, smo_mode);
1648        /* synchronous fread */
1649        ret |= dib8000_write_word(state, 299 + 1, fifo_threshold);
1650        ret |= dib8000_write_word(state, 1286, outreg);
1651
1652        return ret;
1653}
1654
1655static int map_addr_to_serpar_number(struct i2c_msg *msg)
1656{
1657        if (msg->buf[0] <= 15)
1658                msg->buf[0] -= 1;
1659        else if (msg->buf[0] == 17)
1660                msg->buf[0] = 15;
1661        else if (msg->buf[0] == 16)
1662                msg->buf[0] = 17;
1663        else if (msg->buf[0] == 19)
1664                msg->buf[0] = 16;
1665        else if (msg->buf[0] >= 21 && msg->buf[0] <= 25)
1666                msg->buf[0] -= 3;
1667        else if (msg->buf[0] == 28)
1668                msg->buf[0] = 23;
1669        else if (msg->buf[0] == 99)
1670                msg->buf[0] = 99;
1671        else
1672                return -EINVAL;
1673        return 0;
1674}
1675
1676static int dib8096p_tuner_write_serpar(struct i2c_adapter *i2c_adap,
1677                struct i2c_msg msg[], int num)
1678{
1679        struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1680        u8 n_overflow = 1;
1681        u16 i = 1000;
1682        u16 serpar_num = msg[0].buf[0];
1683
1684        while (n_overflow == 1 && i) {
1685                n_overflow = (dib8000_read_word(state, 1984) >> 1) & 0x1;
1686                i--;
1687                if (i == 0)
1688                        dprintk("Tuner ITF: write busy (overflow)\n");
1689        }
1690        dib8000_write_word(state, 1985, (1 << 6) | (serpar_num & 0x3f));
1691        dib8000_write_word(state, 1986, (msg[0].buf[1] << 8) | msg[0].buf[2]);
1692
1693        return num;
1694}
1695
1696static int dib8096p_tuner_read_serpar(struct i2c_adapter *i2c_adap,
1697                struct i2c_msg msg[], int num)
1698{
1699        struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1700        u8 n_overflow = 1, n_empty = 1;
1701        u16 i = 1000;
1702        u16 serpar_num = msg[0].buf[0];
1703        u16 read_word;
1704
1705        while (n_overflow == 1 && i) {
1706                n_overflow = (dib8000_read_word(state, 1984) >> 1) & 0x1;
1707                i--;
1708                if (i == 0)
1709                        dprintk("TunerITF: read busy (overflow)\n");
1710        }
1711        dib8000_write_word(state, 1985, (0<<6) | (serpar_num&0x3f));
1712
1713        i = 1000;
1714        while (n_empty == 1 && i) {
1715                n_empty = dib8000_read_word(state, 1984)&0x1;
1716                i--;
1717                if (i == 0)
1718                        dprintk("TunerITF: read busy (empty)\n");
1719        }
1720
1721        read_word = dib8000_read_word(state, 1987);
1722        msg[1].buf[0] = (read_word >> 8) & 0xff;
1723        msg[1].buf[1] = (read_word) & 0xff;
1724
1725        return num;
1726}
1727
1728static int dib8096p_tuner_rw_serpar(struct i2c_adapter *i2c_adap,
1729                struct i2c_msg msg[], int num)
1730{
1731        if (map_addr_to_serpar_number(&msg[0]) == 0) {
1732                if (num == 1) /* write */
1733                        return dib8096p_tuner_write_serpar(i2c_adap, msg, 1);
1734                else /* read */
1735                        return dib8096p_tuner_read_serpar(i2c_adap, msg, 2);
1736        }
1737        return num;
1738}
1739
1740static int dib8096p_rw_on_apb(struct i2c_adapter *i2c_adap,
1741                struct i2c_msg msg[], int num, u16 apb_address)
1742{
1743        struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1744        u16 word;
1745
1746        if (num == 1) {         /* write */
1747                dib8000_write_word(state, apb_address,
1748                                ((msg[0].buf[1] << 8) | (msg[0].buf[2])));
1749        } else {
1750                word = dib8000_read_word(state, apb_address);
1751                msg[1].buf[0] = (word >> 8) & 0xff;
1752                msg[1].buf[1] = (word) & 0xff;
1753        }
1754        return num;
1755}
1756
1757static int dib8096p_tuner_xfer(struct i2c_adapter *i2c_adap,
1758                struct i2c_msg msg[], int num)
1759{
1760        struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1761        u16 apb_address = 0, word;
1762        int i = 0;
1763
1764        switch (msg[0].buf[0]) {
1765        case 0x12:
1766                        apb_address = 1920;
1767                        break;
1768        case 0x14:
1769                        apb_address = 1921;
1770                        break;
1771        case 0x24:
1772                        apb_address = 1922;
1773                        break;
1774        case 0x1a:
1775                        apb_address = 1923;
1776                        break;
1777        case 0x22:
1778                        apb_address = 1924;
1779                        break;
1780        case 0x33:
1781                        apb_address = 1926;
1782                        break;
1783        case 0x34:
1784                        apb_address = 1927;
1785                        break;
1786        case 0x35:
1787                        apb_address = 1928;
1788                        break;
1789        case 0x36:
1790                        apb_address = 1929;
1791                        break;
1792        case 0x37:
1793                        apb_address = 1930;
1794                        break;
1795        case 0x38:
1796                        apb_address = 1931;
1797                        break;
1798        case 0x39:
1799                        apb_address = 1932;
1800                        break;
1801        case 0x2a:
1802                        apb_address = 1935;
1803                        break;
1804        case 0x2b:
1805                        apb_address = 1936;
1806                        break;
1807        case 0x2c:
1808                        apb_address = 1937;
1809                        break;
1810        case 0x2d:
1811                        apb_address = 1938;
1812                        break;
1813        case 0x2e:
1814                        apb_address = 1939;
1815                        break;
1816        case 0x2f:
1817                        apb_address = 1940;
1818                        break;
1819        case 0x30:
1820                        apb_address = 1941;
1821                        break;
1822        case 0x31:
1823                        apb_address = 1942;
1824                        break;
1825        case 0x32:
1826                        apb_address = 1943;
1827                        break;
1828        case 0x3e:
1829                        apb_address = 1944;
1830                        break;
1831        case 0x3f:
1832                        apb_address = 1945;
1833                        break;
1834        case 0x40:
1835                        apb_address = 1948;
1836                        break;
1837        case 0x25:
1838                        apb_address = 936;
1839                        break;
1840        case 0x26:
1841                        apb_address = 937;
1842                        break;
1843        case 0x27:
1844                        apb_address = 938;
1845                        break;
1846        case 0x28:
1847                        apb_address = 939;
1848                        break;
1849        case 0x1d:
1850                        /* get sad sel request */
1851                        i = ((dib8000_read_word(state, 921) >> 12)&0x3);
1852                        word = dib8000_read_word(state, 924+i);
1853                        msg[1].buf[0] = (word >> 8) & 0xff;
1854                        msg[1].buf[1] = (word) & 0xff;
1855                        return num;
1856        case 0x1f:
1857                        if (num == 1) { /* write */
1858                                word = (u16) ((msg[0].buf[1] << 8) |
1859                                                msg[0].buf[2]);
1860                                /* in the VGAMODE Sel are located on bit 0/1 */
1861                                word &= 0x3;
1862                                word = (dib8000_read_word(state, 921) &
1863                                                ~(3<<12)) | (word<<12);
1864                                /* Set the proper input */
1865                                dib8000_write_word(state, 921, word);
1866                                return num;
1867                        }
1868        }
1869
1870        if (apb_address != 0) /* R/W acces via APB */
1871                return dib8096p_rw_on_apb(i2c_adap, msg, num, apb_address);
1872        else  /* R/W access via SERPAR  */
1873                return dib8096p_tuner_rw_serpar(i2c_adap, msg, num);
1874
1875        return 0;
1876}
1877
1878static u32 dib8096p_i2c_func(struct i2c_adapter *adapter)
1879{
1880        return I2C_FUNC_I2C;
1881}
1882
1883static const struct i2c_algorithm dib8096p_tuner_xfer_algo = {
1884        .master_xfer = dib8096p_tuner_xfer,
1885        .functionality = dib8096p_i2c_func,
1886};
1887
1888static struct i2c_adapter *dib8096p_get_i2c_tuner(struct dvb_frontend *fe)
1889{
1890        struct dib8000_state *st = fe->demodulator_priv;
1891        return &st->dib8096p_tuner_adap;
1892}
1893
1894static int dib8096p_tuner_sleep(struct dvb_frontend *fe, int onoff)
1895{
1896        struct dib8000_state *state = fe->demodulator_priv;
1897        u16 en_cur_state;
1898
1899        dprintk("sleep dib8096p: %d\n", onoff);
1900
1901        en_cur_state = dib8000_read_word(state, 1922);
1902
1903        /* LNAs and MIX are ON and therefore it is a valid configuration */
1904        if (en_cur_state > 0xff)
1905                state->tuner_enable = en_cur_state ;
1906
1907        if (onoff)
1908                en_cur_state &= 0x00ff;
1909        else {
1910                if (state->tuner_enable != 0)
1911                        en_cur_state = state->tuner_enable;
1912        }
1913
1914        dib8000_write_word(state, 1922, en_cur_state);
1915
1916        return 0;
1917}
1918
1919static const s32 lut_1000ln_mant[] =
1920{
1921        908, 7003, 7090, 7170, 7244, 7313, 7377, 7438, 7495, 7549, 7600
1922};
1923
1924static s32 dib8000_get_adc_power(struct dvb_frontend *fe, u8 mode)
1925{
1926        struct dib8000_state *state = fe->demodulator_priv;
1927        u32 ix = 0, tmp_val = 0, exp = 0, mant = 0;
1928        s32 val;
1929
1930        val = dib8000_read32(state, 384);
1931        if (mode) {
1932                tmp_val = val;
1933                while (tmp_val >>= 1)
1934                        exp++;
1935                mant = (val * 1000 / (1<<exp));
1936                ix = (u8)((mant-1000)/100); /* index of the LUT */
1937                val = (lut_1000ln_mant[ix] + 693*(exp-20) - 6908);
1938                val = (val*256)/1000;
1939        }
1940        return val;
1941}
1942
1943static int dib8090p_get_dc_power(struct dvb_frontend *fe, u8 IQ)
1944{
1945        struct dib8000_state *state = fe->demodulator_priv;
1946        int val = 0;
1947
1948        switch (IQ) {
1949        case 1:
1950                        val = dib8000_read_word(state, 403);
1951                        break;
1952        case 0:
1953                        val = dib8000_read_word(state, 404);
1954                        break;
1955        }
1956        if (val  & 0x200)
1957                val -= 1024;
1958
1959        return val;
1960}
1961
1962static void dib8000_update_timf(struct dib8000_state *state)
1963{
1964        u32 timf = state->timf = dib8000_read32(state, 435);
1965
1966        dib8000_write_word(state, 29, (u16) (timf >> 16));
1967        dib8000_write_word(state, 30, (u16) (timf & 0xffff));
1968        dprintk("Updated timing frequency: %d (default: %d)\n", state->timf, state->timf_default);
1969}
1970
1971static u32 dib8000_ctrl_timf(struct dvb_frontend *fe, uint8_t op, uint32_t timf)
1972{
1973        struct dib8000_state *state = fe->demodulator_priv;
1974
1975        switch (op) {
1976        case DEMOD_TIMF_SET:
1977                        state->timf = timf;
1978                        break;
1979        case DEMOD_TIMF_UPDATE:
1980                        dib8000_update_timf(state);
1981                        break;
1982        case DEMOD_TIMF_GET:
1983                        break;
1984        }
1985        dib8000_set_bandwidth(state->fe[0], 6000);
1986
1987        return state->timf;
1988}
1989
1990static const u16 adc_target_16dB[11] = {
1991        7250, 7238, 7264, 7309, 7338, 7382, 7427, 7456, 7500, 7544, 7574
1992};
1993
1994static const u8 permu_seg[] = { 6, 5, 7, 4, 8, 3, 9, 2, 10, 1, 11, 0, 12 };
1995
1996static u16 dib8000_set_layer(struct dib8000_state *state, u8 layer_index, u16 max_constellation)
1997{
1998        u8  cr, constellation, time_intlv;
1999        struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2000
2001        switch (c->layer[layer_index].modulation) {
2002        case DQPSK:
2003                        constellation = 0;
2004                        break;
2005        case  QPSK:
2006                        constellation = 1;
2007                        break;
2008        case QAM_16:
2009                        constellation = 2;
2010                        break;
2011        case QAM_64:
2012        default:
2013                        constellation = 3;
2014                        break;
2015        }
2016
2017        switch (c->layer[layer_index].fec) {
2018        case FEC_1_2:
2019                        cr = 1;
2020                        break;
2021        case FEC_2_3:
2022                        cr = 2;
2023                        break;
2024        case FEC_3_4:
2025                        cr = 3;
2026                        break;
2027        case FEC_5_6:
2028                        cr = 5;
2029                        break;
2030        case FEC_7_8:
2031        default:
2032                        cr = 7;
2033                        break;
2034        }
2035
2036        time_intlv = fls(c->layer[layer_index].interleaving);
2037        if (time_intlv > 3 && !(time_intlv == 4 && c->isdbt_sb_mode == 1))
2038                time_intlv = 0;
2039
2040        dib8000_write_word(state, 2 + layer_index, (constellation << 10) | ((c->layer[layer_index].segment_count & 0xf) << 6) | (cr << 3) | time_intlv);
2041        if (c->layer[layer_index].segment_count > 0) {
2042                switch (max_constellation) {
2043                case DQPSK:
2044                case QPSK:
2045                                if (c->layer[layer_index].modulation == QAM_16 || c->layer[layer_index].modulation == QAM_64)
2046                                        max_constellation = c->layer[layer_index].modulation;
2047                                break;
2048                case QAM_16:
2049                                if (c->layer[layer_index].modulation == QAM_64)
2050                                        max_constellation = c->layer[layer_index].modulation;
2051                                break;
2052                }
2053        }
2054
2055        return  max_constellation;
2056}
2057
2058static const u16 adp_Q64[4] = {0x0148, 0xfff0, 0x00a4, 0xfff8}; /* P_adp_regul_cnt 0.04, P_adp_noise_cnt -0.002, P_adp_regul_ext 0.02, P_adp_noise_ext -0.001 */
2059static const u16 adp_Q16[4] = {0x023d, 0xffdf, 0x00a4, 0xfff0}; /* P_adp_regul_cnt 0.07, P_adp_noise_cnt -0.004, P_adp_regul_ext 0.02, P_adp_noise_ext -0.002 */
2060static const u16 adp_Qdefault[4] = {0x099a, 0xffae, 0x0333, 0xfff8}; /* P_adp_regul_cnt 0.3,  P_adp_noise_cnt -0.01,  P_adp_regul_ext 0.1,  P_adp_noise_ext -0.002 */
2061static u16 dib8000_adp_fine_tune(struct dib8000_state *state, u16 max_constellation)
2062{
2063        u16 i, ana_gain = 0;
2064        const u16 *adp;
2065
2066        /* channel estimation fine configuration */
2067        switch (max_constellation) {
2068        case QAM_64:
2069                        ana_gain = 0x7;
2070                        adp = &adp_Q64[0];
2071                        break;
2072        case QAM_16:
2073                        ana_gain = 0x7;
2074                        adp = &adp_Q16[0];
2075                        break;
2076        default:
2077                        ana_gain = 0;
2078                        adp = &adp_Qdefault[0];
2079                        break;
2080        }
2081
2082        for (i = 0; i < 4; i++)
2083                dib8000_write_word(state, 215 + i, adp[i]);
2084
2085        return ana_gain;
2086}
2087
2088static void dib8000_update_ana_gain(struct dib8000_state *state, u16 ana_gain)
2089{
2090        u16 i;
2091
2092        dib8000_write_word(state, 116, ana_gain);
2093
2094        /* update ADC target depending on ana_gain */
2095        if (ana_gain) { /* set -16dB ADC target for ana_gain=-1 */
2096                for (i = 0; i < 10; i++)
2097                        dib8000_write_word(state, 80 + i, adc_target_16dB[i]);
2098        } else { /* set -22dB ADC target for ana_gain=0 */
2099                for (i = 0; i < 10; i++)
2100                        dib8000_write_word(state, 80 + i, adc_target_16dB[i] - 355);
2101        }
2102}
2103
2104static void dib8000_load_ana_fe_coefs(struct dib8000_state *state, const s16 *ana_fe)
2105{
2106        u16 mode = 0;
2107
2108        if (state->isdbt_cfg_loaded == 0)
2109                for (mode = 0; mode < 24; mode++)
2110                        dib8000_write_word(state, 117 + mode, ana_fe[mode]);
2111}
2112
2113static const u16 lut_prbs_2k[14] = {
2114        0, 0x423, 0x009, 0x5C7, 0x7A6, 0x3D8, 0x527, 0x7FF, 0x79B, 0x3D6, 0x3A2, 0x53B, 0x2F4, 0x213
2115};
2116static const u16 lut_prbs_4k[14] = {
2117        0, 0x208, 0x0C3, 0x7B9, 0x423, 0x5C7, 0x3D8, 0x7FF, 0x3D6, 0x53B, 0x213, 0x029, 0x0D0, 0x48E
2118};
2119static const u16 lut_prbs_8k[14] = {
2120        0, 0x740, 0x069, 0x7DD, 0x208, 0x7B9, 0x5C7, 0x7FF, 0x53B, 0x029, 0x48E, 0x4C4, 0x367, 0x684
2121};
2122
2123static u16 dib8000_get_init_prbs(struct dib8000_state *state, u16 subchannel)
2124{
2125        int sub_channel_prbs_group = 0;
2126
2127        sub_channel_prbs_group = (subchannel / 3) + 1;
2128        dprintk("sub_channel_prbs_group = %d , subchannel =%d prbs = 0x%04x\n", sub_channel_prbs_group, subchannel, lut_prbs_8k[sub_channel_prbs_group]);
2129
2130        switch (state->fe[0]->dtv_property_cache.transmission_mode) {
2131        case TRANSMISSION_MODE_2K:
2132                        return lut_prbs_2k[sub_channel_prbs_group];
2133        case TRANSMISSION_MODE_4K:
2134                        return lut_prbs_4k[sub_channel_prbs_group];
2135        default:
2136        case TRANSMISSION_MODE_8K:
2137                        return lut_prbs_8k[sub_channel_prbs_group];
2138        }
2139}
2140
2141static void dib8000_set_13seg_channel(struct dib8000_state *state)
2142{
2143        u16 i;
2144        u16 coff_pow = 0x2800;
2145
2146        state->seg_mask = 0x1fff; /* All 13 segments enabled */
2147
2148        /* ---- COFF ---- Carloff, the most robust --- */
2149        if (state->isdbt_cfg_loaded == 0) {  /* if not Sound Broadcasting mode : put default values for 13 segments */
2150                dib8000_write_word(state, 180, (16 << 6) | 9);
2151                dib8000_write_word(state, 187, (4 << 12) | (8 << 5) | 0x2);
2152                coff_pow = 0x2800;
2153                for (i = 0; i < 6; i++)
2154                        dib8000_write_word(state, 181+i, coff_pow);
2155
2156                /* P_ctrl_corm_thres4pre_freq_inh=1, P_ctrl_pre_freq_mode_sat=1 */
2157                /* P_ctrl_pre_freq_mode_sat=1, P_ctrl_pre_freq_inh=0, P_ctrl_pre_freq_step = 3, P_pre_freq_win_len=1 */
2158                dib8000_write_word(state, 338, (1 << 12) | (1 << 10) | (0 << 9) | (3 << 5) | 1);
2159
2160                /* P_ctrl_pre_freq_win_len=8, P_ctrl_pre_freq_thres_lockin=6 */
2161                dib8000_write_word(state, 340, (8 << 6) | (6 << 0));
2162                /* P_ctrl_pre_freq_thres_lockout=4, P_small_use_tmcc/ac/cp=1 */
2163                dib8000_write_word(state, 341, (4 << 3) | (1 << 2) | (1 << 1) | (1 << 0));
2164
2165                dib8000_write_word(state, 228, 0);  /* default value */
2166                dib8000_write_word(state, 265, 31); /* default value */
2167                dib8000_write_word(state, 205, 0x200f); /* init value */
2168        }
2169
2170        /*
2171         * make the cpil_coff_lock more robust but slower p_coff_winlen
2172         * 6bits; p_coff_thres_lock 6bits (for coff lock if needed)
2173         */
2174
2175        if (state->cfg.pll->ifreq == 0)
2176                dib8000_write_word(state, 266, ~state->seg_mask | state->seg_diff_mask | 0x40); /* P_equal_noise_seg_inh */
2177
2178        dib8000_load_ana_fe_coefs(state, ana_fe_coeff_13seg);
2179}
2180
2181static void dib8000_set_subchannel_prbs(struct dib8000_state *state, u16 init_prbs)
2182{
2183        u16 reg_1;
2184
2185        reg_1 = dib8000_read_word(state, 1);
2186        dib8000_write_word(state, 1, (init_prbs << 2) | (reg_1 & 0x3)); /* ADDR 1 */
2187}
2188
2189static void dib8000_small_fine_tune(struct dib8000_state *state)
2190{
2191        u16 i;
2192        const s16 *ncoeff;
2193        struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2194
2195        dib8000_write_word(state, 352, state->seg_diff_mask);
2196        dib8000_write_word(state, 353, state->seg_mask);
2197
2198        /* P_small_coef_ext_enable=ISDB-Tsb, P_small_narrow_band=ISDB-Tsb, P_small_last_seg=13, P_small_offset_num_car=5 */
2199        dib8000_write_word(state, 351, (c->isdbt_sb_mode << 9) | (c->isdbt_sb_mode << 8) | (13 << 4) | 5);
2200
2201        if (c->isdbt_sb_mode) {
2202                /* ---- SMALL ---- */
2203                switch (c->transmission_mode) {
2204                case TRANSMISSION_MODE_2K:
2205                                if (c->isdbt_partial_reception == 0) { /* 1-seg */
2206                                        if (c->layer[0].modulation == DQPSK) /* DQPSK */
2207                                                ncoeff = coeff_2k_sb_1seg_dqpsk;
2208                                        else /* QPSK or QAM */
2209                                                ncoeff = coeff_2k_sb_1seg;
2210                                } else { /* 3-segments */
2211                                        if (c->layer[0].modulation == DQPSK) { /* DQPSK on central segment */
2212                                                if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
2213                                                        ncoeff = coeff_2k_sb_3seg_0dqpsk_1dqpsk;
2214                                                else /* QPSK or QAM on external segments */
2215                                                        ncoeff = coeff_2k_sb_3seg_0dqpsk;
2216                                        } else { /* QPSK or QAM on central segment */
2217                                                if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
2218                                                        ncoeff = coeff_2k_sb_3seg_1dqpsk;
2219                                                else /* QPSK or QAM on external segments */
2220                                                        ncoeff = coeff_2k_sb_3seg;
2221                                        }
2222                                }
2223                                break;
2224                case TRANSMISSION_MODE_4K:
2225                                if (c->isdbt_partial_reception == 0) { /* 1-seg */
2226                                        if (c->layer[0].modulation == DQPSK) /* DQPSK */
2227                                                ncoeff = coeff_4k_sb_1seg_dqpsk;
2228                                        else /* QPSK or QAM */
2229                                                ncoeff = coeff_4k_sb_1seg;
2230                                } else { /* 3-segments */
2231                                        if (c->layer[0].modulation == DQPSK) { /* DQPSK on central segment */
2232                                                if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
2233                                                        ncoeff = coeff_4k_sb_3seg_0dqpsk_1dqpsk;
2234                                                else /* QPSK or QAM on external segments */
2235                                                        ncoeff = coeff_4k_sb_3seg_0dqpsk;
2236                                        } else { /* QPSK or QAM on central segment */
2237                                                if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
2238                                                        ncoeff = coeff_4k_sb_3seg_1dqpsk;
2239                                                else /* QPSK or QAM on external segments */
2240                                                        ncoeff = coeff_4k_sb_3seg;
2241                                        }
2242                                }
2243                                break;
2244                case TRANSMISSION_MODE_AUTO:
2245                case TRANSMISSION_MODE_8K:
2246                default:
2247                                if (c->isdbt_partial_reception == 0) { /* 1-seg */
2248                                        if (c->layer[0].modulation == DQPSK) /* DQPSK */
2249                                                ncoeff = coeff_8k_sb_1seg_dqpsk;
2250                                        else /* QPSK or QAM */
2251                                                ncoeff = coeff_8k_sb_1seg;
2252                                } else { /* 3-segments */
2253                                        if (c->layer[0].modulation == DQPSK) { /* DQPSK on central segment */
2254                                                if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
2255                                                        ncoeff = coeff_8k_sb_3seg_0dqpsk_1dqpsk;
2256                                                else /* QPSK or QAM on external segments */
2257                                                        ncoeff = coeff_8k_sb_3seg_0dqpsk;
2258                                        } else { /* QPSK or QAM on central segment */
2259                                                if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
2260                                                        ncoeff = coeff_8k_sb_3seg_1dqpsk;
2261                                                else /* QPSK or QAM on external segments */
2262                                                        ncoeff = coeff_8k_sb_3seg;
2263                                        }
2264                                }
2265                                break;
2266                }
2267
2268                for (i = 0; i < 8; i++)
2269                        dib8000_write_word(state, 343 + i, ncoeff[i]);
2270        }
2271}
2272
2273static const u16 coff_thres_1seg[3] = {300, 150, 80};
2274static const u16 coff_thres_3seg[3] = {350, 300, 250};
2275static void dib8000_set_sb_channel(struct dib8000_state *state)
2276{
2277        struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2278        const u16 *coff;
2279        u16 i;
2280
2281        if (c->transmission_mode == TRANSMISSION_MODE_2K || c->transmission_mode == TRANSMISSION_MODE_4K) {
2282                dib8000_write_word(state, 219, dib8000_read_word(state, 219) | 0x1); /* adp_pass =1 */
2283                dib8000_write_word(state, 190, dib8000_read_word(state, 190) | (0x1 << 14)); /* pha3_force_pha_shift = 1 */
2284        } else {
2285                dib8000_write_word(state, 219, dib8000_read_word(state, 219) & 0xfffe); /* adp_pass =0 */
2286                dib8000_write_word(state, 190, dib8000_read_word(state, 190) & 0xbfff); /* pha3_force_pha_shift = 0 */
2287        }
2288
2289        if (c->isdbt_partial_reception == 1) /* 3-segments */
2290                state->seg_mask = 0x00E0;
2291        else /* 1-segment */
2292                state->seg_mask = 0x0040;
2293
2294        dib8000_write_word(state, 268, (dib8000_read_word(state, 268) & 0xF9FF) | 0x0200);
2295
2296        /* ---- COFF ---- Carloff, the most robust --- */
2297        /* P_coff_cpil_alpha=4, P_coff_inh=0, P_coff_cpil_winlen=64, P_coff_narrow_band=1, P_coff_square_val=1, P_coff_one_seg=~partial_rcpt, P_coff_use_tmcc=1, P_coff_use_ac=1 */
2298        dib8000_write_word(state, 187, (4 << 12) | (0 << 11) | (63 << 5) | (0x3 << 3) | ((~c->isdbt_partial_reception & 1) << 2) | 0x3);
2299
2300        dib8000_write_word(state, 340, (16 << 6) | (8 << 0)); /* P_ctrl_pre_freq_win_len=16, P_ctrl_pre_freq_thres_lockin=8 */
2301        dib8000_write_word(state, 341, (6 << 3) | (1 << 2) | (1 << 1) | (1 << 0));/* P_ctrl_pre_freq_thres_lockout=6, P_small_use_tmcc/ac/cp=1 */
2302
2303        /* Sound Broadcasting mode 1 seg */
2304        if (c->isdbt_partial_reception == 0) {
2305                /* P_coff_winlen=63, P_coff_thres_lock=15, P_coff_one_seg_width = (P_mode == 3) , P_coff_one_seg_sym = (P_mode-1) */
2306                if (state->mode == 3)
2307                        dib8000_write_word(state, 180, 0x1fcf | ((state->mode - 1) << 14));
2308                else
2309                        dib8000_write_word(state, 180, 0x0fcf | ((state->mode - 1) << 14));
2310
2311                /* P_ctrl_corm_thres4pre_freq_inh=1,P_ctrl_pre_freq_mode_sat=1, P_ctrl_pre_freq_inh=0, P_ctrl_pre_freq_step = 5, P_pre_freq_win_len=4 */
2312                dib8000_write_word(state, 338, (1 << 12) | (1 << 10) | (0 << 9) | (5 << 5) | 4);
2313                coff = &coff_thres_1seg[0];
2314        } else {   /* Sound Broadcasting mode 3 seg */
2315                dib8000_write_word(state, 180, 0x1fcf | (1 << 14));
2316                /* P_ctrl_corm_thres4pre_freq_inh = 1, P_ctrl_pre_freq_mode_sat=1, P_ctrl_pre_freq_inh=0, P_ctrl_pre_freq_step = 4, P_pre_freq_win_len=4 */
2317                dib8000_write_word(state, 338, (1 << 12) | (1 << 10) | (0 << 9) | (4 << 5) | 4);
2318                coff = &coff_thres_3seg[0];
2319        }
2320
2321        dib8000_write_word(state, 228, 1); /* P_2d_mode_byp=1 */
2322        dib8000_write_word(state, 205, dib8000_read_word(state, 205) & 0xfff0); /* P_cspu_win_cut = 0 */
2323
2324        if (c->isdbt_partial_reception == 0 && c->transmission_mode == TRANSMISSION_MODE_2K)
2325                dib8000_write_word(state, 265, 15); /* P_equal_noise_sel = 15 */
2326
2327        /* Write COFF thres */
2328        for (i = 0 ; i < 3; i++) {
2329                dib8000_write_word(state, 181+i, coff[i]);
2330                dib8000_write_word(state, 184+i, coff[i]);
2331        }
2332
2333        /*
2334         * make the cpil_coff_lock more robust but slower p_coff_winlen
2335         * 6bits; p_coff_thres_lock 6bits (for coff lock if needed)
2336         */
2337
2338        dib8000_write_word(state, 266, ~state->seg_mask | state->seg_diff_mask); /* P_equal_noise_seg_inh */
2339
2340        if (c->isdbt_partial_reception == 0)
2341                dib8000_write_word(state, 178, 64); /* P_fft_powrange = 64 */
2342        else
2343                dib8000_write_word(state, 178, 32); /* P_fft_powrange = 32 */
2344}
2345
2346static void dib8000_set_isdbt_common_channel(struct dib8000_state *state, u8 seq, u8 autosearching)
2347{
2348        u16 p_cfr_left_edge  = 0, p_cfr_right_edge = 0;
2349        u16 tmcc_pow = 0, ana_gain = 0, tmp = 0, i = 0, nbseg_diff = 0 ;
2350        u16 max_constellation = DQPSK;
2351        int init_prbs;
2352        struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2353
2354        if (autosearching)
2355                c->isdbt_partial_reception = 1;
2356
2357        /* P_mode */
2358        dib8000_write_word(state, 10, (seq << 4));
2359
2360        /* init mode */
2361        state->mode = fft_to_mode(state);
2362
2363        /* set guard */
2364        tmp = dib8000_read_word(state, 1);
2365        dib8000_write_word(state, 1, (tmp&0xfffc) | (c->guard_interval & 0x3));
2366
2367        dib8000_write_word(state, 274, (dib8000_read_word(state, 274) & 0xffcf) | ((c->isdbt_partial_reception & 1) << 5) | ((c->isdbt_sb_mode & 1) << 4));
2368
2369        /* signal optimization parameter */
2370        if (c->isdbt_partial_reception) {
2371                state->seg_diff_mask = (c->layer[0].modulation == DQPSK) << permu_seg[0];
2372                for (i = 1; i < 3; i++)
2373                        nbseg_diff += (c->layer[i].modulation == DQPSK) * c->layer[i].segment_count;
2374                for (i = 0; i < nbseg_diff; i++)
2375                        state->seg_diff_mask |= 1 << permu_seg[i+1];
2376        } else {
2377                for (i = 0; i < 3; i++)
2378                        nbseg_diff += (c->layer[i].modulation == DQPSK) * c->layer[i].segment_count;
2379                for (i = 0; i < nbseg_diff; i++)
2380                        state->seg_diff_mask |= 1 << permu_seg[i];
2381        }
2382
2383        if (state->seg_diff_mask)
2384                dib8000_write_word(state, 268, (dib8000_read_word(state, 268) & 0xF9FF) | 0x0200);
2385        else
2386                dib8000_write_word(state, 268, (2 << 9) | 39); /*init value */
2387
2388        for (i = 0; i < 3; i++)
2389                max_constellation = dib8000_set_layer(state, i, max_constellation);
2390        if (autosearching == 0) {
2391                state->layer_b_nb_seg = c->layer[1].segment_count;
2392                state->layer_c_nb_seg = c->layer[2].segment_count;
2393        }
2394
2395        /* WRITE: Mode & Diff mask */
2396        dib8000_write_word(state, 0, (state->mode << 13) | state->seg_diff_mask);
2397
2398        state->differential_constellation = (state->seg_diff_mask != 0);
2399
2400        /* channel estimation fine configuration */
2401        ana_gain = dib8000_adp_fine_tune(state, max_constellation);
2402
2403        /* update ana_gain depending on max constellation */
2404        dib8000_update_ana_gain(state, ana_gain);
2405
2406        /* ---- ANA_FE ---- */
2407        if (c->isdbt_partial_reception) /* 3-segments */
2408                dib8000_load_ana_fe_coefs(state, ana_fe_coeff_3seg);
2409        else
2410                dib8000_load_ana_fe_coefs(state, ana_fe_coeff_1seg); /* 1-segment */
2411
2412        /* TSB or ISDBT ? apply it now */
2413        if (c->isdbt_sb_mode) {
2414                dib8000_set_sb_channel(state);
2415                if (c->isdbt_sb_subchannel < 14)
2416                        init_prbs = dib8000_get_init_prbs(state, c->isdbt_sb_subchannel);
2417                else
2418                        init_prbs = 0;
2419        } else {
2420                dib8000_set_13seg_channel(state);
2421                init_prbs = 0xfff;
2422        }
2423
2424        /* SMALL */
2425        dib8000_small_fine_tune(state);
2426
2427        dib8000_set_subchannel_prbs(state, init_prbs);
2428
2429        /* ---- CHAN_BLK ---- */
2430        for (i = 0; i < 13; i++) {
2431                if ((((~state->seg_diff_mask) >> i) & 1) == 1) {
2432                        p_cfr_left_edge  += (1 << i) * ((i == 0) || ((((state->seg_mask & (~state->seg_diff_mask)) >> (i - 1)) & 1) == 0));
2433                        p_cfr_right_edge += (1 << i) * ((i == 12) || ((((state->seg_mask & (~state->seg_diff_mask)) >> (i + 1)) & 1) == 0));
2434                }
2435        }
2436        dib8000_write_word(state, 222, p_cfr_left_edge); /* p_cfr_left_edge */
2437        dib8000_write_word(state, 223, p_cfr_right_edge); /* p_cfr_right_edge */
2438        /* "P_cspu_left_edge" & "P_cspu_right_edge" not used => do not care */
2439
2440        dib8000_write_word(state, 189, ~state->seg_mask | state->seg_diff_mask); /* P_lmod4_seg_inh */
2441        dib8000_write_word(state, 192, ~state->seg_mask | state->seg_diff_mask); /* P_pha3_seg_inh */
2442        dib8000_write_word(state, 225, ~state->seg_mask | state->seg_diff_mask); /* P_tac_seg_inh */
2443
2444        if (!autosearching)
2445                dib8000_write_word(state, 288, (~state->seg_mask | state->seg_diff_mask) & 0x1fff); /* P_tmcc_seg_eq_inh */
2446        else
2447                dib8000_write_word(state, 288, 0x1fff); /*disable equalisation of the tmcc when autosearch to be able to find the DQPSK channels. */
2448
2449        dib8000_write_word(state, 211, state->seg_mask & (~state->seg_diff_mask)); /* P_des_seg_enabled */
2450        dib8000_write_word(state, 287, ~state->seg_mask | 0x1000); /* P_tmcc_seg_inh */
2451
2452        dib8000_write_word(state, 178, 32); /* P_fft_powrange = 32 */
2453
2454        /* ---- TMCC ---- */
2455        for (i = 0; i < 3; i++)
2456                tmcc_pow += (((c->layer[i].modulation == DQPSK) * 4 + 1) * c->layer[i].segment_count) ;
2457
2458        /* Quantif of "P_tmcc_dec_thres_?k" is (0, 5+mode, 9); */
2459        /* Threshold is set at 1/4 of max power. */
2460        tmcc_pow *= (1 << (9-2));
2461        dib8000_write_word(state, 290, tmcc_pow); /* P_tmcc_dec_thres_2k */
2462        dib8000_write_word(state, 291, tmcc_pow); /* P_tmcc_dec_thres_4k */
2463        dib8000_write_word(state, 292, tmcc_pow); /* P_tmcc_dec_thres_8k */
2464        /*dib8000_write_word(state, 287, (1 << 13) | 0x1000 ); */
2465
2466        /* ---- PHA3 ---- */
2467        if (state->isdbt_cfg_loaded == 0)
2468                dib8000_write_word(state, 250, 3285); /* p_2d_hspeed_thr0 */
2469
2470        state->isdbt_cfg_loaded = 0;
2471}
2472
2473static u32 dib8000_wait_lock(struct dib8000_state *state, u32 internal,
2474                             u32 wait0_ms, u32 wait1_ms, u32 wait2_ms)
2475{
2476        u32 value = 0;  /* P_search_end0 wait time */
2477        u16 reg = 11;   /* P_search_end0 start addr */
2478
2479        for (reg = 11; reg < 16; reg += 2) {
2480                if (reg == 11) {
2481                        if (state->revision == 0x8090)
2482                                value = internal * wait1_ms;
2483                        else
2484                                value = internal * wait0_ms;
2485                } else if (reg == 13)
2486                        value = internal * wait1_ms;
2487                else if (reg == 15)
2488                        value = internal * wait2_ms;
2489                dib8000_write_word(state, reg, (u16)((value >> 16) & 0xffff));
2490                dib8000_write_word(state, (reg + 1), (u16)(value & 0xffff));
2491        }
2492        return value;
2493}
2494
2495static int dib8000_autosearch_start(struct dvb_frontend *fe)
2496{
2497        struct dib8000_state *state = fe->demodulator_priv;
2498        struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2499        u8 slist = 0;
2500        u32 value, internal = state->cfg.pll->internal;
2501
2502        if (state->revision == 0x8090)
2503                internal = dib8000_read32(state, 23) / 1000;
2504
2505        if ((state->revision >= 0x8002) &&
2506            (state->autosearch_state == AS_SEARCHING_FFT)) {
2507                dib8000_write_word(state,  37, 0x0065); /* P_ctrl_pha_off_max default values */
2508                dib8000_write_word(state, 116, 0x0000); /* P_ana_gain to 0 */
2509
2510                dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x1fff) | (0 << 13) | (1 << 15)); /* P_mode = 0, P_restart_search=1 */
2511                dib8000_write_word(state, 1, (dib8000_read_word(state, 1) & 0xfffc) | 0); /* P_guard = 0 */
2512                dib8000_write_word(state, 6, 0); /* P_lock0_mask = 0 */
2513                dib8000_write_word(state, 7, 0); /* P_lock1_mask = 0 */
2514                dib8000_write_word(state, 8, 0); /* P_lock2_mask = 0 */
2515                dib8000_write_word(state, 10, (dib8000_read_word(state, 10) & 0x200) | (16 << 4) | (0 << 0)); /* P_search_list=16, P_search_maxtrial=0 */
2516
2517                if (state->revision == 0x8090)
2518                        value = dib8000_wait_lock(state, internal, 10, 10, 10); /* time in ms configure P_search_end0 P_search_end1 P_search_end2 */
2519                else
2520                        value = dib8000_wait_lock(state, internal, 20, 20, 20); /* time in ms configure P_search_end0 P_search_end1 P_search_end2 */
2521
2522                dib8000_write_word(state, 17, 0);
2523                dib8000_write_word(state, 18, 200); /* P_search_rstst = 200 */
2524                dib8000_write_word(state, 19, 0);
2525                dib8000_write_word(state, 20, 400); /* P_search_rstend = 400 */
2526                dib8000_write_word(state, 21, (value >> 16) & 0xffff); /* P_search_checkst */
2527                dib8000_write_word(state, 22, value & 0xffff);
2528
2529                if (state->revision == 0x8090)
2530                        dib8000_write_word(state, 32, (dib8000_read_word(state, 32) & 0xf0ff) | (0 << 8)); /* P_corm_alpha = 0 */
2531                else
2532                        dib8000_write_word(state, 32, (dib8000_read_word(state, 32) & 0xf0ff) | (9 << 8)); /* P_corm_alpha = 3 */
2533                dib8000_write_word(state, 355, 2); /* P_search_param_max = 2 */
2534
2535                /* P_search_param_select = (1 | 1<<4 | 1 << 8) */
2536                dib8000_write_word(state, 356, 0);
2537                dib8000_write_word(state, 357, 0x111);
2538
2539                dib8000_write_word(state, 770, (dib8000_read_word(state, 770) & 0xdfff) | (1 << 13)); /* P_restart_ccg = 1 */
2540                dib8000_write_word(state, 770, (dib8000_read_word(state, 770) & 0xdfff) | (0 << 13)); /* P_restart_ccg = 0 */
2541                dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x7ff) | (0 << 15) | (1 << 13)); /* P_restart_search = 0; */
2542        } else if ((state->revision >= 0x8002) &&
2543                   (state->autosearch_state == AS_SEARCHING_GUARD)) {
2544                c->transmission_mode = TRANSMISSION_MODE_8K;
2545                c->guard_interval = GUARD_INTERVAL_1_8;
2546                c->inversion = 0;
2547                c->layer[0].modulation = QAM_64;
2548                c->layer[0].fec = FEC_2_3;
2549                c->layer[0].interleaving = 0;
2550                c->layer[0].segment_count = 13;
2551
2552                slist = 16;
2553                c->transmission_mode = state->found_nfft;
2554
2555                dib8000_set_isdbt_common_channel(state, slist, 1);
2556
2557                /* set lock_mask values */
2558                dib8000_write_word(state, 6, 0x4);
2559                if (state->revision == 0x8090)
2560                        dib8000_write_word(state, 7, ((1 << 12) | (1 << 11) | (1 << 10)));/* tmcc_dec_lock, tmcc_sync_lock, tmcc_data_lock, tmcc_bch_uncor */
2561                else
2562                        dib8000_write_word(state, 7, 0x8);
2563                dib8000_write_word(state, 8, 0x1000);
2564
2565                /* set lock_mask wait time values */
2566                if (state->revision == 0x8090)
2567                        dib8000_wait_lock(state, internal, 50, 100, 1000); /* time in ms configure P_search_end0 P_search_end1 P_search_end2 */
2568                else
2569                        dib8000_wait_lock(state, internal, 50, 200, 1000); /* time in ms configure P_search_end0 P_search_end1 P_search_end2 */
2570
2571                dib8000_write_word(state, 355, 3); /* P_search_param_max = 3 */
2572
2573                /* P_search_param_select = 0xf; look for the 4 different guard intervals */
2574                dib8000_write_word(state, 356, 0);
2575                dib8000_write_word(state, 357, 0xf);
2576
2577                value = dib8000_read_word(state, 0);
2578                dib8000_write_word(state, 0, (u16)((1 << 15) | value));
2579                dib8000_read_word(state, 1284);  /* reset the INT. n_irq_pending */
2580                dib8000_write_word(state, 0, (u16)value);
2581        } else {
2582                c->inversion = 0;
2583                c->layer[0].modulation = QAM_64;
2584                c->layer[0].fec = FEC_2_3;
2585                c->layer[0].interleaving = 0;
2586                c->layer[0].segment_count = 13;
2587                if (!c->isdbt_sb_mode)
2588                        c->layer[0].segment_count = 13;
2589
2590                /* choose the right list, in sb, always do everything */
2591                if (c->isdbt_sb_mode) {
2592                        slist = 7;
2593                        dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x9fff) | (1 << 13));
2594                } else {
2595                        if (c->guard_interval == GUARD_INTERVAL_AUTO) {
2596                                if (c->transmission_mode == TRANSMISSION_MODE_AUTO) {
2597                                        c->transmission_mode = TRANSMISSION_MODE_8K;
2598                                        c->guard_interval = GUARD_INTERVAL_1_8;
2599                                        slist = 7;
2600                                        dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x9fff) | (1 << 13));  /* P_mode = 1 to have autosearch start ok with mode2 */
2601                                } else {
2602                                        c->guard_interval = GUARD_INTERVAL_1_8;
2603                                        slist = 3;
2604                                }
2605                        } else {
2606                                if (c->transmission_mode == TRANSMISSION_MODE_AUTO) {
2607                                        c->transmission_mode = TRANSMISSION_MODE_8K;
2608                                        slist = 2;
2609                                        dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x9fff) | (1 << 13));  /* P_mode = 1 */
2610                                } else
2611                                        slist = 0;
2612                        }
2613                }
2614                dprintk("Using list for autosearch : %d\n", slist);
2615
2616                dib8000_set_isdbt_common_channel(state, slist, 1);
2617
2618                /* set lock_mask values */
2619                dib8000_write_word(state, 6, 0x4);
2620                if (state->revision == 0x8090)
2621                        dib8000_write_word(state, 7, (1 << 12) | (1 << 11) | (1 << 10));
2622                else
2623                        dib8000_write_word(state, 7, 0x8);
2624                dib8000_write_word(state, 8, 0x1000);
2625
2626                /* set lock_mask wait time values */
2627                if (state->revision == 0x8090)
2628                        dib8000_wait_lock(state, internal, 50, 200, 1000); /* time in ms configure P_search_end0 P_search_end1 P_search_end2 */
2629                else
2630                        dib8000_wait_lock(state, internal, 50, 100, 1000); /* time in ms configure P_search_end0 P_search_end1 P_search_end2 */
2631
2632                value = dib8000_read_word(state, 0);
2633                dib8000_write_word(state, 0, (u16)((1 << 15) | value));
2634                dib8000_read_word(state, 1284);  /* reset the INT. n_irq_pending */
2635                dib8000_write_word(state, 0, (u16)value);
2636        }
2637        return 0;
2638}
2639
2640static int dib8000_autosearch_irq(struct dvb_frontend *fe)
2641{
2642        struct dib8000_state *state = fe->demodulator_priv;
2643        u16 irq_pending = dib8000_read_word(state, 1284);
2644
2645        if ((state->revision >= 0x8002) &&
2646            (state->autosearch_state == AS_SEARCHING_FFT)) {
2647                if (irq_pending & 0x1) {
2648                        dprintk("dib8000_autosearch_irq: max correlation result available\n");
2649                        return 3;
2650                }
2651        } else {
2652                if (irq_pending & 0x1) {        /* failed */
2653                        dprintk("dib8000_autosearch_irq failed\n");
2654                        return 1;
2655                }
2656
2657                if (irq_pending & 0x2) {        /* succeeded */
2658                        dprintk("dib8000_autosearch_irq succeeded\n");
2659                        return 2;
2660                }
2661        }
2662
2663        return 0;               // still pending
2664}
2665
2666static void dib8000_viterbi_state(struct dib8000_state *state, u8 onoff)
2667{
2668        u16 tmp;
2669
2670        tmp = dib8000_read_word(state, 771);
2671        if (onoff) /* start P_restart_chd : channel_decoder */
2672                dib8000_write_word(state, 771, tmp & 0xfffd);
2673        else /* stop P_restart_chd : channel_decoder */
2674                dib8000_write_word(state, 771, tmp | (1<<1));
2675}
2676
2677static void dib8000_set_dds(struct dib8000_state *state, s32 offset_khz)
2678{
2679        s16 unit_khz_dds_val;
2680        u32 abs_offset_khz = abs(offset_khz);
2681        u32 dds = state->cfg.pll->ifreq & 0x1ffffff;
2682        u8 invert = !!(state->cfg.pll->ifreq & (1 << 25));
2683        u8 ratio;
2684
2685        if (state->revision == 0x8090) {
2686                ratio = 4;
2687                unit_khz_dds_val = (1<<26) / (dib8000_read32(state, 23) / 1000);
2688                if (offset_khz < 0)
2689                        dds = (1 << 26) - (abs_offset_khz * unit_khz_dds_val);
2690                else
2691                        dds = (abs_offset_khz * unit_khz_dds_val);
2692
2693                if (invert)
2694                        dds = (1<<26) - dds;
2695        } else {
2696                ratio = 2;
2697                unit_khz_dds_val = (u16) (67108864 / state->cfg.pll->internal);
2698
2699                if (offset_khz < 0)
2700                        unit_khz_dds_val *= -1;
2701
2702                /* IF tuner */
2703                if (invert)
2704                        dds -= abs_offset_khz * unit_khz_dds_val;
2705                else
2706                        dds += abs_offset_khz * unit_khz_dds_val;
2707        }
2708
2709        dprintk("setting a DDS frequency offset of %c%dkHz\n", invert ? '-' : ' ', dds / unit_khz_dds_val);
2710
2711        if (abs_offset_khz <= (state->cfg.pll->internal / ratio)) {
2712                /* Max dds offset is the half of the demod freq */
2713                dib8000_write_word(state, 26, invert);
2714                dib8000_write_word(state, 27, (u16)(dds >> 16) & 0x1ff);
2715                dib8000_write_word(state, 28, (u16)(dds & 0xffff));
2716        }
2717}
2718
2719static void dib8000_set_frequency_offset(struct dib8000_state *state)
2720{
2721        struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2722        int i;
2723        u32 current_rf;
2724        int total_dds_offset_khz;
2725
2726        if (state->fe[0]->ops.tuner_ops.get_frequency)
2727                state->fe[0]->ops.tuner_ops.get_frequency(state->fe[0], &current_rf);
2728        else
2729                current_rf = c->frequency;
2730        current_rf /= 1000;
2731        total_dds_offset_khz = (int)current_rf - (int)c->frequency / 1000;
2732
2733        if (c->isdbt_sb_mode) {
2734                state->subchannel = c->isdbt_sb_subchannel;
2735
2736                i = dib8000_read_word(state, 26) & 1; /* P_dds_invspec */
2737                dib8000_write_word(state, 26, c->inversion ^ i);
2738
2739                if (state->cfg.pll->ifreq == 0) { /* low if tuner */
2740                        if ((c->inversion ^ i) == 0)
2741                                dib8000_write_word(state, 26, dib8000_read_word(state, 26) | 1);
2742                } else {
2743                        if ((c->inversion ^ i) == 0)
2744                                total_dds_offset_khz *= -1;
2745                }
2746        }
2747
2748        dprintk("%dkhz tuner offset (frequency = %dHz & current_rf = %dHz) total_dds_offset_hz = %d\n", c->frequency - current_rf, c->frequency, current_rf, total_dds_offset_khz);
2749
2750        /* apply dds offset now */
2751        dib8000_set_dds(state, total_dds_offset_khz);
2752}
2753
2754static u16 LUT_isdbt_symbol_duration[4] = { 26, 101, 63 };
2755
2756static u32 dib8000_get_symbol_duration(struct dib8000_state *state)
2757{
2758        struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2759        u16 i;
2760
2761        switch (c->transmission_mode) {
2762        case TRANSMISSION_MODE_2K:
2763                        i = 0;
2764                        break;
2765        case TRANSMISSION_MODE_4K:
2766                        i = 2;
2767                        break;
2768        default:
2769        case TRANSMISSION_MODE_AUTO:
2770        case TRANSMISSION_MODE_8K:
2771                        i = 1;
2772                        break;
2773        }
2774
2775        return (LUT_isdbt_symbol_duration[i] / (c->bandwidth_hz / 1000)) + 1;
2776}
2777
2778static void dib8000_set_isdbt_loop_params(struct dib8000_state *state, enum param_loop_step loop_step)
2779{
2780        struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2781        u16 reg_32 = 0, reg_37 = 0;
2782
2783        switch (loop_step) {
2784        case LOOP_TUNE_1:
2785                        if (c->isdbt_sb_mode)  {
2786                                if (c->isdbt_partial_reception == 0) {
2787                                        reg_32 = ((11 - state->mode) << 12) | (6 << 8) | 0x40; /* P_timf_alpha = (11-P_mode), P_corm_alpha=6, P_corm_thres=0x40 */
2788                                        reg_37 = (3 << 5) | (0 << 4) | (10 - state->mode); /* P_ctrl_pha_off_max=3   P_ctrl_sfreq_inh =0  P_ctrl_sfreq_step = (10-P_mode)  */
2789                                } else { /* Sound Broadcasting mode 3 seg */
2790                                        reg_32 = ((10 - state->mode) << 12) | (6 << 8) | 0x60; /* P_timf_alpha = (10-P_mode), P_corm_alpha=6, P_corm_thres=0x60 */
2791                                        reg_37 = (3 << 5) | (0 << 4) | (9 - state->mode); /* P_ctrl_pha_off_max=3   P_ctrl_sfreq_inh =0  P_ctrl_sfreq_step = (9-P_mode)  */
2792                                }
2793                        } else { /* 13-seg start conf offset loop parameters */
2794                                reg_32 = ((9 - state->mode) << 12) | (6 << 8) | 0x80; /* P_timf_alpha = (9-P_mode, P_corm_alpha=6, P_corm_thres=0x80 */
2795                                reg_37 = (3 << 5) | (0 << 4) | (8 - state->mode); /* P_ctrl_pha_off_max=3   P_ctrl_sfreq_inh =0  P_ctrl_sfreq_step = 9  */
2796                        }
2797                        break;
2798        case LOOP_TUNE_2:
2799                        if (c->isdbt_sb_mode)  {
2800                                if (c->isdbt_partial_reception == 0) {  /* Sound Broadcasting mode 1 seg */
2801                                        reg_32 = ((13-state->mode) << 12) | (6 << 8) | 0x40; /* P_timf_alpha = (13-P_mode) , P_corm_alpha=6, P_corm_thres=0x40*/
2802                                        reg_37 = (12-state->mode) | ((5 + state->mode) << 5);
2803                                } else {  /* Sound Broadcasting mode 3 seg */
2804                                        reg_32 = ((12-state->mode) << 12) | (6 << 8) | 0x60; /* P_timf_alpha = (12-P_mode) , P_corm_alpha=6, P_corm_thres=0x60 */
2805                                        reg_37 = (11-state->mode) | ((5 + state->mode) << 5);
2806                                }
2807                        } else {  /* 13 seg */
2808                                reg_32 = ((11-state->mode) << 12) | (6 << 8) | 0x80; /* P_timf_alpha = 8 , P_corm_alpha=6, P_corm_thres=0x80 */
2809                                reg_37 = ((5+state->mode) << 5) | (10 - state->mode);
2810                        }
2811                        break;
2812        }
2813        dib8000_write_word(state, 32, reg_32);
2814        dib8000_write_word(state, 37, reg_37);
2815}
2816
2817static void dib8000_demod_restart(struct dib8000_state *state)
2818{
2819        dib8000_write_word(state, 770, 0x4000);
2820        dib8000_write_word(state, 770, 0x0000);
2821        return;
2822}
2823
2824static void dib8000_set_sync_wait(struct dib8000_state *state)
2825{
2826        struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2827        u16 sync_wait = 64;
2828
2829        /* P_dvsy_sync_wait - reuse mode */
2830        switch (c->transmission_mode) {
2831        case TRANSMISSION_MODE_8K:
2832                        sync_wait = 256;
2833                        break;
2834        case TRANSMISSION_MODE_4K:
2835                        sync_wait = 128;
2836                        break;
2837        default:
2838        case TRANSMISSION_MODE_2K:
2839                        sync_wait =  64;
2840                        break;
2841        }
2842
2843        if (state->cfg.diversity_delay == 0)
2844                sync_wait = (sync_wait * (1 << (c->guard_interval)) * 3) / 2 + 48; /* add 50% SFN margin + compensate for one DVSY-fifo */
2845        else
2846                sync_wait = (sync_wait * (1 << (c->guard_interval)) * 3) / 2 + state->cfg.diversity_delay; /* add 50% SFN margin + compensate for DVSY-fifo */
2847
2848        dib8000_write_word(state, 273, (dib8000_read_word(state, 273) & 0x000f) | (sync_wait << 4));
2849}
2850
2851static unsigned long dib8000_get_timeout(struct dib8000_state *state, u32 delay, enum timeout_mode mode)
2852{
2853        if (mode == SYMBOL_DEPENDENT_ON)
2854                delay *= state->symbol_duration;
2855
2856        return jiffies + usecs_to_jiffies(delay * 100);
2857}
2858
2859static s32 dib8000_get_status(struct dvb_frontend *fe)
2860{
2861        struct dib8000_state *state = fe->demodulator_priv;
2862        return state->status;
2863}
2864
2865static enum frontend_tune_state dib8000_get_tune_state(struct dvb_frontend *fe)
2866{
2867        struct dib8000_state *state = fe->demodulator_priv;
2868        return state->tune_state;
2869}
2870
2871static int dib8000_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state)
2872{
2873        struct dib8000_state *state = fe->demodulator_priv;
2874
2875        state->tune_state = tune_state;
2876        return 0;
2877}
2878
2879static int dib8000_tune_restart_from_demod(struct dvb_frontend *fe)
2880{
2881        struct dib8000_state *state = fe->demodulator_priv;
2882
2883        state->status = FE_STATUS_TUNE_PENDING;
2884        state->tune_state = CT_DEMOD_START;
2885        return 0;
2886}
2887
2888static u16 dib8000_read_lock(struct dvb_frontend *fe)
2889{
2890        struct dib8000_state *state = fe->demodulator_priv;
2891
2892        if (state->revision == 0x8090)
2893                return dib8000_read_word(state, 570);
2894        return dib8000_read_word(state, 568);
2895}
2896
2897static int dib8090p_init_sdram(struct dib8000_state *state)
2898{
2899        u16 reg = 0;
2900        dprintk("init sdram\n");
2901
2902        reg = dib8000_read_word(state, 274) & 0xfff0;
2903        dib8000_write_word(state, 274, reg | 0x7); /* P_dintlv_delay_ram = 7 because of MobileSdram */
2904
2905        dib8000_write_word(state, 1803, (7 << 2));
2906
2907        reg = dib8000_read_word(state, 1280);
2908        dib8000_write_word(state, 1280,  reg | (1 << 2)); /* force restart P_restart_sdram */
2909        dib8000_write_word(state, 1280,  reg); /* release restart P_restart_sdram */
2910
2911        return 0;
2912}
2913
2914/**
2915 * is_manual_mode - Check if TMCC should be used for parameters settings
2916 * @c:  struct dvb_frontend_properties
2917 *
2918 * By default, TMCC table should be used for parameter settings on most
2919 * usercases. However, sometimes it is desirable to lock the demod to
2920 * use the manual parameters.
2921 *
2922 * On manual mode, the current dib8000_tune state machine is very restrict:
2923 * It requires that both per-layer and per-transponder parameters to be
2924 * properly specified, otherwise the device won't lock.
2925 *
2926 * Check if all those conditions are properly satisfied before allowing
2927 * the device to use the manual frequency lock mode.
2928 */
2929static int is_manual_mode(struct dtv_frontend_properties *c)
2930{
2931        int i, n_segs = 0;
2932
2933        /* Use auto mode on DVB-T compat mode */
2934        if (c->delivery_system != SYS_ISDBT)
2935                return 0;
2936
2937        /*
2938         * Transmission mode is only detected on auto mode, currently
2939         */
2940        if (c->transmission_mode == TRANSMISSION_MODE_AUTO) {
2941                dprintk("transmission mode auto\n");
2942                return 0;
2943        }
2944
2945        /*
2946         * Guard interval is only detected on auto mode, currently
2947         */
2948        if (c->guard_interval == GUARD_INTERVAL_AUTO) {
2949                dprintk("guard interval auto\n");
2950                return 0;
2951        }
2952
2953        /*
2954         * If no layer is enabled, assume auto mode, as at least one
2955         * layer should be enabled
2956         */
2957        if (!c->isdbt_layer_enabled) {
2958                dprintk("no layer modulation specified\n");
2959                return 0;
2960        }
2961
2962        /*
2963         * Check if the per-layer parameters aren't auto and
2964         * disable a layer if segment count is 0 or invalid.
2965         */
2966        for (i = 0; i < 3; i++) {
2967                if (!(c->isdbt_layer_enabled & 1 << i))
2968                        continue;
2969
2970                if ((c->layer[i].segment_count > 13) ||
2971                    (c->layer[i].segment_count == 0)) {
2972                        c->isdbt_layer_enabled &= ~(1 << i);
2973                        continue;
2974                }
2975
2976                n_segs += c->layer[i].segment_count;
2977
2978                if ((c->layer[i].modulation == QAM_AUTO) ||
2979                    (c->layer[i].fec == FEC_AUTO)) {
2980                        dprintk("layer %c has either modulation or FEC auto\n",
2981                                'A' + i);
2982                        return 0;
2983                }
2984        }
2985
2986        /*
2987         * Userspace specified a wrong number of segments.
2988         *      fallback to auto mode.
2989         */
2990        if (n_segs == 0 || n_segs > 13) {
2991                dprintk("number of segments is invalid\n");
2992                return 0;
2993        }
2994
2995        /* Everything looks ok for manual mode */
2996        return 1;
2997}
2998
2999static int dib8000_tune(struct dvb_frontend *fe)
3000{
3001        struct dib8000_state *state = fe->demodulator_priv;
3002        struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
3003        enum frontend_tune_state *tune_state = &state->tune_state;
3004
3005        u16 locks, deeper_interleaver = 0, i;
3006        int ret = 1; /* 1 symbol duration (in 100us unit) delay most of the time */
3007
3008        unsigned long *timeout = &state->timeout;
3009        unsigned long now = jiffies;
3010#ifdef DIB8000_AGC_FREEZE
3011        u16 agc1, agc2;
3012#endif
3013
3014        u32 corm[4] = {0, 0, 0, 0};
3015        u8 find_index, max_value;
3016
3017#if 0
3018        if (*tune_state < CT_DEMOD_STOP)
3019                dprintk("IN: context status = %d, TUNE_STATE %d autosearch step = %u jiffies = %lu\n",
3020                        state->channel_parameters_set, *tune_state, state->autosearch_state, now);
3021#endif
3022
3023        switch (*tune_state) {
3024        case CT_DEMOD_START: /* 30 */
3025                dib8000_reset_stats(fe);
3026
3027                if (state->revision == 0x8090)
3028                        dib8090p_init_sdram(state);
3029                state->status = FE_STATUS_TUNE_PENDING;
3030                state->channel_parameters_set = is_manual_mode(c);
3031
3032                dprintk("Tuning channel on %s search mode\n",
3033                        state->channel_parameters_set ? "manual" : "auto");
3034
3035                dib8000_viterbi_state(state, 0); /* force chan dec in restart */
3036
3037                /* Layer monitor */
3038                dib8000_write_word(state, 285, dib8000_read_word(state, 285) & 0x60);
3039
3040                dib8000_set_frequency_offset(state);
3041                dib8000_set_bandwidth(fe, c->bandwidth_hz / 1000);
3042
3043                if (state->channel_parameters_set == 0) { /* The channel struct is unknown, search it ! */
3044#ifdef DIB8000_AGC_FREEZE
3045                        if (state->revision != 0x8090) {
3046                                state->agc1_max = dib8000_read_word(state, 108);
3047                                state->agc1_min = dib8000_read_word(state, 109);
3048                                state->agc2_max = dib8000_read_word(state, 110);
3049                                state->agc2_min = dib8000_read_word(state, 111);
3050                                agc1 = dib8000_read_word(state, 388);
3051                                agc2 = dib8000_read_word(state, 389);
3052                                dib8000_write_word(state, 108, agc1);
3053                                dib8000_write_word(state, 109, agc1);
3054                                dib8000_write_word(state, 110, agc2);
3055                                dib8000_write_word(state, 111, agc2);
3056                        }
3057#endif
3058                        state->autosearch_state = AS_SEARCHING_FFT;
3059                        state->found_nfft = TRANSMISSION_MODE_AUTO;
3060                        state->found_guard = GUARD_INTERVAL_AUTO;
3061                        *tune_state = CT_DEMOD_SEARCH_NEXT;
3062                } else { /* we already know the channel struct so TUNE only ! */
3063                        state->autosearch_state = AS_DONE;
3064                        *tune_state = CT_DEMOD_STEP_3;
3065                }
3066                state->symbol_duration = dib8000_get_symbol_duration(state);
3067                break;
3068
3069        case CT_DEMOD_SEARCH_NEXT: /* 51 */
3070                dib8000_autosearch_start(fe);
3071                if (state->revision == 0x8090)
3072                        ret = 50;
3073                else
3074                        ret = 15;
3075                *tune_state = CT_DEMOD_STEP_1;
3076                break;
3077
3078        case CT_DEMOD_STEP_1: /* 31 */
3079                switch (dib8000_autosearch_irq(fe)) {
3080                case 1: /* fail */
3081                        state->status = FE_STATUS_TUNE_FAILED;
3082                        state->autosearch_state = AS_DONE;
3083                        *tune_state = CT_DEMOD_STOP; /* else we are done here */
3084                        break;
3085                case 2: /* Succes */
3086                        state->status = FE_STATUS_FFT_SUCCESS; /* signal to the upper layer, that there was a channel found and the parameters can be read */
3087                        *tune_state = CT_DEMOD_STEP_3;
3088                        if (state->autosearch_state == AS_SEARCHING_GUARD)
3089                                *tune_state = CT_DEMOD_STEP_2;
3090                        else
3091                                state->autosearch_state = AS_DONE;
3092                        break;
3093                case 3: /* Autosearch FFT max correlation endded */
3094                        *tune_state = CT_DEMOD_STEP_2;
3095                        break;
3096                }
3097                break;
3098
3099        case CT_DEMOD_STEP_2:
3100                switch (state->autosearch_state) {
3101                case AS_SEARCHING_FFT:
3102                        /* searching for the correct FFT */
3103                        if (state->revision == 0x8090) {
3104                                corm[2] = (dib8000_read_word(state, 596) << 16) | (dib8000_read_word(state, 597));
3105                                corm[1] = (dib8000_read_word(state, 598) << 16) | (dib8000_read_word(state, 599));
3106                                corm[0] = (dib8000_read_word(state, 600) << 16) | (dib8000_read_word(state, 601));
3107                        } else {
3108                                corm[2] = (dib8000_read_word(state, 594) << 16) | (dib8000_read_word(state, 595));
3109                                corm[1] = (dib8000_read_word(state, 596) << 16) | (dib8000_read_word(state, 597));
3110                                corm[0] = (dib8000_read_word(state, 598) << 16) | (dib8000_read_word(state, 599));
3111                        }
3112                        /* dprintk("corm fft: %u %u %u\n", corm[0], corm[1], corm[2]); */
3113
3114                        max_value = 0;
3115                        for (find_index = 1 ; find_index < 3 ; find_index++) {
3116                                if (corm[max_value] < corm[find_index])
3117                                        max_value = find_index ;
3118                        }
3119
3120                        switch (max_value) {
3121                        case 0:
3122                                state->found_nfft = TRANSMISSION_MODE_2K;
3123                                break;
3124                        case 1:
3125                                state->found_nfft = TRANSMISSION_MODE_4K;
3126                                break;
3127                        case 2:
3128                        default:
3129                                state->found_nfft = TRANSMISSION_MODE_8K;
3130                                break;
3131                        }
3132                        /* dprintk("Autosearch FFT has found Mode %d\n", max_value + 1); */
3133
3134                        *tune_state = CT_DEMOD_SEARCH_NEXT;
3135                        state->autosearch_state = AS_SEARCHING_GUARD;
3136                        if (state->revision == 0x8090)
3137                                ret = 50;
3138                        else
3139                                ret = 10;
3140                        break;
3141                case AS_SEARCHING_GUARD:
3142                        /* searching for the correct guard interval */
3143                        if (state->revision == 0x8090)
3144                                state->found_guard = dib8000_read_word(state, 572) & 0x3;
3145                        else
3146                                state->found_guard = dib8000_read_word(state, 570) & 0x3;
3147                        /* dprintk("guard interval found=%i\n", state->found_guard); */
3148
3149                        *tune_state = CT_DEMOD_STEP_3;
3150                        break;
3151                default:
3152                        /* the demod should never be in this state */
3153                        state->status = FE_STATUS_TUNE_FAILED;
3154                        state->autosearch_state = AS_DONE;
3155                        *tune_state = CT_DEMOD_STOP; /* else we are done here */
3156                        break;
3157                }
3158                break;
3159
3160        case CT_DEMOD_STEP_3: /* 33 */
3161                dib8000_set_isdbt_loop_params(state, LOOP_TUNE_1);
3162                dib8000_set_isdbt_common_channel(state, 0, 0);/* setting the known channel parameters here */
3163                *tune_state = CT_DEMOD_STEP_4;
3164                break;
3165
3166        case CT_DEMOD_STEP_4: /* (34) */
3167                dib8000_demod_restart(state);
3168
3169                dib8000_set_sync_wait(state);
3170                dib8000_set_diversity_in(state->fe[0], state->diversity_onoff);
3171
3172                locks = (dib8000_read_word(state, 180) >> 6) & 0x3f; /* P_coff_winlen ? */
3173                /* coff should lock over P_coff_winlen ofdm symbols : give 3 times this length to lock */
3174                *timeout = dib8000_get_timeout(state, 2 * locks, SYMBOL_DEPENDENT_ON);
3175                *tune_state = CT_DEMOD_STEP_5;
3176                break;
3177
3178        case CT_DEMOD_STEP_5: /* (35) */
3179                locks = dib8000_read_lock(fe);
3180                if (locks & (0x3 << 11)) { /* coff-lock and off_cpil_lock achieved */
3181                        dib8000_update_timf(state); /* we achieved a coff_cpil_lock - it's time to update the timf */
3182                        if (!state->differential_constellation) {
3183                                /* 2 times lmod4_win_len + 10 symbols (pipe delay after coff + nb to compute a 1st correlation) */
3184                                *timeout = dib8000_get_timeout(state, (20 * ((dib8000_read_word(state, 188)>>5)&0x1f)), SYMBOL_DEPENDENT_ON);
3185                                *tune_state = CT_DEMOD_STEP_7;
3186                        } else {
3187                                *tune_state = CT_DEMOD_STEP_8;
3188                        }
3189                } else if (time_after(now, *timeout)) {
3190                        *tune_state = CT_DEMOD_STEP_6; /* goto check for diversity input connection */
3191                }
3192                break;
3193
3194        case CT_DEMOD_STEP_6: /* (36)  if there is an input (diversity) */
3195                if ((state->fe[1] != NULL) && (state->output_mode != OUTMODE_DIVERSITY)) {
3196                        /* if there is a diversity fe in input and this fe is has not already failled : wait here until this this fe has succedeed or failled */
3197                        if (dib8000_get_status(state->fe[1]) <= FE_STATUS_STD_SUCCESS) /* Something is locked on the input fe */
3198                                *tune_state = CT_DEMOD_STEP_8; /* go for mpeg */
3199                        else if (dib8000_get_status(state->fe[1]) >= FE_STATUS_TUNE_TIME_TOO_SHORT) { /* fe in input failled also, break the current one */
3200                                *tune_state = CT_DEMOD_STOP; /* else we are done here ; step 8 will close the loops and exit */
3201                                dib8000_viterbi_state(state, 1); /* start viterbi chandec */
3202                                dib8000_set_isdbt_loop_params(state, LOOP_TUNE_2);
3203                                state->status = FE_STATUS_TUNE_FAILED;
3204                        }
3205                } else {
3206                        dib8000_viterbi_state(state, 1); /* start viterbi chandec */
3207                        dib8000_set_isdbt_loop_params(state, LOOP_TUNE_2);
3208                        *tune_state = CT_DEMOD_STOP; /* else we are done here ; step 8 will close the loops and exit */
3209                        state->status = FE_STATUS_TUNE_FAILED;
3210                }
3211                break;
3212
3213        case CT_DEMOD_STEP_7: /* 37 */
3214                locks = dib8000_read_lock(fe);
3215                if (locks & (1<<10)) { /* lmod4_lock */
3216                        ret = 14; /* wait for 14 symbols */
3217                        *tune_state = CT_DEMOD_STEP_8;
3218                } else if (time_after(now, *timeout))
3219                        *tune_state = CT_DEMOD_STEP_6; /* goto check for diversity input connection */
3220                break;
3221
3222        case CT_DEMOD_STEP_8: /* 38 */
3223                dib8000_viterbi_state(state, 1); /* start viterbi chandec */
3224                dib8000_set_isdbt_loop_params(state, LOOP_TUNE_2);
3225
3226                /* mpeg will never lock on this condition because init_prbs is not set : search for it !*/
3227                if (c->isdbt_sb_mode
3228                    && c->isdbt_sb_subchannel < 14
3229                    && !state->differential_constellation) {
3230                        state->subchannel = 0;
3231                        *tune_state = CT_DEMOD_STEP_11;
3232                } else {
3233                        *tune_state = CT_DEMOD_STEP_9;
3234                        state->status = FE_STATUS_LOCKED;
3235                }
3236                break;
3237
3238        case CT_DEMOD_STEP_9: /* 39 */
3239                if ((state->revision == 0x8090) || ((dib8000_read_word(state, 1291) >> 9) & 0x1)) { /* fe capable of deinterleaving : esram */
3240                        /* defines timeout for mpeg lock depending on interleaver length of longest layer */
3241                        for (i = 0; i < 3; i++) {
3242                                if (c->layer[i].interleaving >= deeper_interleaver) {
3243                                        dprintk("layer%i: time interleaver = %d\n", i, c->layer[i].interleaving);
3244                                        if (c->layer[i].segment_count > 0) { /* valid layer */
3245                                                deeper_interleaver = c->layer[0].interleaving;
3246                                                state->longest_intlv_layer = i;
3247                                        }
3248                                }
3249                        }
3250
3251                        if (deeper_interleaver == 0)
3252                                locks = 2; /* locks is the tmp local variable name */
3253                        else if (deeper_interleaver == 3)
3254                                locks = 8;
3255                        else
3256                                locks = 2 * deeper_interleaver;
3257
3258                        if (state->diversity_onoff != 0) /* because of diversity sync */
3259                                locks *= 2;
3260
3261                        *timeout = now + msecs_to_jiffies(200 * locks); /* give the mpeg lock 800ms if sram is present */
3262                        dprintk("Deeper interleaver mode = %d on layer %d : timeout mult factor = %d => will use timeout = %ld\n",
3263                                deeper_interleaver, state->longest_intlv_layer, locks, *timeout);
3264
3265                        *tune_state = CT_DEMOD_STEP_10;
3266                } else
3267                        *tune_state = CT_DEMOD_STOP;
3268                break;
3269
3270        case CT_DEMOD_STEP_10: /* 40 */
3271                locks = dib8000_read_lock(fe);
3272                if (locks&(1<<(7-state->longest_intlv_layer))) { /* mpeg lock : check the longest one */
3273                        dprintk("ISDB-T layer locks: Layer A %s, Layer B %s, Layer C %s\n",
3274                                c->layer[0].segment_count ? (locks >> 7) & 0x1 ? "locked" : "NOT LOCKED" : "not enabled",
3275                                c->layer[1].segment_count ? (locks >> 6) & 0x1 ? "locked" : "NOT LOCKED" : "not enabled",
3276                                c->layer[2].segment_count ? (locks >> 5) & 0x1 ? "locked" : "NOT LOCKED" : "not enabled");
3277                        if (c->isdbt_sb_mode
3278                            && c->isdbt_sb_subchannel < 14
3279                            && !state->differential_constellation)
3280                                /* signal to the upper layer, that there was a channel found and the parameters can be read */
3281                                state->status = FE_STATUS_DEMOD_SUCCESS;
3282                        else
3283                                state->status = FE_STATUS_DATA_LOCKED;
3284                        *tune_state = CT_DEMOD_STOP;
3285                } else if (time_after(now, *timeout)) {
3286                        if (c->isdbt_sb_mode
3287                            && c->isdbt_sb_subchannel < 14
3288                            && !state->differential_constellation) { /* continue to try init prbs autosearch */
3289                                state->subchannel += 3;
3290                                *tune_state = CT_DEMOD_STEP_11;
3291                        } else { /* we are done mpeg of the longest interleaver xas not locking but let's try if an other layer has locked in the same time */
3292                                if (locks & (0x7 << 5)) {
3293                                        dprintk("Not all ISDB-T layers locked in %d ms: Layer A %s, Layer B %s, Layer C %s\n",
3294                                                jiffies_to_msecs(now - *timeout),
3295                                                c->layer[0].segment_count ? (locks >> 7) & 0x1 ? "locked" : "NOT LOCKED" : "not enabled",
3296                                                c->layer[1].segment_count ? (locks >> 6) & 0x1 ? "locked" : "NOT LOCKED" : "not enabled",
3297                                                c->layer[2].segment_count ? (locks >> 5) & 0x1 ? "locked" : "NOT LOCKED" : "not enabled");
3298
3299                                        state->status = FE_STATUS_DATA_LOCKED;
3300                                } else
3301                                        state->status = FE_STATUS_TUNE_FAILED;
3302                                *tune_state = CT_DEMOD_STOP;
3303                        }
3304                }
3305                break;
3306
3307        case CT_DEMOD_STEP_11:  /* 41 : init prbs autosearch */
3308                if (state->subchannel <= 41) {
3309                        dib8000_set_subchannel_prbs(state, dib8000_get_init_prbs(state, state->subchannel));
3310                        *tune_state = CT_DEMOD_STEP_9;
3311                } else {
3312                        *tune_state = CT_DEMOD_STOP;
3313                        state->status = FE_STATUS_TUNE_FAILED;
3314                }
3315                break;
3316
3317        default:
3318                break;
3319        }
3320
3321        /* tuning is finished - cleanup the demod */
3322        switch (*tune_state) {
3323        case CT_DEMOD_STOP: /* (42) */
3324#ifdef DIB8000_AGC_FREEZE
3325                if ((state->revision != 0x8090) && (state->agc1_max != 0)) {
3326                        dib8000_write_word(state, 108, state->agc1_max);
3327                        dib8000_write_word(state, 109, state->agc1_min);
3328                        dib8000_write_word(state, 110, state->agc2_max);
3329                        dib8000_write_word(state, 111, state->agc2_min);
3330                        state->agc1_max = 0;
3331                        state->agc1_min = 0;
3332                        state->agc2_max = 0;
3333                        state->agc2_min = 0;
3334                }
3335#endif
3336                ret = 0;
3337                break;
3338        default:
3339                break;
3340        }
3341
3342        if ((ret > 0) && (*tune_state > CT_DEMOD_STEP_3))
3343                return ret * state->symbol_duration;
3344        if ((ret > 0) && (ret < state->symbol_duration))
3345                return state->symbol_duration; /* at least one symbol */
3346        return ret;
3347}
3348
3349static int dib8000_wakeup(struct dvb_frontend *fe)
3350{
3351        struct dib8000_state *state = fe->demodulator_priv;
3352        u8 index_frontend;
3353        int ret;
3354
3355        dib8000_set_power_mode(state, DIB8000_POWER_ALL);
3356        dib8000_set_adc_state(state, DIBX000_ADC_ON);
3357        if (dib8000_set_adc_state(state, DIBX000_SLOW_ADC_ON) != 0)
3358                dprintk("could not start Slow ADC\n");
3359
3360        if (state->revision == 0x8090)
3361                dib8000_sad_calib(state);
3362
3363        for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3364                ret = state->fe[index_frontend]->ops.init(state->fe[index_frontend]);
3365                if (ret < 0)
3366                        return ret;
3367        }
3368
3369        return 0;
3370}
3371
3372static int dib8000_sleep(struct dvb_frontend *fe)
3373{
3374        struct dib8000_state *state = fe->demodulator_priv;
3375        u8 index_frontend;
3376        int ret;
3377
3378        for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3379                ret = state->fe[index_frontend]->ops.sleep(state->fe[index_frontend]);
3380                if (ret < 0)
3381                        return ret;
3382        }
3383
3384        if (state->revision != 0x8090)
3385                dib8000_set_output_mode(fe, OUTMODE_HIGH_Z);
3386        dib8000_set_power_mode(state, DIB8000_POWER_INTERFACE_ONLY);
3387        return dib8000_set_adc_state(state, DIBX000_SLOW_ADC_OFF) | dib8000_set_adc_state(state, DIBX000_ADC_OFF);
3388}
3389
3390static int dib8000_read_status(struct dvb_frontend *fe, enum fe_status *stat);
3391
3392static int dib8000_get_frontend(struct dvb_frontend *fe,
3393                                struct dtv_frontend_properties *c)
3394{
3395        struct dib8000_state *state = fe->demodulator_priv;
3396        u16 i, val = 0;
3397        enum fe_status stat = 0;
3398        u8 index_frontend, sub_index_frontend;
3399
3400        c->bandwidth_hz = 6000000;
3401
3402        /*
3403         * If called to early, get_frontend makes dib8000_tune to either
3404         * not lock or not sync. This causes dvbv5-scan/dvbv5-zap to fail.
3405         * So, let's just return if frontend 0 has not locked.
3406         */
3407        dib8000_read_status(fe, &stat);
3408        if (!(stat & FE_HAS_SYNC))
3409                return 0;
3410
3411        dprintk("dib8000_get_frontend: TMCC lock\n");
3412        for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3413                state->fe[index_frontend]->ops.read_status(state->fe[index_frontend], &stat);
3414                if (stat&FE_HAS_SYNC) {
3415                        dprintk("TMCC lock on the slave%i\n", index_frontend);
3416                        /* synchronize the cache with the other frontends */
3417                        state->fe[index_frontend]->ops.get_frontend(state->fe[index_frontend], c);
3418                        for (sub_index_frontend = 0; (sub_index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[sub_index_frontend] != NULL); sub_index_frontend++) {
3419                                if (sub_index_frontend != index_frontend) {
3420                                        state->fe[sub_index_frontend]->dtv_property_cache.isdbt_sb_mode = state->fe[index_frontend]->dtv_property_cache.isdbt_sb_mode;
3421                                        state->fe[sub_index_frontend]->dtv_property_cache.inversion = state->fe[index_frontend]->dtv_property_cache.inversion;
3422                                        state->fe[sub_index_frontend]->dtv_property_cache.transmission_mode = state->fe[index_frontend]->dtv_property_cache.transmission_mode;
3423                                        state->fe[sub_index_frontend]->dtv_property_cache.guard_interval = state->fe[index_frontend]->dtv_property_cache.guard_interval;
3424                                        state->fe[sub_index_frontend]->dtv_property_cache.isdbt_partial_reception = state->fe[index_frontend]->dtv_property_cache.isdbt_partial_reception;
3425                                        for (i = 0; i < 3; i++) {
3426                                                state->fe[sub_index_frontend]->dtv_property_cache.layer[i].segment_count = state->fe[index_frontend]->dtv_property_cache.layer[i].segment_count;
3427                                                state->fe[sub_index_frontend]->dtv_property_cache.layer[i].interleaving = state->fe[index_frontend]->dtv_property_cache.layer[i].interleaving;
3428                                                state->fe[sub_index_frontend]->dtv_property_cache.layer[i].fec = state->fe[index_frontend]->dtv_property_cache.layer[i].fec;
3429                                                state->fe[sub_index_frontend]->dtv_property_cache.layer[i].modulation = state->fe[index_frontend]->dtv_property_cache.layer[i].modulation;
3430                                        }
3431                                }
3432                        }
3433                        return 0;
3434                }
3435        }
3436
3437        c->isdbt_sb_mode = dib8000_read_word(state, 508) & 0x1;
3438
3439        if (state->revision == 0x8090)
3440                val = dib8000_read_word(state, 572);
3441        else
3442                val = dib8000_read_word(state, 570);
3443        c->inversion = (val & 0x40) >> 6;
3444        switch ((val & 0x30) >> 4) {
3445        case 1:
3446                c->transmission_mode = TRANSMISSION_MODE_2K;
3447                dprintk("dib8000_get_frontend: transmission mode 2K\n");
3448                break;
3449        case 2:
3450                c->transmission_mode = TRANSMISSION_MODE_4K;
3451                dprintk("dib8000_get_frontend: transmission mode 4K\n");
3452                break;
3453        case 3:
3454        default:
3455                c->transmission_mode = TRANSMISSION_MODE_8K;
3456                dprintk("dib8000_get_frontend: transmission mode 8K\n");
3457                break;
3458        }
3459
3460        switch (val & 0x3) {
3461        case 0:
3462                c->guard_interval = GUARD_INTERVAL_1_32;
3463                dprintk("dib8000_get_frontend: Guard Interval = 1/32\n");
3464                break;
3465        case 1:
3466                c->guard_interval = GUARD_INTERVAL_1_16;
3467                dprintk("dib8000_get_frontend: Guard Interval = 1/16\n");
3468                break;
3469        case 2:
3470                dprintk("dib8000_get_frontend: Guard Interval = 1/8\n");
3471                c->guard_interval = GUARD_INTERVAL_1_8;
3472                break;
3473        case 3:
3474                dprintk("dib8000_get_frontend: Guard Interval = 1/4\n");
3475                c->guard_interval = GUARD_INTERVAL_1_4;
3476                break;
3477        }
3478
3479        val = dib8000_read_word(state, 505);
3480        c->isdbt_partial_reception = val & 1;
3481        dprintk("dib8000_get_frontend: partial_reception = %d\n", c->isdbt_partial_reception);
3482
3483        for (i = 0; i < 3; i++) {
3484                int show;
3485
3486                val = dib8000_read_word(state, 493 + i) & 0x0f;
3487                c->layer[i].segment_count = val;
3488
3489                if (val == 0 || val > 13)
3490                        show = 0;
3491                else
3492                        show = 1;
3493
3494                if (show)
3495                        dprintk("dib8000_get_frontend: Layer %d segments = %d\n",
3496                                i, c->layer[i].segment_count);
3497
3498                val = dib8000_read_word(state, 499 + i) & 0x3;
3499                /* Interleaving can be 0, 1, 2 or 4 */
3500                if (val == 3)
3501                        val = 4;
3502                c->layer[i].interleaving = val;
3503                if (show)
3504                        dprintk("dib8000_get_frontend: Layer %d time_intlv = %d\n",
3505                                i, c->layer[i].interleaving);
3506
3507                val = dib8000_read_word(state, 481 + i);
3508                switch (val & 0x7) {
3509                case 1:
3510                        c->layer[i].fec = FEC_1_2;
3511                        if (show)
3512                                dprintk("dib8000_get_frontend: Layer %d Code Rate = 1/2\n", i);
3513                        break;
3514                case 2:
3515                        c->layer[i].fec = FEC_2_3;
3516                        if (show)
3517                                dprintk("dib8000_get_frontend: Layer %d Code Rate = 2/3\n", i);
3518                        break;
3519                case 3:
3520                        c->layer[i].fec = FEC_3_4;
3521                        if (show)
3522                                dprintk("dib8000_get_frontend: Layer %d Code Rate = 3/4\n", i);
3523                        break;
3524                case 5:
3525                        c->layer[i].fec = FEC_5_6;
3526                        if (show)
3527                                dprintk("dib8000_get_frontend: Layer %d Code Rate = 5/6\n", i);
3528                        break;
3529                default:
3530                        c->layer[i].fec = FEC_7_8;
3531                        if (show)
3532                                dprintk("dib8000_get_frontend: Layer %d Code Rate = 7/8\n", i);
3533                        break;
3534                }
3535
3536                val = dib8000_read_word(state, 487 + i);
3537                switch (val & 0x3) {
3538                case 0:
3539                        c->layer[i].modulation = DQPSK;
3540                        if (show)
3541                                dprintk("dib8000_get_frontend: Layer %d DQPSK\n", i);
3542                        break;
3543                case 1:
3544                        c->layer[i].modulation = QPSK;
3545                        if (show)
3546                                dprintk("dib8000_get_frontend: Layer %d QPSK\n", i);
3547                        break;
3548                case 2:
3549                        c->layer[i].modulation = QAM_16;
3550                        if (show)
3551                                dprintk("dib8000_get_frontend: Layer %d QAM16\n", i);
3552                        break;
3553                case 3:
3554                default:
3555                        c->layer[i].modulation = QAM_64;
3556                        if (show)
3557                                dprintk("dib8000_get_frontend: Layer %d QAM64\n", i);
3558                        break;
3559                }
3560        }
3561
3562        /* synchronize the cache with the other frontends */
3563        for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3564                state->fe[index_frontend]->dtv_property_cache.isdbt_sb_mode = c->isdbt_sb_mode;
3565                state->fe[index_frontend]->dtv_property_cache.inversion = c->inversion;
3566                state->fe[index_frontend]->dtv_property_cache.transmission_mode = c->transmission_mode;
3567                state->fe[index_frontend]->dtv_property_cache.guard_interval = c->guard_interval;
3568                state->fe[index_frontend]->dtv_property_cache.isdbt_partial_reception = c->isdbt_partial_reception;
3569                for (i = 0; i < 3; i++) {
3570                        state->fe[index_frontend]->dtv_property_cache.layer[i].segment_count = c->layer[i].segment_count;
3571                        state->fe[index_frontend]->dtv_property_cache.layer[i].interleaving = c->layer[i].interleaving;
3572                        state->fe[index_frontend]->dtv_property_cache.layer[i].fec = c->layer[i].fec;
3573                        state->fe[index_frontend]->dtv_property_cache.layer[i].modulation = c->layer[i].modulation;
3574                }
3575        }
3576        return 0;
3577}
3578
3579static int dib8000_set_frontend(struct dvb_frontend *fe)
3580{
3581        struct dib8000_state *state = fe->demodulator_priv;
3582        struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
3583        int l, i, active, time, time_slave = 0;
3584        u8 exit_condition, index_frontend;
3585        unsigned long delay, callback_time;
3586
3587        if (c->frequency == 0) {
3588                dprintk("dib8000: must at least specify frequency\n");
3589                return 0;
3590        }
3591
3592        if (c->bandwidth_hz == 0) {
3593                dprintk("dib8000: no bandwidth specified, set to default\n");
3594                c->bandwidth_hz = 6000000;
3595        }
3596
3597        for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3598                /* synchronization of the cache */
3599                state->fe[index_frontend]->dtv_property_cache.delivery_system = SYS_ISDBT;
3600                memcpy(&state->fe[index_frontend]->dtv_property_cache, &fe->dtv_property_cache, sizeof(struct dtv_frontend_properties));
3601
3602                /* set output mode and diversity input */
3603                if (state->revision != 0x8090) {
3604                        dib8000_set_diversity_in(state->fe[index_frontend], 1);
3605                        if (index_frontend != 0)
3606                                dib8000_set_output_mode(state->fe[index_frontend],
3607                                                OUTMODE_DIVERSITY);
3608                        else
3609                                dib8000_set_output_mode(state->fe[0], OUTMODE_HIGH_Z);
3610                } else {
3611                        dib8096p_set_diversity_in(state->fe[index_frontend], 1);
3612                        if (index_frontend != 0)
3613                                dib8096p_set_output_mode(state->fe[index_frontend],
3614                                                OUTMODE_DIVERSITY);
3615                        else
3616                                dib8096p_set_output_mode(state->fe[0], OUTMODE_HIGH_Z);
3617                }
3618
3619                /* tune the tuner */
3620                if (state->fe[index_frontend]->ops.tuner_ops.set_params)
3621                        state->fe[index_frontend]->ops.tuner_ops.set_params(state->fe[index_frontend]);
3622
3623                dib8000_set_tune_state(state->fe[index_frontend], CT_AGC_START);
3624        }
3625
3626        /* turn off the diversity of the last chip */
3627        if (state->revision != 0x8090)
3628                dib8000_set_diversity_in(state->fe[index_frontend - 1], 0);
3629        else
3630                dib8096p_set_diversity_in(state->fe[index_frontend - 1], 0);
3631
3632        /* start up the AGC */
3633        do {
3634                time = dib8000_agc_startup(state->fe[0]);
3635                for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3636                        time_slave = dib8000_agc_startup(state->fe[index_frontend]);
3637                        if (time == 0)
3638                                time = time_slave;
3639                        else if ((time_slave != 0) && (time_slave > time))
3640                                time = time_slave;
3641                }
3642                if (time == 0)
3643                        break;
3644
3645                /*
3646                 * Despite dib8000_agc_startup returns time at a 0.1 ms range,
3647                 * the actual sleep time depends on CONFIG_HZ. The worse case
3648                 * is when CONFIG_HZ=100. In such case, the minimum granularity
3649                 * is 10ms. On some real field tests, the tuner sometimes don't
3650                 * lock when this timer is lower than 10ms. So, enforce a 10ms
3651                 * granularity.
3652                 */
3653                time = 10 * (time + 99)/100;
3654                usleep_range(time * 1000, (time + 1) * 1000);
3655                exit_condition = 1;
3656                for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3657                        if (dib8000_get_tune_state(state->fe[index_frontend]) != CT_AGC_STOP) {
3658                                exit_condition = 0;
3659                                break;
3660                        }
3661                }
3662        } while (exit_condition == 0);
3663
3664        for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
3665                dib8000_set_tune_state(state->fe[index_frontend], CT_DEMOD_START);
3666
3667        active = 1;
3668        do {
3669                callback_time = 0;
3670                for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3671                        delay = dib8000_tune(state->fe[index_frontend]);
3672                        if (delay != 0) {
3673                                delay = jiffies + usecs_to_jiffies(100 * delay);
3674                                if (!callback_time || delay < callback_time)
3675                                        callback_time = delay;
3676                        }
3677
3678                        /* we are in autosearch */
3679                        if (state->channel_parameters_set == 0) { /* searching */
3680                                if ((dib8000_get_status(state->fe[index_frontend]) == FE_STATUS_DEMOD_SUCCESS) || (dib8000_get_status(state->fe[index_frontend]) == FE_STATUS_FFT_SUCCESS)) {
3681                                        dprintk("autosearch succeeded on fe%i\n", index_frontend);
3682                                        dib8000_get_frontend(state->fe[index_frontend], c); /* we read the channel parameters from the frontend which was successful */
3683                                        state->channel_parameters_set = 1;
3684
3685                                        for (l = 0; (l < MAX_NUMBER_OF_FRONTENDS) && (state->fe[l] != NULL); l++) {
3686                                                if (l != index_frontend) { /* and for all frontend except the successful one */
3687                                                        dprintk("Restarting frontend %d\n", l);
3688                                                        dib8000_tune_restart_from_demod(state->fe[l]);
3689
3690                                                        state->fe[l]->dtv_property_cache.isdbt_sb_mode = state->fe[index_frontend]->dtv_property_cache.isdbt_sb_mode;
3691                                                        state->fe[l]->dtv_property_cache.inversion = state->fe[index_frontend]->dtv_property_cache.inversion;
3692                                                        state->fe[l]->dtv_property_cache.transmission_mode = state->fe[index_frontend]->dtv_property_cache.transmission_mode;
3693                                                        state->fe[l]->dtv_property_cache.guard_interval = state->fe[index_frontend]->dtv_property_cache.guard_interval;
3694                                                        state->fe[l]->dtv_property_cache.isdbt_partial_reception = state->fe[index_frontend]->dtv_property_cache.isdbt_partial_reception;
3695                                                        for (i = 0; i < 3; i++) {
3696                                                                state->fe[l]->dtv_property_cache.layer[i].segment_count = state->fe[index_frontend]->dtv_property_cache.layer[i].segment_count;
3697                                                                state->fe[l]->dtv_property_cache.layer[i].interleaving = state->fe[index_frontend]->dtv_property_cache.layer[i].interleaving;
3698                                                                state->fe[l]->dtv_property_cache.layer[i].fec = state->fe[index_frontend]->dtv_property_cache.layer[i].fec;
3699                                                                state->fe[l]->dtv_property_cache.layer[i].modulation = state->fe[index_frontend]->dtv_property_cache.layer[i].modulation;
3700                                                        }
3701
3702                                                }
3703                                        }
3704                                }
3705                        }
3706                }
3707                /* tuning is done when the master frontend is done (failed or success) */
3708                if (dib8000_get_status(state->fe[0]) == FE_STATUS_TUNE_FAILED ||
3709                                dib8000_get_status(state->fe[0]) == FE_STATUS_LOCKED ||
3710                                dib8000_get_status(state->fe[0]) == FE_STATUS_DATA_LOCKED) {
3711                        active = 0;
3712                        /* we need to wait for all frontends to be finished */
3713                        for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3714                                if (dib8000_get_tune_state(state->fe[index_frontend]) != CT_DEMOD_STOP)
3715                                        active = 1;
3716                        }
3717                        if (active == 0)
3718                                dprintk("tuning done with status %d\n", dib8000_get_status(state->fe[0]));
3719                }
3720
3721                if ((active == 1) && (callback_time == 0)) {
3722                        dprintk("strange callback time something went wrong\n");
3723                        active = 0;
3724                }
3725
3726                while ((active == 1) && (time_before(jiffies, callback_time)))
3727                        msleep(100);
3728        } while (active);
3729
3730        /* set output mode */
3731        if (state->revision != 0x8090)
3732                dib8000_set_output_mode(state->fe[0], state->cfg.output_mode);
3733        else {
3734                dib8096p_set_output_mode(state->fe[0], state->cfg.output_mode);
3735                if (state->cfg.enMpegOutput == 0) {
3736                        dib8096p_setDibTxMux(state, MPEG_ON_DIBTX);
3737                        dib8096p_setHostBusMux(state, DIBTX_ON_HOSTBUS);
3738                }
3739        }
3740
3741        return 0;
3742}
3743
3744static int dib8000_get_stats(struct dvb_frontend *fe, enum fe_status stat);
3745
3746static int dib8000_read_status(struct dvb_frontend *fe, enum fe_status *stat)
3747{
3748        struct dib8000_state *state = fe->demodulator_priv;
3749        u16 lock_slave = 0, lock;
3750        u8 index_frontend;
3751
3752        lock = dib8000_read_lock(fe);
3753        for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
3754                lock_slave |= dib8000_read_lock(state->fe[index_frontend]);
3755
3756        *stat = 0;
3757
3758        if (((lock >> 13) & 1) || ((lock_slave >> 13) & 1))
3759                *stat |= FE_HAS_SIGNAL;
3760
3761        if (((lock >> 8) & 1) || ((lock_slave >> 8) & 1)) /* Equal */
3762                *stat |= FE_HAS_CARRIER;
3763
3764        if ((((lock >> 1) & 0xf) == 0xf) || (((lock_slave >> 1) & 0xf) == 0xf)) /* TMCC_SYNC */
3765                *stat |= FE_HAS_SYNC;
3766
3767        if ((((lock >> 12) & 1) || ((lock_slave >> 12) & 1)) && ((lock >> 5) & 7)) /* FEC MPEG */
3768                *stat |= FE_HAS_LOCK;
3769
3770        if (((lock >> 12) & 1) || ((lock_slave >> 12) & 1)) {
3771                lock = dib8000_read_word(state, 554); /* Viterbi Layer A */
3772                if (lock & 0x01)
3773                        *stat |= FE_HAS_VITERBI;
3774
3775                lock = dib8000_read_word(state, 555); /* Viterbi Layer B */
3776                if (lock & 0x01)
3777                        *stat |= FE_HAS_VITERBI;
3778
3779                lock = dib8000_read_word(state, 556); /* Viterbi Layer C */
3780                if (lock & 0x01)
3781                        *stat |= FE_HAS_VITERBI;
3782        }
3783        dib8000_get_stats(fe, *stat);
3784
3785        return 0;
3786}
3787
3788static int dib8000_read_ber(struct dvb_frontend *fe, u32 * ber)
3789{
3790        struct dib8000_state *state = fe->demodulator_priv;
3791
3792        /* 13 segments */
3793        if (state->revision == 0x8090)
3794                *ber = (dib8000_read_word(state, 562) << 16) |
3795                        dib8000_read_word(state, 563);
3796        else
3797                *ber = (dib8000_read_word(state, 560) << 16) |
3798                        dib8000_read_word(state, 561);
3799        return 0;
3800}
3801
3802static int dib8000_read_unc_blocks(struct dvb_frontend *fe, u32 * unc)
3803{
3804        struct dib8000_state *state = fe->demodulator_priv;
3805
3806        /* packet error on 13 seg */
3807        if (state->revision == 0x8090)
3808                *unc = dib8000_read_word(state, 567);
3809        else
3810                *unc = dib8000_read_word(state, 565);
3811        return 0;
3812}
3813
3814static int dib8000_read_signal_strength(struct dvb_frontend *fe, u16 * strength)
3815{
3816        struct dib8000_state *state = fe->demodulator_priv;
3817        u8 index_frontend;
3818        u16 val;
3819
3820        *strength = 0;
3821        for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3822                state->fe[index_frontend]->ops.read_signal_strength(state->fe[index_frontend], &val);
3823                if (val > 65535 - *strength)
3824                        *strength = 65535;
3825                else
3826                        *strength += val;
3827        }
3828
3829        val = 65535 - dib8000_read_word(state, 390);
3830        if (val > 65535 - *strength)
3831                *strength = 65535;
3832        else
3833                *strength += val;
3834        return 0;
3835}
3836
3837static u32 dib8000_get_snr(struct dvb_frontend *fe)
3838{
3839        struct dib8000_state *state = fe->demodulator_priv;
3840        u32 n, s, exp;
3841        u16 val;
3842
3843        if (state->revision != 0x8090)
3844                val = dib8000_read_word(state, 542);
3845        else
3846                val = dib8000_read_word(state, 544);
3847        n = (val >> 6) & 0xff;
3848        exp = (val & 0x3f);
3849        if ((exp & 0x20) != 0)
3850                exp -= 0x40;
3851        n <<= exp+16;
3852
3853        if (state->revision != 0x8090)
3854                val = dib8000_read_word(state, 543);
3855        else
3856                val = dib8000_read_word(state, 545);
3857        s = (val >> 6) & 0xff;
3858        exp = (val & 0x3f);
3859        if ((exp & 0x20) != 0)
3860                exp -= 0x40;
3861        s <<= exp+16;
3862
3863        if (n > 0) {
3864                u32 t = (s/n) << 16;
3865                return t + ((s << 16) - n*t) / n;
3866        }
3867        return 0xffffffff;
3868}
3869
3870static int dib8000_read_snr(struct dvb_frontend *fe, u16 * snr)
3871{
3872        struct dib8000_state *state = fe->demodulator_priv;
3873        u8 index_frontend;
3874        u32 snr_master;
3875
3876        snr_master = dib8000_get_snr(fe);
3877        for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
3878                snr_master += dib8000_get_snr(state->fe[index_frontend]);
3879
3880        if ((snr_master >> 16) != 0) {
3881                snr_master = 10*intlog10(snr_master>>16);
3882                *snr = snr_master / ((1 << 24) / 10);
3883        }
3884        else
3885                *snr = 0;
3886
3887        return 0;
3888}
3889
3890struct per_layer_regs {
3891        u16 lock, ber, per;
3892};
3893
3894static const struct per_layer_regs per_layer_regs[] = {
3895        { 554, 560, 562 },
3896        { 555, 576, 578 },
3897        { 556, 581, 583 },
3898};
3899
3900struct linear_segments {
3901        unsigned x;
3902        signed y;
3903};
3904
3905/*
3906 * Table to estimate signal strength in dBm.
3907 * This table was empirically determinated by measuring the signal
3908 * strength generated by a DTA-2111 RF generator directly connected into
3909 * a dib8076 device (a PixelView PV-D231U stick), using a good quality
3910 * 3 meters RC6 cable and good RC6 connectors.
3911 * The real value can actually be different on other devices, depending
3912 * on several factors, like if LNA is enabled or not, if diversity is
3913 * enabled, type of connectors, etc.
3914 * Yet, it is better to use this measure in dB than a random non-linear
3915 * percentage value, especially for antenna adjustments.
3916 * On my tests, the precision of the measure using this table is about
3917 * 0.5 dB, with sounds reasonable enough.
3918 */
3919static struct linear_segments strength_to_db_table[] = {
3920        { 55953, 108500 },      /* -22.5 dBm */
3921        { 55394, 108000 },
3922        { 53834, 107000 },
3923        { 52863, 106000 },
3924        { 52239, 105000 },
3925        { 52012, 104000 },
3926        { 51803, 103000 },
3927        { 51566, 102000 },
3928        { 51356, 101000 },
3929        { 51112, 100000 },
3930        { 50869,  99000 },
3931        { 50600,  98000 },
3932        { 50363,  97000 },
3933        { 50117,  96000 },      /* -35 dBm */
3934        { 49889,  95000 },
3935        { 49680,  94000 },
3936        { 49493,  93000 },
3937        { 49302,  92000 },
3938        { 48929,  91000 },
3939        { 48416,  90000 },
3940        { 48035,  89000 },
3941        { 47593,  88000 },
3942        { 47282,  87000 },
3943        { 46953,  86000 },
3944        { 46698,  85000 },
3945        { 45617,  84000 },
3946        { 44773,  83000 },
3947        { 43845,  82000 },
3948        { 43020,  81000 },
3949        { 42010,  80000 },      /* -51 dBm */
3950        {     0,      0 },
3951};
3952
3953static u32 interpolate_value(u32 value, struct linear_segments *segments,
3954                             unsigned len)
3955{
3956        u64 tmp64;
3957        u32 dx;
3958        s32 dy;
3959        int i, ret;
3960
3961        if (value >= segments[0].x)
3962                return segments[0].y;
3963        if (value < segments[len-1].x)
3964                return segments[len-1].y;
3965
3966        for (i = 1; i < len - 1; i++) {
3967                /* If value is identical, no need to interpolate */
3968                if (value == segments[i].x)
3969                        return segments[i].y;
3970                if (value > segments[i].x)
3971                        break;
3972        }
3973
3974        /* Linear interpolation between the two (x,y) points */
3975        dy = segments[i - 1].y - segments[i].y;
3976        dx = segments[i - 1].x - segments[i].x;
3977
3978        tmp64 = value - segments[i].x;
3979        tmp64 *= dy;
3980        do_div(tmp64, dx);
3981        ret = segments[i].y + tmp64;
3982
3983        return ret;
3984}
3985
3986static u32 dib8000_get_time_us(struct dvb_frontend *fe, int layer)
3987{
3988        struct dib8000_state *state = fe->demodulator_priv;
3989        struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
3990        int ini_layer, end_layer, i;
3991        u64 time_us, tmp64;
3992        u32 tmp, denom;
3993        int guard, rate_num, rate_denum = 1, bits_per_symbol, nsegs;
3994        int interleaving = 0, fft_div;
3995
3996        if (layer >= 0) {
3997                ini_layer = layer;
3998                end_layer = layer + 1;
3999        } else {
4000                ini_layer = 0;
4001                end_layer = 3;
4002        }
4003
4004        switch (c->guard_interval) {
4005        case GUARD_INTERVAL_1_4:
4006                guard = 4;
4007                break;
4008        case GUARD_INTERVAL_1_8:
4009                guard = 8;
4010                break;
4011        case GUARD_INTERVAL_1_16:
4012                guard = 16;
4013                break;
4014        default:
4015        case GUARD_INTERVAL_1_32:
4016                guard = 32;
4017                break;
4018        }
4019
4020        switch (c->transmission_mode) {
4021        case TRANSMISSION_MODE_2K:
4022                fft_div = 4;
4023                break;
4024        case TRANSMISSION_MODE_4K:
4025                fft_div = 2;
4026                break;
4027        default:
4028        case TRANSMISSION_MODE_8K:
4029                fft_div = 1;
4030                break;
4031        }
4032
4033        denom = 0;
4034        for (i = ini_layer; i < end_layer; i++) {
4035                nsegs = c->layer[i].segment_count;
4036                if (nsegs == 0 || nsegs > 13)
4037                        continue;
4038
4039                switch (c->layer[i].modulation) {
4040                case DQPSK:
4041                case QPSK:
4042                        bits_per_symbol = 2;
4043                        break;
4044                case QAM_16:
4045                        bits_per_symbol = 4;
4046                        break;
4047                default:
4048                case QAM_64:
4049                        bits_per_symbol = 6;
4050                        break;
4051                }
4052
4053                switch (c->layer[i].fec) {
4054                case FEC_1_2:
4055                        rate_num = 1;
4056                        rate_denum = 2;
4057                        break;
4058                case FEC_2_3:
4059                        rate_num = 2;
4060                        rate_denum = 3;
4061                        break;
4062                case FEC_3_4:
4063                        rate_num = 3;
4064                        rate_denum = 4;
4065                        break;
4066                case FEC_5_6:
4067                        rate_num = 5;
4068                        rate_denum = 6;
4069                        break;
4070                default:
4071                case FEC_7_8:
4072                        rate_num = 7;
4073                        rate_denum = 8;
4074                        break;
4075                }
4076
4077                interleaving = c->layer[i].interleaving;
4078
4079                denom += bits_per_symbol * rate_num * fft_div * nsegs * 384;
4080        }
4081
4082        /* If all goes wrong, wait for 1s for the next stats */
4083        if (!denom)
4084                return 0;
4085
4086        /* Estimate the period for the total bit rate */
4087        time_us = rate_denum * (1008 * 1562500L);
4088        tmp64 = time_us;
4089        do_div(tmp64, guard);
4090        time_us = time_us + tmp64;
4091        time_us += denom / 2;
4092        do_div(time_us, denom);
4093
4094        tmp = 1008 * 96 * interleaving;
4095        time_us += tmp + tmp / guard;
4096
4097        return time_us;
4098}
4099
4100static int dib8000_get_stats(struct dvb_frontend *fe, enum fe_status stat)
4101{
4102        struct dib8000_state *state = fe->demodulator_priv;
4103        struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
4104        int i;
4105        int show_per_stats = 0;
4106        u32 time_us = 0, snr, val;
4107        u64 blocks;
4108        s32 db;
4109        u16 strength;
4110
4111        /* Get Signal strength */
4112        dib8000_read_signal_strength(fe, &strength);
4113        val = strength;
4114        db = interpolate_value(val,
4115                               strength_to_db_table,
4116                               ARRAY_SIZE(strength_to_db_table)) - 131000;
4117        c->strength.stat[0].svalue = db;
4118
4119        /* UCB/BER/CNR measures require lock */
4120        if (!(stat & FE_HAS_LOCK)) {
4121                c->cnr.len = 1;
4122                c->block_count.len = 1;
4123                c->block_error.len = 1;
4124                c->post_bit_error.len = 1;
4125                c->post_bit_count.len = 1;
4126                c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
4127                c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
4128                c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
4129                c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
4130                c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
4131                return 0;
4132        }
4133
4134        /* Check if time for stats was elapsed */
4135        if (time_after(jiffies, state->per_jiffies_stats)) {
4136                state->per_jiffies_stats = jiffies + msecs_to_jiffies(1000);
4137
4138                /* Get SNR */
4139                snr = dib8000_get_snr(fe);
4140                for (i = 1; i < MAX_NUMBER_OF_FRONTENDS; i++) {
4141                        if (state->fe[i])
4142                                snr += dib8000_get_snr(state->fe[i]);
4143                }
4144                snr = snr >> 16;
4145
4146                if (snr) {
4147                        snr = 10 * intlog10(snr);
4148                        snr = (1000L * snr) >> 24;
4149                } else {
4150                        snr = 0;
4151                }
4152                c->cnr.stat[0].svalue = snr;
4153                c->cnr.stat[0].scale = FE_SCALE_DECIBEL;
4154
4155                /* Get UCB measures */
4156                dib8000_read_unc_blocks(fe, &val);
4157                if (val < state->init_ucb)
4158                        state->init_ucb += 0x100000000LL;
4159
4160                c->block_error.stat[0].scale = FE_SCALE_COUNTER;
4161                c->block_error.stat[0].uvalue = val + state->init_ucb;
4162
4163                /* Estimate the number of packets based on bitrate */
4164                if (!time_us)
4165                        time_us = dib8000_get_time_us(fe, -1);
4166
4167                if (time_us) {
4168                        blocks = 1250000ULL * 1000000ULL;
4169                        do_div(blocks, time_us * 8 * 204);
4170                        c->block_count.stat[0].scale = FE_SCALE_COUNTER;
4171                        c->block_count.stat[0].uvalue += blocks;
4172                }
4173
4174                show_per_stats = 1;
4175        }
4176
4177        /* Get post-BER measures */
4178        if (time_after(jiffies, state->ber_jiffies_stats)) {
4179                time_us = dib8000_get_time_us(fe, -1);
4180                state->ber_jiffies_stats = jiffies + msecs_to_jiffies((time_us + 500) / 1000);
4181
4182                dprintk("Next all layers stats available in %u us.\n", time_us);
4183
4184                dib8000_read_ber(fe, &val);
4185                c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
4186                c->post_bit_error.stat[0].uvalue += val;
4187
4188                c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
4189                c->post_bit_count.stat[0].uvalue += 100000000;
4190        }
4191
4192        if (state->revision < 0x8002)
4193                return 0;
4194
4195        c->block_error.len = 4;
4196        c->post_bit_error.len = 4;
4197        c->post_bit_count.len = 4;
4198
4199        for (i = 0; i < 3; i++) {
4200                unsigned nsegs = c->layer[i].segment_count;
4201
4202                if (nsegs == 0 || nsegs > 13)
4203                        continue;
4204
4205                time_us = 0;
4206
4207                if (time_after(jiffies, state->ber_jiffies_stats_layer[i])) {
4208                        time_us = dib8000_get_time_us(fe, i);
4209
4210                        state->ber_jiffies_stats_layer[i] = jiffies + msecs_to_jiffies((time_us + 500) / 1000);
4211                        dprintk("Next layer %c  stats will be available in %u us\n",
4212                                'A' + i, time_us);
4213
4214                        val = dib8000_read_word(state, per_layer_regs[i].ber);
4215                        c->post_bit_error.stat[1 + i].scale = FE_SCALE_COUNTER;
4216                        c->post_bit_error.stat[1 + i].uvalue += val;
4217
4218                        c->post_bit_count.stat[1 + i].scale = FE_SCALE_COUNTER;
4219                        c->post_bit_count.stat[1 + i].uvalue += 100000000;
4220                }
4221
4222                if (show_per_stats) {
4223                        val = dib8000_read_word(state, per_layer_regs[i].per);
4224
4225                        c->block_error.stat[1 + i].scale = FE_SCALE_COUNTER;
4226                        c->block_error.stat[1 + i].uvalue += val;
4227
4228                        if (!time_us)
4229                                time_us = dib8000_get_time_us(fe, i);
4230                        if (time_us) {
4231                                blocks = 1250000ULL * 1000000ULL;
4232                                do_div(blocks, time_us * 8 * 204);
4233                                c->block_count.stat[0].scale = FE_SCALE_COUNTER;
4234                                c->block_count.stat[0].uvalue += blocks;
4235                        }
4236                }
4237        }
4238        return 0;
4239}
4240
4241static int dib8000_set_slave_frontend(struct dvb_frontend *fe, struct dvb_frontend *fe_slave)
4242{
4243        struct dib8000_state *state = fe->demodulator_priv;
4244        u8 index_frontend = 1;
4245
4246        while ((index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL))
4247                index_frontend++;
4248        if (index_frontend < MAX_NUMBER_OF_FRONTENDS) {
4249                dprintk("set slave fe %p to index %i\n", fe_slave, index_frontend);
4250                state->fe[index_frontend] = fe_slave;
4251                return 0;
4252        }
4253
4254        dprintk("too many slave frontend\n");
4255        return -ENOMEM;
4256}
4257
4258static struct dvb_frontend *dib8000_get_slave_frontend(struct dvb_frontend *fe, int slave_index)
4259{
4260        struct dib8000_state *state = fe->demodulator_priv;
4261
4262        if (slave_index >= MAX_NUMBER_OF_FRONTENDS)
4263                return NULL;
4264        return state->fe[slave_index];
4265}
4266
4267static int dib8000_i2c_enumeration(struct i2c_adapter *host, int no_of_demods,
4268                u8 default_addr, u8 first_addr, u8 is_dib8096p)
4269{
4270        int k = 0, ret = 0;
4271        u8 new_addr = 0;
4272        struct i2c_device client = {.adap = host };
4273
4274        client.i2c_write_buffer = kzalloc(4, GFP_KERNEL);
4275        if (!client.i2c_write_buffer) {
4276                dprintk("%s: not enough memory\n", __func__);
4277                return -ENOMEM;
4278        }
4279        client.i2c_read_buffer = kzalloc(4, GFP_KERNEL);
4280        if (!client.i2c_read_buffer) {
4281                dprintk("%s: not enough memory\n", __func__);
4282                ret = -ENOMEM;
4283                goto error_memory_read;
4284        }
4285        client.i2c_buffer_lock = kzalloc(sizeof(struct mutex), GFP_KERNEL);
4286        if (!client.i2c_buffer_lock) {
4287                dprintk("%s: not enough memory\n", __func__);
4288                ret = -ENOMEM;
4289                goto error_memory_lock;
4290        }
4291        mutex_init(client.i2c_buffer_lock);
4292
4293        for (k = no_of_demods - 1; k >= 0; k--) {
4294                /* designated i2c address */
4295                new_addr = first_addr + (k << 1);
4296
4297                client.addr = new_addr;
4298                if (!is_dib8096p)
4299                        dib8000_i2c_write16(&client, 1287, 0x0003);     /* sram lead in, rdy */
4300                if (dib8000_identify(&client) == 0) {
4301                        /* sram lead in, rdy */
4302                        if (!is_dib8096p)
4303                                dib8000_i2c_write16(&client, 1287, 0x0003);
4304                        client.addr = default_addr;
4305                        if (dib8000_identify(&client) == 0) {
4306                                dprintk("#%d: not identified\n", k);
4307                                ret  = -EINVAL;
4308                                goto error;
4309                        }
4310                }
4311
4312                /* start diversity to pull_down div_str - just for i2c-enumeration */
4313                dib8000_i2c_write16(&client, 1286, (1 << 10) | (4 << 6));
4314
4315                /* set new i2c address and force divstart */
4316                dib8000_i2c_write16(&client, 1285, (new_addr << 2) | 0x2);
4317                client.addr = new_addr;
4318                dib8000_identify(&client);
4319
4320                dprintk("IC %d initialized (to i2c_address 0x%x)\n", k, new_addr);
4321        }
4322
4323        for (k = 0; k < no_of_demods; k++) {
4324                new_addr = first_addr | (k << 1);
4325                client.addr = new_addr;
4326
4327                // unforce divstr
4328                dib8000_i2c_write16(&client, 1285, new_addr << 2);
4329
4330                /* deactivate div - it was just for i2c-enumeration */
4331                dib8000_i2c_write16(&client, 1286, 0);
4332        }
4333
4334error:
4335        kfree(client.i2c_buffer_lock);
4336error_memory_lock:
4337        kfree(client.i2c_read_buffer);
4338error_memory_read:
4339        kfree(client.i2c_write_buffer);
4340
4341        return ret;
4342}
4343
4344static int dib8000_fe_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings *tune)
4345{
4346        tune->min_delay_ms = 1000;
4347        tune->step_size = 0;
4348        tune->max_drift = 0;
4349        return 0;
4350}
4351
4352static void dib8000_release(struct dvb_frontend *fe)
4353{
4354        struct dib8000_state *st = fe->demodulator_priv;
4355        u8 index_frontend;
4356
4357        for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (st->fe[index_frontend] != NULL); index_frontend++)
4358                dvb_frontend_detach(st->fe[index_frontend]);
4359
4360        dibx000_exit_i2c_master(&st->i2c_master);
4361        i2c_del_adapter(&st->dib8096p_tuner_adap);
4362        kfree(st->fe[0]);
4363        kfree(st);
4364}
4365
4366static struct i2c_adapter *dib8000_get_i2c_master(struct dvb_frontend *fe, enum dibx000_i2c_interface intf, int gating)
4367{
4368        struct dib8000_state *st = fe->demodulator_priv;
4369        return dibx000_get_i2c_adapter(&st->i2c_master, intf, gating);
4370}
4371
4372static int dib8000_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff)
4373{
4374        struct dib8000_state *st = fe->demodulator_priv;
4375        u16 val = dib8000_read_word(st, 299) & 0xffef;
4376        val |= (onoff & 0x1) << 4;
4377
4378        dprintk("pid filter enabled %d\n", onoff);
4379        return dib8000_write_word(st, 299, val);
4380}
4381
4382static int dib8000_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
4383{
4384        struct dib8000_state *st = fe->demodulator_priv;
4385        dprintk("Index %x, PID %d, OnOff %d\n", id, pid, onoff);
4386        return dib8000_write_word(st, 305 + id, onoff ? (1 << 13) | pid : 0);
4387}
4388
4389static const struct dvb_frontend_ops dib8000_ops = {
4390        .delsys = { SYS_ISDBT },
4391        .info = {
4392                 .name = "DiBcom 8000 ISDB-T",
4393                 .frequency_min_hz =  44250 * kHz,
4394                 .frequency_max_hz = 867250 * kHz,
4395                 .frequency_stepsize_hz = 62500,
4396                 .caps = FE_CAN_INVERSION_AUTO |
4397                 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
4398                 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
4399                 FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
4400                 FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_RECOVER | FE_CAN_HIERARCHY_AUTO,
4401                 },
4402
4403        .release = dib8000_release,
4404
4405        .init = dib8000_wakeup,
4406        .sleep = dib8000_sleep,
4407
4408        .set_frontend = dib8000_set_frontend,
4409        .get_tune_settings = dib8000_fe_get_tune_settings,
4410        .get_frontend = dib8000_get_frontend,
4411
4412        .read_status = dib8000_read_status,
4413        .read_ber = dib8000_read_ber,
4414        .read_signal_strength = dib8000_read_signal_strength,
4415        .read_snr = dib8000_read_snr,
4416        .read_ucblocks = dib8000_read_unc_blocks,
4417};
4418
4419static struct dvb_frontend *dib8000_init(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib8000_config *cfg)
4420{
4421        struct dvb_frontend *fe;
4422        struct dib8000_state *state;
4423
4424        dprintk("dib8000_init\n");
4425
4426        state = kzalloc(sizeof(struct dib8000_state), GFP_KERNEL);
4427        if (state == NULL)
4428                return NULL;
4429        fe = kzalloc(sizeof(struct dvb_frontend), GFP_KERNEL);
4430        if (fe == NULL)
4431                goto error;
4432
4433        memcpy(&state->cfg, cfg, sizeof(struct dib8000_config));
4434        state->i2c.adap = i2c_adap;
4435        state->i2c.addr = i2c_addr;
4436        state->i2c.i2c_write_buffer = state->i2c_write_buffer;
4437        state->i2c.i2c_read_buffer = state->i2c_read_buffer;
4438        mutex_init(&state->i2c_buffer_lock);
4439        state->i2c.i2c_buffer_lock = &state->i2c_buffer_lock;
4440        state->gpio_val = cfg->gpio_val;
4441        state->gpio_dir = cfg->gpio_dir;
4442
4443        /* Ensure the output mode remains at the previous default if it's
4444         * not specifically set by the caller.
4445         */
4446        if ((state->cfg.output_mode != OUTMODE_MPEG2_SERIAL) && (state->cfg.output_mode != OUTMODE_MPEG2_PAR_GATED_CLK))
4447                state->cfg.output_mode = OUTMODE_MPEG2_FIFO;
4448
4449        state->fe[0] = fe;
4450        fe->demodulator_priv = state;
4451        memcpy(&state->fe[0]->ops, &dib8000_ops, sizeof(struct dvb_frontend_ops));
4452
4453        state->timf_default = cfg->pll->timf;
4454
4455        if (dib8000_identify(&state->i2c) == 0)
4456                goto error;
4457
4458        dibx000_init_i2c_master(&state->i2c_master, DIB8000, state->i2c.adap, state->i2c.addr);
4459
4460        /* init 8096p tuner adapter */
4461        strncpy(state->dib8096p_tuner_adap.name, "DiB8096P tuner interface",
4462                        sizeof(state->dib8096p_tuner_adap.name));
4463        state->dib8096p_tuner_adap.algo = &dib8096p_tuner_xfer_algo;
4464        state->dib8096p_tuner_adap.algo_data = NULL;
4465        state->dib8096p_tuner_adap.dev.parent = state->i2c.adap->dev.parent;
4466        i2c_set_adapdata(&state->dib8096p_tuner_adap, state);
4467        i2c_add_adapter(&state->dib8096p_tuner_adap);
4468
4469        dib8000_reset(fe);
4470
4471        dib8000_write_word(state, 285, (dib8000_read_word(state, 285) & ~0x60) | (3 << 5));     /* ber_rs_len = 3 */
4472        state->current_demod_bw = 6000;
4473
4474        return fe;
4475
4476error:
4477        kfree(state);
4478        return NULL;
4479}
4480
4481void *dib8000_attach(struct dib8000_ops *ops)
4482{
4483        if (!ops)
4484                return NULL;
4485
4486        ops->pwm_agc_reset = dib8000_pwm_agc_reset;
4487        ops->get_dc_power = dib8090p_get_dc_power;
4488        ops->set_gpio = dib8000_set_gpio;
4489        ops->get_slave_frontend = dib8000_get_slave_frontend;
4490        ops->set_tune_state = dib8000_set_tune_state;
4491        ops->pid_filter_ctrl = dib8000_pid_filter_ctrl;
4492        ops->get_adc_power = dib8000_get_adc_power;
4493        ops->update_pll = dib8000_update_pll;
4494        ops->tuner_sleep = dib8096p_tuner_sleep;
4495        ops->get_tune_state = dib8000_get_tune_state;
4496        ops->get_i2c_tuner = dib8096p_get_i2c_tuner;
4497        ops->set_slave_frontend = dib8000_set_slave_frontend;
4498        ops->pid_filter = dib8000_pid_filter;
4499        ops->ctrl_timf = dib8000_ctrl_timf;
4500        ops->init = dib8000_init;
4501        ops->get_i2c_master = dib8000_get_i2c_master;
4502        ops->i2c_enumeration = dib8000_i2c_enumeration;
4503        ops->set_wbd_ref = dib8000_set_wbd_ref;
4504
4505        return ops;
4506}
4507EXPORT_SYMBOL(dib8000_attach);
4508
4509MODULE_AUTHOR("Olivier Grenie <Olivier.Grenie@parrot.com, Patrick Boettcher <patrick.boettcher@posteo.de>");
4510MODULE_DESCRIPTION("Driver for the DiBcom 8000 ISDB-T demodulator");
4511MODULE_LICENSE("GPL");
4512