0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/kernel.h>
0011 #include <linux/module.h>
0012 #include <linux/moduleparam.h>
0013 #include <linux/init.h>
0014 #include <linux/delay.h>
0015 #include <linux/firmware.h>
0016 #include <linux/i2c.h>
0017 #include <asm/div64.h>
0018
0019 #include <media/dvb_frontend.h>
0020 #include "stv0910.h"
0021 #include "stv0910_regs.h"
0022
0023 #define EXT_CLOCK 30000000
0024 #define TUNING_DELAY 200
0025 #define BER_SRC_S 0x20
0026 #define BER_SRC_S2 0x20
0027
0028 static LIST_HEAD(stvlist);
0029
0030 enum receive_mode { RCVMODE_NONE, RCVMODE_DVBS, RCVMODE_DVBS2, RCVMODE_AUTO };
0031
0032 enum dvbs2_fectype { DVBS2_64K, DVBS2_16K };
0033
0034 enum dvbs2_mod_cod {
0035 DVBS2_DUMMY_PLF, DVBS2_QPSK_1_4, DVBS2_QPSK_1_3, DVBS2_QPSK_2_5,
0036 DVBS2_QPSK_1_2, DVBS2_QPSK_3_5, DVBS2_QPSK_2_3, DVBS2_QPSK_3_4,
0037 DVBS2_QPSK_4_5, DVBS2_QPSK_5_6, DVBS2_QPSK_8_9, DVBS2_QPSK_9_10,
0038 DVBS2_8PSK_3_5, DVBS2_8PSK_2_3, DVBS2_8PSK_3_4, DVBS2_8PSK_5_6,
0039 DVBS2_8PSK_8_9, DVBS2_8PSK_9_10, DVBS2_16APSK_2_3, DVBS2_16APSK_3_4,
0040 DVBS2_16APSK_4_5, DVBS2_16APSK_5_6, DVBS2_16APSK_8_9, DVBS2_16APSK_9_10,
0041 DVBS2_32APSK_3_4, DVBS2_32APSK_4_5, DVBS2_32APSK_5_6, DVBS2_32APSK_8_9,
0042 DVBS2_32APSK_9_10
0043 };
0044
0045 enum fe_stv0910_mod_cod {
0046 FE_DUMMY_PLF, FE_QPSK_14, FE_QPSK_13, FE_QPSK_25,
0047 FE_QPSK_12, FE_QPSK_35, FE_QPSK_23, FE_QPSK_34,
0048 FE_QPSK_45, FE_QPSK_56, FE_QPSK_89, FE_QPSK_910,
0049 FE_8PSK_35, FE_8PSK_23, FE_8PSK_34, FE_8PSK_56,
0050 FE_8PSK_89, FE_8PSK_910, FE_16APSK_23, FE_16APSK_34,
0051 FE_16APSK_45, FE_16APSK_56, FE_16APSK_89, FE_16APSK_910,
0052 FE_32APSK_34, FE_32APSK_45, FE_32APSK_56, FE_32APSK_89,
0053 FE_32APSK_910
0054 };
0055
0056 enum fe_stv0910_roll_off { FE_SAT_35, FE_SAT_25, FE_SAT_20, FE_SAT_15 };
0057
0058 static inline u32 muldiv32(u32 a, u32 b, u32 c)
0059 {
0060 u64 tmp64;
0061
0062 tmp64 = (u64)a * (u64)b;
0063 do_div(tmp64, c);
0064
0065 return (u32)tmp64;
0066 }
0067
0068 struct stv_base {
0069 struct list_head stvlist;
0070
0071 u8 adr;
0072 struct i2c_adapter *i2c;
0073 struct mutex i2c_lock;
0074 struct mutex reg_lock;
0075 int count;
0076
0077 u32 extclk;
0078 u32 mclk;
0079 };
0080
0081 struct stv {
0082 struct stv_base *base;
0083 struct dvb_frontend fe;
0084 int nr;
0085 u16 regoff;
0086 u8 i2crpt;
0087 u8 tscfgh;
0088 u8 tsgeneral;
0089 u8 tsspeed;
0090 u8 single;
0091 unsigned long tune_time;
0092
0093 s32 search_range;
0094 u32 started;
0095 u32 demod_lock_time;
0096 enum receive_mode receive_mode;
0097 u32 demod_timeout;
0098 u32 fec_timeout;
0099 u32 first_time_lock;
0100 u8 demod_bits;
0101 u32 symbol_rate;
0102
0103 u8 last_viterbi_rate;
0104 enum fe_code_rate puncture_rate;
0105 enum fe_stv0910_mod_cod mod_cod;
0106 enum dvbs2_fectype fectype;
0107 u32 pilots;
0108 enum fe_stv0910_roll_off feroll_off;
0109
0110 int is_standard_broadcast;
0111 int is_vcm;
0112
0113 u32 cur_scrambling_code;
0114
0115 u32 last_bernumerator;
0116 u32 last_berdenominator;
0117 u8 berscale;
0118
0119 u8 vth[6];
0120 };
0121
0122 struct sinit_table {
0123 u16 address;
0124 u8 data;
0125 };
0126
0127 struct slookup {
0128 s16 value;
0129 u32 reg_value;
0130 };
0131
0132 static int write_reg(struct stv *state, u16 reg, u8 val)
0133 {
0134 struct i2c_adapter *adap = state->base->i2c;
0135 u8 data[3] = {reg >> 8, reg & 0xff, val};
0136 struct i2c_msg msg = {.addr = state->base->adr, .flags = 0,
0137 .buf = data, .len = 3};
0138
0139 if (i2c_transfer(adap, &msg, 1) != 1) {
0140 dev_warn(&adap->dev, "i2c write error ([%02x] %04x: %02x)\n",
0141 state->base->adr, reg, val);
0142 return -EIO;
0143 }
0144 return 0;
0145 }
0146
0147 static inline int i2c_read_regs16(struct i2c_adapter *adapter, u8 adr,
0148 u16 reg, u8 *val, int count)
0149 {
0150 u8 msg[2] = {reg >> 8, reg & 0xff};
0151 struct i2c_msg msgs[2] = {{.addr = adr, .flags = 0,
0152 .buf = msg, .len = 2},
0153 {.addr = adr, .flags = I2C_M_RD,
0154 .buf = val, .len = count } };
0155
0156 if (i2c_transfer(adapter, msgs, 2) != 2) {
0157 dev_warn(&adapter->dev, "i2c read error ([%02x] %04x)\n",
0158 adr, reg);
0159 return -EIO;
0160 }
0161 return 0;
0162 }
0163
0164 static int read_reg(struct stv *state, u16 reg, u8 *val)
0165 {
0166 return i2c_read_regs16(state->base->i2c, state->base->adr,
0167 reg, val, 1);
0168 }
0169
0170 static int read_regs(struct stv *state, u16 reg, u8 *val, int len)
0171 {
0172 return i2c_read_regs16(state->base->i2c, state->base->adr,
0173 reg, val, len);
0174 }
0175
0176 static int write_shared_reg(struct stv *state, u16 reg, u8 mask, u8 val)
0177 {
0178 int status;
0179 u8 tmp;
0180
0181 mutex_lock(&state->base->reg_lock);
0182 status = read_reg(state, reg, &tmp);
0183 if (!status)
0184 status = write_reg(state, reg, (tmp & ~mask) | (val & mask));
0185 mutex_unlock(&state->base->reg_lock);
0186 return status;
0187 }
0188
0189 static int write_field(struct stv *state, u32 field, u8 val)
0190 {
0191 int status;
0192 u8 shift, mask, old, new;
0193
0194 status = read_reg(state, field >> 16, &old);
0195 if (status)
0196 return status;
0197 mask = field & 0xff;
0198 shift = (field >> 12) & 0xf;
0199 new = ((val << shift) & mask) | (old & ~mask);
0200 if (new == old)
0201 return 0;
0202 return write_reg(state, field >> 16, new);
0203 }
0204
0205 #define SET_FIELD(_reg, _val) \
0206 write_field(state, state->nr ? FSTV0910_P2_##_reg : \
0207 FSTV0910_P1_##_reg, _val)
0208
0209 #define SET_REG(_reg, _val) \
0210 write_reg(state, state->nr ? RSTV0910_P2_##_reg : \
0211 RSTV0910_P1_##_reg, _val)
0212
0213 #define GET_REG(_reg, _val) \
0214 read_reg(state, state->nr ? RSTV0910_P2_##_reg : \
0215 RSTV0910_P1_##_reg, _val)
0216
0217 static const struct slookup s1_sn_lookup[] = {
0218 { 0, 9242 },
0219 { 5, 9105 },
0220 { 10, 8950 },
0221 { 15, 8780 },
0222 { 20, 8566 },
0223 { 25, 8366 },
0224 { 30, 8146 },
0225 { 35, 7908 },
0226 { 40, 7666 },
0227 { 45, 7405 },
0228 { 50, 7136 },
0229 { 55, 6861 },
0230 { 60, 6576 },
0231 { 65, 6330 },
0232 { 70, 6048 },
0233 { 75, 5768 },
0234 { 80, 5492 },
0235 { 85, 5224 },
0236 { 90, 4959 },
0237 { 95, 4709 },
0238 { 100, 4467 },
0239 { 105, 4236 },
0240 { 110, 4013 },
0241 { 115, 3800 },
0242 { 120, 3598 },
0243 { 125, 3406 },
0244 { 130, 3225 },
0245 { 135, 3052 },
0246 { 140, 2889 },
0247 { 145, 2733 },
0248 { 150, 2587 },
0249 { 160, 2318 },
0250 { 170, 2077 },
0251 { 180, 1862 },
0252 { 190, 1670 },
0253 { 200, 1499 },
0254 { 210, 1347 },
0255 { 220, 1213 },
0256 { 230, 1095 },
0257 { 240, 992 },
0258 { 250, 900 },
0259 { 260, 826 },
0260 { 270, 758 },
0261 { 280, 702 },
0262 { 290, 653 },
0263 { 300, 613 },
0264 { 310, 579 },
0265 { 320, 550 },
0266 { 330, 526 },
0267 { 350, 490 },
0268 { 400, 445 },
0269 { 450, 430 },
0270 { 500, 426 },
0271 { 510, 425 }
0272 };
0273
0274 static const struct slookup s2_sn_lookup[] = {
0275 { -30, 13950 },
0276 { -25, 13580 },
0277 { -20, 13150 },
0278 { -15, 12760 },
0279 { -10, 12345 },
0280 { -5, 11900 },
0281 { 0, 11520 },
0282 { 5, 11080 },
0283 { 10, 10630 },
0284 { 15, 10210 },
0285 { 20, 9790 },
0286 { 25, 9390 },
0287 { 30, 8970 },
0288 { 35, 8575 },
0289 { 40, 8180 },
0290 { 45, 7800 },
0291 { 50, 7430 },
0292 { 55, 7080 },
0293 { 60, 6720 },
0294 { 65, 6320 },
0295 { 70, 6060 },
0296 { 75, 5760 },
0297 { 80, 5480 },
0298 { 85, 5200 },
0299 { 90, 4930 },
0300 { 95, 4680 },
0301 { 100, 4425 },
0302 { 105, 4210 },
0303 { 110, 3980 },
0304 { 115, 3765 },
0305 { 120, 3570 },
0306 { 125, 3315 },
0307 { 130, 3140 },
0308 { 135, 2980 },
0309 { 140, 2820 },
0310 { 145, 2670 },
0311 { 150, 2535 },
0312 { 160, 2270 },
0313 { 170, 2035 },
0314 { 180, 1825 },
0315 { 190, 1650 },
0316 { 200, 1485 },
0317 { 210, 1340 },
0318 { 220, 1212 },
0319 { 230, 1100 },
0320 { 240, 1000 },
0321 { 250, 910 },
0322 { 260, 836 },
0323 { 270, 772 },
0324 { 280, 718 },
0325 { 290, 671 },
0326 { 300, 635 },
0327 { 310, 602 },
0328 { 320, 575 },
0329 { 330, 550 },
0330 { 350, 517 },
0331 { 400, 480 },
0332 { 450, 466 },
0333 { 500, 464 },
0334 { 510, 463 },
0335 };
0336
0337 static const struct slookup padc_lookup[] = {
0338 { 0, 118000 },
0339 { -100, 93600 },
0340 { -200, 74500 },
0341 { -300, 59100 },
0342 { -400, 47000 },
0343 { -500, 37300 },
0344 { -600, 29650 },
0345 { -700, 23520 },
0346 { -900, 14850 },
0347 { -1100, 9380 },
0348 { -1300, 5910 },
0349 { -1500, 3730 },
0350 { -1700, 2354 },
0351 { -1900, 1485 },
0352 { -2000, 1179 },
0353 { -2100, 1000 },
0354 };
0355
0356
0357
0358
0359 static const u8 s2car_loop[] = {
0360
0361
0362
0363
0364
0365
0366 0x0C, 0x3C, 0x0B, 0x3C, 0x2A, 0x2C, 0x2A, 0x1C, 0x3A, 0x3B,
0367
0368 0x0C, 0x3C, 0x0B, 0x3C, 0x2A, 0x2C, 0x3A, 0x0C, 0x3A, 0x2B,
0369
0370 0x1C, 0x3C, 0x1B, 0x3C, 0x3A, 0x1C, 0x3A, 0x3B, 0x3A, 0x2B,
0371
0372 0x0C, 0x1C, 0x2B, 0x1C, 0x0B, 0x2C, 0x0B, 0x0C, 0x2A, 0x2B,
0373
0374 0x1C, 0x1C, 0x2B, 0x1C, 0x0B, 0x2C, 0x0B, 0x0C, 0x2A, 0x2B,
0375
0376 0x2C, 0x2C, 0x2B, 0x1C, 0x0B, 0x2C, 0x0B, 0x0C, 0x2A, 0x2B,
0377
0378 0x3C, 0x2C, 0x3B, 0x2C, 0x1B, 0x1C, 0x1B, 0x3B, 0x3A, 0x1B,
0379
0380 0x0D, 0x3C, 0x3B, 0x2C, 0x1B, 0x1C, 0x1B, 0x3B, 0x3A, 0x1B,
0381
0382 0x1D, 0x3C, 0x0C, 0x2C, 0x2B, 0x1C, 0x1B, 0x3B, 0x0B, 0x1B,
0383
0384 0x3D, 0x0D, 0x0C, 0x2C, 0x2B, 0x0C, 0x2B, 0x2B, 0x0B, 0x0B,
0385
0386 0x1E, 0x0D, 0x1C, 0x2C, 0x3B, 0x0C, 0x2B, 0x2B, 0x1B, 0x0B,
0387
0388 0x28, 0x09, 0x28, 0x09, 0x28, 0x09, 0x28, 0x08, 0x28, 0x27,
0389
0390 0x19, 0x29, 0x19, 0x29, 0x19, 0x29, 0x38, 0x19, 0x28, 0x09,
0391
0392 0x1A, 0x0B, 0x1A, 0x3A, 0x0A, 0x2A, 0x39, 0x2A, 0x39, 0x1A,
0393
0394 0x2B, 0x2B, 0x1B, 0x1B, 0x0B, 0x1B, 0x1A, 0x0B, 0x1A, 0x1A,
0395
0396 0x0C, 0x0C, 0x3B, 0x3B, 0x1B, 0x1B, 0x2A, 0x0B, 0x2A, 0x2A,
0397
0398 0x0C, 0x1C, 0x0C, 0x3B, 0x2B, 0x1B, 0x3A, 0x0B, 0x2A, 0x2A,
0399
0400
0401
0402
0403
0404
0405
0406
0407
0408
0409
0410 0x0A, 0x0A, 0x0A, 0x0A, 0x1A, 0x0A, 0x39, 0x0A, 0x29, 0x0A,
0411
0412 0x0A, 0x0A, 0x0A, 0x0A, 0x0B, 0x0A, 0x2A, 0x0A, 0x1A, 0x0A,
0413
0414 0x0A, 0x0A, 0x0A, 0x0A, 0x1B, 0x0A, 0x3A, 0x0A, 0x2A, 0x0A,
0415
0416 0x0A, 0x0A, 0x0A, 0x0A, 0x1B, 0x0A, 0x3A, 0x0A, 0x2A, 0x0A,
0417
0418 0x0A, 0x0A, 0x0A, 0x0A, 0x2B, 0x0A, 0x0B, 0x0A, 0x3A, 0x0A,
0419
0420 0x0A, 0x0A, 0x0A, 0x0A, 0x2B, 0x0A, 0x0B, 0x0A, 0x3A, 0x0A,
0421
0422 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
0423
0424 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
0425
0426 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
0427
0428 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
0429
0430 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
0431 };
0432
0433 static u8 get_optim_cloop(struct stv *state,
0434 enum fe_stv0910_mod_cod mod_cod, u32 pilots)
0435 {
0436 int i = 0;
0437
0438 if (mod_cod >= FE_32APSK_910)
0439 i = ((int)FE_32APSK_910 - (int)FE_QPSK_14) * 10;
0440 else if (mod_cod >= FE_QPSK_14)
0441 i = ((int)mod_cod - (int)FE_QPSK_14) * 10;
0442
0443 if (state->symbol_rate <= 3000000)
0444 i += 0;
0445 else if (state->symbol_rate <= 7000000)
0446 i += 2;
0447 else if (state->symbol_rate <= 15000000)
0448 i += 4;
0449 else if (state->symbol_rate <= 25000000)
0450 i += 6;
0451 else
0452 i += 8;
0453
0454 if (!pilots)
0455 i += 1;
0456
0457 return s2car_loop[i];
0458 }
0459
0460 static int get_cur_symbol_rate(struct stv *state, u32 *p_symbol_rate)
0461 {
0462 int status = 0;
0463 u8 symb_freq0;
0464 u8 symb_freq1;
0465 u8 symb_freq2;
0466 u8 symb_freq3;
0467 u8 tim_offs0;
0468 u8 tim_offs1;
0469 u8 tim_offs2;
0470 u32 symbol_rate;
0471 s32 timing_offset;
0472
0473 *p_symbol_rate = 0;
0474 if (!state->started)
0475 return status;
0476
0477 read_reg(state, RSTV0910_P2_SFR3 + state->regoff, &symb_freq3);
0478 read_reg(state, RSTV0910_P2_SFR2 + state->regoff, &symb_freq2);
0479 read_reg(state, RSTV0910_P2_SFR1 + state->regoff, &symb_freq1);
0480 read_reg(state, RSTV0910_P2_SFR0 + state->regoff, &symb_freq0);
0481 read_reg(state, RSTV0910_P2_TMGREG2 + state->regoff, &tim_offs2);
0482 read_reg(state, RSTV0910_P2_TMGREG1 + state->regoff, &tim_offs1);
0483 read_reg(state, RSTV0910_P2_TMGREG0 + state->regoff, &tim_offs0);
0484
0485 symbol_rate = ((u32)symb_freq3 << 24) | ((u32)symb_freq2 << 16) |
0486 ((u32)symb_freq1 << 8) | (u32)symb_freq0;
0487 timing_offset = ((u32)tim_offs2 << 16) | ((u32)tim_offs1 << 8) |
0488 (u32)tim_offs0;
0489
0490 if ((timing_offset & (1 << 23)) != 0)
0491 timing_offset |= 0xFF000000;
0492
0493 symbol_rate = (u32)(((u64)symbol_rate * state->base->mclk) >> 32);
0494 timing_offset = (s32)(((s64)symbol_rate * (s64)timing_offset) >> 29);
0495
0496 *p_symbol_rate = symbol_rate + timing_offset;
0497
0498 return 0;
0499 }
0500
0501 static int get_signal_parameters(struct stv *state)
0502 {
0503 u8 tmp;
0504
0505 if (!state->started)
0506 return -EINVAL;
0507
0508 if (state->receive_mode == RCVMODE_DVBS2) {
0509 read_reg(state, RSTV0910_P2_DMDMODCOD + state->regoff, &tmp);
0510 state->mod_cod = (enum fe_stv0910_mod_cod)((tmp & 0x7c) >> 2);
0511 state->pilots = (tmp & 0x01) != 0;
0512 state->fectype = (enum dvbs2_fectype)((tmp & 0x02) >> 1);
0513
0514 } else if (state->receive_mode == RCVMODE_DVBS) {
0515 read_reg(state, RSTV0910_P2_VITCURPUN + state->regoff, &tmp);
0516 state->puncture_rate = FEC_NONE;
0517 switch (tmp & 0x1F) {
0518 case 0x0d:
0519 state->puncture_rate = FEC_1_2;
0520 break;
0521 case 0x12:
0522 state->puncture_rate = FEC_2_3;
0523 break;
0524 case 0x15:
0525 state->puncture_rate = FEC_3_4;
0526 break;
0527 case 0x18:
0528 state->puncture_rate = FEC_5_6;
0529 break;
0530 case 0x1a:
0531 state->puncture_rate = FEC_7_8;
0532 break;
0533 }
0534 state->is_vcm = 0;
0535 state->is_standard_broadcast = 1;
0536 state->feroll_off = FE_SAT_35;
0537 }
0538 return 0;
0539 }
0540
0541 static int tracking_optimization(struct stv *state)
0542 {
0543 u8 tmp;
0544
0545 read_reg(state, RSTV0910_P2_DMDCFGMD + state->regoff, &tmp);
0546 tmp &= ~0xC0;
0547
0548 switch (state->receive_mode) {
0549 case RCVMODE_DVBS:
0550 tmp |= 0x40;
0551 break;
0552 case RCVMODE_DVBS2:
0553 tmp |= 0x80;
0554 break;
0555 default:
0556 tmp |= 0xC0;
0557 break;
0558 }
0559 write_reg(state, RSTV0910_P2_DMDCFGMD + state->regoff, tmp);
0560
0561 if (state->receive_mode == RCVMODE_DVBS2) {
0562
0563 write_shared_reg(state,
0564 RSTV0910_TSTTSRS, state->nr ? 0x02 : 0x01,
0565 0x03);
0566
0567 if (state->fectype == DVBS2_64K) {
0568 u8 aclc = get_optim_cloop(state, state->mod_cod,
0569 state->pilots);
0570
0571 if (state->mod_cod <= FE_QPSK_910) {
0572 write_reg(state, RSTV0910_P2_ACLC2S2Q +
0573 state->regoff, aclc);
0574 } else if (state->mod_cod <= FE_8PSK_910) {
0575 write_reg(state, RSTV0910_P2_ACLC2S2Q +
0576 state->regoff, 0x2a);
0577 write_reg(state, RSTV0910_P2_ACLC2S28 +
0578 state->regoff, aclc);
0579 } else if (state->mod_cod <= FE_16APSK_910) {
0580 write_reg(state, RSTV0910_P2_ACLC2S2Q +
0581 state->regoff, 0x2a);
0582 write_reg(state, RSTV0910_P2_ACLC2S216A +
0583 state->regoff, aclc);
0584 } else if (state->mod_cod <= FE_32APSK_910) {
0585 write_reg(state, RSTV0910_P2_ACLC2S2Q +
0586 state->regoff, 0x2a);
0587 write_reg(state, RSTV0910_P2_ACLC2S232A +
0588 state->regoff, aclc);
0589 }
0590 }
0591 }
0592 return 0;
0593 }
0594
0595 static s32 table_lookup(const struct slookup *table,
0596 int table_size, u32 reg_value)
0597 {
0598 s32 value;
0599 int imin = 0;
0600 int imax = table_size - 1;
0601 int i;
0602 s32 reg_diff;
0603
0604
0605 if (reg_value >= table[0].reg_value) {
0606 value = table[0].value;
0607 } else if (reg_value <= table[imax].reg_value) {
0608 value = table[imax].value;
0609 } else {
0610 while ((imax - imin) > 1) {
0611 i = (imax + imin) / 2;
0612 if ((table[imin].reg_value >= reg_value) &&
0613 (reg_value >= table[i].reg_value))
0614 imax = i;
0615 else
0616 imin = i;
0617 }
0618
0619 reg_diff = table[imax].reg_value - table[imin].reg_value;
0620 value = table[imin].value;
0621 if (reg_diff != 0)
0622 value += ((s32)(reg_value - table[imin].reg_value) *
0623 (s32)(table[imax].value
0624 - table[imin].value))
0625 / (reg_diff);
0626 }
0627
0628 return value;
0629 }
0630
0631 static int get_signal_to_noise(struct stv *state, s32 *signal_to_noise)
0632 {
0633 u8 data0;
0634 u8 data1;
0635 u16 data;
0636 int n_lookup;
0637 const struct slookup *lookup;
0638
0639 *signal_to_noise = 0;
0640
0641 if (!state->started)
0642 return -EINVAL;
0643
0644 if (state->receive_mode == RCVMODE_DVBS2) {
0645 read_reg(state, RSTV0910_P2_NNOSPLHT1 + state->regoff,
0646 &data1);
0647 read_reg(state, RSTV0910_P2_NNOSPLHT0 + state->regoff,
0648 &data0);
0649 n_lookup = ARRAY_SIZE(s2_sn_lookup);
0650 lookup = s2_sn_lookup;
0651 } else {
0652 read_reg(state, RSTV0910_P2_NNOSDATAT1 + state->regoff,
0653 &data1);
0654 read_reg(state, RSTV0910_P2_NNOSDATAT0 + state->regoff,
0655 &data0);
0656 n_lookup = ARRAY_SIZE(s1_sn_lookup);
0657 lookup = s1_sn_lookup;
0658 }
0659 data = (((u16)data1) << 8) | (u16)data0;
0660 *signal_to_noise = table_lookup(lookup, n_lookup, data);
0661 return 0;
0662 }
0663
0664 static int get_bit_error_rate_s(struct stv *state, u32 *bernumerator,
0665 u32 *berdenominator)
0666 {
0667 u8 regs[3];
0668
0669 int status = read_regs(state,
0670 RSTV0910_P2_ERRCNT12 + state->regoff,
0671 regs, 3);
0672
0673 if (status)
0674 return -EINVAL;
0675
0676 if ((regs[0] & 0x80) == 0) {
0677 state->last_berdenominator = 1ULL << ((state->berscale * 2) +
0678 10 + 3);
0679 state->last_bernumerator = ((u32)(regs[0] & 0x7F) << 16) |
0680 ((u32)regs[1] << 8) | regs[2];
0681 if (state->last_bernumerator < 256 && state->berscale < 6) {
0682 state->berscale += 1;
0683 status = write_reg(state, RSTV0910_P2_ERRCTRL1 +
0684 state->regoff,
0685 0x20 | state->berscale);
0686 } else if (state->last_bernumerator > 1024 &&
0687 state->berscale > 2) {
0688 state->berscale -= 1;
0689 status = write_reg(state, RSTV0910_P2_ERRCTRL1 +
0690 state->regoff, 0x20 |
0691 state->berscale);
0692 }
0693 }
0694 *bernumerator = state->last_bernumerator;
0695 *berdenominator = state->last_berdenominator;
0696 return 0;
0697 }
0698
0699 static u32 dvbs2_nbch(enum dvbs2_mod_cod mod_cod, enum dvbs2_fectype fectype)
0700 {
0701 static const u32 nbch[][2] = {
0702 { 0, 0},
0703 {16200, 3240},
0704 {21600, 5400},
0705 {25920, 6480},
0706 {32400, 7200},
0707 {38880, 9720},
0708 {43200, 10800},
0709 {48600, 11880},
0710 {51840, 12600},
0711 {54000, 13320},
0712 {57600, 14400},
0713 {58320, 16000},
0714 {43200, 9720},
0715 {48600, 10800},
0716 {51840, 11880},
0717 {54000, 13320},
0718 {57600, 14400},
0719 {58320, 16000},
0720 {43200, 10800},
0721 {48600, 11880},
0722 {51840, 12600},
0723 {54000, 13320},
0724 {57600, 14400},
0725 {58320, 16000},
0726 {48600, 11880},
0727 {51840, 12600},
0728 {54000, 13320},
0729 {57600, 14400},
0730 {58320, 16000},
0731 };
0732
0733 if (mod_cod >= DVBS2_QPSK_1_4 &&
0734 mod_cod <= DVBS2_32APSK_9_10 && fectype <= DVBS2_16K)
0735 return nbch[mod_cod][fectype];
0736 return 64800;
0737 }
0738
0739 static int get_bit_error_rate_s2(struct stv *state, u32 *bernumerator,
0740 u32 *berdenominator)
0741 {
0742 u8 regs[3];
0743
0744 int status = read_regs(state, RSTV0910_P2_ERRCNT12 + state->regoff,
0745 regs, 3);
0746
0747 if (status)
0748 return -EINVAL;
0749
0750 if ((regs[0] & 0x80) == 0) {
0751 state->last_berdenominator =
0752 dvbs2_nbch((enum dvbs2_mod_cod)state->mod_cod,
0753 state->fectype) <<
0754 (state->berscale * 2);
0755 state->last_bernumerator = (((u32)regs[0] & 0x7F) << 16) |
0756 ((u32)regs[1] << 8) | regs[2];
0757 if (state->last_bernumerator < 256 && state->berscale < 6) {
0758 state->berscale += 1;
0759 write_reg(state, RSTV0910_P2_ERRCTRL1 + state->regoff,
0760 0x20 | state->berscale);
0761 } else if (state->last_bernumerator > 1024 &&
0762 state->berscale > 2) {
0763 state->berscale -= 1;
0764 write_reg(state, RSTV0910_P2_ERRCTRL1 + state->regoff,
0765 0x20 | state->berscale);
0766 }
0767 }
0768 *bernumerator = state->last_bernumerator;
0769 *berdenominator = state->last_berdenominator;
0770 return status;
0771 }
0772
0773 static int get_bit_error_rate(struct stv *state, u32 *bernumerator,
0774 u32 *berdenominator)
0775 {
0776 *bernumerator = 0;
0777 *berdenominator = 1;
0778
0779 switch (state->receive_mode) {
0780 case RCVMODE_DVBS:
0781 return get_bit_error_rate_s(state,
0782 bernumerator, berdenominator);
0783 case RCVMODE_DVBS2:
0784 return get_bit_error_rate_s2(state,
0785 bernumerator, berdenominator);
0786 default:
0787 break;
0788 }
0789 return 0;
0790 }
0791
0792 static int set_mclock(struct stv *state, u32 master_clock)
0793 {
0794 u32 idf = 1;
0795 u32 odf = 4;
0796 u32 quartz = state->base->extclk / 1000000;
0797 u32 fphi = master_clock / 1000000;
0798 u32 ndiv = (fphi * odf * idf) / quartz;
0799 u32 cp = 7;
0800 u32 fvco;
0801
0802 if (ndiv >= 7 && ndiv <= 71)
0803 cp = 7;
0804 else if (ndiv >= 72 && ndiv <= 79)
0805 cp = 8;
0806 else if (ndiv >= 80 && ndiv <= 87)
0807 cp = 9;
0808 else if (ndiv >= 88 && ndiv <= 95)
0809 cp = 10;
0810 else if (ndiv >= 96 && ndiv <= 103)
0811 cp = 11;
0812 else if (ndiv >= 104 && ndiv <= 111)
0813 cp = 12;
0814 else if (ndiv >= 112 && ndiv <= 119)
0815 cp = 13;
0816 else if (ndiv >= 120 && ndiv <= 127)
0817 cp = 14;
0818 else if (ndiv >= 128 && ndiv <= 135)
0819 cp = 15;
0820 else if (ndiv >= 136 && ndiv <= 143)
0821 cp = 16;
0822 else if (ndiv >= 144 && ndiv <= 151)
0823 cp = 17;
0824 else if (ndiv >= 152 && ndiv <= 159)
0825 cp = 18;
0826 else if (ndiv >= 160 && ndiv <= 167)
0827 cp = 19;
0828 else if (ndiv >= 168 && ndiv <= 175)
0829 cp = 20;
0830 else if (ndiv >= 176 && ndiv <= 183)
0831 cp = 21;
0832 else if (ndiv >= 184 && ndiv <= 191)
0833 cp = 22;
0834 else if (ndiv >= 192 && ndiv <= 199)
0835 cp = 23;
0836 else if (ndiv >= 200 && ndiv <= 207)
0837 cp = 24;
0838 else if (ndiv >= 208 && ndiv <= 215)
0839 cp = 25;
0840 else if (ndiv >= 216 && ndiv <= 223)
0841 cp = 26;
0842 else if (ndiv >= 224 && ndiv <= 225)
0843 cp = 27;
0844
0845 write_reg(state, RSTV0910_NCOARSE, (cp << 3) | idf);
0846 write_reg(state, RSTV0910_NCOARSE2, odf);
0847 write_reg(state, RSTV0910_NCOARSE1, ndiv);
0848
0849 fvco = (quartz * 2 * ndiv) / idf;
0850 state->base->mclk = fvco / (2 * odf) * 1000000;
0851
0852 return 0;
0853 }
0854
0855 static int stop(struct stv *state)
0856 {
0857 if (state->started) {
0858 u8 tmp;
0859
0860 write_reg(state, RSTV0910_P2_TSCFGH + state->regoff,
0861 state->tscfgh | 0x01);
0862 read_reg(state, RSTV0910_P2_PDELCTRL1 + state->regoff, &tmp);
0863 tmp &= ~0x01;
0864 write_reg(state, RSTV0910_P2_PDELCTRL1 + state->regoff, tmp);
0865
0866 write_reg(state, RSTV0910_P2_AGC2O + state->regoff, 0x5B);
0867
0868 write_reg(state, RSTV0910_P2_DMDISTATE + state->regoff, 0x5c);
0869 state->started = 0;
0870 }
0871 state->receive_mode = RCVMODE_NONE;
0872 return 0;
0873 }
0874
0875 static void set_pls(struct stv *state, u32 pls_code)
0876 {
0877 if (pls_code == state->cur_scrambling_code)
0878 return;
0879
0880
0881 write_reg(state, RSTV0910_P2_PLROOT0 + state->regoff,
0882 pls_code & 0xff);
0883 write_reg(state, RSTV0910_P2_PLROOT1 + state->regoff,
0884 (pls_code >> 8) & 0xff);
0885 write_reg(state, RSTV0910_P2_PLROOT2 + state->regoff,
0886 0x04 | ((pls_code >> 16) & 0x03));
0887 state->cur_scrambling_code = pls_code;
0888 }
0889
0890 static void set_isi(struct stv *state, u32 isi)
0891 {
0892 if (isi == NO_STREAM_ID_FILTER)
0893 return;
0894 if (isi == 0x80000000) {
0895 SET_FIELD(FORCE_CONTINUOUS, 1);
0896 SET_FIELD(TSOUT_NOSYNC, 1);
0897 } else {
0898 SET_FIELD(FILTER_EN, 1);
0899 write_reg(state, RSTV0910_P2_ISIENTRY + state->regoff,
0900 isi & 0xff);
0901 write_reg(state, RSTV0910_P2_ISIBITENA + state->regoff, 0xff);
0902 }
0903 SET_FIELD(ALGOSWRST, 1);
0904 SET_FIELD(ALGOSWRST, 0);
0905 }
0906
0907 static void set_stream_modes(struct stv *state,
0908 struct dtv_frontend_properties *p)
0909 {
0910 set_isi(state, p->stream_id);
0911 set_pls(state, p->scrambling_sequence_index);
0912 }
0913
0914 static int init_search_param(struct stv *state,
0915 struct dtv_frontend_properties *p)
0916 {
0917 SET_FIELD(FORCE_CONTINUOUS, 0);
0918 SET_FIELD(FRAME_MODE, 0);
0919 SET_FIELD(FILTER_EN, 0);
0920 SET_FIELD(TSOUT_NOSYNC, 0);
0921 SET_FIELD(TSFIFO_EMBINDVB, 0);
0922 SET_FIELD(TSDEL_SYNCBYTE, 0);
0923 SET_REG(UPLCCST0, 0xe0);
0924 SET_FIELD(TSINS_TOKEN, 0);
0925 SET_FIELD(HYSTERESIS_THRESHOLD, 0);
0926 SET_FIELD(ISIOBS_MODE, 1);
0927
0928 set_stream_modes(state, p);
0929 return 0;
0930 }
0931
0932 static int enable_puncture_rate(struct stv *state, enum fe_code_rate rate)
0933 {
0934 u8 val;
0935
0936 switch (rate) {
0937 case FEC_1_2:
0938 val = 0x01;
0939 break;
0940 case FEC_2_3:
0941 val = 0x02;
0942 break;
0943 case FEC_3_4:
0944 val = 0x04;
0945 break;
0946 case FEC_5_6:
0947 val = 0x08;
0948 break;
0949 case FEC_7_8:
0950 val = 0x20;
0951 break;
0952 case FEC_NONE:
0953 default:
0954 val = 0x2f;
0955 break;
0956 }
0957
0958 return write_reg(state, RSTV0910_P2_PRVIT + state->regoff, val);
0959 }
0960
0961 static int set_vth_default(struct stv *state)
0962 {
0963 state->vth[0] = 0xd7;
0964 state->vth[1] = 0x85;
0965 state->vth[2] = 0x58;
0966 state->vth[3] = 0x3a;
0967 state->vth[4] = 0x34;
0968 state->vth[5] = 0x28;
0969 write_reg(state, RSTV0910_P2_VTH12 + state->regoff + 0, state->vth[0]);
0970 write_reg(state, RSTV0910_P2_VTH12 + state->regoff + 1, state->vth[1]);
0971 write_reg(state, RSTV0910_P2_VTH12 + state->regoff + 2, state->vth[2]);
0972 write_reg(state, RSTV0910_P2_VTH12 + state->regoff + 3, state->vth[3]);
0973 write_reg(state, RSTV0910_P2_VTH12 + state->regoff + 4, state->vth[4]);
0974 write_reg(state, RSTV0910_P2_VTH12 + state->regoff + 5, state->vth[5]);
0975 return 0;
0976 }
0977
0978 static int set_vth(struct stv *state)
0979 {
0980 static const struct slookup vthlookup_table[] = {
0981 {250, 8780},
0982 {100, 7405},
0983 {40, 6330},
0984 {12, 5224},
0985 {5, 4236}
0986 };
0987
0988 int i;
0989 u8 tmp[2];
0990 int status = read_regs(state,
0991 RSTV0910_P2_NNOSDATAT1 + state->regoff,
0992 tmp, 2);
0993 u16 reg_value = (tmp[0] << 8) | tmp[1];
0994 s32 vth = table_lookup(vthlookup_table, ARRAY_SIZE(vthlookup_table),
0995 reg_value);
0996
0997 for (i = 0; i < 6; i += 1)
0998 if (state->vth[i] > vth)
0999 state->vth[i] = vth;
1000
1001 write_reg(state, RSTV0910_P2_VTH12 + state->regoff + 0, state->vth[0]);
1002 write_reg(state, RSTV0910_P2_VTH12 + state->regoff + 1, state->vth[1]);
1003 write_reg(state, RSTV0910_P2_VTH12 + state->regoff + 2, state->vth[2]);
1004 write_reg(state, RSTV0910_P2_VTH12 + state->regoff + 3, state->vth[3]);
1005 write_reg(state, RSTV0910_P2_VTH12 + state->regoff + 4, state->vth[4]);
1006 write_reg(state, RSTV0910_P2_VTH12 + state->regoff + 5, state->vth[5]);
1007 return status;
1008 }
1009
1010 static int start(struct stv *state, struct dtv_frontend_properties *p)
1011 {
1012 s32 freq;
1013 u8 reg_dmdcfgmd;
1014 u16 symb;
1015
1016 if (p->symbol_rate < 100000 || p->symbol_rate > 70000000)
1017 return -EINVAL;
1018
1019 state->receive_mode = RCVMODE_NONE;
1020 state->demod_lock_time = 0;
1021
1022
1023 if (state->started)
1024 write_reg(state, RSTV0910_P2_DMDISTATE + state->regoff, 0x5C);
1025
1026 init_search_param(state, p);
1027
1028 if (p->symbol_rate <= 1000000) {
1029 state->demod_timeout = 3000;
1030 state->fec_timeout = 2000;
1031 } else if (p->symbol_rate <= 2000000) {
1032 state->demod_timeout = 2500;
1033 state->fec_timeout = 1300;
1034 } else if (p->symbol_rate <= 5000000) {
1035 state->demod_timeout = 1000;
1036 state->fec_timeout = 650;
1037 } else if (p->symbol_rate <= 10000000) {
1038 state->demod_timeout = 700;
1039 state->fec_timeout = 350;
1040 } else if (p->symbol_rate < 20000000) {
1041 state->demod_timeout = 400;
1042 state->fec_timeout = 200;
1043 } else {
1044 state->demod_timeout = 300;
1045 state->fec_timeout = 200;
1046 }
1047
1048
1049 symb = muldiv32(p->symbol_rate, 65536, state->base->mclk);
1050 write_reg(state, RSTV0910_P2_SFRINIT1 + state->regoff,
1051 ((symb >> 8) & 0x7F));
1052 write_reg(state, RSTV0910_P2_SFRINIT0 + state->regoff, (symb & 0xFF));
1053
1054 state->demod_bits |= 0x80;
1055 write_reg(state, RSTV0910_P2_DEMOD + state->regoff, state->demod_bits);
1056
1057
1058 read_reg(state, RSTV0910_P2_DMDCFGMD + state->regoff, ®_dmdcfgmd);
1059 write_reg(state, RSTV0910_P2_DMDCFGMD + state->regoff,
1060 reg_dmdcfgmd |= 0xC0);
1061
1062 write_shared_reg(state,
1063 RSTV0910_TSTTSRS, state->nr ? 0x02 : 0x01, 0x00);
1064
1065
1066 write_reg(state, RSTV0910_P2_FECM + state->regoff, 0x00);
1067 write_reg(state, RSTV0910_P2_PRVIT + state->regoff, 0x2F);
1068
1069 enable_puncture_rate(state, FEC_NONE);
1070
1071
1072 write_reg(state, RSTV0910_P2_ACLC2S2Q + state->regoff, 0x0B);
1073 write_reg(state, RSTV0910_P2_ACLC2S28 + state->regoff, 0x0A);
1074 write_reg(state, RSTV0910_P2_BCLC2S2Q + state->regoff, 0x84);
1075 write_reg(state, RSTV0910_P2_BCLC2S28 + state->regoff, 0x84);
1076 write_reg(state, RSTV0910_P2_CARHDR + state->regoff, 0x1C);
1077 write_reg(state, RSTV0910_P2_CARFREQ + state->regoff, 0x79);
1078
1079 write_reg(state, RSTV0910_P2_ACLC2S216A + state->regoff, 0x29);
1080 write_reg(state, RSTV0910_P2_ACLC2S232A + state->regoff, 0x09);
1081 write_reg(state, RSTV0910_P2_BCLC2S216A + state->regoff, 0x84);
1082 write_reg(state, RSTV0910_P2_BCLC2S232A + state->regoff, 0x84);
1083
1084
1085
1086
1087
1088 write_reg(state, RSTV0910_TSTRES0, state->nr ? 0x04 : 0x08);
1089 write_reg(state, RSTV0910_TSTRES0, 0);
1090
1091 set_vth_default(state);
1092
1093 write_reg(state, RSTV0910_P2_DMDISTATE + state->regoff, 0x1F);
1094
1095 write_reg(state, RSTV0910_P2_CARCFG + state->regoff, 0x46);
1096
1097 if (p->symbol_rate <= 5000000)
1098 freq = (state->search_range / 2000) + 80;
1099 else
1100 freq = (state->search_range / 2000) + 1600;
1101 freq = (freq << 16) / (state->base->mclk / 1000);
1102
1103 write_reg(state, RSTV0910_P2_CFRUP1 + state->regoff,
1104 (freq >> 8) & 0xff);
1105 write_reg(state, RSTV0910_P2_CFRUP0 + state->regoff, (freq & 0xff));
1106
1107 freq = -freq;
1108 write_reg(state, RSTV0910_P2_CFRLOW1 + state->regoff,
1109 (freq >> 8) & 0xff);
1110 write_reg(state, RSTV0910_P2_CFRLOW0 + state->regoff, (freq & 0xff));
1111
1112
1113 write_reg(state, RSTV0910_P2_CFRINIT1 + state->regoff, 0);
1114 write_reg(state, RSTV0910_P2_CFRINIT0 + state->regoff, 0);
1115
1116 write_reg(state, RSTV0910_P2_DMDISTATE + state->regoff, 0x1F);
1117
1118 write_reg(state, RSTV0910_P2_DMDISTATE + state->regoff, 0x15);
1119
1120 state->demod_lock_time += TUNING_DELAY;
1121 state->started = 1;
1122
1123 return 0;
1124 }
1125
1126 static int init_diseqc(struct stv *state)
1127 {
1128 u16 offs = state->nr ? 0x40 : 0;
1129 u8 freq = ((state->base->mclk + 11000 * 32) / (22000 * 32));
1130
1131
1132 write_reg(state, RSTV0910_P1_DISRXCFG + offs, 0x00);
1133 write_reg(state, RSTV0910_P1_DISTXCFG + offs, 0xBA);
1134 write_reg(state, RSTV0910_P1_DISTXCFG + offs, 0x3A);
1135 write_reg(state, RSTV0910_P1_DISTXF22 + offs, freq);
1136 return 0;
1137 }
1138
1139 static int probe(struct stv *state)
1140 {
1141 u8 id;
1142
1143 state->receive_mode = RCVMODE_NONE;
1144 state->started = 0;
1145
1146 if (read_reg(state, RSTV0910_MID, &id) < 0)
1147 return -ENODEV;
1148
1149 if (id != 0x51)
1150 return -EINVAL;
1151
1152
1153 write_reg(state, RSTV0910_P1_I2CRPT, 0x24);
1154
1155 write_reg(state, RSTV0910_P2_I2CRPT, 0x24);
1156
1157 write_reg(state, RSTV0910_I2CCFG, 0x88);
1158
1159 write_reg(state, RSTV0910_OUTCFG, 0x00);
1160 write_reg(state, RSTV0910_PADCFG, 0x05);
1161 write_reg(state, RSTV0910_SYNTCTRL, 0x02);
1162 write_reg(state, RSTV0910_TSGENERAL, state->tsgeneral);
1163 write_reg(state, RSTV0910_CFGEXT, 0x02);
1164
1165 if (state->single)
1166 write_reg(state, RSTV0910_GENCFG, 0x14);
1167 else
1168 write_reg(state, RSTV0910_GENCFG, 0x15);
1169
1170 write_reg(state, RSTV0910_P1_TNRCFG2, 0x02);
1171 write_reg(state, RSTV0910_P2_TNRCFG2, 0x82);
1172
1173 write_reg(state, RSTV0910_P1_CAR3CFG, 0x02);
1174 write_reg(state, RSTV0910_P2_CAR3CFG, 0x02);
1175 write_reg(state, RSTV0910_P1_DMDCFG4, 0x04);
1176 write_reg(state, RSTV0910_P2_DMDCFG4, 0x04);
1177
1178 write_reg(state, RSTV0910_TSTRES0, 0x80);
1179 write_reg(state, RSTV0910_TSTRES0, 0x00);
1180
1181 write_reg(state, RSTV0910_P1_TSPIDFLT1, 0x00);
1182 write_reg(state, RSTV0910_P2_TSPIDFLT1, 0x00);
1183
1184 write_reg(state, RSTV0910_P1_TMGCFG2, 0x80);
1185 write_reg(state, RSTV0910_P2_TMGCFG2, 0x80);
1186
1187 set_mclock(state, 135000000);
1188
1189
1190 write_reg(state, RSTV0910_P1_TSCFGH, state->tscfgh | 0x01);
1191 write_reg(state, RSTV0910_P1_TSCFGH, state->tscfgh);
1192 write_reg(state, RSTV0910_P1_TSCFGM, 0xC0);
1193 write_reg(state, RSTV0910_P1_TSCFGL, 0x20);
1194
1195 write_reg(state, RSTV0910_P1_TSSPEED, state->tsspeed);
1196
1197 write_reg(state, RSTV0910_P2_TSCFGH, state->tscfgh | 0x01);
1198 write_reg(state, RSTV0910_P2_TSCFGH, state->tscfgh);
1199 write_reg(state, RSTV0910_P2_TSCFGM, 0xC0);
1200 write_reg(state, RSTV0910_P2_TSCFGL, 0x20);
1201
1202 write_reg(state, RSTV0910_P2_TSSPEED, state->tsspeed);
1203
1204
1205 write_reg(state, RSTV0910_P1_TSCFGH, state->tscfgh | 0x01);
1206 write_reg(state, RSTV0910_P2_TSCFGH, state->tscfgh | 0x01);
1207 write_reg(state, RSTV0910_P1_TSCFGH, state->tscfgh);
1208 write_reg(state, RSTV0910_P2_TSCFGH, state->tscfgh);
1209
1210 write_reg(state, RSTV0910_P1_I2CRPT, state->i2crpt);
1211 write_reg(state, RSTV0910_P2_I2CRPT, state->i2crpt);
1212
1213 write_reg(state, RSTV0910_P1_TSINSDELM, 0x17);
1214 write_reg(state, RSTV0910_P1_TSINSDELL, 0xff);
1215
1216 write_reg(state, RSTV0910_P2_TSINSDELM, 0x17);
1217 write_reg(state, RSTV0910_P2_TSINSDELL, 0xff);
1218
1219 init_diseqc(state);
1220 return 0;
1221 }
1222
1223 static int gate_ctrl(struct dvb_frontend *fe, int enable)
1224 {
1225 struct stv *state = fe->demodulator_priv;
1226 u8 i2crpt = state->i2crpt & ~0x86;
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238 if (enable) {
1239 mutex_lock(&state->base->i2c_lock);
1240 i2crpt |= 0x80;
1241 } else {
1242 i2crpt |= 0x02;
1243 }
1244
1245 if (write_reg(state, state->nr ? RSTV0910_P2_I2CRPT :
1246 RSTV0910_P1_I2CRPT, i2crpt) < 0) {
1247
1248 if (!WARN_ON(!mutex_is_locked(&state->base->i2c_lock)))
1249 mutex_unlock(&state->base->i2c_lock);
1250 dev_err(&state->base->i2c->dev,
1251 "%s() write_reg failure (enable=%d)\n",
1252 __func__, enable);
1253 return -EIO;
1254 }
1255
1256 state->i2crpt = i2crpt;
1257
1258 if (!enable)
1259 if (!WARN_ON(!mutex_is_locked(&state->base->i2c_lock)))
1260 mutex_unlock(&state->base->i2c_lock);
1261 return 0;
1262 }
1263
1264 static void release(struct dvb_frontend *fe)
1265 {
1266 struct stv *state = fe->demodulator_priv;
1267
1268 state->base->count--;
1269 if (state->base->count == 0) {
1270 list_del(&state->base->stvlist);
1271 kfree(state->base);
1272 }
1273 kfree(state);
1274 }
1275
1276 static int set_parameters(struct dvb_frontend *fe)
1277 {
1278 int stat = 0;
1279 struct stv *state = fe->demodulator_priv;
1280 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1281
1282 stop(state);
1283 if (fe->ops.tuner_ops.set_params)
1284 fe->ops.tuner_ops.set_params(fe);
1285 state->symbol_rate = p->symbol_rate;
1286 stat = start(state, p);
1287 return stat;
1288 }
1289
1290 static int manage_matype_info(struct stv *state)
1291 {
1292 if (!state->started)
1293 return -EINVAL;
1294 if (state->receive_mode == RCVMODE_DVBS2) {
1295 u8 bbheader[2];
1296
1297 read_regs(state, RSTV0910_P2_MATSTR1 + state->regoff,
1298 bbheader, 2);
1299 state->feroll_off =
1300 (enum fe_stv0910_roll_off)(bbheader[0] & 0x03);
1301 state->is_vcm = (bbheader[0] & 0x10) == 0;
1302 state->is_standard_broadcast = (bbheader[0] & 0xFC) == 0xF0;
1303 } else if (state->receive_mode == RCVMODE_DVBS) {
1304 state->is_vcm = 0;
1305 state->is_standard_broadcast = 1;
1306 state->feroll_off = FE_SAT_35;
1307 }
1308 return 0;
1309 }
1310
1311 static int read_snr(struct dvb_frontend *fe)
1312 {
1313 struct stv *state = fe->demodulator_priv;
1314 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1315 s32 snrval;
1316
1317 if (!get_signal_to_noise(state, &snrval)) {
1318 p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
1319 p->cnr.stat[0].svalue = 100 * snrval;
1320 } else {
1321 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1322 }
1323
1324 return 0;
1325 }
1326
1327 static int read_ber(struct dvb_frontend *fe)
1328 {
1329 struct stv *state = fe->demodulator_priv;
1330 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1331 u32 n, d;
1332
1333 get_bit_error_rate(state, &n, &d);
1334
1335 p->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER;
1336 p->pre_bit_error.stat[0].uvalue = n;
1337 p->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER;
1338 p->pre_bit_count.stat[0].uvalue = d;
1339
1340 return 0;
1341 }
1342
1343 static void read_signal_strength(struct dvb_frontend *fe)
1344 {
1345 struct stv *state = fe->demodulator_priv;
1346 struct dtv_frontend_properties *p = &state->fe.dtv_property_cache;
1347 u8 reg[2];
1348 u16 agc;
1349 s32 padc, power = 0;
1350 int i;
1351
1352 read_regs(state, RSTV0910_P2_AGCIQIN1 + state->regoff, reg, 2);
1353
1354 agc = (((u32)reg[0]) << 8) | reg[1];
1355
1356 for (i = 0; i < 5; i += 1) {
1357 read_regs(state, RSTV0910_P2_POWERI + state->regoff, reg, 2);
1358 power += (u32)reg[0] * (u32)reg[0]
1359 + (u32)reg[1] * (u32)reg[1];
1360 usleep_range(3000, 4000);
1361 }
1362 power /= 5;
1363
1364 padc = table_lookup(padc_lookup, ARRAY_SIZE(padc_lookup), power) + 352;
1365
1366 p->strength.stat[0].scale = FE_SCALE_DECIBEL;
1367 p->strength.stat[0].svalue = (padc - agc);
1368 }
1369
1370 static int read_status(struct dvb_frontend *fe, enum fe_status *status)
1371 {
1372 struct stv *state = fe->demodulator_priv;
1373 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1374 u8 dmd_state = 0;
1375 u8 dstatus = 0;
1376 enum receive_mode cur_receive_mode = RCVMODE_NONE;
1377 u32 feclock = 0;
1378
1379 *status = 0;
1380
1381 read_reg(state, RSTV0910_P2_DMDSTATE + state->regoff, &dmd_state);
1382
1383 if (dmd_state & 0x40) {
1384 read_reg(state, RSTV0910_P2_DSTATUS + state->regoff, &dstatus);
1385 if (dstatus & 0x08)
1386 cur_receive_mode = (dmd_state & 0x20) ?
1387 RCVMODE_DVBS : RCVMODE_DVBS2;
1388 }
1389 if (cur_receive_mode == RCVMODE_NONE) {
1390 set_vth(state);
1391
1392
1393 p->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1394 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1395 p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1396 p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1397
1398 return 0;
1399 }
1400
1401 *status |= (FE_HAS_SIGNAL
1402 | FE_HAS_CARRIER
1403 | FE_HAS_VITERBI
1404 | FE_HAS_SYNC);
1405
1406 if (state->receive_mode == RCVMODE_NONE) {
1407 state->receive_mode = cur_receive_mode;
1408 state->demod_lock_time = jiffies;
1409 state->first_time_lock = 1;
1410
1411 get_signal_parameters(state);
1412 tracking_optimization(state);
1413
1414 write_reg(state, RSTV0910_P2_TSCFGH + state->regoff,
1415 state->tscfgh);
1416 usleep_range(3000, 4000);
1417 write_reg(state, RSTV0910_P2_TSCFGH + state->regoff,
1418 state->tscfgh | 0x01);
1419 write_reg(state, RSTV0910_P2_TSCFGH + state->regoff,
1420 state->tscfgh);
1421 }
1422 if (dmd_state & 0x40) {
1423 if (state->receive_mode == RCVMODE_DVBS2) {
1424 u8 pdelstatus;
1425
1426 read_reg(state,
1427 RSTV0910_P2_PDELSTATUS1 + state->regoff,
1428 &pdelstatus);
1429 feclock = (pdelstatus & 0x02) != 0;
1430 } else {
1431 u8 vstatus;
1432
1433 read_reg(state,
1434 RSTV0910_P2_VSTATUSVIT + state->regoff,
1435 &vstatus);
1436 feclock = (vstatus & 0x08) != 0;
1437 }
1438 }
1439
1440 if (feclock) {
1441 *status |= FE_HAS_LOCK;
1442
1443 if (state->first_time_lock) {
1444 u8 tmp;
1445
1446 state->first_time_lock = 0;
1447
1448 manage_matype_info(state);
1449
1450 if (state->receive_mode == RCVMODE_DVBS2) {
1451
1452
1453
1454
1455 state->demod_bits &= ~0x84;
1456 write_reg(state,
1457 RSTV0910_P2_DEMOD + state->regoff,
1458 state->demod_bits);
1459 read_reg(state,
1460 RSTV0910_P2_PDELCTRL2 + state->regoff,
1461 &tmp);
1462
1463 tmp |= 0x40;
1464 write_reg(state,
1465 RSTV0910_P2_PDELCTRL2 + state->regoff,
1466 tmp);
1467
1468 tmp &= ~0x40;
1469 write_reg(state,
1470 RSTV0910_P2_PDELCTRL2 + state->regoff,
1471 tmp);
1472
1473 state->berscale = 2;
1474 state->last_bernumerator = 0;
1475 state->last_berdenominator = 1;
1476
1477 write_reg(state,
1478 RSTV0910_P2_ERRCTRL1 + state->regoff,
1479 BER_SRC_S2 | state->berscale);
1480 } else {
1481 state->berscale = 2;
1482 state->last_bernumerator = 0;
1483 state->last_berdenominator = 1;
1484
1485 write_reg(state,
1486 RSTV0910_P2_ERRCTRL1 + state->regoff,
1487 BER_SRC_S | state->berscale);
1488 }
1489
1490 write_reg(state,
1491 RSTV0910_P2_FBERCPT4 + state->regoff, 0x00);
1492
1493
1494
1495
1496 write_reg(state,
1497 RSTV0910_P2_ERRCTRL2 + state->regoff, 0xc1);
1498
1499 set_vth_default(state);
1500 if (state->receive_mode == RCVMODE_DVBS)
1501 enable_puncture_rate(state,
1502 state->puncture_rate);
1503 }
1504
1505
1506 if (state->is_vcm) {
1507 u8 tmp;
1508 enum fe_stv0910_mod_cod mod_cod;
1509
1510 read_reg(state, RSTV0910_P2_DMDMODCOD + state->regoff,
1511 &tmp);
1512 mod_cod = (enum fe_stv0910_mod_cod)((tmp & 0x7c) >> 2);
1513
1514 if (mod_cod > state->mod_cod)
1515 state->mod_cod = mod_cod;
1516 }
1517 }
1518
1519
1520
1521
1522 read_signal_strength(fe);
1523
1524
1525 if (*status & FE_HAS_CARRIER)
1526 read_snr(fe);
1527 else
1528 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1529
1530
1531 if (*status & FE_HAS_VITERBI) {
1532 read_ber(fe);
1533 } else {
1534 p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1535 p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1536 }
1537
1538 return 0;
1539 }
1540
1541 static int get_frontend(struct dvb_frontend *fe,
1542 struct dtv_frontend_properties *p)
1543 {
1544 struct stv *state = fe->demodulator_priv;
1545 u8 tmp;
1546 u32 symbolrate;
1547
1548 if (state->receive_mode == RCVMODE_DVBS2) {
1549 u32 mc;
1550 const enum fe_modulation modcod2mod[0x20] = {
1551 QPSK, QPSK, QPSK, QPSK,
1552 QPSK, QPSK, QPSK, QPSK,
1553 QPSK, QPSK, QPSK, QPSK,
1554 PSK_8, PSK_8, PSK_8, PSK_8,
1555 PSK_8, PSK_8, APSK_16, APSK_16,
1556 APSK_16, APSK_16, APSK_16, APSK_16,
1557 APSK_32, APSK_32, APSK_32, APSK_32,
1558 APSK_32,
1559 };
1560 const enum fe_code_rate modcod2fec[0x20] = {
1561 FEC_NONE, FEC_NONE, FEC_NONE, FEC_2_5,
1562 FEC_1_2, FEC_3_5, FEC_2_3, FEC_3_4,
1563 FEC_4_5, FEC_5_6, FEC_8_9, FEC_9_10,
1564 FEC_3_5, FEC_2_3, FEC_3_4, FEC_5_6,
1565 FEC_8_9, FEC_9_10, FEC_2_3, FEC_3_4,
1566 FEC_4_5, FEC_5_6, FEC_8_9, FEC_9_10,
1567 FEC_3_4, FEC_4_5, FEC_5_6, FEC_8_9,
1568 FEC_9_10
1569 };
1570 read_reg(state, RSTV0910_P2_DMDMODCOD + state->regoff, &tmp);
1571 mc = ((tmp & 0x7c) >> 2);
1572 p->pilot = (tmp & 0x01) ? PILOT_ON : PILOT_OFF;
1573 p->modulation = modcod2mod[mc];
1574 p->fec_inner = modcod2fec[mc];
1575 } else if (state->receive_mode == RCVMODE_DVBS) {
1576 read_reg(state, RSTV0910_P2_VITCURPUN + state->regoff, &tmp);
1577 switch (tmp & 0x1F) {
1578 case 0x0d:
1579 p->fec_inner = FEC_1_2;
1580 break;
1581 case 0x12:
1582 p->fec_inner = FEC_2_3;
1583 break;
1584 case 0x15:
1585 p->fec_inner = FEC_3_4;
1586 break;
1587 case 0x18:
1588 p->fec_inner = FEC_5_6;
1589 break;
1590 case 0x1a:
1591 p->fec_inner = FEC_7_8;
1592 break;
1593 default:
1594 p->fec_inner = FEC_NONE;
1595 break;
1596 }
1597 p->rolloff = ROLLOFF_35;
1598 }
1599
1600 if (state->receive_mode != RCVMODE_NONE) {
1601 get_cur_symbol_rate(state, &symbolrate);
1602 p->symbol_rate = symbolrate;
1603 }
1604 return 0;
1605 }
1606
1607 static int tune(struct dvb_frontend *fe, bool re_tune,
1608 unsigned int mode_flags,
1609 unsigned int *delay, enum fe_status *status)
1610 {
1611 struct stv *state = fe->demodulator_priv;
1612 int r;
1613
1614 if (re_tune) {
1615 r = set_parameters(fe);
1616 if (r)
1617 return r;
1618 state->tune_time = jiffies;
1619 }
1620
1621 r = read_status(fe, status);
1622 if (r)
1623 return r;
1624
1625 if (*status & FE_HAS_LOCK)
1626 return 0;
1627 *delay = HZ;
1628
1629 return 0;
1630 }
1631
1632 static enum dvbfe_algo get_algo(struct dvb_frontend *fe)
1633 {
1634 return DVBFE_ALGO_HW;
1635 }
1636
1637 static int set_tone(struct dvb_frontend *fe, enum fe_sec_tone_mode tone)
1638 {
1639 struct stv *state = fe->demodulator_priv;
1640 u16 offs = state->nr ? 0x40 : 0;
1641
1642 switch (tone) {
1643 case SEC_TONE_ON:
1644 return write_reg(state, RSTV0910_P1_DISTXCFG + offs, 0x38);
1645 case SEC_TONE_OFF:
1646 return write_reg(state, RSTV0910_P1_DISTXCFG + offs, 0x3a);
1647 default:
1648 break;
1649 }
1650 return -EINVAL;
1651 }
1652
1653 static int wait_dis(struct stv *state, u8 flag, u8 val)
1654 {
1655 int i;
1656 u8 stat;
1657 u16 offs = state->nr ? 0x40 : 0;
1658
1659 for (i = 0; i < 10; i++) {
1660 read_reg(state, RSTV0910_P1_DISTXSTATUS + offs, &stat);
1661 if ((stat & flag) == val)
1662 return 0;
1663 usleep_range(10000, 11000);
1664 }
1665 return -ETIMEDOUT;
1666 }
1667
1668 static int send_master_cmd(struct dvb_frontend *fe,
1669 struct dvb_diseqc_master_cmd *cmd)
1670 {
1671 struct stv *state = fe->demodulator_priv;
1672 int i;
1673
1674 SET_FIELD(DISEQC_MODE, 2);
1675 SET_FIELD(DIS_PRECHARGE, 1);
1676 for (i = 0; i < cmd->msg_len; i++) {
1677 wait_dis(state, 0x40, 0x00);
1678 SET_REG(DISTXFIFO, cmd->msg[i]);
1679 }
1680 SET_FIELD(DIS_PRECHARGE, 0);
1681 wait_dis(state, 0x20, 0x20);
1682 return 0;
1683 }
1684
1685 static int send_burst(struct dvb_frontend *fe, enum fe_sec_mini_cmd burst)
1686 {
1687 struct stv *state = fe->demodulator_priv;
1688 u8 value;
1689
1690 if (burst == SEC_MINI_A) {
1691 SET_FIELD(DISEQC_MODE, 3);
1692 value = 0x00;
1693 } else {
1694 SET_FIELD(DISEQC_MODE, 2);
1695 value = 0xFF;
1696 }
1697
1698 SET_FIELD(DIS_PRECHARGE, 1);
1699 wait_dis(state, 0x40, 0x00);
1700 SET_REG(DISTXFIFO, value);
1701 SET_FIELD(DIS_PRECHARGE, 0);
1702 wait_dis(state, 0x20, 0x20);
1703
1704 return 0;
1705 }
1706
1707 static int sleep(struct dvb_frontend *fe)
1708 {
1709 struct stv *state = fe->demodulator_priv;
1710
1711 stop(state);
1712 return 0;
1713 }
1714
1715 static const struct dvb_frontend_ops stv0910_ops = {
1716 .delsys = { SYS_DVBS, SYS_DVBS2, SYS_DSS },
1717 .info = {
1718 .name = "ST STV0910",
1719 .frequency_min_hz = 950 * MHz,
1720 .frequency_max_hz = 2150 * MHz,
1721 .symbol_rate_min = 100000,
1722 .symbol_rate_max = 70000000,
1723 .caps = FE_CAN_INVERSION_AUTO |
1724 FE_CAN_FEC_AUTO |
1725 FE_CAN_QPSK |
1726 FE_CAN_2G_MODULATION |
1727 FE_CAN_MULTISTREAM
1728 },
1729 .sleep = sleep,
1730 .release = release,
1731 .i2c_gate_ctrl = gate_ctrl,
1732 .set_frontend = set_parameters,
1733 .get_frontend_algo = get_algo,
1734 .get_frontend = get_frontend,
1735 .tune = tune,
1736 .read_status = read_status,
1737 .set_tone = set_tone,
1738
1739 .diseqc_send_master_cmd = send_master_cmd,
1740 .diseqc_send_burst = send_burst,
1741 };
1742
1743 static struct stv_base *match_base(struct i2c_adapter *i2c, u8 adr)
1744 {
1745 struct stv_base *p;
1746
1747 list_for_each_entry(p, &stvlist, stvlist)
1748 if (p->i2c == i2c && p->adr == adr)
1749 return p;
1750 return NULL;
1751 }
1752
1753 static void stv0910_init_stats(struct stv *state)
1754 {
1755 struct dtv_frontend_properties *p = &state->fe.dtv_property_cache;
1756
1757 p->strength.len = 1;
1758 p->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1759 p->cnr.len = 1;
1760 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1761 p->pre_bit_error.len = 1;
1762 p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1763 p->pre_bit_count.len = 1;
1764 p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1765 }
1766
1767 struct dvb_frontend *stv0910_attach(struct i2c_adapter *i2c,
1768 struct stv0910_cfg *cfg,
1769 int nr)
1770 {
1771 struct stv *state;
1772 struct stv_base *base;
1773
1774 state = kzalloc(sizeof(*state), GFP_KERNEL);
1775 if (!state)
1776 return NULL;
1777
1778 state->tscfgh = 0x20 | (cfg->parallel ? 0 : 0x40);
1779 state->tsgeneral = (cfg->parallel == 2) ? 0x02 : 0x00;
1780 state->i2crpt = 0x0A | ((cfg->rptlvl & 0x07) << 4);
1781
1782 state->tsspeed = (cfg->tsspeed ? cfg->tsspeed : 0x28);
1783 state->nr = nr;
1784 state->regoff = state->nr ? 0 : 0x200;
1785 state->search_range = 16000000;
1786 state->demod_bits = 0x10;
1787 state->receive_mode = RCVMODE_NONE;
1788 state->cur_scrambling_code = (~0U);
1789 state->single = cfg->single ? 1 : 0;
1790
1791 base = match_base(i2c, cfg->adr);
1792 if (base) {
1793 base->count++;
1794 state->base = base;
1795 } else {
1796 base = kzalloc(sizeof(*base), GFP_KERNEL);
1797 if (!base)
1798 goto fail;
1799 base->i2c = i2c;
1800 base->adr = cfg->adr;
1801 base->count = 1;
1802 base->extclk = cfg->clk ? cfg->clk : 30000000;
1803
1804 mutex_init(&base->i2c_lock);
1805 mutex_init(&base->reg_lock);
1806 state->base = base;
1807 if (probe(state) < 0) {
1808 dev_info(&i2c->dev, "No demod found at adr %02X on %s\n",
1809 cfg->adr, dev_name(&i2c->dev));
1810 kfree(base);
1811 goto fail;
1812 }
1813 list_add(&base->stvlist, &stvlist);
1814 }
1815 state->fe.ops = stv0910_ops;
1816 state->fe.demodulator_priv = state;
1817 state->nr = nr;
1818
1819 dev_info(&i2c->dev, "%s demod found at adr %02X on %s\n",
1820 state->fe.ops.info.name, cfg->adr, dev_name(&i2c->dev));
1821
1822 stv0910_init_stats(state);
1823
1824 return &state->fe;
1825
1826 fail:
1827 kfree(state);
1828 return NULL;
1829 }
1830 EXPORT_SYMBOL_GPL(stv0910_attach);
1831
1832 MODULE_DESCRIPTION("ST STV0910 multistandard frontend driver");
1833 MODULE_AUTHOR("Ralph and Marcus Metzler, Manfred Voelkel");
1834 MODULE_LICENSE("GPL v2");