linux/drivers/media/dvb/frontends/dib3000mc.c
<<
>>
Prefs
   1/*
   2 * Driver for DiBcom DiB3000MC/P-demodulator.
   3 *
   4 * Copyright (C) 2004-7 DiBcom (http://www.dibcom.fr/)
   5 * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de)
   6 *
   7 * This code is partially based on the previous dib3000mc.c .
   8 *
   9 * This program is free software; you can redistribute it and/or
  10 *      modify it under the terms of the GNU General Public License as
  11 *      published by the Free Software Foundation, version 2.
  12 */
  13
  14#include <linux/kernel.h>
  15#include <linux/i2c.h>
  16
  17#include "dvb_frontend.h"
  18
  19#include "dib3000mc.h"
  20
  21static int debug;
  22module_param(debug, int, 0644);
  23MODULE_PARM_DESC(debug, "turn on debugging (default: 0)");
  24
  25static int buggy_sfn_workaround;
  26module_param(buggy_sfn_workaround, int, 0644);
  27MODULE_PARM_DESC(buggy_sfn_workaround, "Enable work-around for buggy SFNs (default: 0)");
  28
  29#define dprintk(args...) do { if (debug) { printk(KERN_DEBUG "DiB3000MC/P:"); printk(args); printk("\n"); } } while (0)
  30
  31struct dib3000mc_state {
  32        struct dvb_frontend demod;
  33        struct dib3000mc_config *cfg;
  34
  35        u8 i2c_addr;
  36        struct i2c_adapter *i2c_adap;
  37
  38        struct dibx000_i2c_master i2c_master;
  39
  40        u32 timf;
  41
  42        fe_bandwidth_t current_bandwidth;
  43
  44        u16 dev_id;
  45
  46        u8 sfn_workaround_active :1;
  47};
  48
  49static u16 dib3000mc_read_word(struct dib3000mc_state *state, u16 reg)
  50{
  51        u8 wb[2] = { (reg >> 8) | 0x80, reg & 0xff };
  52        u8 rb[2];
  53        struct i2c_msg msg[2] = {
  54                { .addr = state->i2c_addr >> 1, .flags = 0,        .buf = wb, .len = 2 },
  55                { .addr = state->i2c_addr >> 1, .flags = I2C_M_RD, .buf = rb, .len = 2 },
  56        };
  57
  58        if (i2c_transfer(state->i2c_adap, msg, 2) != 2)
  59                dprintk("i2c read error on %d\n",reg);
  60
  61        return (rb[0] << 8) | rb[1];
  62}
  63
  64static int dib3000mc_write_word(struct dib3000mc_state *state, u16 reg, u16 val)
  65{
  66        u8 b[4] = {
  67                (reg >> 8) & 0xff, reg & 0xff,
  68                (val >> 8) & 0xff, val & 0xff,
  69        };
  70        struct i2c_msg msg = {
  71                .addr = state->i2c_addr >> 1, .flags = 0, .buf = b, .len = 4
  72        };
  73        return i2c_transfer(state->i2c_adap, &msg, 1) != 1 ? -EREMOTEIO : 0;
  74}
  75
  76static int dib3000mc_identify(struct dib3000mc_state *state)
  77{
  78        u16 value;
  79        if ((value = dib3000mc_read_word(state, 1025)) != 0x01b3) {
  80                dprintk("-E-  DiB3000MC/P: wrong Vendor ID (read=0x%x)\n",value);
  81                return -EREMOTEIO;
  82        }
  83
  84        value = dib3000mc_read_word(state, 1026);
  85        if (value != 0x3001 && value != 0x3002) {
  86                dprintk("-E-  DiB3000MC/P: wrong Device ID (%x)\n",value);
  87                return -EREMOTEIO;
  88        }
  89        state->dev_id = value;
  90
  91        dprintk("-I-  found DiB3000MC/P: %x\n",state->dev_id);
  92
  93        return 0;
  94}
  95
  96static int dib3000mc_set_timing(struct dib3000mc_state *state, s16 nfft, u32 bw, u8 update_offset)
  97{
  98        u32 timf;
  99
 100        if (state->timf == 0) {
 101                timf = 1384402; // default value for 8MHz
 102                if (update_offset)
 103                        msleep(200); // first time we do an update
 104        } else
 105                timf = state->timf;
 106
 107        timf *= (bw / 1000);
 108
 109        if (update_offset) {
 110                s16 tim_offs = dib3000mc_read_word(state, 416);
 111
 112                if (tim_offs &  0x2000)
 113                        tim_offs -= 0x4000;
 114
 115                if (nfft == TRANSMISSION_MODE_2K)
 116                        tim_offs *= 4;
 117
 118                timf += tim_offs;
 119                state->timf = timf / (bw / 1000);
 120        }
 121
 122        dprintk("timf: %d\n", timf);
 123
 124        dib3000mc_write_word(state, 23, (u16) (timf >> 16));
 125        dib3000mc_write_word(state, 24, (u16) (timf      ) & 0xffff);
 126
 127        return 0;
 128}
 129
 130static int dib3000mc_setup_pwm_state(struct dib3000mc_state *state)
 131{
 132        u16 reg_51, reg_52 = state->cfg->agc->setup & 0xfefb;
 133    if (state->cfg->pwm3_inversion) {
 134                reg_51 =  (2 << 14) | (0 << 10) | (7 << 6) | (2 << 2) | (2 << 0);
 135                reg_52 |= (1 << 2);
 136        } else {
 137                reg_51 = (2 << 14) | (4 << 10) | (7 << 6) | (2 << 2) | (2 << 0);
 138                reg_52 |= (1 << 8);
 139        }
 140        dib3000mc_write_word(state, 51, reg_51);
 141        dib3000mc_write_word(state, 52, reg_52);
 142
 143    if (state->cfg->use_pwm3)
 144                dib3000mc_write_word(state, 245, (1 << 3) | (1 << 0));
 145        else
 146                dib3000mc_write_word(state, 245, 0);
 147
 148    dib3000mc_write_word(state, 1040, 0x3);
 149        return 0;
 150}
 151
 152static int dib3000mc_set_output_mode(struct dib3000mc_state *state, int mode)
 153{
 154        int    ret = 0;
 155        u16 fifo_threshold = 1792;
 156        u16 outreg = 0;
 157        u16 outmode = 0;
 158        u16 elecout = 1;
 159        u16 smo_reg = dib3000mc_read_word(state, 206) & 0x0010; /* keep the pid_parse bit */
 160
 161        dprintk("-I-  Setting output mode for demod %p to %d\n",
 162                        &state->demod, mode);
 163
 164        switch (mode) {
 165                case OUTMODE_HIGH_Z:  // disable
 166                        elecout = 0;
 167                        break;
 168                case OUTMODE_MPEG2_PAR_GATED_CLK:   // STBs with parallel gated clock
 169                        outmode = 0;
 170                        break;
 171                case OUTMODE_MPEG2_PAR_CONT_CLK:    // STBs with parallel continues clock
 172                        outmode = 1;
 173                        break;
 174                case OUTMODE_MPEG2_SERIAL:          // STBs with serial input
 175                        outmode = 2;
 176                        break;
 177                case OUTMODE_MPEG2_FIFO:            // e.g. USB feeding
 178                        elecout = 3;
 179                        /*ADDR @ 206 :
 180                        P_smo_error_discard  [1;6:6] = 0
 181                        P_smo_rs_discard     [1;5:5] = 0
 182                        P_smo_pid_parse      [1;4:4] = 0
 183                        P_smo_fifo_flush     [1;3:3] = 0
 184                        P_smo_mode           [2;2:1] = 11
 185                        P_smo_ovf_prot       [1;0:0] = 0
 186                        */
 187                        smo_reg |= 3 << 1;
 188                        fifo_threshold = 512;
 189                        outmode = 5;
 190                        break;
 191                case OUTMODE_DIVERSITY:
 192                        outmode = 4;
 193                        elecout = 1;
 194                        break;
 195                default:
 196                        dprintk("Unhandled output_mode passed to be set for demod %p\n",&state->demod);
 197                        outmode = 0;
 198                        break;
 199        }
 200
 201        if ((state->cfg->output_mpeg2_in_188_bytes))
 202                smo_reg |= (1 << 5); // P_smo_rs_discard     [1;5:5] = 1
 203
 204        outreg = dib3000mc_read_word(state, 244) & 0x07FF;
 205        outreg |= (outmode << 11);
 206        ret |= dib3000mc_write_word(state,  244, outreg);
 207        ret |= dib3000mc_write_word(state,  206, smo_reg);   /*smo_ mode*/
 208        ret |= dib3000mc_write_word(state,  207, fifo_threshold); /* synchronous fread */
 209        ret |= dib3000mc_write_word(state, 1040, elecout);         /* P_out_cfg */
 210        return ret;
 211}
 212
 213static int dib3000mc_set_bandwidth(struct dib3000mc_state *state, u32 bw)
 214{
 215        u16 bw_cfg[6] = { 0 };
 216        u16 imp_bw_cfg[3] = { 0 };
 217        u16 reg;
 218
 219/* settings here are for 27.7MHz */
 220        switch (bw) {
 221                case 8000:
 222                        bw_cfg[0] = 0x0019; bw_cfg[1] = 0x5c30; bw_cfg[2] = 0x0054; bw_cfg[3] = 0x88a0; bw_cfg[4] = 0x01a6; bw_cfg[5] = 0xab20;
 223                        imp_bw_cfg[0] = 0x04db; imp_bw_cfg[1] = 0x00db; imp_bw_cfg[2] = 0x00b7;
 224                        break;
 225
 226                case 7000:
 227                        bw_cfg[0] = 0x001c; bw_cfg[1] = 0xfba5; bw_cfg[2] = 0x0060; bw_cfg[3] = 0x9c25; bw_cfg[4] = 0x01e3; bw_cfg[5] = 0x0cb7;
 228                        imp_bw_cfg[0] = 0x04c0; imp_bw_cfg[1] = 0x00c0; imp_bw_cfg[2] = 0x00a0;
 229                        break;
 230
 231                case 6000:
 232                        bw_cfg[0] = 0x0021; bw_cfg[1] = 0xd040; bw_cfg[2] = 0x0070; bw_cfg[3] = 0xb62b; bw_cfg[4] = 0x0233; bw_cfg[5] = 0x8ed5;
 233                        imp_bw_cfg[0] = 0x04a5; imp_bw_cfg[1] = 0x00a5; imp_bw_cfg[2] = 0x0089;
 234                        break;
 235
 236                case 5000:
 237                        bw_cfg[0] = 0x0028; bw_cfg[1] = 0x9380; bw_cfg[2] = 0x0087; bw_cfg[3] = 0x4100; bw_cfg[4] = 0x02a4; bw_cfg[5] = 0x4500;
 238                        imp_bw_cfg[0] = 0x0489; imp_bw_cfg[1] = 0x0089; imp_bw_cfg[2] = 0x0072;
 239                        break;
 240
 241                default: return -EINVAL;
 242        }
 243
 244        for (reg = 6; reg < 12; reg++)
 245                dib3000mc_write_word(state, reg, bw_cfg[reg - 6]);
 246        dib3000mc_write_word(state, 12, 0x0000);
 247        dib3000mc_write_word(state, 13, 0x03e8);
 248        dib3000mc_write_word(state, 14, 0x0000);
 249        dib3000mc_write_word(state, 15, 0x03f2);
 250        dib3000mc_write_word(state, 16, 0x0001);
 251        dib3000mc_write_word(state, 17, 0xb0d0);
 252        // P_sec_len
 253        dib3000mc_write_word(state, 18, 0x0393);
 254        dib3000mc_write_word(state, 19, 0x8700);
 255
 256        for (reg = 55; reg < 58; reg++)
 257                dib3000mc_write_word(state, reg, imp_bw_cfg[reg - 55]);
 258
 259        // Timing configuration
 260        dib3000mc_set_timing(state, TRANSMISSION_MODE_2K, bw, 0);
 261
 262        return 0;
 263}
 264
 265static u16 impulse_noise_val[29] =
 266
 267{
 268        0x38, 0x6d9, 0x3f28, 0x7a7, 0x3a74, 0x196, 0x32a, 0x48c, 0x3ffe, 0x7f3,
 269        0x2d94, 0x76, 0x53d, 0x3ff8, 0x7e3, 0x3320, 0x76, 0x5b3, 0x3feb, 0x7d2,
 270        0x365e, 0x76, 0x48c, 0x3ffe, 0x5b3, 0x3feb, 0x76, 0x0000, 0xd
 271};
 272
 273static void dib3000mc_set_impulse_noise(struct dib3000mc_state *state, u8 mode, s16 nfft)
 274{
 275        u16 i;
 276        for (i = 58; i < 87; i++)
 277                dib3000mc_write_word(state, i, impulse_noise_val[i-58]);
 278
 279        if (nfft == TRANSMISSION_MODE_8K) {
 280                dib3000mc_write_word(state, 58, 0x3b);
 281                dib3000mc_write_word(state, 84, 0x00);
 282                dib3000mc_write_word(state, 85, 0x8200);
 283        }
 284
 285        dib3000mc_write_word(state, 34, 0x1294);
 286        dib3000mc_write_word(state, 35, 0x1ff8);
 287        if (mode == 1)
 288                dib3000mc_write_word(state, 55, dib3000mc_read_word(state, 55) | (1 << 10));
 289}
 290
 291static int dib3000mc_init(struct dvb_frontend *demod)
 292{
 293        struct dib3000mc_state *state = demod->demodulator_priv;
 294        struct dibx000_agc_config *agc = state->cfg->agc;
 295
 296        // Restart Configuration
 297        dib3000mc_write_word(state, 1027, 0x8000);
 298        dib3000mc_write_word(state, 1027, 0x0000);
 299
 300        // power up the demod + mobility configuration
 301        dib3000mc_write_word(state, 140, 0x0000);
 302        dib3000mc_write_word(state, 1031, 0);
 303
 304        if (state->cfg->mobile_mode) {
 305                dib3000mc_write_word(state, 139,  0x0000);
 306                dib3000mc_write_word(state, 141,  0x0000);
 307                dib3000mc_write_word(state, 175,  0x0002);
 308                dib3000mc_write_word(state, 1032, 0x0000);
 309        } else {
 310                dib3000mc_write_word(state, 139,  0x0001);
 311                dib3000mc_write_word(state, 141,  0x0000);
 312                dib3000mc_write_word(state, 175,  0x0000);
 313                dib3000mc_write_word(state, 1032, 0x012C);
 314        }
 315        dib3000mc_write_word(state, 1033, 0x0000);
 316
 317        // P_clk_cfg
 318        dib3000mc_write_word(state, 1037, 0x3130);
 319
 320        // other configurations
 321
 322        // P_ctrl_sfreq
 323        dib3000mc_write_word(state, 33, (5 << 0));
 324        dib3000mc_write_word(state, 88, (1 << 10) | (0x10 << 0));
 325
 326        // Phase noise control
 327        // P_fft_phacor_inh, P_fft_phacor_cpe, P_fft_powrange
 328        dib3000mc_write_word(state, 99, (1 << 9) | (0x20 << 0));
 329
 330        if (state->cfg->phase_noise_mode == 0)
 331                dib3000mc_write_word(state, 111, 0x00);
 332        else
 333                dib3000mc_write_word(state, 111, 0x02);
 334
 335        // P_agc_global
 336        dib3000mc_write_word(state, 50, 0x8000);
 337
 338        // agc setup misc
 339        dib3000mc_setup_pwm_state(state);
 340
 341        // P_agc_counter_lock
 342        dib3000mc_write_word(state, 53, 0x87);
 343        // P_agc_counter_unlock
 344        dib3000mc_write_word(state, 54, 0x87);
 345
 346        /* agc */
 347        dib3000mc_write_word(state, 36, state->cfg->max_time);
 348        dib3000mc_write_word(state, 37, (state->cfg->agc_command1 << 13) | (state->cfg->agc_command2 << 12) | (0x1d << 0));
 349        dib3000mc_write_word(state, 38, state->cfg->pwm3_value);
 350        dib3000mc_write_word(state, 39, state->cfg->ln_adc_level);
 351
 352        // set_agc_loop_Bw
 353        dib3000mc_write_word(state, 40, 0x0179);
 354        dib3000mc_write_word(state, 41, 0x03f0);
 355
 356        dib3000mc_write_word(state, 42, agc->agc1_max);
 357        dib3000mc_write_word(state, 43, agc->agc1_min);
 358        dib3000mc_write_word(state, 44, agc->agc2_max);
 359        dib3000mc_write_word(state, 45, agc->agc2_min);
 360        dib3000mc_write_word(state, 46, (agc->agc1_pt1 << 8) | agc->agc1_pt2);
 361        dib3000mc_write_word(state, 47, (agc->agc1_slope1 << 8) | agc->agc1_slope2);
 362        dib3000mc_write_word(state, 48, (agc->agc2_pt1 << 8) | agc->agc2_pt2);
 363        dib3000mc_write_word(state, 49, (agc->agc2_slope1 << 8) | agc->agc2_slope2);
 364
 365// Begin: TimeOut registers
 366        // P_pha3_thres
 367        dib3000mc_write_word(state, 110, 3277);
 368        // P_timf_alpha = 6, P_corm_alpha = 6, P_corm_thres = 0x80
 369        dib3000mc_write_word(state,  26, 0x6680);
 370        // lock_mask0
 371        dib3000mc_write_word(state, 1, 4);
 372        // lock_mask1
 373        dib3000mc_write_word(state, 2, 4);
 374        // lock_mask2
 375        dib3000mc_write_word(state, 3, 0x1000);
 376        // P_search_maxtrial=1
 377        dib3000mc_write_word(state, 5, 1);
 378
 379        dib3000mc_set_bandwidth(state, 8000);
 380
 381        // div_lock_mask
 382        dib3000mc_write_word(state,  4, 0x814);
 383
 384        dib3000mc_write_word(state, 21, (1 << 9) | 0x164);
 385        dib3000mc_write_word(state, 22, 0x463d);
 386
 387        // Spurious rm cfg
 388        // P_cspu_regul, P_cspu_win_cut
 389        dib3000mc_write_word(state, 120, 0x200f);
 390        // P_adp_selec_monit
 391        dib3000mc_write_word(state, 134, 0);
 392
 393        // Fec cfg
 394        dib3000mc_write_word(state, 195, 0x10);
 395
 396        // diversity register: P_dvsy_sync_wait..
 397        dib3000mc_write_word(state, 180, 0x2FF0);
 398
 399        // Impulse noise configuration
 400        dib3000mc_set_impulse_noise(state, 0, TRANSMISSION_MODE_8K);
 401
 402        // output mode set-up
 403        dib3000mc_set_output_mode(state, OUTMODE_HIGH_Z);
 404
 405        /* close the i2c-gate */
 406        dib3000mc_write_word(state, 769, (1 << 7) );
 407
 408        return 0;
 409}
 410
 411static int dib3000mc_sleep(struct dvb_frontend *demod)
 412{
 413        struct dib3000mc_state *state = demod->demodulator_priv;
 414
 415        dib3000mc_write_word(state, 1031, 0xFFFF);
 416        dib3000mc_write_word(state, 1032, 0xFFFF);
 417        dib3000mc_write_word(state, 1033, 0xFFF0);
 418
 419    return 0;
 420}
 421
 422static void dib3000mc_set_adp_cfg(struct dib3000mc_state *state, s16 qam)
 423{
 424        u16 cfg[4] = { 0 },reg;
 425        switch (qam) {
 426                case QPSK:
 427                        cfg[0] = 0x099a; cfg[1] = 0x7fae; cfg[2] = 0x0333; cfg[3] = 0x7ff0;
 428                        break;
 429                case QAM_16:
 430                        cfg[0] = 0x023d; cfg[1] = 0x7fdf; cfg[2] = 0x00a4; cfg[3] = 0x7ff0;
 431                        break;
 432                case QAM_64:
 433                        cfg[0] = 0x0148; cfg[1] = 0x7ff0; cfg[2] = 0x00a4; cfg[3] = 0x7ff8;
 434                        break;
 435        }
 436        for (reg = 129; reg < 133; reg++)
 437                dib3000mc_write_word(state, reg, cfg[reg - 129]);
 438}
 439
 440static void dib3000mc_set_channel_cfg(struct dib3000mc_state *state, struct dvb_frontend_parameters *ch, u16 seq)
 441{
 442        u16 value;
 443    dib3000mc_set_bandwidth(state, BANDWIDTH_TO_KHZ(ch->u.ofdm.bandwidth));
 444        dib3000mc_set_timing(state, ch->u.ofdm.transmission_mode, BANDWIDTH_TO_KHZ(ch->u.ofdm.bandwidth), 0);
 445
 446//      if (boost)
 447//              dib3000mc_write_word(state, 100, (11 << 6) + 6);
 448//      else
 449                dib3000mc_write_word(state, 100, (16 << 6) + 9);
 450
 451        dib3000mc_write_word(state, 1027, 0x0800);
 452        dib3000mc_write_word(state, 1027, 0x0000);
 453
 454        //Default cfg isi offset adp
 455        dib3000mc_write_word(state, 26,  0x6680);
 456        dib3000mc_write_word(state, 29,  0x1273);
 457        dib3000mc_write_word(state, 33,       5);
 458        dib3000mc_set_adp_cfg(state, QAM_16);
 459        dib3000mc_write_word(state, 133,  15564);
 460
 461        dib3000mc_write_word(state, 12 , 0x0);
 462        dib3000mc_write_word(state, 13 , 0x3e8);
 463        dib3000mc_write_word(state, 14 , 0x0);
 464        dib3000mc_write_word(state, 15 , 0x3f2);
 465
 466        dib3000mc_write_word(state, 93,0);
 467        dib3000mc_write_word(state, 94,0);
 468        dib3000mc_write_word(state, 95,0);
 469        dib3000mc_write_word(state, 96,0);
 470        dib3000mc_write_word(state, 97,0);
 471        dib3000mc_write_word(state, 98,0);
 472
 473        dib3000mc_set_impulse_noise(state, 0, ch->u.ofdm.transmission_mode);
 474
 475        value = 0;
 476        switch (ch->u.ofdm.transmission_mode) {
 477                case TRANSMISSION_MODE_2K: value |= (0 << 7); break;
 478                default:
 479                case TRANSMISSION_MODE_8K: value |= (1 << 7); break;
 480        }
 481        switch (ch->u.ofdm.guard_interval) {
 482                case GUARD_INTERVAL_1_32: value |= (0 << 5); break;
 483                case GUARD_INTERVAL_1_16: value |= (1 << 5); break;
 484                case GUARD_INTERVAL_1_4:  value |= (3 << 5); break;
 485                default:
 486                case GUARD_INTERVAL_1_8:  value |= (2 << 5); break;
 487        }
 488        switch (ch->u.ofdm.constellation) {
 489                case QPSK:  value |= (0 << 3); break;
 490                case QAM_16: value |= (1 << 3); break;
 491                default:
 492                case QAM_64: value |= (2 << 3); break;
 493        }
 494        switch (HIERARCHY_1) {
 495                case HIERARCHY_2: value |= 2; break;
 496                case HIERARCHY_4: value |= 4; break;
 497                default:
 498                case HIERARCHY_1: value |= 1; break;
 499        }
 500        dib3000mc_write_word(state, 0, value);
 501        dib3000mc_write_word(state, 5, (1 << 8) | ((seq & 0xf) << 4));
 502
 503        value = 0;
 504        if (ch->u.ofdm.hierarchy_information == 1)
 505                value |= (1 << 4);
 506        if (1 == 1)
 507                value |= 1;
 508        switch ((ch->u.ofdm.hierarchy_information == 0 || 1 == 1) ? ch->u.ofdm.code_rate_HP : ch->u.ofdm.code_rate_LP) {
 509                case FEC_2_3: value |= (2 << 1); break;
 510                case FEC_3_4: value |= (3 << 1); break;
 511                case FEC_5_6: value |= (5 << 1); break;
 512                case FEC_7_8: value |= (7 << 1); break;
 513                default:
 514                case FEC_1_2: value |= (1 << 1); break;
 515        }
 516        dib3000mc_write_word(state, 181, value);
 517
 518        // diversity synchro delay add 50% SFN margin
 519        switch (ch->u.ofdm.transmission_mode) {
 520                case TRANSMISSION_MODE_8K: value = 256; break;
 521                case TRANSMISSION_MODE_2K:
 522                default: value = 64; break;
 523        }
 524        switch (ch->u.ofdm.guard_interval) {
 525                case GUARD_INTERVAL_1_16: value *= 2; break;
 526                case GUARD_INTERVAL_1_8:  value *= 4; break;
 527                case GUARD_INTERVAL_1_4:  value *= 8; break;
 528                default:
 529                case GUARD_INTERVAL_1_32: value *= 1; break;
 530        }
 531        value <<= 4;
 532        value |= dib3000mc_read_word(state, 180) & 0x000f;
 533        dib3000mc_write_word(state, 180, value);
 534
 535        // restart demod
 536        value = dib3000mc_read_word(state, 0);
 537        dib3000mc_write_word(state, 0, value | (1 << 9));
 538        dib3000mc_write_word(state, 0, value);
 539
 540        msleep(30);
 541
 542        dib3000mc_set_impulse_noise(state, state->cfg->impulse_noise_mode, ch->u.ofdm.transmission_mode);
 543}
 544
 545static int dib3000mc_autosearch_start(struct dvb_frontend *demod, struct dvb_frontend_parameters *chan)
 546{
 547        struct dib3000mc_state *state = demod->demodulator_priv;
 548        u16 reg;
 549//      u32 val;
 550        struct dvb_frontend_parameters schan;
 551
 552        schan = *chan;
 553
 554        /* TODO what is that ? */
 555
 556        /* a channel for autosearch */
 557        schan.u.ofdm.transmission_mode = TRANSMISSION_MODE_8K;
 558        schan.u.ofdm.guard_interval = GUARD_INTERVAL_1_32;
 559        schan.u.ofdm.constellation = QAM_64;
 560        schan.u.ofdm.code_rate_HP = FEC_2_3;
 561        schan.u.ofdm.code_rate_LP = FEC_2_3;
 562        schan.u.ofdm.hierarchy_information = 0;
 563
 564        dib3000mc_set_channel_cfg(state, &schan, 11);
 565
 566        reg = dib3000mc_read_word(state, 0);
 567        dib3000mc_write_word(state, 0, reg | (1 << 8));
 568        dib3000mc_read_word(state, 511);
 569        dib3000mc_write_word(state, 0, reg);
 570
 571        return 0;
 572}
 573
 574static int dib3000mc_autosearch_is_irq(struct dvb_frontend *demod)
 575{
 576        struct dib3000mc_state *state = demod->demodulator_priv;
 577        u16 irq_pending = dib3000mc_read_word(state, 511);
 578
 579        if (irq_pending & 0x1) // failed
 580                return 1;
 581
 582        if (irq_pending & 0x2) // succeeded
 583                return 2;
 584
 585        return 0; // still pending
 586}
 587
 588static int dib3000mc_tune(struct dvb_frontend *demod, struct dvb_frontend_parameters *ch)
 589{
 590        struct dib3000mc_state *state = demod->demodulator_priv;
 591
 592        // ** configure demod **
 593        dib3000mc_set_channel_cfg(state, ch, 0);
 594
 595        // activates isi
 596        if (state->sfn_workaround_active) {
 597                dprintk("SFN workaround is active\n");
 598                dib3000mc_write_word(state, 29, 0x1273);
 599                dib3000mc_write_word(state, 108, 0x4000); // P_pha3_force_pha_shift
 600        } else {
 601                dib3000mc_write_word(state, 29, 0x1073);
 602                dib3000mc_write_word(state, 108, 0x0000); // P_pha3_force_pha_shift
 603        }
 604
 605        dib3000mc_set_adp_cfg(state, (u8)ch->u.ofdm.constellation);
 606        if (ch->u.ofdm.transmission_mode == TRANSMISSION_MODE_8K) {
 607                dib3000mc_write_word(state, 26, 38528);
 608                dib3000mc_write_word(state, 33, 8);
 609        } else {
 610                dib3000mc_write_word(state, 26, 30336);
 611                dib3000mc_write_word(state, 33, 6);
 612        }
 613
 614        if (dib3000mc_read_word(state, 509) & 0x80)
 615                dib3000mc_set_timing(state, ch->u.ofdm.transmission_mode, BANDWIDTH_TO_KHZ(ch->u.ofdm.bandwidth), 1);
 616
 617        return 0;
 618}
 619
 620struct i2c_adapter * dib3000mc_get_tuner_i2c_master(struct dvb_frontend *demod, int gating)
 621{
 622        struct dib3000mc_state *st = demod->demodulator_priv;
 623        return dibx000_get_i2c_adapter(&st->i2c_master, DIBX000_I2C_INTERFACE_TUNER, gating);
 624}
 625
 626EXPORT_SYMBOL(dib3000mc_get_tuner_i2c_master);
 627
 628static int dib3000mc_get_frontend(struct dvb_frontend* fe,
 629                                struct dvb_frontend_parameters *fep)
 630{
 631        struct dib3000mc_state *state = fe->demodulator_priv;
 632        u16 tps = dib3000mc_read_word(state,458);
 633
 634        fep->inversion = INVERSION_AUTO;
 635
 636        fep->u.ofdm.bandwidth = state->current_bandwidth;
 637
 638        switch ((tps >> 8) & 0x1) {
 639                case 0: fep->u.ofdm.transmission_mode = TRANSMISSION_MODE_2K; break;
 640                case 1: fep->u.ofdm.transmission_mode = TRANSMISSION_MODE_8K; break;
 641        }
 642
 643        switch (tps & 0x3) {
 644                case 0: fep->u.ofdm.guard_interval = GUARD_INTERVAL_1_32; break;
 645                case 1: fep->u.ofdm.guard_interval = GUARD_INTERVAL_1_16; break;
 646                case 2: fep->u.ofdm.guard_interval = GUARD_INTERVAL_1_8; break;
 647                case 3: fep->u.ofdm.guard_interval = GUARD_INTERVAL_1_4; break;
 648        }
 649
 650        switch ((tps >> 13) & 0x3) {
 651                case 0: fep->u.ofdm.constellation = QPSK; break;
 652                case 1: fep->u.ofdm.constellation = QAM_16; break;
 653                case 2:
 654                default: fep->u.ofdm.constellation = QAM_64; break;
 655        }
 656
 657        /* as long as the frontend_param structure is fixed for hierarchical transmission I refuse to use it */
 658        /* (tps >> 12) & 0x1 == hrch is used, (tps >> 9) & 0x7 == alpha */
 659
 660        fep->u.ofdm.hierarchy_information = HIERARCHY_NONE;
 661        switch ((tps >> 5) & 0x7) {
 662                case 1: fep->u.ofdm.code_rate_HP = FEC_1_2; break;
 663                case 2: fep->u.ofdm.code_rate_HP = FEC_2_3; break;
 664                case 3: fep->u.ofdm.code_rate_HP = FEC_3_4; break;
 665                case 5: fep->u.ofdm.code_rate_HP = FEC_5_6; break;
 666                case 7:
 667                default: fep->u.ofdm.code_rate_HP = FEC_7_8; break;
 668
 669        }
 670
 671        switch ((tps >> 2) & 0x7) {
 672                case 1: fep->u.ofdm.code_rate_LP = FEC_1_2; break;
 673                case 2: fep->u.ofdm.code_rate_LP = FEC_2_3; break;
 674                case 3: fep->u.ofdm.code_rate_LP = FEC_3_4; break;
 675                case 5: fep->u.ofdm.code_rate_LP = FEC_5_6; break;
 676                case 7:
 677                default: fep->u.ofdm.code_rate_LP = FEC_7_8; break;
 678        }
 679
 680        return 0;
 681}
 682
 683static int dib3000mc_set_frontend(struct dvb_frontend* fe,
 684                                struct dvb_frontend_parameters *fep)
 685{
 686        struct dib3000mc_state *state = fe->demodulator_priv;
 687    int ret;
 688
 689        dib3000mc_set_output_mode(state, OUTMODE_HIGH_Z);
 690
 691        state->current_bandwidth = fep->u.ofdm.bandwidth;
 692        dib3000mc_set_bandwidth(state, BANDWIDTH_TO_KHZ(fep->u.ofdm.bandwidth));
 693
 694        /* maybe the parameter has been changed */
 695        state->sfn_workaround_active = buggy_sfn_workaround;
 696
 697        if (fe->ops.tuner_ops.set_params) {
 698                fe->ops.tuner_ops.set_params(fe, fep);
 699                msleep(100);
 700        }
 701
 702        if (fep->u.ofdm.transmission_mode == TRANSMISSION_MODE_AUTO ||
 703                fep->u.ofdm.guard_interval    == GUARD_INTERVAL_AUTO ||
 704                fep->u.ofdm.constellation     == QAM_AUTO ||
 705                fep->u.ofdm.code_rate_HP      == FEC_AUTO) {
 706                int i = 1000, found;
 707
 708                dib3000mc_autosearch_start(fe, fep);
 709                do {
 710                        msleep(1);
 711                        found = dib3000mc_autosearch_is_irq(fe);
 712                } while (found == 0 && i--);
 713
 714                dprintk("autosearch returns: %d\n",found);
 715                if (found == 0 || found == 1)
 716                        return 0; // no channel found
 717
 718                dib3000mc_get_frontend(fe, fep);
 719        }
 720
 721    ret = dib3000mc_tune(fe, fep);
 722
 723        /* make this a config parameter */
 724        dib3000mc_set_output_mode(state, OUTMODE_MPEG2_FIFO);
 725    return ret;
 726}
 727
 728static int dib3000mc_read_status(struct dvb_frontend *fe, fe_status_t *stat)
 729{
 730        struct dib3000mc_state *state = fe->demodulator_priv;
 731        u16 lock = dib3000mc_read_word(state, 509);
 732
 733        *stat = 0;
 734
 735        if (lock & 0x8000)
 736                *stat |= FE_HAS_SIGNAL;
 737        if (lock & 0x3000)
 738                *stat |= FE_HAS_CARRIER;
 739        if (lock & 0x0100)
 740                *stat |= FE_HAS_VITERBI;
 741        if (lock & 0x0010)
 742                *stat |= FE_HAS_SYNC;
 743        if (lock & 0x0008)
 744                *stat |= FE_HAS_LOCK;
 745
 746        return 0;
 747}
 748
 749static int dib3000mc_read_ber(struct dvb_frontend *fe, u32 *ber)
 750{
 751        struct dib3000mc_state *state = fe->demodulator_priv;
 752        *ber = (dib3000mc_read_word(state, 500) << 16) | dib3000mc_read_word(state, 501);
 753        return 0;
 754}
 755
 756static int dib3000mc_read_unc_blocks(struct dvb_frontend *fe, u32 *unc)
 757{
 758        struct dib3000mc_state *state = fe->demodulator_priv;
 759        *unc = dib3000mc_read_word(state, 508);
 760        return 0;
 761}
 762
 763static int dib3000mc_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
 764{
 765        struct dib3000mc_state *state = fe->demodulator_priv;
 766        u16 val = dib3000mc_read_word(state, 392);
 767        *strength = 65535 - val;
 768        return 0;
 769}
 770
 771static int dib3000mc_read_snr(struct dvb_frontend* fe, u16 *snr)
 772{
 773        *snr = 0x0000;
 774        return 0;
 775}
 776
 777static int dib3000mc_fe_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings *tune)
 778{
 779        tune->min_delay_ms = 1000;
 780        return 0;
 781}
 782
 783static void dib3000mc_release(struct dvb_frontend *fe)
 784{
 785        struct dib3000mc_state *state = fe->demodulator_priv;
 786        dibx000_exit_i2c_master(&state->i2c_master);
 787        kfree(state);
 788}
 789
 790int dib3000mc_pid_control(struct dvb_frontend *fe, int index, int pid,int onoff)
 791{
 792        struct dib3000mc_state *state = fe->demodulator_priv;
 793        dib3000mc_write_word(state, 212 + index,  onoff ? (1 << 13) | pid : 0);
 794        return 0;
 795}
 796EXPORT_SYMBOL(dib3000mc_pid_control);
 797
 798int dib3000mc_pid_parse(struct dvb_frontend *fe, int onoff)
 799{
 800        struct dib3000mc_state *state = fe->demodulator_priv;
 801        u16 tmp = dib3000mc_read_word(state, 206) & ~(1 << 4);
 802        tmp |= (onoff << 4);
 803        return dib3000mc_write_word(state, 206, tmp);
 804}
 805EXPORT_SYMBOL(dib3000mc_pid_parse);
 806
 807void dib3000mc_set_config(struct dvb_frontend *fe, struct dib3000mc_config *cfg)
 808{
 809        struct dib3000mc_state *state = fe->demodulator_priv;
 810        state->cfg = cfg;
 811}
 812EXPORT_SYMBOL(dib3000mc_set_config);
 813
 814int dib3000mc_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, struct dib3000mc_config cfg[])
 815{
 816        struct dib3000mc_state st = { .i2c_adap = i2c };
 817        int k;
 818        u8 new_addr;
 819
 820        static u8 DIB3000MC_I2C_ADDRESS[] = {20,22,24,26};
 821
 822        for (k = no_of_demods-1; k >= 0; k--) {
 823                st.cfg = &cfg[k];
 824
 825                /* designated i2c address */
 826                new_addr          = DIB3000MC_I2C_ADDRESS[k];
 827                st.i2c_addr = new_addr;
 828                if (dib3000mc_identify(&st) != 0) {
 829                        st.i2c_addr = default_addr;
 830                        if (dib3000mc_identify(&st) != 0) {
 831                                dprintk("-E-  DiB3000P/MC #%d: not identified\n", k);
 832                                return -ENODEV;
 833                        }
 834                }
 835
 836                dib3000mc_set_output_mode(&st, OUTMODE_MPEG2_PAR_CONT_CLK);
 837
 838                // set new i2c address and force divstr (Bit 1) to value 0 (Bit 0)
 839                dib3000mc_write_word(&st, 1024, (new_addr << 3) | 0x1);
 840                st.i2c_addr = new_addr;
 841        }
 842
 843        for (k = 0; k < no_of_demods; k++) {
 844                st.cfg = &cfg[k];
 845                st.i2c_addr = DIB3000MC_I2C_ADDRESS[k];
 846
 847                dib3000mc_write_word(&st, 1024, st.i2c_addr << 3);
 848
 849                /* turn off data output */
 850                dib3000mc_set_output_mode(&st, OUTMODE_HIGH_Z);
 851        }
 852        return 0;
 853}
 854EXPORT_SYMBOL(dib3000mc_i2c_enumeration);
 855
 856static struct dvb_frontend_ops dib3000mc_ops;
 857
 858struct dvb_frontend * dib3000mc_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib3000mc_config *cfg)
 859{
 860        struct dvb_frontend *demod;
 861        struct dib3000mc_state *st;
 862        st = kzalloc(sizeof(struct dib3000mc_state), GFP_KERNEL);
 863        if (st == NULL)
 864                return NULL;
 865
 866        st->cfg = cfg;
 867        st->i2c_adap = i2c_adap;
 868        st->i2c_addr = i2c_addr;
 869
 870        demod                   = &st->demod;
 871        demod->demodulator_priv = st;
 872        memcpy(&st->demod.ops, &dib3000mc_ops, sizeof(struct dvb_frontend_ops));
 873
 874        if (dib3000mc_identify(st) != 0)
 875                goto error;
 876
 877        dibx000_init_i2c_master(&st->i2c_master, DIB3000MC, st->i2c_adap, st->i2c_addr);
 878
 879        dib3000mc_write_word(st, 1037, 0x3130);
 880
 881        return demod;
 882
 883error:
 884        kfree(st);
 885        return NULL;
 886}
 887EXPORT_SYMBOL(dib3000mc_attach);
 888
 889static struct dvb_frontend_ops dib3000mc_ops = {
 890        .info = {
 891                .name = "DiBcom 3000MC/P",
 892                .type = FE_OFDM,
 893                .frequency_min      = 44250000,
 894                .frequency_max      = 867250000,
 895                .frequency_stepsize = 62500,
 896                .caps = FE_CAN_INVERSION_AUTO |
 897                        FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
 898                        FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
 899                        FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
 900                        FE_CAN_TRANSMISSION_MODE_AUTO |
 901                        FE_CAN_GUARD_INTERVAL_AUTO |
 902                        FE_CAN_RECOVER |
 903                        FE_CAN_HIERARCHY_AUTO,
 904        },
 905
 906        .release              = dib3000mc_release,
 907
 908        .init                 = dib3000mc_init,
 909        .sleep                = dib3000mc_sleep,
 910
 911        .set_frontend         = dib3000mc_set_frontend,
 912        .get_tune_settings    = dib3000mc_fe_get_tune_settings,
 913        .get_frontend         = dib3000mc_get_frontend,
 914
 915        .read_status          = dib3000mc_read_status,
 916        .read_ber             = dib3000mc_read_ber,
 917        .read_signal_strength = dib3000mc_read_signal_strength,
 918        .read_snr             = dib3000mc_read_snr,
 919        .read_ucblocks        = dib3000mc_read_unc_blocks,
 920};
 921
 922MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");
 923MODULE_DESCRIPTION("Driver for the DiBcom 3000MC/P COFDM demodulator");
 924MODULE_LICENSE("GPL");
 925