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