2  * Driver for DiBcom DiB3000MC/P-demodulator.
 
   4  * Copyright (C) 2004-6 DiBcom (http://www.dibcom.fr/)
 
   5  * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de)
 
   7  * This code is partially based on the previous dib3000mc.c .
 
   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.
 
  14 #include <linux/kernel.h>
 
  15 #include <linux/i2c.h>
 
  16 //#include <linux/init.h>
 
  17 //#include <linux/delay.h>
 
  18 //#include <linux/string.h>
 
  19 //#include <linux/slab.h>
 
  21 #include "dvb_frontend.h"
 
  23 #include "dib3000mc.h"
 
  26 module_param(debug, int, 0644);
 
  27 MODULE_PARM_DESC(debug, "turn on debugging (default: 0)");
 
  29 #define dprintk(args...) do { if (debug) { printk(KERN_DEBUG "DiB3000MC/P:"); printk(args); } } while (0)
 
  31 struct dib3000mc_state {
 
  32         struct dvb_frontend demod;
 
  33         struct dib3000mc_config *cfg;
 
  36         struct i2c_adapter *i2c_adap;
 
  38         struct dibx000_i2c_master i2c_master;
 
  42         fe_bandwidth_t current_bandwidth;
 
  47 static u16 dib3000mc_read_word(struct dib3000mc_state *state, u16 reg)
 
  49         u8 wb[2] = { (reg >> 8) | 0x80, reg & 0xff };
 
  51         struct i2c_msg msg[2] = {
 
  52                 { .addr = state->i2c_addr >> 1, .flags = 0,        .buf = wb, .len = 2 },
 
  53                 { .addr = state->i2c_addr >> 1, .flags = I2C_M_RD, .buf = rb, .len = 2 },
 
  56         if (i2c_transfer(state->i2c_adap, msg, 2) != 2)
 
  57                 dprintk("i2c read error on %d\n",reg);
 
  59         return (rb[0] << 8) | rb[1];
 
  62 static int dib3000mc_write_word(struct dib3000mc_state *state, u16 reg, u16 val)
 
  65                 (reg >> 8) & 0xff, reg & 0xff,
 
  66                 (val >> 8) & 0xff, val & 0xff,
 
  68         struct i2c_msg msg = {
 
  69                 .addr = state->i2c_addr >> 1, .flags = 0, .buf = b, .len = 4
 
  71         return i2c_transfer(state->i2c_adap, &msg, 1) != 1 ? -EREMOTEIO : 0;
 
  75 static int dib3000mc_identify(struct dib3000mc_state *state)
 
  78         if ((value = dib3000mc_read_word(state, 1025)) != 0x01b3) {
 
  79                 dprintk("-E-  DiB3000MC/P: wrong Vendor ID (read=0x%x)\n",value);
 
  83         value = dib3000mc_read_word(state, 1026);
 
  84         if (value != 0x3001 && value != 0x3002) {
 
  85                 dprintk("-E-  DiB3000MC/P: wrong Device ID (%x)\n",value);
 
  88         state->dev_id = value;
 
  90         dprintk("-I-  found DiB3000MC/P: %x\n",state->dev_id);
 
  95 static int dib3000mc_set_timing(struct dib3000mc_state *state, s16 nfft, u8 bw, u8 update_offset)
 
  99         if (state->timf == 0) {
 
 100                 timf = 1384402; // default value for 8MHz
 
 102                         msleep(200); // first time we do an update
 
 106         timf *= (BW_INDEX_TO_KHZ(bw) / 1000);
 
 109                 s16 tim_offs = dib3000mc_read_word(state, 416);
 
 111                 if (tim_offs &  0x2000)
 
 118                 state->timf = timf / (BW_INDEX_TO_KHZ(bw) / 1000);
 
 121         dprintk("timf: %d\n", timf);
 
 123         dib3000mc_write_word(state, 23, timf >> 16);
 
 124         dib3000mc_write_word(state, 24, timf & 0xffff);
 
 129 static int dib3000mc_setup_pwm_state(struct dib3000mc_state *state)
 
 131         u16 reg_51, reg_52 = state->cfg->agc->setup & 0xfefb;
 
 132     if (state->cfg->pwm3_inversion) {
 
 133                 reg_51 =  (2 << 14) | (0 << 10) | (7 << 6) | (2 << 2) | (2 << 0);
 
 136                 reg_51 = (2 << 14) | (4 << 10) | (7 << 6) | (2 << 2) | (2 << 0);
 
 139         dib3000mc_write_word(state, 51, reg_51);
 
 140         dib3000mc_write_word(state, 52, reg_52);
 
 142     if (state->cfg->use_pwm3)
 
 143                 dib3000mc_write_word(state, 245, (1 << 3) | (1 << 0));
 
 145                 dib3000mc_write_word(state, 245, 0);
 
 147     dib3000mc_write_word(state, 1040, 0x3);
 
 151 static int dib3000mc_set_output_mode(struct dib3000mc_state *state, int mode)
 
 154         u16 fifo_threshold = 1792;
 
 158         u16 smo_reg = dib3000mc_read_word(state, 206) & 0x0010; /* keep the pid_parse bit */
 
 160         dprintk("-I-  Setting output mode for demod %p to %d\n",
 
 161                         &state->demod, mode);
 
 164                 case OUTMODE_HIGH_Z:  // disable
 
 167                 case OUTMODE_MPEG2_PAR_GATED_CLK:   // STBs with parallel gated clock
 
 170                 case OUTMODE_MPEG2_PAR_CONT_CLK:    // STBs with parallel continues clock
 
 173                 case OUTMODE_MPEG2_SERIAL:          // STBs with serial input
 
 176                 case OUTMODE_MPEG2_FIFO:            // e.g. USB feeding
 
 179                         P_smo_error_discard  [1;6:6] = 0
 
 180                         P_smo_rs_discard     [1;5:5] = 0
 
 181                         P_smo_pid_parse      [1;4:4] = 0
 
 182                         P_smo_fifo_flush     [1;3:3] = 0
 
 183                         P_smo_mode           [2;2:1] = 11
 
 184                         P_smo_ovf_prot       [1;0:0] = 0
 
 187                         fifo_threshold = 512;
 
 190                 case OUTMODE_DIVERSITY:
 
 195                         dprintk("Unhandled output_mode passed to be set for demod %p\n",&state->demod);
 
 200         if ((state->cfg->output_mpeg2_in_188_bytes))
 
 201                 smo_reg |= (1 << 5); // P_smo_rs_discard     [1;5:5] = 1
 
 203         outreg = dib3000mc_read_word(state, 244) & 0x07FF;
 
 204         outreg |= (outmode << 11);
 
 205         ret |= dib3000mc_write_word(state,  244, outreg);
 
 206         ret |= dib3000mc_write_word(state,  206, smo_reg);   /*smo_ mode*/
 
 207         ret |= dib3000mc_write_word(state,  207, fifo_threshold); /* synchronous fread */
 
 208         ret |= dib3000mc_write_word(state, 1040, elecout);         /* P_out_cfg */
 
 212 static int dib3000mc_set_bandwidth(struct dvb_frontend *demod, u8 bw)
 
 214         struct dib3000mc_state *state = demod->demodulator_priv;
 
 215         u16 bw_cfg[6] = { 0 };
 
 216         u16 imp_bw_cfg[3] = { 0 };
 
 219 /* settings here are for 27.7MHz */
 
 221                 case BANDWIDTH_8_MHZ:
 
 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;
 
 226                 case BANDWIDTH_7_MHZ:
 
 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;
 
 231                 case BANDWIDTH_6_MHZ:
 
 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;
 
 236                 case 255 /* BANDWIDTH_5_MHZ */:
 
 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;
 
 241                 default: return -EINVAL;
 
 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);
 
 253         dib3000mc_write_word(state, 18, 0x0393);
 
 254         dib3000mc_write_word(state, 19, 0x8700);
 
 256         for (reg = 55; reg < 58; reg++)
 
 257                 dib3000mc_write_word(state, reg, imp_bw_cfg[reg - 55]);
 
 259         // Timing configuration
 
 260         dib3000mc_set_timing(state, 0, bw, 0);
 
 265 static u16 impulse_noise_val[29] =
 
 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
 
 273 static void dib3000mc_set_impulse_noise(struct dib3000mc_state *state, u8 mode, s16 nfft)
 
 276         for (i = 58; i < 87; i++)
 
 277                 dib3000mc_write_word(state, i, impulse_noise_val[i-58]);
 
 280                 dib3000mc_write_word(state, 58, 0x3b);
 
 281                 dib3000mc_write_word(state, 84, 0x00);
 
 282                 dib3000mc_write_word(state, 85, 0x8200);
 
 285         dib3000mc_write_word(state, 34, 0x1294);
 
 286         dib3000mc_write_word(state, 35, 0x1ff8);
 
 288                 dib3000mc_write_word(state, 55, dib3000mc_read_word(state, 55) | (1 << 10));
 
 291 static int dib3000mc_init(struct dvb_frontend *demod)
 
 293         struct dib3000mc_state *state = demod->demodulator_priv;
 
 294         struct dibx000_agc_config *agc = state->cfg->agc;
 
 296         // Restart Configuration
 
 297         dib3000mc_write_word(state, 1027, 0x8000);
 
 298         dib3000mc_write_word(state, 1027, 0x0000);
 
 300         // power up the demod + mobility configuration
 
 301         dib3000mc_write_word(state, 140, 0x0000);
 
 302         dib3000mc_write_word(state, 1031, 0);
 
 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);
 
 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);
 
 315         dib3000mc_write_word(state, 1033, 0x0000);
 
 318         dib3000mc_write_word(state, 1037, 0x3130);
 
 320         // other configurations
 
 323         dib3000mc_write_word(state, 33, (5 << 0));
 
 324         dib3000mc_write_word(state, 88, (1 << 10) | (0x10 << 0));
 
 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));
 
 330         if (state->cfg->phase_noise_mode == 0)
 
 331                 dib3000mc_write_word(state, 111, 0x00);
 
 333                 dib3000mc_write_word(state, 111, 0x02);
 
 336         dib3000mc_write_word(state, 50, 0x8000);
 
 339         dib3000mc_setup_pwm_state(state);
 
 341         // P_agc_counter_lock
 
 342         dib3000mc_write_word(state, 53, 0x87);
 
 343         // P_agc_counter_unlock
 
 344         dib3000mc_write_word(state, 54, 0x87);
 
 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);
 
 353         dib3000mc_write_word(state, 40, 0x0179);
 
 354         dib3000mc_write_word(state, 41, 0x03f0);
 
 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);
 
 365 // Begin: TimeOut registers
 
 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);
 
 371         dib3000mc_write_word(state, 1, 4);
 
 373         dib3000mc_write_word(state, 2, 4);
 
 375         dib3000mc_write_word(state, 3, 0x1000);
 
 376         // P_search_maxtrial=1
 
 377         dib3000mc_write_word(state, 5, 1);
 
 379         dib3000mc_set_bandwidth(&state->demod, BANDWIDTH_8_MHZ);
 
 382         dib3000mc_write_word(state,  4, 0x814);
 
 384         dib3000mc_write_word(state, 21, (1 << 9) | 0x164);
 
 385         dib3000mc_write_word(state, 22, 0x463d);
 
 388         // P_cspu_regul, P_cspu_win_cut
 
 389         dib3000mc_write_word(state, 120, 0x200f);
 
 391         dib3000mc_write_word(state, 134, 0);
 
 394         dib3000mc_write_word(state, 195, 0x10);
 
 396         // diversity register: P_dvsy_sync_wait..
 
 397         dib3000mc_write_word(state, 180, 0x2FF0);
 
 399         // Impulse noise configuration
 
 400         dib3000mc_set_impulse_noise(state, 0, 1);
 
 402         // output mode set-up
 
 403         dib3000mc_set_output_mode(state, OUTMODE_HIGH_Z);
 
 405         /* close the i2c-gate */
 
 406         dib3000mc_write_word(state, 769, (1 << 7) );
 
 411 static int dib3000mc_sleep(struct dvb_frontend *demod)
 
 413         struct dib3000mc_state *state = demod->demodulator_priv;
 
 415         dib3000mc_write_word(state, 1031, 0xFFFF);
 
 416         dib3000mc_write_word(state, 1032, 0xFFFF);
 
 417         dib3000mc_write_word(state, 1033, 0xFFF0);
 
 422 static void dib3000mc_set_adp_cfg(struct dib3000mc_state *state, s16 qam)
 
 424         u16 cfg[4] = { 0 },reg;
 
 427                         cfg[0] = 0x099a; cfg[1] = 0x7fae; cfg[2] = 0x0333; cfg[3] = 0x7ff0;
 
 430                         cfg[0] = 0x023d; cfg[1] = 0x7fdf; cfg[2] = 0x00a4; cfg[3] = 0x7ff0;
 
 433                         cfg[0] = 0x0148; cfg[1] = 0x7ff0; cfg[2] = 0x00a4; cfg[3] = 0x7ff8;
 
 436         for (reg = 129; reg < 133; reg++)
 
 437                 dib3000mc_write_word(state, reg, cfg[reg - 129]);
 
 440 static void dib3000mc_set_channel_cfg(struct dib3000mc_state *state, struct dibx000_ofdm_channel *chan, u16 seq)
 
 444         dib3000mc_set_timing(state, chan->nfft, chan->Bw, 0);
 
 447 //              dib3000mc_write_word(state, 100, (11 << 6) + 6);
 
 449                 dib3000mc_write_word(state, 100, (16 << 6) + 9);
 
 451         dib3000mc_write_word(state, 1027, 0x0800);
 
 452         dib3000mc_write_word(state, 1027, 0x0000);
 
 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, 1);
 
 459         dib3000mc_write_word(state, 133,  15564);
 
 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);
 
 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);
 
 473         dib3000mc_set_impulse_noise(state, 0, chan->nfft);
 
 475         tmp = ((chan->nfft & 0x1) << 7) | (chan->guard << 5) | (chan->nqam << 3) | chan->vit_alpha;
 
 476         dib3000mc_write_word(state, 0, tmp);
 
 478         dib3000mc_write_word(state, 5, (1 << 8) | ((seq & 0xf) << 4));
 
 480         tmp = (chan->vit_hrch << 4) | (chan->vit_select_hp);
 
 481         if (!chan->vit_hrch || (chan->vit_hrch && chan->vit_select_hp))
 
 482                 tmp |= chan->vit_code_rate_hp << 1;
 
 484                 tmp |= chan->vit_code_rate_lp << 1;
 
 485         dib3000mc_write_word(state, 181, tmp);
 
 487         // diversity synchro delay
 
 488         tmp = dib3000mc_read_word(state, 180) & 0x000f;
 
 489         tmp |= ((chan->nfft == 0) ? 64 : 256) * ((1 << (chan->guard)) * 3 / 2) << 4; // add 50% SFN margin
 
 490         dib3000mc_write_word(state, 180, tmp);
 
 493         tmp = dib3000mc_read_word(state, 0);
 
 494         dib3000mc_write_word(state, 0, tmp | (1 << 9));
 
 495         dib3000mc_write_word(state, 0, tmp);
 
 499         dib3000mc_set_impulse_noise(state, state->cfg->impulse_noise_mode, chan->nfft);
 
 502 static int dib3000mc_autosearch_start(struct dvb_frontend *demod, struct dibx000_ofdm_channel *chan)
 
 504         struct dib3000mc_state *state = demod->demodulator_priv;
 
 507         struct dibx000_ofdm_channel fchan;
 
 509         INIT_OFDM_CHANNEL(&fchan);
 
 513         /* a channel for autosearch */
 
 514         fchan.nfft = 1; fchan.guard = 0; fchan.nqam = 2;
 
 515         fchan.vit_alpha = 1; fchan.vit_code_rate_hp = 2; fchan.vit_code_rate_lp = 2;
 
 516         fchan.vit_hrch = 0; fchan.vit_select_hp = 1;
 
 518         dib3000mc_set_channel_cfg(state, &fchan, 11);
 
 520         reg = dib3000mc_read_word(state, 0);
 
 521         dib3000mc_write_word(state, 0, reg | (1 << 8));
 
 522         dib3000mc_read_word(state, 511);
 
 523         dib3000mc_write_word(state, 0, reg);
 
 528 static int dib3000mc_autosearch_is_irq(struct dvb_frontend *demod)
 
 530         struct dib3000mc_state *state = demod->demodulator_priv;
 
 531         u16 irq_pending = dib3000mc_read_word(state, 511);
 
 533         if (irq_pending & 0x1) // failed
 
 536         if (irq_pending & 0x2) // succeeded
 
 539         return 0; // still pending
 
 542 static int dib3000mc_tune(struct dvb_frontend *demod, struct dibx000_ofdm_channel *ch)
 
 544         struct dib3000mc_state *state = demod->demodulator_priv;
 
 546         // ** configure demod **
 
 547         dib3000mc_set_channel_cfg(state, ch, 0);
 
 550         dib3000mc_write_word(state, 29, 0x1073);
 
 552         dib3000mc_set_adp_cfg(state, (u8)ch->nqam);
 
 555                 dib3000mc_write_word(state, 26, 38528);
 
 556                 dib3000mc_write_word(state, 33, 8);
 
 558                 dib3000mc_write_word(state, 26, 30336);
 
 559                 dib3000mc_write_word(state, 33, 6);
 
 562         if (dib3000mc_read_word(state, 509) & 0x80)
 
 563                 dib3000mc_set_timing(state, ch->nfft, ch->Bw, 1);
 
 568 struct i2c_adapter * dib3000mc_get_tuner_i2c_master(struct dvb_frontend *demod, int gating)
 
 570         struct dib3000mc_state *st = demod->demodulator_priv;
 
 571         return dibx000_get_i2c_adapter(&st->i2c_master, DIBX000_I2C_INTERFACE_TUNER, gating);
 
 574 EXPORT_SYMBOL(dib3000mc_get_tuner_i2c_master);
 
 576 static int dib3000mc_get_frontend(struct dvb_frontend* fe,
 
 577                                 struct dvb_frontend_parameters *fep)
 
 579         struct dib3000mc_state *state = fe->demodulator_priv;
 
 580         u16 tps = dib3000mc_read_word(state,458);
 
 582         fep->inversion = INVERSION_AUTO;
 
 584         fep->u.ofdm.bandwidth = state->current_bandwidth;
 
 586         switch ((tps >> 8) & 0x1) {
 
 587                 case 0: fep->u.ofdm.transmission_mode = TRANSMISSION_MODE_2K; break;
 
 588                 case 1: fep->u.ofdm.transmission_mode = TRANSMISSION_MODE_8K; break;
 
 592                 case 0: fep->u.ofdm.guard_interval = GUARD_INTERVAL_1_32; break;
 
 593                 case 1: fep->u.ofdm.guard_interval = GUARD_INTERVAL_1_16; break;
 
 594                 case 2: fep->u.ofdm.guard_interval = GUARD_INTERVAL_1_8; break;
 
 595                 case 3: fep->u.ofdm.guard_interval = GUARD_INTERVAL_1_4; break;
 
 598         switch ((tps >> 13) & 0x3) {
 
 599                 case 0: fep->u.ofdm.constellation = QPSK; break;
 
 600                 case 1: fep->u.ofdm.constellation = QAM_16; break;
 
 602                 default: fep->u.ofdm.constellation = QAM_64; break;
 
 605         /* as long as the frontend_param structure is fixed for hierarchical transmission I refuse to use it */
 
 606         /* (tps >> 12) & 0x1 == hrch is used, (tps >> 9) & 0x7 == alpha */
 
 608         fep->u.ofdm.hierarchy_information = HIERARCHY_NONE;
 
 609         switch ((tps >> 5) & 0x7) {
 
 610                 case 1: fep->u.ofdm.code_rate_HP = FEC_1_2; break;
 
 611                 case 2: fep->u.ofdm.code_rate_HP = FEC_2_3; break;
 
 612                 case 3: fep->u.ofdm.code_rate_HP = FEC_3_4; break;
 
 613                 case 5: fep->u.ofdm.code_rate_HP = FEC_5_6; break;
 
 615                 default: fep->u.ofdm.code_rate_HP = FEC_7_8; break;
 
 619         switch ((tps >> 2) & 0x7) {
 
 620                 case 1: fep->u.ofdm.code_rate_LP = FEC_1_2; break;
 
 621                 case 2: fep->u.ofdm.code_rate_LP = FEC_2_3; break;
 
 622                 case 3: fep->u.ofdm.code_rate_LP = FEC_3_4; break;
 
 623                 case 5: fep->u.ofdm.code_rate_LP = FEC_5_6; break;
 
 625                 default: fep->u.ofdm.code_rate_LP = FEC_7_8; break;
 
 631 static int dib3000mc_set_frontend(struct dvb_frontend* fe,
 
 632                                 struct dvb_frontend_parameters *fep)
 
 634         struct dib3000mc_state *state = fe->demodulator_priv;
 
 635         struct dibx000_ofdm_channel ch;
 
 637         INIT_OFDM_CHANNEL(&ch);
 
 640         state->current_bandwidth = fep->u.ofdm.bandwidth;
 
 641         dib3000mc_set_bandwidth(fe, fep->u.ofdm.bandwidth);
 
 643         if (fe->ops.tuner_ops.set_params) {
 
 644                 fe->ops.tuner_ops.set_params(fe, fep);
 
 648         if (fep->u.ofdm.transmission_mode == TRANSMISSION_MODE_AUTO ||
 
 649                 fep->u.ofdm.guard_interval    == GUARD_INTERVAL_AUTO ||
 
 650                 fep->u.ofdm.constellation     == QAM_AUTO ||
 
 651                 fep->u.ofdm.code_rate_HP      == FEC_AUTO) {
 
 654                 dib3000mc_autosearch_start(fe, &ch);
 
 657                         found = dib3000mc_autosearch_is_irq(fe);
 
 658                 } while (found == 0 && i--);
 
 660                 dprintk("autosearch returns: %d\n",found);
 
 661                 if (found == 0 || found == 1)
 
 662                         return 0; // no channel found
 
 664                 dib3000mc_get_frontend(fe, fep);
 
 668         /* make this a config parameter */
 
 669         dib3000mc_set_output_mode(state, OUTMODE_MPEG2_FIFO);
 
 671         return dib3000mc_tune(fe, &ch);
 
 674 static int dib3000mc_read_status(struct dvb_frontend *fe, fe_status_t *stat)
 
 676         struct dib3000mc_state *state = fe->demodulator_priv;
 
 677         u16 lock = dib3000mc_read_word(state, 509);
 
 682                 *stat |= FE_HAS_SIGNAL;
 
 684                 *stat |= FE_HAS_CARRIER;
 
 686                 *stat |= FE_HAS_VITERBI;
 
 688                 *stat |= FE_HAS_SYNC;
 
 690                 *stat |= FE_HAS_LOCK;
 
 695 static int dib3000mc_read_ber(struct dvb_frontend *fe, u32 *ber)
 
 697         struct dib3000mc_state *state = fe->demodulator_priv;
 
 698         *ber = (dib3000mc_read_word(state, 500) << 16) | dib3000mc_read_word(state, 501);
 
 702 static int dib3000mc_read_unc_blocks(struct dvb_frontend *fe, u32 *unc)
 
 704         struct dib3000mc_state *state = fe->demodulator_priv;
 
 705         *unc = dib3000mc_read_word(state, 508);
 
 709 static int dib3000mc_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
 
 711         struct dib3000mc_state *state = fe->demodulator_priv;
 
 712         u16 val = dib3000mc_read_word(state, 392);
 
 713         *strength = 65535 - val;
 
 717 static int dib3000mc_read_snr(struct dvb_frontend* fe, u16 *snr)
 
 723 static int dib3000mc_fe_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings *tune)
 
 725         tune->min_delay_ms = 1000;
 
 729 static void dib3000mc_release(struct dvb_frontend *fe)
 
 731         struct dib3000mc_state *state = fe->demodulator_priv;
 
 732         dibx000_exit_i2c_master(&state->i2c_master);
 
 736 int dib3000mc_pid_control(struct dvb_frontend *fe, int index, int pid,int onoff)
 
 738         struct dib3000mc_state *state = fe->demodulator_priv;
 
 739         dib3000mc_write_word(state, 212 + index,  onoff ? (1 << 13) | pid : 0);
 
 742 EXPORT_SYMBOL(dib3000mc_pid_control);
 
 744 int dib3000mc_pid_parse(struct dvb_frontend *fe, int onoff)
 
 746         struct dib3000mc_state *state = fe->demodulator_priv;
 
 747         u16 tmp = dib3000mc_read_word(state, 206) & ~(1 << 4);
 
 749         return dib3000mc_write_word(state, 206, tmp);
 
 751 EXPORT_SYMBOL(dib3000mc_pid_parse);
 
 753 void dib3000mc_set_config(struct dvb_frontend *fe, struct dib3000mc_config *cfg)
 
 755         struct dib3000mc_state *state = fe->demodulator_priv;
 
 758 EXPORT_SYMBOL(dib3000mc_set_config);
 
 760 int dib3000mc_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, struct dib3000mc_config cfg[])
 
 762         struct dib3000mc_state st = { .i2c_adap = i2c };
 
 766         static u8 DIB3000MC_I2C_ADDRESS[] = {20,22,24,26};
 
 768         for (k = no_of_demods-1; k >= 0; k--) {
 
 771                 /* designated i2c address */
 
 772                 new_addr          = DIB3000MC_I2C_ADDRESS[k];
 
 773                 st.i2c_addr = new_addr;
 
 774                 if (dib3000mc_identify(&st) != 0) {
 
 775                         st.i2c_addr = default_addr;
 
 776                         if (dib3000mc_identify(&st) != 0) {
 
 777                                 dprintk("-E-  DiB3000P/MC #%d: not identified\n", k);
 
 782                 dib3000mc_set_output_mode(&st, OUTMODE_MPEG2_PAR_CONT_CLK);
 
 784                 // set new i2c address and force divstr (Bit 1) to value 0 (Bit 0)
 
 785                 dib3000mc_write_word(&st, 1024, (new_addr << 3) | 0x1);
 
 786                 st.i2c_addr = new_addr;
 
 789         for (k = 0; k < no_of_demods; k++) {
 
 791                 st.i2c_addr = DIB3000MC_I2C_ADDRESS[k];
 
 793                 dib3000mc_write_word(&st, 1024, st.i2c_addr << 3);
 
 795                 /* turn off data output */
 
 796                 dib3000mc_set_output_mode(&st, OUTMODE_HIGH_Z);
 
 800 EXPORT_SYMBOL(dib3000mc_i2c_enumeration);
 
 802 static struct dvb_frontend_ops dib3000mc_ops;
 
 804 struct dvb_frontend * dib3000mc_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib3000mc_config *cfg)
 
 806         struct dvb_frontend *demod;
 
 807         struct dib3000mc_state *st;
 
 808         st = kzalloc(sizeof(struct dib3000mc_state), GFP_KERNEL);
 
 813         st->i2c_adap = i2c_adap;
 
 814         st->i2c_addr = i2c_addr;
 
 817         demod->demodulator_priv = st;
 
 818         memcpy(&st->demod.ops, &dib3000mc_ops, sizeof(struct dvb_frontend_ops));
 
 820         if (dib3000mc_identify(st) != 0)
 
 823         dibx000_init_i2c_master(&st->i2c_master, DIB3000MC, st->i2c_adap, st->i2c_addr);
 
 825         dib3000mc_write_word(st, 1037, 0x3130);
 
 833 EXPORT_SYMBOL(dib3000mc_attach);
 
 835 static struct dvb_frontend_ops dib3000mc_ops = {
 
 837                 .name = "DiBcom 3000MC/P",
 
 839                 .frequency_min      = 44250000,
 
 840                 .frequency_max      = 867250000,
 
 841                 .frequency_stepsize = 62500,
 
 842                 .caps = FE_CAN_INVERSION_AUTO |
 
 843                         FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
 
 844                         FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
 
 845                         FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
 
 846                         FE_CAN_TRANSMISSION_MODE_AUTO |
 
 847                         FE_CAN_GUARD_INTERVAL_AUTO |
 
 849                         FE_CAN_HIERARCHY_AUTO,
 
 852         .release              = dib3000mc_release,
 
 854         .init                 = dib3000mc_init,
 
 855         .sleep                = dib3000mc_sleep,
 
 857         .set_frontend         = dib3000mc_set_frontend,
 
 858         .get_tune_settings    = dib3000mc_fe_get_tune_settings,
 
 859         .get_frontend         = dib3000mc_get_frontend,
 
 861         .read_status          = dib3000mc_read_status,
 
 862         .read_ber             = dib3000mc_read_ber,
 
 863         .read_signal_strength = dib3000mc_read_signal_strength,
 
 864         .read_snr             = dib3000mc_read_snr,
 
 865         .read_ucblocks        = dib3000mc_read_unc_blocks,
 
 868 MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");
 
 869 MODULE_DESCRIPTION("Driver for the DiBcom 3000MC/P COFDM demodulator");
 
 870 MODULE_LICENSE("GPL");