0001
0002
0003
0004
0005
0006
0007
0008 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0009
0010 #include <linux/kernel.h>
0011 #include <linux/slab.h>
0012 #include <linux/i2c.h>
0013 #include <linux/mutex.h>
0014 #include <asm/div64.h>
0015
0016 #include <media/dvb_math.h>
0017 #include <media/dvb_frontend.h>
0018
0019 #include "dib7000p.h"
0020
0021 static int debug;
0022 module_param(debug, int, 0644);
0023 MODULE_PARM_DESC(debug, "turn on debugging (default: 0)");
0024
0025 static int buggy_sfn_workaround;
0026 module_param(buggy_sfn_workaround, int, 0644);
0027 MODULE_PARM_DESC(buggy_sfn_workaround, "Enable work-around for buggy SFNs (default: 0)");
0028
0029 #define dprintk(fmt, arg...) do { \
0030 if (debug) \
0031 printk(KERN_DEBUG pr_fmt("%s: " fmt), \
0032 __func__, ##arg); \
0033 } while (0)
0034
0035 struct i2c_device {
0036 struct i2c_adapter *i2c_adap;
0037 u8 i2c_addr;
0038 };
0039
0040 struct dib7000p_state {
0041 struct dvb_frontend demod;
0042 struct dib7000p_config cfg;
0043
0044 u8 i2c_addr;
0045 struct i2c_adapter *i2c_adap;
0046
0047 struct dibx000_i2c_master i2c_master;
0048
0049 u16 wbd_ref;
0050
0051 u8 current_band;
0052 u32 current_bandwidth;
0053 struct dibx000_agc_config *current_agc;
0054 u32 timf;
0055
0056 u8 div_force_off:1;
0057 u8 div_state:1;
0058 u16 div_sync_wait;
0059
0060 u8 agc_state;
0061
0062 u16 gpio_dir;
0063 u16 gpio_val;
0064
0065 u8 sfn_workaround_active:1;
0066
0067 #define SOC7090 0x7090
0068 u16 version;
0069
0070 u16 tuner_enable;
0071 struct i2c_adapter dib7090_tuner_adap;
0072
0073
0074 struct i2c_msg msg[2];
0075 u8 i2c_write_buffer[4];
0076 u8 i2c_read_buffer[2];
0077 struct mutex i2c_buffer_lock;
0078
0079 u8 input_mode_mpeg;
0080
0081
0082 s64 old_ucb;
0083 unsigned long per_jiffies_stats;
0084 unsigned long ber_jiffies_stats;
0085 unsigned long get_stats_time;
0086 };
0087
0088 enum dib7000p_power_mode {
0089 DIB7000P_POWER_ALL = 0,
0090 DIB7000P_POWER_ANALOG_ADC,
0091 DIB7000P_POWER_INTERFACE_ONLY,
0092 };
0093
0094
0095 static int dib7090_set_output_mode(struct dvb_frontend *fe, int mode);
0096 static int dib7090_set_diversity_in(struct dvb_frontend *fe, int onoff);
0097 static void dib7090_setDibTxMux(struct dib7000p_state *state, int mode);
0098 static void dib7090_setHostBusMux(struct dib7000p_state *state, int mode);
0099
0100 static u16 dib7000p_read_word(struct dib7000p_state *state, u16 reg)
0101 {
0102 u16 ret;
0103
0104 if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
0105 dprintk("could not acquire lock\n");
0106 return 0;
0107 }
0108
0109 state->i2c_write_buffer[0] = reg >> 8;
0110 state->i2c_write_buffer[1] = reg & 0xff;
0111
0112 memset(state->msg, 0, 2 * sizeof(struct i2c_msg));
0113 state->msg[0].addr = state->i2c_addr >> 1;
0114 state->msg[0].flags = 0;
0115 state->msg[0].buf = state->i2c_write_buffer;
0116 state->msg[0].len = 2;
0117 state->msg[1].addr = state->i2c_addr >> 1;
0118 state->msg[1].flags = I2C_M_RD;
0119 state->msg[1].buf = state->i2c_read_buffer;
0120 state->msg[1].len = 2;
0121
0122 if (i2c_transfer(state->i2c_adap, state->msg, 2) != 2)
0123 dprintk("i2c read error on %d\n", reg);
0124
0125 ret = (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
0126 mutex_unlock(&state->i2c_buffer_lock);
0127 return ret;
0128 }
0129
0130 static int dib7000p_write_word(struct dib7000p_state *state, u16 reg, u16 val)
0131 {
0132 int ret;
0133
0134 if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
0135 dprintk("could not acquire lock\n");
0136 return -EINVAL;
0137 }
0138
0139 state->i2c_write_buffer[0] = (reg >> 8) & 0xff;
0140 state->i2c_write_buffer[1] = reg & 0xff;
0141 state->i2c_write_buffer[2] = (val >> 8) & 0xff;
0142 state->i2c_write_buffer[3] = val & 0xff;
0143
0144 memset(&state->msg[0], 0, sizeof(struct i2c_msg));
0145 state->msg[0].addr = state->i2c_addr >> 1;
0146 state->msg[0].flags = 0;
0147 state->msg[0].buf = state->i2c_write_buffer;
0148 state->msg[0].len = 4;
0149
0150 ret = (i2c_transfer(state->i2c_adap, state->msg, 1) != 1 ?
0151 -EREMOTEIO : 0);
0152 mutex_unlock(&state->i2c_buffer_lock);
0153 return ret;
0154 }
0155
0156 static void dib7000p_write_tab(struct dib7000p_state *state, u16 * buf)
0157 {
0158 u16 l = 0, r, *n;
0159 n = buf;
0160 l = *n++;
0161 while (l) {
0162 r = *n++;
0163
0164 do {
0165 dib7000p_write_word(state, r, *n++);
0166 r++;
0167 } while (--l);
0168 l = *n++;
0169 }
0170 }
0171
0172 static int dib7000p_set_output_mode(struct dib7000p_state *state, int mode)
0173 {
0174 int ret = 0;
0175 u16 outreg, fifo_threshold, smo_mode;
0176
0177 outreg = 0;
0178 fifo_threshold = 1792;
0179 smo_mode = (dib7000p_read_word(state, 235) & 0x0050) | (1 << 1);
0180
0181 dprintk("setting output mode for demod %p to %d\n", &state->demod, mode);
0182
0183 switch (mode) {
0184 case OUTMODE_MPEG2_PAR_GATED_CLK:
0185 outreg = (1 << 10);
0186 break;
0187 case OUTMODE_MPEG2_PAR_CONT_CLK:
0188 outreg = (1 << 10) | (1 << 6);
0189 break;
0190 case OUTMODE_MPEG2_SERIAL:
0191 outreg = (1 << 10) | (2 << 6) | (0 << 1);
0192 break;
0193 case OUTMODE_DIVERSITY:
0194 if (state->cfg.hostbus_diversity)
0195 outreg = (1 << 10) | (4 << 6);
0196 else
0197 outreg = (1 << 11);
0198 break;
0199 case OUTMODE_MPEG2_FIFO:
0200 smo_mode |= (3 << 1);
0201 fifo_threshold = 512;
0202 outreg = (1 << 10) | (5 << 6);
0203 break;
0204 case OUTMODE_ANALOG_ADC:
0205 outreg = (1 << 10) | (3 << 6);
0206 break;
0207 case OUTMODE_HIGH_Z:
0208 outreg = 0;
0209 break;
0210 default:
0211 dprintk("Unhandled output_mode passed to be set for demod %p\n", &state->demod);
0212 break;
0213 }
0214
0215 if (state->cfg.output_mpeg2_in_188_bytes)
0216 smo_mode |= (1 << 5);
0217
0218 ret |= dib7000p_write_word(state, 235, smo_mode);
0219 ret |= dib7000p_write_word(state, 236, fifo_threshold);
0220 if (state->version != SOC7090)
0221 ret |= dib7000p_write_word(state, 1286, outreg);
0222
0223 return ret;
0224 }
0225
0226 static int dib7000p_set_diversity_in(struct dvb_frontend *demod, int onoff)
0227 {
0228 struct dib7000p_state *state = demod->demodulator_priv;
0229
0230 if (state->div_force_off) {
0231 dprintk("diversity combination deactivated - forced by COFDM parameters\n");
0232 onoff = 0;
0233 dib7000p_write_word(state, 207, 0);
0234 } else
0235 dib7000p_write_word(state, 207, (state->div_sync_wait << 4) | (1 << 2) | (2 << 0));
0236
0237 state->div_state = (u8) onoff;
0238
0239 if (onoff) {
0240 dib7000p_write_word(state, 204, 6);
0241 dib7000p_write_word(state, 205, 16);
0242
0243 } else {
0244 dib7000p_write_word(state, 204, 1);
0245 dib7000p_write_word(state, 205, 0);
0246 }
0247
0248 return 0;
0249 }
0250
0251 static int dib7000p_set_power_mode(struct dib7000p_state *state, enum dib7000p_power_mode mode)
0252 {
0253
0254 u16 reg_774 = 0x3fff, reg_775 = 0xffff, reg_776 = 0x0007, reg_899 = 0x0003, reg_1280 = (0xfe00) | (dib7000p_read_word(state, 1280) & 0x01ff);
0255
0256
0257 switch (mode) {
0258
0259 case DIB7000P_POWER_ALL:
0260 reg_774 = 0x0000;
0261 reg_775 = 0x0000;
0262 reg_776 = 0x0;
0263 reg_899 = 0x0;
0264 if (state->version == SOC7090)
0265 reg_1280 &= 0x001f;
0266 else
0267 reg_1280 &= 0x01ff;
0268 break;
0269
0270 case DIB7000P_POWER_ANALOG_ADC:
0271
0272 reg_774 &= ~((1 << 15) | (1 << 14) | (1 << 11) | (1 << 10) | (1 << 9));
0273
0274 reg_776 &= ~((1 << 0));
0275
0276 if (state->version != SOC7090)
0277 reg_1280 &= ~((1 << 11));
0278 reg_1280 &= ~(1 << 6);
0279 fallthrough;
0280 case DIB7000P_POWER_INTERFACE_ONLY:
0281
0282
0283 if (state->version == SOC7090)
0284 reg_1280 &= ~((1 << 7) | (1 << 5));
0285 else
0286 reg_1280 &= ~((1 << 14) | (1 << 13) | (1 << 12) | (1 << 10));
0287 break;
0288
0289
0290 }
0291
0292 dib7000p_write_word(state, 774, reg_774);
0293 dib7000p_write_word(state, 775, reg_775);
0294 dib7000p_write_word(state, 776, reg_776);
0295 dib7000p_write_word(state, 1280, reg_1280);
0296 if (state->version != SOC7090)
0297 dib7000p_write_word(state, 899, reg_899);
0298
0299 return 0;
0300 }
0301
0302 static void dib7000p_set_adc_state(struct dib7000p_state *state, enum dibx000_adc_states no)
0303 {
0304 u16 reg_908 = 0, reg_909 = 0;
0305 u16 reg;
0306
0307 if (state->version != SOC7090) {
0308 reg_908 = dib7000p_read_word(state, 908);
0309 reg_909 = dib7000p_read_word(state, 909);
0310 }
0311
0312 switch (no) {
0313 case DIBX000_SLOW_ADC_ON:
0314 if (state->version == SOC7090) {
0315 reg = dib7000p_read_word(state, 1925);
0316
0317 dib7000p_write_word(state, 1925, reg | (1 << 4) | (1 << 2));
0318
0319 reg = dib7000p_read_word(state, 1925);
0320 msleep(200);
0321 dib7000p_write_word(state, 1925, reg & ~(1 << 4));
0322
0323 reg = dib7000p_read_word(state, 72) & ~((0x3 << 14) | (0x3 << 12));
0324 dib7000p_write_word(state, 72, reg | (1 << 14) | (3 << 12) | 524);
0325 } else {
0326 reg_909 |= (1 << 1) | (1 << 0);
0327 dib7000p_write_word(state, 909, reg_909);
0328 reg_909 &= ~(1 << 1);
0329 }
0330 break;
0331
0332 case DIBX000_SLOW_ADC_OFF:
0333 if (state->version == SOC7090) {
0334 reg = dib7000p_read_word(state, 1925);
0335 dib7000p_write_word(state, 1925, (reg & ~(1 << 2)) | (1 << 4));
0336 } else
0337 reg_909 |= (1 << 1) | (1 << 0);
0338 break;
0339
0340 case DIBX000_ADC_ON:
0341 reg_908 &= 0x0fff;
0342 reg_909 &= 0x0003;
0343 break;
0344
0345 case DIBX000_ADC_OFF:
0346 reg_908 |= (1 << 14) | (1 << 13) | (1 << 12);
0347 reg_909 |= (1 << 5) | (1 << 4) | (1 << 3) | (1 << 2);
0348 break;
0349
0350 case DIBX000_VBG_ENABLE:
0351 reg_908 &= ~(1 << 15);
0352 break;
0353
0354 case DIBX000_VBG_DISABLE:
0355 reg_908 |= (1 << 15);
0356 break;
0357
0358 default:
0359 break;
0360 }
0361
0362
0363
0364 reg_909 |= (state->cfg.disable_sample_and_hold & 1) << 4;
0365 reg_908 |= (state->cfg.enable_current_mirror & 1) << 7;
0366
0367 if (state->version != SOC7090) {
0368 dib7000p_write_word(state, 908, reg_908);
0369 dib7000p_write_word(state, 909, reg_909);
0370 }
0371 }
0372
0373 static int dib7000p_set_bandwidth(struct dib7000p_state *state, u32 bw)
0374 {
0375 u32 timf;
0376
0377
0378 state->current_bandwidth = bw;
0379
0380 if (state->timf == 0) {
0381 dprintk("using default timf\n");
0382 timf = state->cfg.bw->timf;
0383 } else {
0384 dprintk("using updated timf\n");
0385 timf = state->timf;
0386 }
0387
0388 timf = timf * (bw / 50) / 160;
0389
0390 dib7000p_write_word(state, 23, (u16) ((timf >> 16) & 0xffff));
0391 dib7000p_write_word(state, 24, (u16) ((timf) & 0xffff));
0392
0393 return 0;
0394 }
0395
0396 static int dib7000p_sad_calib(struct dib7000p_state *state)
0397 {
0398
0399 dib7000p_write_word(state, 73, (0 << 1) | (0 << 0));
0400
0401 if (state->version == SOC7090)
0402 dib7000p_write_word(state, 74, 2048);
0403 else
0404 dib7000p_write_word(state, 74, 776);
0405
0406
0407 dib7000p_write_word(state, 73, (1 << 0));
0408 dib7000p_write_word(state, 73, (0 << 0));
0409
0410 msleep(1);
0411
0412 return 0;
0413 }
0414
0415 static int dib7000p_set_wbd_ref(struct dvb_frontend *demod, u16 value)
0416 {
0417 struct dib7000p_state *state = demod->demodulator_priv;
0418 if (value > 4095)
0419 value = 4095;
0420 state->wbd_ref = value;
0421 return dib7000p_write_word(state, 105, (dib7000p_read_word(state, 105) & 0xf000) | value);
0422 }
0423
0424 static int dib7000p_get_agc_values(struct dvb_frontend *fe,
0425 u16 *agc_global, u16 *agc1, u16 *agc2, u16 *wbd)
0426 {
0427 struct dib7000p_state *state = fe->demodulator_priv;
0428
0429 if (agc_global != NULL)
0430 *agc_global = dib7000p_read_word(state, 394);
0431 if (agc1 != NULL)
0432 *agc1 = dib7000p_read_word(state, 392);
0433 if (agc2 != NULL)
0434 *agc2 = dib7000p_read_word(state, 393);
0435 if (wbd != NULL)
0436 *wbd = dib7000p_read_word(state, 397);
0437
0438 return 0;
0439 }
0440
0441 static int dib7000p_set_agc1_min(struct dvb_frontend *fe, u16 v)
0442 {
0443 struct dib7000p_state *state = fe->demodulator_priv;
0444 return dib7000p_write_word(state, 108, v);
0445 }
0446
0447 static void dib7000p_reset_pll(struct dib7000p_state *state)
0448 {
0449 struct dibx000_bandwidth_config *bw = &state->cfg.bw[0];
0450 u16 clk_cfg0;
0451
0452 if (state->version == SOC7090) {
0453 dib7000p_write_word(state, 1856, (!bw->pll_reset << 13) | (bw->pll_range << 12) | (bw->pll_ratio << 6) | (bw->pll_prediv));
0454
0455 while (((dib7000p_read_word(state, 1856) >> 15) & 0x1) != 1)
0456 ;
0457
0458 dib7000p_write_word(state, 1857, dib7000p_read_word(state, 1857) | (!bw->pll_bypass << 15));
0459 } else {
0460
0461 clk_cfg0 = (1 << 15) | ((bw->pll_ratio & 0x3f) << 9) |
0462 (bw->modulo << 7) | (bw->ADClkSrc << 6) | (bw->IO_CLK_en_core << 5) | (bw->bypclk_div << 2) | (bw->enable_refdiv << 1) | (0 << 0);
0463
0464 dib7000p_write_word(state, 900, clk_cfg0);
0465
0466
0467 dib7000p_write_word(state, 903, (bw->pll_prediv << 5) | (((bw->pll_ratio >> 6) & 0x3) << 3) | (bw->pll_range << 1) | bw->pll_reset);
0468 clk_cfg0 = (bw->pll_bypass << 15) | (clk_cfg0 & 0x7fff);
0469 dib7000p_write_word(state, 900, clk_cfg0);
0470 }
0471
0472 dib7000p_write_word(state, 18, (u16) (((bw->internal * 1000) >> 16) & 0xffff));
0473 dib7000p_write_word(state, 19, (u16) ((bw->internal * 1000) & 0xffff));
0474 dib7000p_write_word(state, 21, (u16) ((bw->ifreq >> 16) & 0xffff));
0475 dib7000p_write_word(state, 22, (u16) ((bw->ifreq) & 0xffff));
0476
0477 dib7000p_write_word(state, 72, bw->sad_cfg);
0478 }
0479
0480 static u32 dib7000p_get_internal_freq(struct dib7000p_state *state)
0481 {
0482 u32 internal = (u32) dib7000p_read_word(state, 18) << 16;
0483 internal |= (u32) dib7000p_read_word(state, 19);
0484 internal /= 1000;
0485
0486 return internal;
0487 }
0488
0489 static int dib7000p_update_pll(struct dvb_frontend *fe, struct dibx000_bandwidth_config *bw)
0490 {
0491 struct dib7000p_state *state = fe->demodulator_priv;
0492 u16 reg_1857, reg_1856 = dib7000p_read_word(state, 1856);
0493 u8 loopdiv, prediv;
0494 u32 internal, xtal;
0495
0496
0497 prediv = reg_1856 & 0x3f;
0498 loopdiv = (reg_1856 >> 6) & 0x3f;
0499
0500 if ((bw != NULL) && (bw->pll_prediv != prediv || bw->pll_ratio != loopdiv)) {
0501 dprintk("Updating pll (prediv: old = %d new = %d ; loopdiv : old = %d new = %d)\n", prediv, bw->pll_prediv, loopdiv, bw->pll_ratio);
0502 reg_1856 &= 0xf000;
0503 reg_1857 = dib7000p_read_word(state, 1857);
0504 dib7000p_write_word(state, 1857, reg_1857 & ~(1 << 15));
0505
0506 dib7000p_write_word(state, 1856, reg_1856 | ((bw->pll_ratio & 0x3f) << 6) | (bw->pll_prediv & 0x3f));
0507
0508
0509 internal = dib7000p_get_internal_freq(state);
0510 xtal = (internal / loopdiv) * prediv;
0511 internal = 1000 * (xtal / bw->pll_prediv) * bw->pll_ratio;
0512 dib7000p_write_word(state, 18, (u16) ((internal >> 16) & 0xffff));
0513 dib7000p_write_word(state, 19, (u16) (internal & 0xffff));
0514
0515 dib7000p_write_word(state, 1857, reg_1857 | (1 << 15));
0516
0517 while (((dib7000p_read_word(state, 1856) >> 15) & 0x1) != 1)
0518 dprintk("Waiting for PLL to lock\n");
0519
0520 return 0;
0521 }
0522 return -EIO;
0523 }
0524
0525 static int dib7000p_reset_gpio(struct dib7000p_state *st)
0526 {
0527
0528 dprintk("gpio dir: %x: val: %x, pwm_pos: %x\n", st->gpio_dir, st->gpio_val, st->cfg.gpio_pwm_pos);
0529
0530 dib7000p_write_word(st, 1029, st->gpio_dir);
0531 dib7000p_write_word(st, 1030, st->gpio_val);
0532
0533
0534
0535 dib7000p_write_word(st, 1032, st->cfg.gpio_pwm_pos);
0536
0537 dib7000p_write_word(st, 1037, st->cfg.pwm_freq_div);
0538 return 0;
0539 }
0540
0541 static int dib7000p_cfg_gpio(struct dib7000p_state *st, u8 num, u8 dir, u8 val)
0542 {
0543 st->gpio_dir = dib7000p_read_word(st, 1029);
0544 st->gpio_dir &= ~(1 << num);
0545 st->gpio_dir |= (dir & 0x1) << num;
0546 dib7000p_write_word(st, 1029, st->gpio_dir);
0547
0548 st->gpio_val = dib7000p_read_word(st, 1030);
0549 st->gpio_val &= ~(1 << num);
0550 st->gpio_val |= (val & 0x01) << num;
0551 dib7000p_write_word(st, 1030, st->gpio_val);
0552
0553 return 0;
0554 }
0555
0556 static int dib7000p_set_gpio(struct dvb_frontend *demod, u8 num, u8 dir, u8 val)
0557 {
0558 struct dib7000p_state *state = demod->demodulator_priv;
0559 return dib7000p_cfg_gpio(state, num, dir, val);
0560 }
0561
0562 static u16 dib7000p_defaults[] = {
0563
0564 3, 2,
0565 0x0004,
0566 (1<<3)|(1<<11)|(1<<12)|(1<<13),
0567 0x0814,
0568
0569 12, 6,
0570 0x001b,
0571 0x7740,
0572 0x005b,
0573 0x8d80,
0574 0x01c9,
0575 0xc380,
0576 0x0000,
0577 0x0080,
0578 0x0000,
0579 0x0090,
0580 0x0001,
0581 0xd4c0,
0582
0583 1, 26,
0584 0x6680,
0585
0586
0587 11, 79,
0588 (1 << 13) - 825 - 117,
0589 (1 << 13) - 837 - 117,
0590 (1 << 13) - 811 - 117,
0591 (1 << 13) - 766 - 117,
0592 (1 << 13) - 737 - 117,
0593 (1 << 13) - 693 - 117,
0594 (1 << 13) - 648 - 117,
0595 (1 << 13) - 619 - 117,
0596 (1 << 13) - 575 - 117,
0597 (1 << 13) - 531 - 117,
0598 (1 << 13) - 501 - 117,
0599
0600 1, 142,
0601 0x0410,
0602
0603
0604 8, 145,
0605 0,
0606 0,
0607 0,
0608 0,
0609 0,
0610 0,
0611 0,
0612 0,
0613
0614 1, 154,
0615 1 << 13,
0616
0617 1, 168,
0618 0x0ccd,
0619
0620 1, 183,
0621 0x200f,
0622
0623 1, 212,
0624 0x169,
0625
0626 5, 187,
0627 0x023d,
0628 0x00a4,
0629 0x00a4,
0630 0x7ff0,
0631 0x3ccc,
0632
0633 1, 198,
0634 0x800,
0635
0636 1, 222,
0637 0x0010,
0638
0639 1, 235,
0640 0x0062,
0641
0642 0,
0643 };
0644
0645 static void dib7000p_reset_stats(struct dvb_frontend *fe);
0646
0647 static int dib7000p_demod_reset(struct dib7000p_state *state)
0648 {
0649 dib7000p_set_power_mode(state, DIB7000P_POWER_ALL);
0650
0651 if (state->version == SOC7090)
0652 dibx000_reset_i2c_master(&state->i2c_master);
0653
0654 dib7000p_set_adc_state(state, DIBX000_VBG_ENABLE);
0655
0656
0657 dib7000p_write_word(state, 770, 0xffff);
0658 dib7000p_write_word(state, 771, 0xffff);
0659 dib7000p_write_word(state, 772, 0x001f);
0660 dib7000p_write_word(state, 1280, 0x001f - ((1 << 4) | (1 << 3)));
0661
0662 dib7000p_write_word(state, 770, 0);
0663 dib7000p_write_word(state, 771, 0);
0664 dib7000p_write_word(state, 772, 0);
0665 dib7000p_write_word(state, 1280, 0);
0666
0667 if (state->version != SOC7090) {
0668 dib7000p_write_word(state, 898, 0x0003);
0669 dib7000p_write_word(state, 898, 0);
0670 }
0671
0672
0673 dib7000p_reset_pll(state);
0674
0675 if (dib7000p_reset_gpio(state) != 0)
0676 dprintk("GPIO reset was not successful.\n");
0677
0678 if (state->version == SOC7090) {
0679 dib7000p_write_word(state, 899, 0);
0680
0681
0682 dib7000p_write_word(state, 42, (1<<5) | 3);
0683 dib7000p_write_word(state, 43, 0x2d4);
0684 dib7000p_write_word(state, 44, 300);
0685 dib7000p_write_word(state, 273, (0<<6) | 30);
0686 }
0687 if (dib7000p_set_output_mode(state, OUTMODE_HIGH_Z) != 0)
0688 dprintk("OUTPUT_MODE could not be reset.\n");
0689
0690 dib7000p_set_adc_state(state, DIBX000_SLOW_ADC_ON);
0691 dib7000p_sad_calib(state);
0692 dib7000p_set_adc_state(state, DIBX000_SLOW_ADC_OFF);
0693
0694
0695 dib7000p_write_word(state, 1285, dib7000p_read_word(state, 1285) & ~(1 << 1));
0696
0697 dib7000p_set_bandwidth(state, 8000);
0698
0699 if (state->version == SOC7090) {
0700 dib7000p_write_word(state, 36, 0x0755);
0701 } else {
0702 if (state->cfg.tuner_is_baseband)
0703 dib7000p_write_word(state, 36, 0x0755);
0704 else
0705 dib7000p_write_word(state, 36, 0x1f55);
0706 }
0707
0708 dib7000p_write_tab(state, dib7000p_defaults);
0709 if (state->version != SOC7090) {
0710 dib7000p_write_word(state, 901, 0x0006);
0711 dib7000p_write_word(state, 902, (3 << 10) | (1 << 6));
0712 dib7000p_write_word(state, 905, 0x2c8e);
0713 }
0714
0715 dib7000p_set_power_mode(state, DIB7000P_POWER_INTERFACE_ONLY);
0716
0717 return 0;
0718 }
0719
0720 static void dib7000p_pll_clk_cfg(struct dib7000p_state *state)
0721 {
0722 u16 tmp = 0;
0723 tmp = dib7000p_read_word(state, 903);
0724 dib7000p_write_word(state, 903, (tmp | 0x1));
0725 tmp = dib7000p_read_word(state, 900);
0726 dib7000p_write_word(state, 900, (tmp & 0x7fff) | (1 << 6));
0727 }
0728
0729 static void dib7000p_restart_agc(struct dib7000p_state *state)
0730 {
0731
0732 dib7000p_write_word(state, 770, (1 << 11) | (1 << 9));
0733 dib7000p_write_word(state, 770, 0x0000);
0734 }
0735
0736 static int dib7000p_update_lna(struct dib7000p_state *state)
0737 {
0738 u16 dyn_gain;
0739
0740 if (state->cfg.update_lna) {
0741 dyn_gain = dib7000p_read_word(state, 394);
0742 if (state->cfg.update_lna(&state->demod, dyn_gain)) {
0743 dib7000p_restart_agc(state);
0744 return 1;
0745 }
0746 }
0747
0748 return 0;
0749 }
0750
0751 static int dib7000p_set_agc_config(struct dib7000p_state *state, u8 band)
0752 {
0753 struct dibx000_agc_config *agc = NULL;
0754 int i;
0755 if (state->current_band == band && state->current_agc != NULL)
0756 return 0;
0757 state->current_band = band;
0758
0759 for (i = 0; i < state->cfg.agc_config_count; i++)
0760 if (state->cfg.agc[i].band_caps & band) {
0761 agc = &state->cfg.agc[i];
0762 break;
0763 }
0764
0765 if (agc == NULL) {
0766 dprintk("no valid AGC configuration found for band 0x%02x\n", band);
0767 return -EINVAL;
0768 }
0769
0770 state->current_agc = agc;
0771
0772
0773 dib7000p_write_word(state, 75, agc->setup);
0774 dib7000p_write_word(state, 76, agc->inv_gain);
0775 dib7000p_write_word(state, 77, agc->time_stabiliz);
0776 dib7000p_write_word(state, 100, (agc->alpha_level << 12) | agc->thlock);
0777
0778
0779 dib7000p_write_word(state, 101, (agc->alpha_mant << 5) | agc->alpha_exp);
0780 dib7000p_write_word(state, 102, (agc->beta_mant << 6) | agc->beta_exp);
0781
0782
0783 dprintk("WBD: ref: %d, sel: %d, active: %d, alpha: %d\n",
0784 state->wbd_ref != 0 ? state->wbd_ref : agc->wbd_ref, agc->wbd_sel, !agc->perform_agc_softsplit, agc->wbd_sel);
0785
0786 if (state->wbd_ref != 0)
0787 dib7000p_write_word(state, 105, (agc->wbd_inv << 12) | state->wbd_ref);
0788 else
0789 dib7000p_write_word(state, 105, (agc->wbd_inv << 12) | agc->wbd_ref);
0790
0791 dib7000p_write_word(state, 106, (agc->wbd_sel << 13) | (agc->wbd_alpha << 9) | (agc->perform_agc_softsplit << 8));
0792
0793 dib7000p_write_word(state, 107, agc->agc1_max);
0794 dib7000p_write_word(state, 108, agc->agc1_min);
0795 dib7000p_write_word(state, 109, agc->agc2_max);
0796 dib7000p_write_word(state, 110, agc->agc2_min);
0797 dib7000p_write_word(state, 111, (agc->agc1_pt1 << 8) | agc->agc1_pt2);
0798 dib7000p_write_word(state, 112, agc->agc1_pt3);
0799 dib7000p_write_word(state, 113, (agc->agc1_slope1 << 8) | agc->agc1_slope2);
0800 dib7000p_write_word(state, 114, (agc->agc2_pt1 << 8) | agc->agc2_pt2);
0801 dib7000p_write_word(state, 115, (agc->agc2_slope1 << 8) | agc->agc2_slope2);
0802 return 0;
0803 }
0804
0805 static int dib7000p_set_dds(struct dib7000p_state *state, s32 offset_khz)
0806 {
0807 u32 internal = dib7000p_get_internal_freq(state);
0808 s32 unit_khz_dds_val;
0809 u32 abs_offset_khz = abs(offset_khz);
0810 u32 dds = state->cfg.bw->ifreq & 0x1ffffff;
0811 u8 invert = !!(state->cfg.bw->ifreq & (1 << 25));
0812 if (internal == 0) {
0813 pr_warn("DIB7000P: dib7000p_get_internal_freq returned 0\n");
0814 return -1;
0815 }
0816
0817 unit_khz_dds_val = 67108864 / (internal);
0818
0819 dprintk("setting a frequency offset of %dkHz internal freq = %d invert = %d\n", offset_khz, internal, invert);
0820
0821 if (offset_khz < 0)
0822 unit_khz_dds_val *= -1;
0823
0824
0825 if (invert)
0826 dds -= (abs_offset_khz * unit_khz_dds_val);
0827 else
0828 dds += (abs_offset_khz * unit_khz_dds_val);
0829
0830 if (abs_offset_khz <= (internal / 2)) {
0831 dib7000p_write_word(state, 21, (u16) (((dds >> 16) & 0x1ff) | (0 << 10) | (invert << 9)));
0832 dib7000p_write_word(state, 22, (u16) (dds & 0xffff));
0833 }
0834 return 0;
0835 }
0836
0837 static int dib7000p_agc_startup(struct dvb_frontend *demod)
0838 {
0839 struct dtv_frontend_properties *ch = &demod->dtv_property_cache;
0840 struct dib7000p_state *state = demod->demodulator_priv;
0841 int ret = -1;
0842 u8 *agc_state = &state->agc_state;
0843 u8 agc_split;
0844 u16 reg;
0845 u32 upd_demod_gain_period = 0x1000;
0846 s32 frequency_offset = 0;
0847
0848 switch (state->agc_state) {
0849 case 0:
0850 dib7000p_set_power_mode(state, DIB7000P_POWER_ALL);
0851 if (state->version == SOC7090) {
0852 reg = dib7000p_read_word(state, 0x79b) & 0xff00;
0853 dib7000p_write_word(state, 0x79a, upd_demod_gain_period & 0xFFFF);
0854 dib7000p_write_word(state, 0x79b, reg | (1 << 14) | ((upd_demod_gain_period >> 16) & 0xFF));
0855
0856
0857 reg = dib7000p_read_word(state, 0x780);
0858 dib7000p_write_word(state, 0x780, (reg | (0x3)) & (~(1 << 7)));
0859 } else {
0860 dib7000p_set_adc_state(state, DIBX000_ADC_ON);
0861 dib7000p_pll_clk_cfg(state);
0862 }
0863
0864 if (dib7000p_set_agc_config(state, BAND_OF_FREQUENCY(ch->frequency / 1000)) != 0)
0865 return -1;
0866
0867 if (demod->ops.tuner_ops.get_frequency) {
0868 u32 frequency_tuner;
0869
0870 demod->ops.tuner_ops.get_frequency(demod, &frequency_tuner);
0871 frequency_offset = (s32)frequency_tuner / 1000 - ch->frequency / 1000;
0872 }
0873
0874 if (dib7000p_set_dds(state, frequency_offset) < 0)
0875 return -1;
0876
0877 ret = 7;
0878 (*agc_state)++;
0879 break;
0880
0881 case 1:
0882 if (state->cfg.agc_control)
0883 state->cfg.agc_control(&state->demod, 1);
0884
0885 dib7000p_write_word(state, 78, 32768);
0886 if (!state->current_agc->perform_agc_softsplit) {
0887
0888
0889 dib7000p_write_word(state, 106, (state->current_agc->wbd_sel << 13) | (state->current_agc->wbd_alpha << 9) | (1 << 8));
0890 (*agc_state)++;
0891 ret = 5;
0892 } else {
0893
0894 (*agc_state) = 4;
0895
0896 ret = 7;
0897 }
0898
0899 dib7000p_restart_agc(state);
0900 break;
0901
0902 case 2:
0903 dib7000p_write_word(state, 75, state->current_agc->setup | (1 << 4));
0904 dib7000p_write_word(state, 106, (state->current_agc->wbd_sel << 13) | (2 << 9) | (0 << 8));
0905 (*agc_state)++;
0906 ret = 14;
0907 break;
0908
0909 case 3:
0910 agc_split = (u8) dib7000p_read_word(state, 396);
0911 dib7000p_write_word(state, 78, dib7000p_read_word(state, 394));
0912
0913 dib7000p_write_word(state, 75, state->current_agc->setup);
0914 dib7000p_write_word(state, 106, (state->current_agc->wbd_sel << 13) | (state->current_agc->wbd_alpha << 9) | agc_split);
0915
0916 dib7000p_restart_agc(state);
0917
0918 dprintk("SPLIT %p: %u\n", demod, agc_split);
0919
0920 (*agc_state)++;
0921 ret = 5;
0922 break;
0923
0924 case 4:
0925 ret = 7;
0926
0927 if (dib7000p_update_lna(state))
0928 ret = 5;
0929 else
0930 (*agc_state)++;
0931 break;
0932
0933 case 5:
0934 if (state->cfg.agc_control)
0935 state->cfg.agc_control(&state->demod, 0);
0936 (*agc_state)++;
0937 break;
0938 default:
0939 break;
0940 }
0941 return ret;
0942 }
0943
0944 static void dib7000p_update_timf(struct dib7000p_state *state)
0945 {
0946 u32 timf = (dib7000p_read_word(state, 427) << 16) | dib7000p_read_word(state, 428);
0947 state->timf = timf * 160 / (state->current_bandwidth / 50);
0948 dib7000p_write_word(state, 23, (u16) (timf >> 16));
0949 dib7000p_write_word(state, 24, (u16) (timf & 0xffff));
0950 dprintk("updated timf_frequency: %d (default: %d)\n", state->timf, state->cfg.bw->timf);
0951
0952 }
0953
0954 static u32 dib7000p_ctrl_timf(struct dvb_frontend *fe, u8 op, u32 timf)
0955 {
0956 struct dib7000p_state *state = fe->demodulator_priv;
0957 switch (op) {
0958 case DEMOD_TIMF_SET:
0959 state->timf = timf;
0960 break;
0961 case DEMOD_TIMF_UPDATE:
0962 dib7000p_update_timf(state);
0963 break;
0964 case DEMOD_TIMF_GET:
0965 break;
0966 }
0967 dib7000p_set_bandwidth(state, state->current_bandwidth);
0968 return state->timf;
0969 }
0970
0971 static void dib7000p_set_channel(struct dib7000p_state *state,
0972 struct dtv_frontend_properties *ch, u8 seq)
0973 {
0974 u16 value, est[4];
0975
0976 dib7000p_set_bandwidth(state, BANDWIDTH_TO_KHZ(ch->bandwidth_hz));
0977
0978
0979 value = 0;
0980 switch (ch->transmission_mode) {
0981 case TRANSMISSION_MODE_2K:
0982 value |= (0 << 7);
0983 break;
0984 case TRANSMISSION_MODE_4K:
0985 value |= (2 << 7);
0986 break;
0987 default:
0988 case TRANSMISSION_MODE_8K:
0989 value |= (1 << 7);
0990 break;
0991 }
0992 switch (ch->guard_interval) {
0993 case GUARD_INTERVAL_1_32:
0994 value |= (0 << 5);
0995 break;
0996 case GUARD_INTERVAL_1_16:
0997 value |= (1 << 5);
0998 break;
0999 case GUARD_INTERVAL_1_4:
1000 value |= (3 << 5);
1001 break;
1002 default:
1003 case GUARD_INTERVAL_1_8:
1004 value |= (2 << 5);
1005 break;
1006 }
1007 switch (ch->modulation) {
1008 case QPSK:
1009 value |= (0 << 3);
1010 break;
1011 case QAM_16:
1012 value |= (1 << 3);
1013 break;
1014 default:
1015 case QAM_64:
1016 value |= (2 << 3);
1017 break;
1018 }
1019 switch (HIERARCHY_1) {
1020 case HIERARCHY_2:
1021 value |= 2;
1022 break;
1023 case HIERARCHY_4:
1024 value |= 4;
1025 break;
1026 default:
1027 case HIERARCHY_1:
1028 value |= 1;
1029 break;
1030 }
1031 dib7000p_write_word(state, 0, value);
1032 dib7000p_write_word(state, 5, (seq << 4) | 1);
1033
1034
1035 value = 0;
1036 if (1 != 0)
1037 value |= (1 << 6);
1038 if (ch->hierarchy == 1)
1039 value |= (1 << 4);
1040 if (1 == 1)
1041 value |= 1;
1042 switch ((ch->hierarchy == 0 || 1 == 1) ? ch->code_rate_HP : ch->code_rate_LP) {
1043 case FEC_2_3:
1044 value |= (2 << 1);
1045 break;
1046 case FEC_3_4:
1047 value |= (3 << 1);
1048 break;
1049 case FEC_5_6:
1050 value |= (5 << 1);
1051 break;
1052 case FEC_7_8:
1053 value |= (7 << 1);
1054 break;
1055 default:
1056 case FEC_1_2:
1057 value |= (1 << 1);
1058 break;
1059 }
1060 dib7000p_write_word(state, 208, value);
1061
1062
1063 dib7000p_write_word(state, 26, 0x6680);
1064 dib7000p_write_word(state, 32, 0x0003);
1065 dib7000p_write_word(state, 29, 0x1273);
1066 dib7000p_write_word(state, 33, 0x0005);
1067
1068
1069 switch (ch->transmission_mode) {
1070 case TRANSMISSION_MODE_8K:
1071 value = 256;
1072 break;
1073 case TRANSMISSION_MODE_4K:
1074 value = 128;
1075 break;
1076 case TRANSMISSION_MODE_2K:
1077 default:
1078 value = 64;
1079 break;
1080 }
1081 switch (ch->guard_interval) {
1082 case GUARD_INTERVAL_1_16:
1083 value *= 2;
1084 break;
1085 case GUARD_INTERVAL_1_8:
1086 value *= 4;
1087 break;
1088 case GUARD_INTERVAL_1_4:
1089 value *= 8;
1090 break;
1091 default:
1092 case GUARD_INTERVAL_1_32:
1093 value *= 1;
1094 break;
1095 }
1096 if (state->cfg.diversity_delay == 0)
1097 state->div_sync_wait = (value * 3) / 2 + 48;
1098 else
1099 state->div_sync_wait = (value * 3) / 2 + state->cfg.diversity_delay;
1100
1101
1102 state->div_force_off = !1 && ch->transmission_mode != TRANSMISSION_MODE_8K;
1103 dib7000p_set_diversity_in(&state->demod, state->div_state);
1104
1105
1106 switch (ch->modulation) {
1107 case QAM_64:
1108 est[0] = 0x0148;
1109 est[1] = 0xfff0;
1110 est[2] = 0x00a4;
1111 est[3] = 0xfff8;
1112 break;
1113 case QAM_16:
1114 est[0] = 0x023d;
1115 est[1] = 0xffdf;
1116 est[2] = 0x00a4;
1117 est[3] = 0xfff0;
1118 break;
1119 default:
1120 est[0] = 0x099a;
1121 est[1] = 0xffae;
1122 est[2] = 0x0333;
1123 est[3] = 0xfff8;
1124 break;
1125 }
1126 for (value = 0; value < 4; value++)
1127 dib7000p_write_word(state, 187 + value, est[value]);
1128 }
1129
1130 static int dib7000p_autosearch_start(struct dvb_frontend *demod)
1131 {
1132 struct dtv_frontend_properties *ch = &demod->dtv_property_cache;
1133 struct dib7000p_state *state = demod->demodulator_priv;
1134 struct dtv_frontend_properties schan;
1135 u32 value, factor;
1136 u32 internal = dib7000p_get_internal_freq(state);
1137
1138 schan = *ch;
1139 schan.modulation = QAM_64;
1140 schan.guard_interval = GUARD_INTERVAL_1_32;
1141 schan.transmission_mode = TRANSMISSION_MODE_8K;
1142 schan.code_rate_HP = FEC_2_3;
1143 schan.code_rate_LP = FEC_3_4;
1144 schan.hierarchy = 0;
1145
1146 dib7000p_set_channel(state, &schan, 7);
1147
1148 factor = BANDWIDTH_TO_KHZ(ch->bandwidth_hz);
1149 if (factor >= 5000) {
1150 if (state->version == SOC7090)
1151 factor = 2;
1152 else
1153 factor = 1;
1154 } else
1155 factor = 6;
1156
1157 value = 30 * internal * factor;
1158 dib7000p_write_word(state, 6, (u16) ((value >> 16) & 0xffff));
1159 dib7000p_write_word(state, 7, (u16) (value & 0xffff));
1160 value = 100 * internal * factor;
1161 dib7000p_write_word(state, 8, (u16) ((value >> 16) & 0xffff));
1162 dib7000p_write_word(state, 9, (u16) (value & 0xffff));
1163 value = 500 * internal * factor;
1164 dib7000p_write_word(state, 10, (u16) ((value >> 16) & 0xffff));
1165 dib7000p_write_word(state, 11, (u16) (value & 0xffff));
1166
1167 value = dib7000p_read_word(state, 0);
1168 dib7000p_write_word(state, 0, (u16) ((1 << 9) | value));
1169 dib7000p_read_word(state, 1284);
1170 dib7000p_write_word(state, 0, (u16) value);
1171
1172 return 0;
1173 }
1174
1175 static int dib7000p_autosearch_is_irq(struct dvb_frontend *demod)
1176 {
1177 struct dib7000p_state *state = demod->demodulator_priv;
1178 u16 irq_pending = dib7000p_read_word(state, 1284);
1179
1180 if (irq_pending & 0x1)
1181 return 1;
1182
1183 if (irq_pending & 0x2)
1184 return 2;
1185
1186 return 0;
1187 }
1188
1189 static void dib7000p_spur_protect(struct dib7000p_state *state, u32 rf_khz, u32 bw)
1190 {
1191 static const s16 notch[] = { 16143, 14402, 12238, 9713, 6902, 3888, 759, -2392 };
1192 static const u8 sine[] = { 0, 2, 3, 5, 6, 8, 9, 11, 13, 14, 16, 17, 19, 20, 22,
1193 24, 25, 27, 28, 30, 31, 33, 34, 36, 38, 39, 41, 42, 44, 45, 47, 48, 50, 51,
1194 53, 55, 56, 58, 59, 61, 62, 64, 65, 67, 68, 70, 71, 73, 74, 76, 77, 79, 80,
1195 82, 83, 85, 86, 88, 89, 91, 92, 94, 95, 97, 98, 99, 101, 102, 104, 105,
1196 107, 108, 109, 111, 112, 114, 115, 117, 118, 119, 121, 122, 123, 125, 126,
1197 128, 129, 130, 132, 133, 134, 136, 137, 138, 140, 141, 142, 144, 145, 146,
1198 147, 149, 150, 151, 152, 154, 155, 156, 157, 159, 160, 161, 162, 164, 165,
1199 166, 167, 168, 170, 171, 172, 173, 174, 175, 177, 178, 179, 180, 181, 182,
1200 183, 184, 185, 186, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198,
1201 199, 200, 201, 202, 203, 204, 205, 206, 207, 207, 208, 209, 210, 211, 212,
1202 213, 214, 215, 215, 216, 217, 218, 219, 220, 220, 221, 222, 223, 224, 224,
1203 225, 226, 227, 227, 228, 229, 229, 230, 231, 231, 232, 233, 233, 234, 235,
1204 235, 236, 237, 237, 238, 238, 239, 239, 240, 241, 241, 242, 242, 243, 243,
1205 244, 244, 245, 245, 245, 246, 246, 247, 247, 248, 248, 248, 249, 249, 249,
1206 250, 250, 250, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 254,
1207 254, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
1208 255, 255, 255, 255, 255, 255
1209 };
1210
1211 u32 xtal = state->cfg.bw->xtal_hz / 1000;
1212 int f_rel = DIV_ROUND_CLOSEST(rf_khz, xtal) * xtal - rf_khz;
1213 int k;
1214 int coef_re[8], coef_im[8];
1215 int bw_khz = bw;
1216 u32 pha;
1217
1218 dprintk("relative position of the Spur: %dk (RF: %dk, XTAL: %dk)\n", f_rel, rf_khz, xtal);
1219
1220 if (f_rel < -bw_khz / 2 || f_rel > bw_khz / 2)
1221 return;
1222
1223 bw_khz /= 100;
1224
1225 dib7000p_write_word(state, 142, 0x0610);
1226
1227 for (k = 0; k < 8; k++) {
1228 pha = ((f_rel * (k + 1) * 112 * 80 / bw_khz) / 1000) & 0x3ff;
1229
1230 if (pha == 0) {
1231 coef_re[k] = 256;
1232 coef_im[k] = 0;
1233 } else if (pha < 256) {
1234 coef_re[k] = sine[256 - (pha & 0xff)];
1235 coef_im[k] = sine[pha & 0xff];
1236 } else if (pha == 256) {
1237 coef_re[k] = 0;
1238 coef_im[k] = 256;
1239 } else if (pha < 512) {
1240 coef_re[k] = -sine[pha & 0xff];
1241 coef_im[k] = sine[256 - (pha & 0xff)];
1242 } else if (pha == 512) {
1243 coef_re[k] = -256;
1244 coef_im[k] = 0;
1245 } else if (pha < 768) {
1246 coef_re[k] = -sine[256 - (pha & 0xff)];
1247 coef_im[k] = -sine[pha & 0xff];
1248 } else if (pha == 768) {
1249 coef_re[k] = 0;
1250 coef_im[k] = -256;
1251 } else {
1252 coef_re[k] = sine[pha & 0xff];
1253 coef_im[k] = -sine[256 - (pha & 0xff)];
1254 }
1255
1256 coef_re[k] *= notch[k];
1257 coef_re[k] += (1 << 14);
1258 if (coef_re[k] >= (1 << 24))
1259 coef_re[k] = (1 << 24) - 1;
1260 coef_re[k] /= (1 << 15);
1261
1262 coef_im[k] *= notch[k];
1263 coef_im[k] += (1 << 14);
1264 if (coef_im[k] >= (1 << 24))
1265 coef_im[k] = (1 << 24) - 1;
1266 coef_im[k] /= (1 << 15);
1267
1268 dprintk("PALF COEF: %d re: %d im: %d\n", k, coef_re[k], coef_im[k]);
1269
1270 dib7000p_write_word(state, 143, (0 << 14) | (k << 10) | (coef_re[k] & 0x3ff));
1271 dib7000p_write_word(state, 144, coef_im[k] & 0x3ff);
1272 dib7000p_write_word(state, 143, (1 << 14) | (k << 10) | (coef_re[k] & 0x3ff));
1273 }
1274 dib7000p_write_word(state, 143, 0);
1275 }
1276
1277 static int dib7000p_tune(struct dvb_frontend *demod)
1278 {
1279 struct dtv_frontend_properties *ch = &demod->dtv_property_cache;
1280 struct dib7000p_state *state = demod->demodulator_priv;
1281 u16 tmp = 0;
1282
1283 if (ch != NULL)
1284 dib7000p_set_channel(state, ch, 0);
1285 else
1286 return -EINVAL;
1287
1288
1289 dib7000p_write_word(state, 770, 0x4000);
1290 dib7000p_write_word(state, 770, 0x0000);
1291 msleep(45);
1292
1293
1294 tmp = (0 << 14) | (4 << 10) | (0 << 9) | (3 << 5) | (1 << 4) | (0x3);
1295 if (state->sfn_workaround_active) {
1296 dprintk("SFN workaround is active\n");
1297 tmp |= (1 << 9);
1298 dib7000p_write_word(state, 166, 0x4000);
1299 } else {
1300 dib7000p_write_word(state, 166, 0x0000);
1301 }
1302 dib7000p_write_word(state, 29, tmp);
1303
1304
1305 if (state->timf == 0)
1306 msleep(200);
1307
1308
1309
1310
1311 tmp = (6 << 8) | 0x80;
1312 switch (ch->transmission_mode) {
1313 case TRANSMISSION_MODE_2K:
1314 tmp |= (2 << 12);
1315 break;
1316 case TRANSMISSION_MODE_4K:
1317 tmp |= (3 << 12);
1318 break;
1319 default:
1320 case TRANSMISSION_MODE_8K:
1321 tmp |= (4 << 12);
1322 break;
1323 }
1324 dib7000p_write_word(state, 26, tmp);
1325
1326
1327 tmp = (0 << 4);
1328 switch (ch->transmission_mode) {
1329 case TRANSMISSION_MODE_2K:
1330 tmp |= 0x6;
1331 break;
1332 case TRANSMISSION_MODE_4K:
1333 tmp |= 0x7;
1334 break;
1335 default:
1336 case TRANSMISSION_MODE_8K:
1337 tmp |= 0x8;
1338 break;
1339 }
1340 dib7000p_write_word(state, 32, tmp);
1341
1342
1343 tmp = (0 << 4);
1344 switch (ch->transmission_mode) {
1345 case TRANSMISSION_MODE_2K:
1346 tmp |= 0x6;
1347 break;
1348 case TRANSMISSION_MODE_4K:
1349 tmp |= 0x7;
1350 break;
1351 default:
1352 case TRANSMISSION_MODE_8K:
1353 tmp |= 0x8;
1354 break;
1355 }
1356 dib7000p_write_word(state, 33, tmp);
1357
1358 tmp = dib7000p_read_word(state, 509);
1359 if (!((tmp >> 6) & 0x1)) {
1360
1361 tmp = dib7000p_read_word(state, 771);
1362 dib7000p_write_word(state, 771, tmp | (1 << 1));
1363 dib7000p_write_word(state, 771, tmp);
1364 msleep(40);
1365 tmp = dib7000p_read_word(state, 509);
1366 }
1367
1368 if ((tmp >> 6) & 0x1) {
1369 dib7000p_update_timf(state);
1370
1371 tmp = dib7000p_read_word(state, 26);
1372 dib7000p_write_word(state, 26, (tmp & ~(0xf << 12)) | ((((tmp >> 12) & 0xf) + 5) << 12));
1373 }
1374
1375 if (state->cfg.spur_protect)
1376 dib7000p_spur_protect(state, ch->frequency / 1000, BANDWIDTH_TO_KHZ(ch->bandwidth_hz));
1377
1378 dib7000p_set_bandwidth(state, BANDWIDTH_TO_KHZ(ch->bandwidth_hz));
1379
1380 dib7000p_reset_stats(demod);
1381
1382 return 0;
1383 }
1384
1385 static int dib7000p_wakeup(struct dvb_frontend *demod)
1386 {
1387 struct dib7000p_state *state = demod->demodulator_priv;
1388 dib7000p_set_power_mode(state, DIB7000P_POWER_ALL);
1389 dib7000p_set_adc_state(state, DIBX000_SLOW_ADC_ON);
1390 if (state->version == SOC7090)
1391 dib7000p_sad_calib(state);
1392 return 0;
1393 }
1394
1395 static int dib7000p_sleep(struct dvb_frontend *demod)
1396 {
1397 struct dib7000p_state *state = demod->demodulator_priv;
1398 if (state->version == SOC7090)
1399 return dib7000p_set_power_mode(state, DIB7000P_POWER_INTERFACE_ONLY);
1400 return dib7000p_set_output_mode(state, OUTMODE_HIGH_Z) | dib7000p_set_power_mode(state, DIB7000P_POWER_INTERFACE_ONLY);
1401 }
1402
1403 static int dib7000p_identify(struct dib7000p_state *st)
1404 {
1405 u16 value;
1406 dprintk("checking demod on I2C address: %d (%x)\n", st->i2c_addr, st->i2c_addr);
1407
1408 if ((value = dib7000p_read_word(st, 768)) != 0x01b3) {
1409 dprintk("wrong Vendor ID (read=0x%x)\n", value);
1410 return -EREMOTEIO;
1411 }
1412
1413 if ((value = dib7000p_read_word(st, 769)) != 0x4000) {
1414 dprintk("wrong Device ID (%x)\n", value);
1415 return -EREMOTEIO;
1416 }
1417
1418 return 0;
1419 }
1420
1421 static int dib7000p_get_frontend(struct dvb_frontend *fe,
1422 struct dtv_frontend_properties *fep)
1423 {
1424 struct dib7000p_state *state = fe->demodulator_priv;
1425 u16 tps = dib7000p_read_word(state, 463);
1426
1427 fep->inversion = INVERSION_AUTO;
1428
1429 fep->bandwidth_hz = BANDWIDTH_TO_HZ(state->current_bandwidth);
1430
1431 switch ((tps >> 8) & 0x3) {
1432 case 0:
1433 fep->transmission_mode = TRANSMISSION_MODE_2K;
1434 break;
1435 case 1:
1436 fep->transmission_mode = TRANSMISSION_MODE_8K;
1437 break;
1438
1439 }
1440
1441 switch (tps & 0x3) {
1442 case 0:
1443 fep->guard_interval = GUARD_INTERVAL_1_32;
1444 break;
1445 case 1:
1446 fep->guard_interval = GUARD_INTERVAL_1_16;
1447 break;
1448 case 2:
1449 fep->guard_interval = GUARD_INTERVAL_1_8;
1450 break;
1451 case 3:
1452 fep->guard_interval = GUARD_INTERVAL_1_4;
1453 break;
1454 }
1455
1456 switch ((tps >> 14) & 0x3) {
1457 case 0:
1458 fep->modulation = QPSK;
1459 break;
1460 case 1:
1461 fep->modulation = QAM_16;
1462 break;
1463 case 2:
1464 default:
1465 fep->modulation = QAM_64;
1466 break;
1467 }
1468
1469
1470
1471
1472 fep->hierarchy = HIERARCHY_NONE;
1473 switch ((tps >> 5) & 0x7) {
1474 case 1:
1475 fep->code_rate_HP = FEC_1_2;
1476 break;
1477 case 2:
1478 fep->code_rate_HP = FEC_2_3;
1479 break;
1480 case 3:
1481 fep->code_rate_HP = FEC_3_4;
1482 break;
1483 case 5:
1484 fep->code_rate_HP = FEC_5_6;
1485 break;
1486 case 7:
1487 default:
1488 fep->code_rate_HP = FEC_7_8;
1489 break;
1490
1491 }
1492
1493 switch ((tps >> 2) & 0x7) {
1494 case 1:
1495 fep->code_rate_LP = FEC_1_2;
1496 break;
1497 case 2:
1498 fep->code_rate_LP = FEC_2_3;
1499 break;
1500 case 3:
1501 fep->code_rate_LP = FEC_3_4;
1502 break;
1503 case 5:
1504 fep->code_rate_LP = FEC_5_6;
1505 break;
1506 case 7:
1507 default:
1508 fep->code_rate_LP = FEC_7_8;
1509 break;
1510 }
1511
1512
1513
1514 return 0;
1515 }
1516
1517 static int dib7000p_set_frontend(struct dvb_frontend *fe)
1518 {
1519 struct dtv_frontend_properties *fep = &fe->dtv_property_cache;
1520 struct dib7000p_state *state = fe->demodulator_priv;
1521 int time, ret;
1522
1523 if (state->version == SOC7090)
1524 dib7090_set_diversity_in(fe, 0);
1525 else
1526 dib7000p_set_output_mode(state, OUTMODE_HIGH_Z);
1527
1528
1529 state->sfn_workaround_active = buggy_sfn_workaround;
1530
1531 if (fe->ops.tuner_ops.set_params)
1532 fe->ops.tuner_ops.set_params(fe);
1533
1534
1535 state->agc_state = 0;
1536 do {
1537 time = dib7000p_agc_startup(fe);
1538 if (time != -1)
1539 msleep(time);
1540 } while (time != -1);
1541
1542 if (fep->transmission_mode == TRANSMISSION_MODE_AUTO ||
1543 fep->guard_interval == GUARD_INTERVAL_AUTO || fep->modulation == QAM_AUTO || fep->code_rate_HP == FEC_AUTO) {
1544 int i = 800, found;
1545
1546 dib7000p_autosearch_start(fe);
1547 do {
1548 msleep(1);
1549 found = dib7000p_autosearch_is_irq(fe);
1550 } while (found == 0 && i--);
1551
1552 dprintk("autosearch returns: %d\n", found);
1553 if (found == 0 || found == 1)
1554 return 0;
1555
1556 dib7000p_get_frontend(fe, fep);
1557 }
1558
1559 ret = dib7000p_tune(fe);
1560
1561
1562 if (state->version == SOC7090) {
1563 dib7090_set_output_mode(fe, state->cfg.output_mode);
1564 if (state->cfg.enMpegOutput == 0) {
1565 dib7090_setDibTxMux(state, MPEG_ON_DIBTX);
1566 dib7090_setHostBusMux(state, DIBTX_ON_HOSTBUS);
1567 }
1568 } else
1569 dib7000p_set_output_mode(state, state->cfg.output_mode);
1570
1571 return ret;
1572 }
1573
1574 static int dib7000p_get_stats(struct dvb_frontend *fe, enum fe_status stat);
1575
1576 static int dib7000p_read_status(struct dvb_frontend *fe, enum fe_status *stat)
1577 {
1578 struct dib7000p_state *state = fe->demodulator_priv;
1579 u16 lock = dib7000p_read_word(state, 509);
1580
1581 *stat = 0;
1582
1583 if (lock & 0x8000)
1584 *stat |= FE_HAS_SIGNAL;
1585 if (lock & 0x3000)
1586 *stat |= FE_HAS_CARRIER;
1587 if (lock & 0x0100)
1588 *stat |= FE_HAS_VITERBI;
1589 if (lock & 0x0010)
1590 *stat |= FE_HAS_SYNC;
1591 if ((lock & 0x0038) == 0x38)
1592 *stat |= FE_HAS_LOCK;
1593
1594 dib7000p_get_stats(fe, *stat);
1595
1596 return 0;
1597 }
1598
1599 static int dib7000p_read_ber(struct dvb_frontend *fe, u32 * ber)
1600 {
1601 struct dib7000p_state *state = fe->demodulator_priv;
1602 *ber = (dib7000p_read_word(state, 500) << 16) | dib7000p_read_word(state, 501);
1603 return 0;
1604 }
1605
1606 static int dib7000p_read_unc_blocks(struct dvb_frontend *fe, u32 * unc)
1607 {
1608 struct dib7000p_state *state = fe->demodulator_priv;
1609 *unc = dib7000p_read_word(state, 506);
1610 return 0;
1611 }
1612
1613 static int dib7000p_read_signal_strength(struct dvb_frontend *fe, u16 * strength)
1614 {
1615 struct dib7000p_state *state = fe->demodulator_priv;
1616 u16 val = dib7000p_read_word(state, 394);
1617 *strength = 65535 - val;
1618 return 0;
1619 }
1620
1621 static u32 dib7000p_get_snr(struct dvb_frontend *fe)
1622 {
1623 struct dib7000p_state *state = fe->demodulator_priv;
1624 u16 val;
1625 s32 signal_mant, signal_exp, noise_mant, noise_exp;
1626 u32 result = 0;
1627
1628 val = dib7000p_read_word(state, 479);
1629 noise_mant = (val >> 4) & 0xff;
1630 noise_exp = ((val & 0xf) << 2);
1631 val = dib7000p_read_word(state, 480);
1632 noise_exp += ((val >> 14) & 0x3);
1633 if ((noise_exp & 0x20) != 0)
1634 noise_exp -= 0x40;
1635
1636 signal_mant = (val >> 6) & 0xFF;
1637 signal_exp = (val & 0x3F);
1638 if ((signal_exp & 0x20) != 0)
1639 signal_exp -= 0x40;
1640
1641 if (signal_mant != 0)
1642 result = intlog10(2) * 10 * signal_exp + 10 * intlog10(signal_mant);
1643 else
1644 result = intlog10(2) * 10 * signal_exp - 100;
1645
1646 if (noise_mant != 0)
1647 result -= intlog10(2) * 10 * noise_exp + 10 * intlog10(noise_mant);
1648 else
1649 result -= intlog10(2) * 10 * noise_exp - 100;
1650
1651 return result;
1652 }
1653
1654 static int dib7000p_read_snr(struct dvb_frontend *fe, u16 *snr)
1655 {
1656 u32 result;
1657
1658 result = dib7000p_get_snr(fe);
1659
1660 *snr = result / ((1 << 24) / 10);
1661 return 0;
1662 }
1663
1664 static void dib7000p_reset_stats(struct dvb_frontend *demod)
1665 {
1666 struct dib7000p_state *state = demod->demodulator_priv;
1667 struct dtv_frontend_properties *c = &demod->dtv_property_cache;
1668 u32 ucb;
1669
1670 memset(&c->strength, 0, sizeof(c->strength));
1671 memset(&c->cnr, 0, sizeof(c->cnr));
1672 memset(&c->post_bit_error, 0, sizeof(c->post_bit_error));
1673 memset(&c->post_bit_count, 0, sizeof(c->post_bit_count));
1674 memset(&c->block_error, 0, sizeof(c->block_error));
1675
1676 c->strength.len = 1;
1677 c->cnr.len = 1;
1678 c->block_error.len = 1;
1679 c->block_count.len = 1;
1680 c->post_bit_error.len = 1;
1681 c->post_bit_count.len = 1;
1682
1683 c->strength.stat[0].scale = FE_SCALE_DECIBEL;
1684 c->strength.stat[0].uvalue = 0;
1685
1686 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1687 c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1688 c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1689 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1690 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1691
1692 dib7000p_read_unc_blocks(demod, &ucb);
1693
1694 state->old_ucb = ucb;
1695 state->ber_jiffies_stats = 0;
1696 state->per_jiffies_stats = 0;
1697 }
1698
1699 struct linear_segments {
1700 unsigned x;
1701 signed y;
1702 };
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723 #define DB_OFFSET 131000
1724
1725 static struct linear_segments strength_to_db_table[] = {
1726 { 63630, DB_OFFSET - 20500},
1727 { 62273, DB_OFFSET - 21000},
1728 { 60162, DB_OFFSET - 22000},
1729 { 58730, DB_OFFSET - 23000},
1730 { 58294, DB_OFFSET - 24000},
1731 { 57778, DB_OFFSET - 25000},
1732 { 57320, DB_OFFSET - 26000},
1733 { 56779, DB_OFFSET - 27000},
1734 { 56293, DB_OFFSET - 28000},
1735 { 55724, DB_OFFSET - 29000},
1736 { 55145, DB_OFFSET - 30000},
1737 { 54680, DB_OFFSET - 31000},
1738 { 54293, DB_OFFSET - 32000},
1739 { 53813, DB_OFFSET - 33000},
1740 { 53427, DB_OFFSET - 34000},
1741 { 52981, DB_OFFSET - 35000},
1742
1743 { 52636, DB_OFFSET - 36000},
1744 { 52014, DB_OFFSET - 37000},
1745 { 51674, DB_OFFSET - 38000},
1746 { 50692, DB_OFFSET - 39000},
1747 { 49824, DB_OFFSET - 40000},
1748 { 49052, DB_OFFSET - 41000},
1749 { 48436, DB_OFFSET - 42000},
1750 { 47836, DB_OFFSET - 43000},
1751 { 47368, DB_OFFSET - 44000},
1752 { 46468, DB_OFFSET - 45000},
1753 { 45597, DB_OFFSET - 46000},
1754 { 44586, DB_OFFSET - 47000},
1755 { 43667, DB_OFFSET - 48000},
1756 { 42673, DB_OFFSET - 49000},
1757 { 41816, DB_OFFSET - 50000},
1758 { 40876, DB_OFFSET - 51000},
1759 { 0, 0},
1760 };
1761
1762 static u32 interpolate_value(u32 value, struct linear_segments *segments,
1763 unsigned len)
1764 {
1765 u64 tmp64;
1766 u32 dx;
1767 s32 dy;
1768 int i, ret;
1769
1770 if (value >= segments[0].x)
1771 return segments[0].y;
1772 if (value < segments[len-1].x)
1773 return segments[len-1].y;
1774
1775 for (i = 1; i < len - 1; i++) {
1776
1777 if (value == segments[i].x)
1778 return segments[i].y;
1779 if (value > segments[i].x)
1780 break;
1781 }
1782
1783
1784 dy = segments[i - 1].y - segments[i].y;
1785 dx = segments[i - 1].x - segments[i].x;
1786
1787 tmp64 = value - segments[i].x;
1788 tmp64 *= dy;
1789 do_div(tmp64, dx);
1790 ret = segments[i].y + tmp64;
1791
1792 return ret;
1793 }
1794
1795
1796 static u32 dib7000p_get_time_us(struct dvb_frontend *demod)
1797 {
1798 struct dtv_frontend_properties *c = &demod->dtv_property_cache;
1799 u64 time_us, tmp64;
1800 u32 tmp, denom;
1801 int guard, rate_num, rate_denum = 1, bits_per_symbol;
1802 int interleaving = 0, fft_div;
1803
1804 switch (c->guard_interval) {
1805 case GUARD_INTERVAL_1_4:
1806 guard = 4;
1807 break;
1808 case GUARD_INTERVAL_1_8:
1809 guard = 8;
1810 break;
1811 case GUARD_INTERVAL_1_16:
1812 guard = 16;
1813 break;
1814 default:
1815 case GUARD_INTERVAL_1_32:
1816 guard = 32;
1817 break;
1818 }
1819
1820 switch (c->transmission_mode) {
1821 case TRANSMISSION_MODE_2K:
1822 fft_div = 4;
1823 break;
1824 case TRANSMISSION_MODE_4K:
1825 fft_div = 2;
1826 break;
1827 default:
1828 case TRANSMISSION_MODE_8K:
1829 fft_div = 1;
1830 break;
1831 }
1832
1833 switch (c->modulation) {
1834 case DQPSK:
1835 case QPSK:
1836 bits_per_symbol = 2;
1837 break;
1838 case QAM_16:
1839 bits_per_symbol = 4;
1840 break;
1841 default:
1842 case QAM_64:
1843 bits_per_symbol = 6;
1844 break;
1845 }
1846
1847 switch ((c->hierarchy == 0 || 1 == 1) ? c->code_rate_HP : c->code_rate_LP) {
1848 case FEC_1_2:
1849 rate_num = 1;
1850 rate_denum = 2;
1851 break;
1852 case FEC_2_3:
1853 rate_num = 2;
1854 rate_denum = 3;
1855 break;
1856 case FEC_3_4:
1857 rate_num = 3;
1858 rate_denum = 4;
1859 break;
1860 case FEC_5_6:
1861 rate_num = 5;
1862 rate_denum = 6;
1863 break;
1864 default:
1865 case FEC_7_8:
1866 rate_num = 7;
1867 rate_denum = 8;
1868 break;
1869 }
1870
1871 denom = bits_per_symbol * rate_num * fft_div * 384;
1872
1873
1874
1875
1876
1877
1878
1879 if (!denom)
1880 return 0;
1881
1882
1883 time_us = rate_denum * (1008 * 1562500L);
1884 tmp64 = time_us;
1885 do_div(tmp64, guard);
1886 time_us = time_us + tmp64;
1887 time_us += denom / 2;
1888 do_div(time_us, denom);
1889
1890 tmp = 1008 * 96 * interleaving;
1891 time_us += tmp + tmp / guard;
1892
1893 return time_us;
1894 }
1895
1896 static int dib7000p_get_stats(struct dvb_frontend *demod, enum fe_status stat)
1897 {
1898 struct dib7000p_state *state = demod->demodulator_priv;
1899 struct dtv_frontend_properties *c = &demod->dtv_property_cache;
1900 int show_per_stats = 0;
1901 u32 time_us = 0, val, snr;
1902 u64 blocks, ucb;
1903 s32 db;
1904 u16 strength;
1905
1906
1907 dib7000p_read_signal_strength(demod, &strength);
1908 val = strength;
1909 db = interpolate_value(val,
1910 strength_to_db_table,
1911 ARRAY_SIZE(strength_to_db_table)) - DB_OFFSET;
1912 c->strength.stat[0].svalue = db;
1913
1914
1915 if (!(stat & FE_HAS_LOCK)) {
1916 c->cnr.len = 1;
1917 c->block_count.len = 1;
1918 c->block_error.len = 1;
1919 c->post_bit_error.len = 1;
1920 c->post_bit_count.len = 1;
1921 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1922 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1923 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1924 c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1925 c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1926 return 0;
1927 }
1928
1929
1930 if (time_after(jiffies, state->per_jiffies_stats)) {
1931 state->per_jiffies_stats = jiffies + msecs_to_jiffies(1000);
1932
1933
1934 snr = dib7000p_get_snr(demod);
1935 if (snr)
1936 snr = (1000L * snr) >> 24;
1937 else
1938 snr = 0;
1939 c->cnr.stat[0].svalue = snr;
1940 c->cnr.stat[0].scale = FE_SCALE_DECIBEL;
1941
1942
1943 dib7000p_read_unc_blocks(demod, &val);
1944 ucb = val - state->old_ucb;
1945 if (val < state->old_ucb)
1946 ucb += 0x100000000LL;
1947
1948 c->block_error.stat[0].scale = FE_SCALE_COUNTER;
1949 c->block_error.stat[0].uvalue = ucb;
1950
1951
1952 if (!time_us)
1953 time_us = dib7000p_get_time_us(demod);
1954
1955 if (time_us) {
1956 blocks = 1250000ULL * 1000000ULL;
1957 do_div(blocks, time_us * 8 * 204);
1958 c->block_count.stat[0].scale = FE_SCALE_COUNTER;
1959 c->block_count.stat[0].uvalue += blocks;
1960 }
1961
1962 show_per_stats = 1;
1963 }
1964
1965
1966 if (time_after(jiffies, state->ber_jiffies_stats)) {
1967 time_us = dib7000p_get_time_us(demod);
1968 state->ber_jiffies_stats = jiffies + msecs_to_jiffies((time_us + 500) / 1000);
1969
1970 dprintk("Next all layers stats available in %u us.\n", time_us);
1971
1972 dib7000p_read_ber(demod, &val);
1973 c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
1974 c->post_bit_error.stat[0].uvalue += val;
1975
1976 c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
1977 c->post_bit_count.stat[0].uvalue += 100000000;
1978 }
1979
1980
1981 if (show_per_stats) {
1982 dib7000p_read_unc_blocks(demod, &val);
1983
1984 c->block_error.stat[0].scale = FE_SCALE_COUNTER;
1985 c->block_error.stat[0].uvalue += val;
1986
1987 time_us = dib7000p_get_time_us(demod);
1988 if (time_us) {
1989 blocks = 1250000ULL * 1000000ULL;
1990 do_div(blocks, time_us * 8 * 204);
1991 c->block_count.stat[0].scale = FE_SCALE_COUNTER;
1992 c->block_count.stat[0].uvalue += blocks;
1993 }
1994 }
1995 return 0;
1996 }
1997
1998 static int dib7000p_fe_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings *tune)
1999 {
2000 tune->min_delay_ms = 1000;
2001 return 0;
2002 }
2003
2004 static void dib7000p_release(struct dvb_frontend *demod)
2005 {
2006 struct dib7000p_state *st = demod->demodulator_priv;
2007 dibx000_exit_i2c_master(&st->i2c_master);
2008 i2c_del_adapter(&st->dib7090_tuner_adap);
2009 kfree(st);
2010 }
2011
2012 static int dib7000pc_detection(struct i2c_adapter *i2c_adap)
2013 {
2014 u8 *tx, *rx;
2015 struct i2c_msg msg[2] = {
2016 {.addr = 18 >> 1, .flags = 0, .len = 2},
2017 {.addr = 18 >> 1, .flags = I2C_M_RD, .len = 2},
2018 };
2019 int ret = 0;
2020
2021 tx = kzalloc(2, GFP_KERNEL);
2022 if (!tx)
2023 return -ENOMEM;
2024 rx = kzalloc(2, GFP_KERNEL);
2025 if (!rx) {
2026 ret = -ENOMEM;
2027 goto rx_memory_error;
2028 }
2029
2030 msg[0].buf = tx;
2031 msg[1].buf = rx;
2032
2033 tx[0] = 0x03;
2034 tx[1] = 0x00;
2035
2036 if (i2c_transfer(i2c_adap, msg, 2) == 2)
2037 if (rx[0] == 0x01 && rx[1] == 0xb3) {
2038 dprintk("-D- DiB7000PC detected\n");
2039 ret = 1;
2040 goto out;
2041 }
2042
2043 msg[0].addr = msg[1].addr = 0x40;
2044
2045 if (i2c_transfer(i2c_adap, msg, 2) == 2)
2046 if (rx[0] == 0x01 && rx[1] == 0xb3) {
2047 dprintk("-D- DiB7000PC detected\n");
2048 ret = 1;
2049 goto out;
2050 }
2051
2052 dprintk("-D- DiB7000PC not detected\n");
2053
2054 out:
2055 kfree(rx);
2056 rx_memory_error:
2057 kfree(tx);
2058 return ret;
2059 }
2060
2061 static struct i2c_adapter *dib7000p_get_i2c_master(struct dvb_frontend *demod, enum dibx000_i2c_interface intf, int gating)
2062 {
2063 struct dib7000p_state *st = demod->demodulator_priv;
2064 return dibx000_get_i2c_adapter(&st->i2c_master, intf, gating);
2065 }
2066
2067 static int dib7000p_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff)
2068 {
2069 struct dib7000p_state *state = fe->demodulator_priv;
2070 u16 val = dib7000p_read_word(state, 235) & 0xffef;
2071 val |= (onoff & 0x1) << 4;
2072 dprintk("PID filter enabled %d\n", onoff);
2073 return dib7000p_write_word(state, 235, val);
2074 }
2075
2076 static int dib7000p_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
2077 {
2078 struct dib7000p_state *state = fe->demodulator_priv;
2079 dprintk("PID filter: index %x, PID %d, OnOff %d\n", id, pid, onoff);
2080 return dib7000p_write_word(state, 241 + id, onoff ? (1 << 13) | pid : 0);
2081 }
2082
2083 static int dib7000p_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, struct dib7000p_config cfg[])
2084 {
2085 struct dib7000p_state *dpst;
2086 int k = 0;
2087 u8 new_addr = 0;
2088
2089 dpst = kzalloc(sizeof(struct dib7000p_state), GFP_KERNEL);
2090 if (!dpst)
2091 return -ENOMEM;
2092
2093 dpst->i2c_adap = i2c;
2094 mutex_init(&dpst->i2c_buffer_lock);
2095
2096 for (k = no_of_demods - 1; k >= 0; k--) {
2097 dpst->cfg = cfg[k];
2098
2099
2100 if (cfg[k].default_i2c_addr != 0)
2101 new_addr = cfg[k].default_i2c_addr + (k << 1);
2102 else
2103 new_addr = (0x40 + k) << 1;
2104 dpst->i2c_addr = new_addr;
2105 dib7000p_write_word(dpst, 1287, 0x0003);
2106 if (dib7000p_identify(dpst) != 0) {
2107 dpst->i2c_addr = default_addr;
2108 dib7000p_write_word(dpst, 1287, 0x0003);
2109 if (dib7000p_identify(dpst) != 0) {
2110 dprintk("DiB7000P #%d: not identified\n", k);
2111 kfree(dpst);
2112 return -EIO;
2113 }
2114 }
2115
2116
2117 dib7000p_set_output_mode(dpst, OUTMODE_DIVERSITY);
2118
2119
2120 dib7000p_write_word(dpst, 1285, (new_addr << 2) | 0x2);
2121
2122 dprintk("IC %d initialized (to i2c_address 0x%x)\n", k, new_addr);
2123 }
2124
2125 for (k = 0; k < no_of_demods; k++) {
2126 dpst->cfg = cfg[k];
2127 if (cfg[k].default_i2c_addr != 0)
2128 dpst->i2c_addr = (cfg[k].default_i2c_addr + k) << 1;
2129 else
2130 dpst->i2c_addr = (0x40 + k) << 1;
2131
2132
2133 dib7000p_write_word(dpst, 1285, dpst->i2c_addr << 2);
2134
2135
2136 dib7000p_set_output_mode(dpst, OUTMODE_HIGH_Z);
2137 }
2138
2139 kfree(dpst);
2140 return 0;
2141 }
2142
2143 static const s32 lut_1000ln_mant[] = {
2144 6908, 6956, 7003, 7047, 7090, 7131, 7170, 7208, 7244, 7279, 7313, 7346, 7377, 7408, 7438, 7467, 7495, 7523, 7549, 7575, 7600
2145 };
2146
2147 static s32 dib7000p_get_adc_power(struct dvb_frontend *fe)
2148 {
2149 struct dib7000p_state *state = fe->demodulator_priv;
2150 u32 tmp_val = 0, exp = 0, mant = 0;
2151 s32 pow_i;
2152 u16 buf[2];
2153 u8 ix = 0;
2154
2155 buf[0] = dib7000p_read_word(state, 0x184);
2156 buf[1] = dib7000p_read_word(state, 0x185);
2157 pow_i = (buf[0] << 16) | buf[1];
2158 dprintk("raw pow_i = %d\n", pow_i);
2159
2160 tmp_val = pow_i;
2161 while (tmp_val >>= 1)
2162 exp++;
2163
2164 mant = (pow_i * 1000 / (1 << exp));
2165 dprintk(" mant = %d exp = %d\n", mant / 1000, exp);
2166
2167 ix = (u8) ((mant - 1000) / 100);
2168 dprintk(" ix = %d\n", ix);
2169
2170 pow_i = (lut_1000ln_mant[ix] + 693 * (exp - 20) - 6908);
2171 pow_i = (pow_i << 8) / 1000;
2172 dprintk(" pow_i = %d\n", pow_i);
2173
2174 return pow_i;
2175 }
2176
2177 static int map_addr_to_serpar_number(struct i2c_msg *msg)
2178 {
2179 if ((msg->buf[0] <= 15))
2180 msg->buf[0] -= 1;
2181 else if (msg->buf[0] == 17)
2182 msg->buf[0] = 15;
2183 else if (msg->buf[0] == 16)
2184 msg->buf[0] = 17;
2185 else if (msg->buf[0] == 19)
2186 msg->buf[0] = 16;
2187 else if (msg->buf[0] >= 21 && msg->buf[0] <= 25)
2188 msg->buf[0] -= 3;
2189 else if (msg->buf[0] == 28)
2190 msg->buf[0] = 23;
2191 else
2192 return -EINVAL;
2193 return 0;
2194 }
2195
2196 static int w7090p_tuner_write_serpar(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
2197 {
2198 struct dib7000p_state *state = i2c_get_adapdata(i2c_adap);
2199 u8 n_overflow = 1;
2200 u16 i = 1000;
2201 u16 serpar_num = msg[0].buf[0];
2202
2203 while (n_overflow == 1 && i) {
2204 n_overflow = (dib7000p_read_word(state, 1984) >> 1) & 0x1;
2205 i--;
2206 if (i == 0)
2207 dprintk("Tuner ITF: write busy (overflow)\n");
2208 }
2209 dib7000p_write_word(state, 1985, (1 << 6) | (serpar_num & 0x3f));
2210 dib7000p_write_word(state, 1986, (msg[0].buf[1] << 8) | msg[0].buf[2]);
2211
2212 return num;
2213 }
2214
2215 static int w7090p_tuner_read_serpar(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
2216 {
2217 struct dib7000p_state *state = i2c_get_adapdata(i2c_adap);
2218 u8 n_overflow = 1, n_empty = 1;
2219 u16 i = 1000;
2220 u16 serpar_num = msg[0].buf[0];
2221 u16 read_word;
2222
2223 while (n_overflow == 1 && i) {
2224 n_overflow = (dib7000p_read_word(state, 1984) >> 1) & 0x1;
2225 i--;
2226 if (i == 0)
2227 dprintk("TunerITF: read busy (overflow)\n");
2228 }
2229 dib7000p_write_word(state, 1985, (0 << 6) | (serpar_num & 0x3f));
2230
2231 i = 1000;
2232 while (n_empty == 1 && i) {
2233 n_empty = dib7000p_read_word(state, 1984) & 0x1;
2234 i--;
2235 if (i == 0)
2236 dprintk("TunerITF: read busy (empty)\n");
2237 }
2238 read_word = dib7000p_read_word(state, 1987);
2239 msg[1].buf[0] = (read_word >> 8) & 0xff;
2240 msg[1].buf[1] = (read_word) & 0xff;
2241
2242 return num;
2243 }
2244
2245 static int w7090p_tuner_rw_serpar(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
2246 {
2247 if (map_addr_to_serpar_number(&msg[0]) == 0) {
2248 if (num == 1) {
2249 return w7090p_tuner_write_serpar(i2c_adap, msg, 1);
2250 } else {
2251 return w7090p_tuner_read_serpar(i2c_adap, msg, 2);
2252 }
2253 }
2254 return num;
2255 }
2256
2257 static int dib7090p_rw_on_apb(struct i2c_adapter *i2c_adap,
2258 struct i2c_msg msg[], int num, u16 apb_address)
2259 {
2260 struct dib7000p_state *state = i2c_get_adapdata(i2c_adap);
2261 u16 word;
2262
2263 if (num == 1) {
2264 dib7000p_write_word(state, apb_address, ((msg[0].buf[1] << 8) | (msg[0].buf[2])));
2265 } else {
2266 word = dib7000p_read_word(state, apb_address);
2267 msg[1].buf[0] = (word >> 8) & 0xff;
2268 msg[1].buf[1] = (word) & 0xff;
2269 }
2270
2271 return num;
2272 }
2273
2274 static int dib7090_tuner_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
2275 {
2276 struct dib7000p_state *state = i2c_get_adapdata(i2c_adap);
2277
2278 u16 apb_address = 0, word;
2279 int i = 0;
2280 switch (msg[0].buf[0]) {
2281 case 0x12:
2282 apb_address = 1920;
2283 break;
2284 case 0x14:
2285 apb_address = 1921;
2286 break;
2287 case 0x24:
2288 apb_address = 1922;
2289 break;
2290 case 0x1a:
2291 apb_address = 1923;
2292 break;
2293 case 0x22:
2294 apb_address = 1924;
2295 break;
2296 case 0x33:
2297 apb_address = 1926;
2298 break;
2299 case 0x34:
2300 apb_address = 1927;
2301 break;
2302 case 0x35:
2303 apb_address = 1928;
2304 break;
2305 case 0x36:
2306 apb_address = 1929;
2307 break;
2308 case 0x37:
2309 apb_address = 1930;
2310 break;
2311 case 0x38:
2312 apb_address = 1931;
2313 break;
2314 case 0x39:
2315 apb_address = 1932;
2316 break;
2317 case 0x2a:
2318 apb_address = 1935;
2319 break;
2320 case 0x2b:
2321 apb_address = 1936;
2322 break;
2323 case 0x2c:
2324 apb_address = 1937;
2325 break;
2326 case 0x2d:
2327 apb_address = 1938;
2328 break;
2329 case 0x2e:
2330 apb_address = 1939;
2331 break;
2332 case 0x2f:
2333 apb_address = 1940;
2334 break;
2335 case 0x30:
2336 apb_address = 1941;
2337 break;
2338 case 0x31:
2339 apb_address = 1942;
2340 break;
2341 case 0x32:
2342 apb_address = 1943;
2343 break;
2344 case 0x3e:
2345 apb_address = 1944;
2346 break;
2347 case 0x3f:
2348 apb_address = 1945;
2349 break;
2350 case 0x40:
2351 apb_address = 1948;
2352 break;
2353 case 0x25:
2354 apb_address = 914;
2355 break;
2356 case 0x26:
2357 apb_address = 915;
2358 break;
2359 case 0x27:
2360 apb_address = 917;
2361 break;
2362 case 0x28:
2363 apb_address = 916;
2364 break;
2365 case 0x1d:
2366 i = ((dib7000p_read_word(state, 72) >> 12) & 0x3);
2367 word = dib7000p_read_word(state, 384 + i);
2368 msg[1].buf[0] = (word >> 8) & 0xff;
2369 msg[1].buf[1] = (word) & 0xff;
2370 return num;
2371 case 0x1f:
2372 if (num == 1) {
2373 word = (u16) ((msg[0].buf[1] << 8) | msg[0].buf[2]);
2374 word &= 0x3;
2375 word = (dib7000p_read_word(state, 72) & ~(3 << 12)) | (word << 12);
2376 dib7000p_write_word(state, 72, word);
2377 return num;
2378 }
2379 }
2380
2381 if (apb_address != 0)
2382 return dib7090p_rw_on_apb(i2c_adap, msg, num, apb_address);
2383 else
2384 return w7090p_tuner_rw_serpar(i2c_adap, msg, num);
2385
2386 return 0;
2387 }
2388
2389 static u32 dib7000p_i2c_func(struct i2c_adapter *adapter)
2390 {
2391 return I2C_FUNC_I2C;
2392 }
2393
2394 static const struct i2c_algorithm dib7090_tuner_xfer_algo = {
2395 .master_xfer = dib7090_tuner_xfer,
2396 .functionality = dib7000p_i2c_func,
2397 };
2398
2399 static struct i2c_adapter *dib7090_get_i2c_tuner(struct dvb_frontend *fe)
2400 {
2401 struct dib7000p_state *st = fe->demodulator_priv;
2402 return &st->dib7090_tuner_adap;
2403 }
2404
2405 static int dib7090_host_bus_drive(struct dib7000p_state *state, u8 drive)
2406 {
2407 u16 reg;
2408
2409
2410 reg = dib7000p_read_word(state, 1798) & ~((0x7) | (0x7 << 6) | (0x7 << 12));
2411 reg |= (drive << 12) | (drive << 6) | drive;
2412 dib7000p_write_word(state, 1798, reg);
2413
2414
2415 reg = dib7000p_read_word(state, 1799) & ~((0x7 << 2) | (0x7 << 8));
2416 reg |= (drive << 8) | (drive << 2);
2417 dib7000p_write_word(state, 1799, reg);
2418
2419
2420 reg = dib7000p_read_word(state, 1800) & ~((0x7) | (0x7 << 6) | (0x7 << 12));
2421 reg |= (drive << 12) | (drive << 6) | drive;
2422 dib7000p_write_word(state, 1800, reg);
2423
2424
2425 reg = dib7000p_read_word(state, 1801) & ~((0x7 << 2) | (0x7 << 8));
2426 reg |= (drive << 8) | (drive << 2);
2427 dib7000p_write_word(state, 1801, reg);
2428
2429
2430 reg = dib7000p_read_word(state, 1802) & ~((0x7) | (0x7 << 6) | (0x7 << 12));
2431 reg |= (drive << 12) | (drive << 6) | drive;
2432 dib7000p_write_word(state, 1802, reg);
2433
2434 return 0;
2435 }
2436
2437 static u32 dib7090_calcSyncFreq(u32 P_Kin, u32 P_Kout, u32 insertExtSynchro, u32 syncSize)
2438 {
2439 u32 quantif = 3;
2440 u32 nom = (insertExtSynchro * P_Kin + syncSize);
2441 u32 denom = P_Kout;
2442 u32 syncFreq = ((nom << quantif) / denom);
2443
2444 if ((syncFreq & ((1 << quantif) - 1)) != 0)
2445 syncFreq = (syncFreq >> quantif) + 1;
2446 else
2447 syncFreq = (syncFreq >> quantif);
2448
2449 if (syncFreq != 0)
2450 syncFreq = syncFreq - 1;
2451
2452 return syncFreq;
2453 }
2454
2455 static int dib7090_cfg_DibTx(struct dib7000p_state *state, u32 P_Kin, u32 P_Kout, u32 insertExtSynchro, u32 synchroMode, u32 syncWord, u32 syncSize)
2456 {
2457 dprintk("Configure DibStream Tx\n");
2458
2459 dib7000p_write_word(state, 1615, 1);
2460 dib7000p_write_word(state, 1603, P_Kin);
2461 dib7000p_write_word(state, 1605, P_Kout);
2462 dib7000p_write_word(state, 1606, insertExtSynchro);
2463 dib7000p_write_word(state, 1608, synchroMode);
2464 dib7000p_write_word(state, 1609, (syncWord >> 16) & 0xffff);
2465 dib7000p_write_word(state, 1610, syncWord & 0xffff);
2466 dib7000p_write_word(state, 1612, syncSize);
2467 dib7000p_write_word(state, 1615, 0);
2468
2469 return 0;
2470 }
2471
2472 static int dib7090_cfg_DibRx(struct dib7000p_state *state, u32 P_Kin, u32 P_Kout, u32 synchroMode, u32 insertExtSynchro, u32 syncWord, u32 syncSize,
2473 u32 dataOutRate)
2474 {
2475 u32 syncFreq;
2476
2477 dprintk("Configure DibStream Rx\n");
2478 if ((P_Kin != 0) && (P_Kout != 0)) {
2479 syncFreq = dib7090_calcSyncFreq(P_Kin, P_Kout, insertExtSynchro, syncSize);
2480 dib7000p_write_word(state, 1542, syncFreq);
2481 }
2482 dib7000p_write_word(state, 1554, 1);
2483 dib7000p_write_word(state, 1536, P_Kin);
2484 dib7000p_write_word(state, 1537, P_Kout);
2485 dib7000p_write_word(state, 1539, synchroMode);
2486 dib7000p_write_word(state, 1540, (syncWord >> 16) & 0xffff);
2487 dib7000p_write_word(state, 1541, syncWord & 0xffff);
2488 dib7000p_write_word(state, 1543, syncSize);
2489 dib7000p_write_word(state, 1544, dataOutRate);
2490 dib7000p_write_word(state, 1554, 0);
2491
2492 return 0;
2493 }
2494
2495 static void dib7090_enMpegMux(struct dib7000p_state *state, int onoff)
2496 {
2497 u16 reg_1287 = dib7000p_read_word(state, 1287);
2498
2499 switch (onoff) {
2500 case 1:
2501 reg_1287 &= ~(1<<7);
2502 break;
2503 case 0:
2504 reg_1287 |= (1<<7);
2505 break;
2506 }
2507
2508 dib7000p_write_word(state, 1287, reg_1287);
2509 }
2510
2511 static void dib7090_configMpegMux(struct dib7000p_state *state,
2512 u16 pulseWidth, u16 enSerialMode, u16 enSerialClkDiv2)
2513 {
2514 dprintk("Enable Mpeg mux\n");
2515
2516 dib7090_enMpegMux(state, 0);
2517
2518
2519 if ((enSerialMode == 1) && (state->input_mode_mpeg == 1))
2520 enSerialClkDiv2 = 0;
2521
2522 dib7000p_write_word(state, 1287, ((pulseWidth & 0x1f) << 2)
2523 | ((enSerialMode & 0x1) << 1)
2524 | (enSerialClkDiv2 & 0x1));
2525
2526 dib7090_enMpegMux(state, 1);
2527 }
2528
2529 static void dib7090_setDibTxMux(struct dib7000p_state *state, int mode)
2530 {
2531 u16 reg_1288 = dib7000p_read_word(state, 1288) & ~(0x7 << 7);
2532
2533 switch (mode) {
2534 case MPEG_ON_DIBTX:
2535 dprintk("SET MPEG ON DIBSTREAM TX\n");
2536 dib7090_cfg_DibTx(state, 8, 5, 0, 0, 0, 0);
2537 reg_1288 |= (1<<9);
2538 break;
2539 case DIV_ON_DIBTX:
2540 dprintk("SET DIV_OUT ON DIBSTREAM TX\n");
2541 dib7090_cfg_DibTx(state, 5, 5, 0, 0, 0, 0);
2542 reg_1288 |= (1<<8);
2543 break;
2544 case ADC_ON_DIBTX:
2545 dprintk("SET ADC_OUT ON DIBSTREAM TX\n");
2546 dib7090_cfg_DibTx(state, 20, 5, 10, 0, 0, 0);
2547 reg_1288 |= (1<<7);
2548 break;
2549 default:
2550 break;
2551 }
2552 dib7000p_write_word(state, 1288, reg_1288);
2553 }
2554
2555 static void dib7090_setHostBusMux(struct dib7000p_state *state, int mode)
2556 {
2557 u16 reg_1288 = dib7000p_read_word(state, 1288) & ~(0x7 << 4);
2558
2559 switch (mode) {
2560 case DEMOUT_ON_HOSTBUS:
2561 dprintk("SET DEM OUT OLD INTERF ON HOST BUS\n");
2562 dib7090_enMpegMux(state, 0);
2563 reg_1288 |= (1<<6);
2564 break;
2565 case DIBTX_ON_HOSTBUS:
2566 dprintk("SET DIBSTREAM TX ON HOST BUS\n");
2567 dib7090_enMpegMux(state, 0);
2568 reg_1288 |= (1<<5);
2569 break;
2570 case MPEG_ON_HOSTBUS:
2571 dprintk("SET MPEG MUX ON HOST BUS\n");
2572 reg_1288 |= (1<<4);
2573 break;
2574 default:
2575 break;
2576 }
2577 dib7000p_write_word(state, 1288, reg_1288);
2578 }
2579
2580 static int dib7090_set_diversity_in(struct dvb_frontend *fe, int onoff)
2581 {
2582 struct dib7000p_state *state = fe->demodulator_priv;
2583 u16 reg_1287;
2584
2585 switch (onoff) {
2586 case 0:
2587 dprintk("%s mode OFF : by default Enable Mpeg INPUT\n", __func__);
2588 dib7090_cfg_DibRx(state, 8, 5, 0, 0, 0, 8, 0);
2589
2590
2591
2592 reg_1287 = dib7000p_read_word(state, 1287);
2593
2594 if ((reg_1287 & 0x1) == 1) {
2595
2596 reg_1287 &= ~0x1;
2597 dib7000p_write_word(state, 1287, reg_1287);
2598 }
2599 state->input_mode_mpeg = 1;
2600 break;
2601 case 1:
2602 case 2:
2603 dprintk("%s ON : Enable diversity INPUT\n", __func__);
2604 dib7090_cfg_DibRx(state, 5, 5, 0, 0, 0, 0, 0);
2605 state->input_mode_mpeg = 0;
2606 break;
2607 }
2608
2609 dib7000p_set_diversity_in(&state->demod, onoff);
2610 return 0;
2611 }
2612
2613 static int dib7090_set_output_mode(struct dvb_frontend *fe, int mode)
2614 {
2615 struct dib7000p_state *state = fe->demodulator_priv;
2616
2617 u16 outreg, smo_mode, fifo_threshold;
2618 u8 prefer_mpeg_mux_use = 1;
2619 int ret = 0;
2620
2621 dib7090_host_bus_drive(state, 1);
2622
2623 fifo_threshold = 1792;
2624 smo_mode = (dib7000p_read_word(state, 235) & 0x0050) | (1 << 1);
2625 outreg = dib7000p_read_word(state, 1286) & ~((1 << 10) | (0x7 << 6) | (1 << 1));
2626
2627 switch (mode) {
2628 case OUTMODE_HIGH_Z:
2629 outreg = 0;
2630 break;
2631
2632 case OUTMODE_MPEG2_SERIAL:
2633 if (prefer_mpeg_mux_use) {
2634 dprintk("setting output mode TS_SERIAL using Mpeg Mux\n");
2635 dib7090_configMpegMux(state, 3, 1, 1);
2636 dib7090_setHostBusMux(state, MPEG_ON_HOSTBUS);
2637 } else {
2638 dprintk("setting output mode TS_SERIAL using Smooth bloc\n");
2639 dib7090_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
2640 outreg |= (2<<6) | (0 << 1);
2641 }
2642 break;
2643
2644 case OUTMODE_MPEG2_PAR_GATED_CLK:
2645 if (prefer_mpeg_mux_use) {
2646 dprintk("setting output mode TS_PARALLEL_GATED using Mpeg Mux\n");
2647 dib7090_configMpegMux(state, 2, 0, 0);
2648 dib7090_setHostBusMux(state, MPEG_ON_HOSTBUS);
2649 } else {
2650 dprintk("setting output mode TS_PARALLEL_GATED using Smooth block\n");
2651 dib7090_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
2652 outreg |= (0<<6);
2653 }
2654 break;
2655
2656 case OUTMODE_MPEG2_PAR_CONT_CLK:
2657 dprintk("setting output mode TS_PARALLEL_CONT using Smooth block\n");
2658 dib7090_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
2659 outreg |= (1<<6);
2660 break;
2661
2662 case OUTMODE_MPEG2_FIFO:
2663 dprintk("setting output mode TS_FIFO using Smooth block\n");
2664 dib7090_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
2665 outreg |= (5<<6);
2666 smo_mode |= (3 << 1);
2667 fifo_threshold = 512;
2668 break;
2669
2670 case OUTMODE_DIVERSITY:
2671 dprintk("setting output mode MODE_DIVERSITY\n");
2672 dib7090_setDibTxMux(state, DIV_ON_DIBTX);
2673 dib7090_setHostBusMux(state, DIBTX_ON_HOSTBUS);
2674 break;
2675
2676 case OUTMODE_ANALOG_ADC:
2677 dprintk("setting output mode MODE_ANALOG_ADC\n");
2678 dib7090_setDibTxMux(state, ADC_ON_DIBTX);
2679 dib7090_setHostBusMux(state, DIBTX_ON_HOSTBUS);
2680 break;
2681 }
2682 if (mode != OUTMODE_HIGH_Z)
2683 outreg |= (1 << 10);
2684
2685 if (state->cfg.output_mpeg2_in_188_bytes)
2686 smo_mode |= (1 << 5);
2687
2688 ret |= dib7000p_write_word(state, 235, smo_mode);
2689 ret |= dib7000p_write_word(state, 236, fifo_threshold);
2690 ret |= dib7000p_write_word(state, 1286, outreg);
2691
2692 return ret;
2693 }
2694
2695 static int dib7090_tuner_sleep(struct dvb_frontend *fe, int onoff)
2696 {
2697 struct dib7000p_state *state = fe->demodulator_priv;
2698 u16 en_cur_state;
2699
2700 dprintk("sleep dib7090: %d\n", onoff);
2701
2702 en_cur_state = dib7000p_read_word(state, 1922);
2703
2704 if (en_cur_state > 0xff)
2705 state->tuner_enable = en_cur_state;
2706
2707 if (onoff)
2708 en_cur_state &= 0x00ff;
2709 else {
2710 if (state->tuner_enable != 0)
2711 en_cur_state = state->tuner_enable;
2712 }
2713
2714 dib7000p_write_word(state, 1922, en_cur_state);
2715
2716 return 0;
2717 }
2718
2719 static int dib7090_get_adc_power(struct dvb_frontend *fe)
2720 {
2721 return dib7000p_get_adc_power(fe);
2722 }
2723
2724 static int dib7090_slave_reset(struct dvb_frontend *fe)
2725 {
2726 struct dib7000p_state *state = fe->demodulator_priv;
2727 u16 reg;
2728
2729 reg = dib7000p_read_word(state, 1794);
2730 dib7000p_write_word(state, 1794, reg | (4 << 12));
2731
2732 dib7000p_write_word(state, 1032, 0xffff);
2733 return 0;
2734 }
2735
2736 static const struct dvb_frontend_ops dib7000p_ops;
2737 static struct dvb_frontend *dib7000p_init(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib7000p_config *cfg)
2738 {
2739 struct dvb_frontend *demod;
2740 struct dib7000p_state *st;
2741 st = kzalloc(sizeof(struct dib7000p_state), GFP_KERNEL);
2742 if (st == NULL)
2743 return NULL;
2744
2745 memcpy(&st->cfg, cfg, sizeof(struct dib7000p_config));
2746 st->i2c_adap = i2c_adap;
2747 st->i2c_addr = i2c_addr;
2748 st->gpio_val = cfg->gpio_val;
2749 st->gpio_dir = cfg->gpio_dir;
2750
2751
2752
2753
2754 if ((st->cfg.output_mode != OUTMODE_MPEG2_SERIAL) && (st->cfg.output_mode != OUTMODE_MPEG2_PAR_GATED_CLK))
2755 st->cfg.output_mode = OUTMODE_MPEG2_FIFO;
2756
2757 demod = &st->demod;
2758 demod->demodulator_priv = st;
2759 memcpy(&st->demod.ops, &dib7000p_ops, sizeof(struct dvb_frontend_ops));
2760 mutex_init(&st->i2c_buffer_lock);
2761
2762 dib7000p_write_word(st, 1287, 0x0003);
2763
2764 if (dib7000p_identify(st) != 0)
2765 goto error;
2766
2767 st->version = dib7000p_read_word(st, 897);
2768
2769
2770
2771
2772 st->i2c_master.gated_tuner_i2c_adap.dev.parent = i2c_adap->dev.parent;
2773
2774 dibx000_init_i2c_master(&st->i2c_master, DIB7000P, st->i2c_adap, st->i2c_addr);
2775
2776
2777 strscpy(st->dib7090_tuner_adap.name, "DiB7090 tuner interface",
2778 sizeof(st->dib7090_tuner_adap.name));
2779 st->dib7090_tuner_adap.algo = &dib7090_tuner_xfer_algo;
2780 st->dib7090_tuner_adap.algo_data = NULL;
2781 st->dib7090_tuner_adap.dev.parent = st->i2c_adap->dev.parent;
2782 i2c_set_adapdata(&st->dib7090_tuner_adap, st);
2783 i2c_add_adapter(&st->dib7090_tuner_adap);
2784
2785 dib7000p_demod_reset(st);
2786
2787 dib7000p_reset_stats(demod);
2788
2789 if (st->version == SOC7090) {
2790 dib7090_set_output_mode(demod, st->cfg.output_mode);
2791 dib7090_set_diversity_in(demod, 0);
2792 }
2793
2794 return demod;
2795
2796 error:
2797 kfree(st);
2798 return NULL;
2799 }
2800
2801 void *dib7000p_attach(struct dib7000p_ops *ops)
2802 {
2803 if (!ops)
2804 return NULL;
2805
2806 ops->slave_reset = dib7090_slave_reset;
2807 ops->get_adc_power = dib7090_get_adc_power;
2808 ops->dib7000pc_detection = dib7000pc_detection;
2809 ops->get_i2c_tuner = dib7090_get_i2c_tuner;
2810 ops->tuner_sleep = dib7090_tuner_sleep;
2811 ops->init = dib7000p_init;
2812 ops->set_agc1_min = dib7000p_set_agc1_min;
2813 ops->set_gpio = dib7000p_set_gpio;
2814 ops->i2c_enumeration = dib7000p_i2c_enumeration;
2815 ops->pid_filter = dib7000p_pid_filter;
2816 ops->pid_filter_ctrl = dib7000p_pid_filter_ctrl;
2817 ops->get_i2c_master = dib7000p_get_i2c_master;
2818 ops->update_pll = dib7000p_update_pll;
2819 ops->ctrl_timf = dib7000p_ctrl_timf;
2820 ops->get_agc_values = dib7000p_get_agc_values;
2821 ops->set_wbd_ref = dib7000p_set_wbd_ref;
2822
2823 return ops;
2824 }
2825 EXPORT_SYMBOL(dib7000p_attach);
2826
2827 static const struct dvb_frontend_ops dib7000p_ops = {
2828 .delsys = { SYS_DVBT },
2829 .info = {
2830 .name = "DiBcom 7000PC",
2831 .frequency_min_hz = 44250 * kHz,
2832 .frequency_max_hz = 867250 * kHz,
2833 .frequency_stepsize_hz = 62500,
2834 .caps = FE_CAN_INVERSION_AUTO |
2835 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
2836 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
2837 FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
2838 FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_RECOVER | FE_CAN_HIERARCHY_AUTO,
2839 },
2840
2841 .release = dib7000p_release,
2842
2843 .init = dib7000p_wakeup,
2844 .sleep = dib7000p_sleep,
2845
2846 .set_frontend = dib7000p_set_frontend,
2847 .get_tune_settings = dib7000p_fe_get_tune_settings,
2848 .get_frontend = dib7000p_get_frontend,
2849
2850 .read_status = dib7000p_read_status,
2851 .read_ber = dib7000p_read_ber,
2852 .read_signal_strength = dib7000p_read_signal_strength,
2853 .read_snr = dib7000p_read_snr,
2854 .read_ucblocks = dib7000p_read_unc_blocks,
2855 };
2856
2857 MODULE_AUTHOR("Olivier Grenie <olivie.grenie@parrot.com>");
2858 MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
2859 MODULE_DESCRIPTION("Driver for the DiBcom 7000PC COFDM demodulator");
2860 MODULE_LICENSE("GPL");