1 // SPDX-License-Identifier: GPL-2.0
3 * Driver for the ST STV0910 DVB-S/S2 demodulator.
5 * Copyright (C) 2014-2015 Ralph Metzler <rjkm@metzlerbros.de>
6 * Marcus Metzler <mocm@metzlerbros.de>
7 * developed for Digital Devices GmbH
10 #include <linux/kernel.h>
11 #include <linux/module.h>
12 #include <linux/moduleparam.h>
13 #include <linux/init.h>
14 #include <linux/delay.h>
15 #include <linux/firmware.h>
16 #include <linux/i2c.h>
17 #include <asm/div64.h>
19 #include <media/dvb_frontend.h>
21 #include "stv0910_regs.h"
23 #define EXT_CLOCK 30000000
24 #define TUNING_DELAY 200
25 #define BER_SRC_S 0x20
26 #define BER_SRC_S2 0x20
28 static LIST_HEAD(stvlist
);
30 enum receive_mode
{ RCVMODE_NONE
, RCVMODE_DVBS
, RCVMODE_DVBS2
, RCVMODE_AUTO
};
32 enum dvbs2_fectype
{ DVBS2_64K
, DVBS2_16K
};
35 DVBS2_DUMMY_PLF
, DVBS2_QPSK_1_4
, DVBS2_QPSK_1_3
, DVBS2_QPSK_2_5
,
36 DVBS2_QPSK_1_2
, DVBS2_QPSK_3_5
, DVBS2_QPSK_2_3
, DVBS2_QPSK_3_4
,
37 DVBS2_QPSK_4_5
, DVBS2_QPSK_5_6
, DVBS2_QPSK_8_9
, DVBS2_QPSK_9_10
,
38 DVBS2_8PSK_3_5
, DVBS2_8PSK_2_3
, DVBS2_8PSK_3_4
, DVBS2_8PSK_5_6
,
39 DVBS2_8PSK_8_9
, DVBS2_8PSK_9_10
, DVBS2_16APSK_2_3
, DVBS2_16APSK_3_4
,
40 DVBS2_16APSK_4_5
, DVBS2_16APSK_5_6
, DVBS2_16APSK_8_9
, DVBS2_16APSK_9_10
,
41 DVBS2_32APSK_3_4
, DVBS2_32APSK_4_5
, DVBS2_32APSK_5_6
, DVBS2_32APSK_8_9
,
45 enum fe_stv0910_mod_cod
{
46 FE_DUMMY_PLF
, FE_QPSK_14
, FE_QPSK_13
, FE_QPSK_25
,
47 FE_QPSK_12
, FE_QPSK_35
, FE_QPSK_23
, FE_QPSK_34
,
48 FE_QPSK_45
, FE_QPSK_56
, FE_QPSK_89
, FE_QPSK_910
,
49 FE_8PSK_35
, FE_8PSK_23
, FE_8PSK_34
, FE_8PSK_56
,
50 FE_8PSK_89
, FE_8PSK_910
, FE_16APSK_23
, FE_16APSK_34
,
51 FE_16APSK_45
, FE_16APSK_56
, FE_16APSK_89
, FE_16APSK_910
,
52 FE_32APSK_34
, FE_32APSK_45
, FE_32APSK_56
, FE_32APSK_89
,
56 enum fe_stv0910_roll_off
{ FE_SAT_35
, FE_SAT_25
, FE_SAT_20
, FE_SAT_15
};
58 static inline u32
muldiv32(u32 a
, u32 b
, u32 c
)
62 tmp64
= (u64
)a
* (u64
)b
;
69 struct list_head stvlist
;
72 struct i2c_adapter
*i2c
;
73 struct mutex i2c_lock
; /* shared I2C access protect */
74 struct mutex reg_lock
; /* shared register write protect */
82 struct stv_base
*base
;
83 struct dvb_frontend fe
;
91 unsigned long tune_time
;
96 enum receive_mode receive_mode
;
103 u8 last_viterbi_rate
;
104 enum fe_code_rate puncture_rate
;
105 enum fe_stv0910_mod_cod mod_cod
;
106 enum dvbs2_fectype fectype
;
108 enum fe_stv0910_roll_off feroll_off
;
110 int is_standard_broadcast
;
113 u32 cur_scrambling_code
;
115 u32 last_bernumerator
;
116 u32 last_berdenominator
;
127 static int write_reg(struct stv
*state
, u16 reg
, u8 val
)
129 struct i2c_adapter
*adap
= state
->base
->i2c
;
130 u8 data
[3] = {reg
>> 8, reg
& 0xff, val
};
131 struct i2c_msg msg
= {.addr
= state
->base
->adr
, .flags
= 0,
132 .buf
= data
, .len
= 3};
134 if (i2c_transfer(adap
, &msg
, 1) != 1) {
135 dev_warn(&adap
->dev
, "i2c write error ([%02x] %04x: %02x)\n",
136 state
->base
->adr
, reg
, val
);
142 static inline int i2c_read_regs16(struct i2c_adapter
*adapter
, u8 adr
,
143 u16 reg
, u8
*val
, int count
)
145 u8 msg
[2] = {reg
>> 8, reg
& 0xff};
146 struct i2c_msg msgs
[2] = {{.addr
= adr
, .flags
= 0,
147 .buf
= msg
, .len
= 2},
148 {.addr
= adr
, .flags
= I2C_M_RD
,
149 .buf
= val
, .len
= count
} };
151 if (i2c_transfer(adapter
, msgs
, 2) != 2) {
152 dev_warn(&adapter
->dev
, "i2c read error ([%02x] %04x)\n",
159 static int read_reg(struct stv
*state
, u16 reg
, u8
*val
)
161 return i2c_read_regs16(state
->base
->i2c
, state
->base
->adr
,
165 static int read_regs(struct stv
*state
, u16 reg
, u8
*val
, int len
)
167 return i2c_read_regs16(state
->base
->i2c
, state
->base
->adr
,
171 static int write_shared_reg(struct stv
*state
, u16 reg
, u8 mask
, u8 val
)
176 mutex_lock(&state
->base
->reg_lock
);
177 status
= read_reg(state
, reg
, &tmp
);
179 status
= write_reg(state
, reg
, (tmp
& ~mask
) | (val
& mask
));
180 mutex_unlock(&state
->base
->reg_lock
);
184 static int write_field(struct stv
*state
, u32 field
, u8 val
)
187 u8 shift
, mask
, old
, new;
189 status
= read_reg(state
, field
>> 16, &old
);
193 shift
= (field
>> 12) & 0xf;
194 new = ((val
<< shift
) & mask
) | (old
& ~mask
);
197 return write_reg(state
, field
>> 16, new);
200 #define SET_FIELD(_reg, _val) \
201 write_field(state, state->nr ? FSTV0910_P2_##_reg : \
202 FSTV0910_P1_##_reg, _val)
204 #define SET_REG(_reg, _val) \
205 write_reg(state, state->nr ? RSTV0910_P2_##_reg : \
206 RSTV0910_P1_##_reg, _val)
208 #define GET_REG(_reg, _val) \
209 read_reg(state, state->nr ? RSTV0910_P2_##_reg : \
210 RSTV0910_P1_##_reg, _val)
212 static const struct slookup s1_sn_lookup
[] = {
213 { 0, 9242 }, /* C/N= 0dB */
214 { 5, 9105 }, /* C/N= 0.5dB */
215 { 10, 8950 }, /* C/N= 1.0dB */
216 { 15, 8780 }, /* C/N= 1.5dB */
217 { 20, 8566 }, /* C/N= 2.0dB */
218 { 25, 8366 }, /* C/N= 2.5dB */
219 { 30, 8146 }, /* C/N= 3.0dB */
220 { 35, 7908 }, /* C/N= 3.5dB */
221 { 40, 7666 }, /* C/N= 4.0dB */
222 { 45, 7405 }, /* C/N= 4.5dB */
223 { 50, 7136 }, /* C/N= 5.0dB */
224 { 55, 6861 }, /* C/N= 5.5dB */
225 { 60, 6576 }, /* C/N= 6.0dB */
226 { 65, 6330 }, /* C/N= 6.5dB */
227 { 70, 6048 }, /* C/N= 7.0dB */
228 { 75, 5768 }, /* C/N= 7.5dB */
229 { 80, 5492 }, /* C/N= 8.0dB */
230 { 85, 5224 }, /* C/N= 8.5dB */
231 { 90, 4959 }, /* C/N= 9.0dB */
232 { 95, 4709 }, /* C/N= 9.5dB */
233 { 100, 4467 }, /* C/N=10.0dB */
234 { 105, 4236 }, /* C/N=10.5dB */
235 { 110, 4013 }, /* C/N=11.0dB */
236 { 115, 3800 }, /* C/N=11.5dB */
237 { 120, 3598 }, /* C/N=12.0dB */
238 { 125, 3406 }, /* C/N=12.5dB */
239 { 130, 3225 }, /* C/N=13.0dB */
240 { 135, 3052 }, /* C/N=13.5dB */
241 { 140, 2889 }, /* C/N=14.0dB */
242 { 145, 2733 }, /* C/N=14.5dB */
243 { 150, 2587 }, /* C/N=15.0dB */
244 { 160, 2318 }, /* C/N=16.0dB */
245 { 170, 2077 }, /* C/N=17.0dB */
246 { 180, 1862 }, /* C/N=18.0dB */
247 { 190, 1670 }, /* C/N=19.0dB */
248 { 200, 1499 }, /* C/N=20.0dB */
249 { 210, 1347 }, /* C/N=21.0dB */
250 { 220, 1213 }, /* C/N=22.0dB */
251 { 230, 1095 }, /* C/N=23.0dB */
252 { 240, 992 }, /* C/N=24.0dB */
253 { 250, 900 }, /* C/N=25.0dB */
254 { 260, 826 }, /* C/N=26.0dB */
255 { 270, 758 }, /* C/N=27.0dB */
256 { 280, 702 }, /* C/N=28.0dB */
257 { 290, 653 }, /* C/N=29.0dB */
258 { 300, 613 }, /* C/N=30.0dB */
259 { 310, 579 }, /* C/N=31.0dB */
260 { 320, 550 }, /* C/N=32.0dB */
261 { 330, 526 }, /* C/N=33.0dB */
262 { 350, 490 }, /* C/N=33.0dB */
263 { 400, 445 }, /* C/N=40.0dB */
264 { 450, 430 }, /* C/N=45.0dB */
265 { 500, 426 }, /* C/N=50.0dB */
266 { 510, 425 } /* C/N=51.0dB */
269 static const struct slookup s2_sn_lookup
[] = {
270 { -30, 13950 }, /* C/N=-2.5dB */
271 { -25, 13580 }, /* C/N=-2.5dB */
272 { -20, 13150 }, /* C/N=-2.0dB */
273 { -15, 12760 }, /* C/N=-1.5dB */
274 { -10, 12345 }, /* C/N=-1.0dB */
275 { -5, 11900 }, /* C/N=-0.5dB */
276 { 0, 11520 }, /* C/N= 0dB */
277 { 5, 11080 }, /* C/N= 0.5dB */
278 { 10, 10630 }, /* C/N= 1.0dB */
279 { 15, 10210 }, /* C/N= 1.5dB */
280 { 20, 9790 }, /* C/N= 2.0dB */
281 { 25, 9390 }, /* C/N= 2.5dB */
282 { 30, 8970 }, /* C/N= 3.0dB */
283 { 35, 8575 }, /* C/N= 3.5dB */
284 { 40, 8180 }, /* C/N= 4.0dB */
285 { 45, 7800 }, /* C/N= 4.5dB */
286 { 50, 7430 }, /* C/N= 5.0dB */
287 { 55, 7080 }, /* C/N= 5.5dB */
288 { 60, 6720 }, /* C/N= 6.0dB */
289 { 65, 6320 }, /* C/N= 6.5dB */
290 { 70, 6060 }, /* C/N= 7.0dB */
291 { 75, 5760 }, /* C/N= 7.5dB */
292 { 80, 5480 }, /* C/N= 8.0dB */
293 { 85, 5200 }, /* C/N= 8.5dB */
294 { 90, 4930 }, /* C/N= 9.0dB */
295 { 95, 4680 }, /* C/N= 9.5dB */
296 { 100, 4425 }, /* C/N=10.0dB */
297 { 105, 4210 }, /* C/N=10.5dB */
298 { 110, 3980 }, /* C/N=11.0dB */
299 { 115, 3765 }, /* C/N=11.5dB */
300 { 120, 3570 }, /* C/N=12.0dB */
301 { 125, 3315 }, /* C/N=12.5dB */
302 { 130, 3140 }, /* C/N=13.0dB */
303 { 135, 2980 }, /* C/N=13.5dB */
304 { 140, 2820 }, /* C/N=14.0dB */
305 { 145, 2670 }, /* C/N=14.5dB */
306 { 150, 2535 }, /* C/N=15.0dB */
307 { 160, 2270 }, /* C/N=16.0dB */
308 { 170, 2035 }, /* C/N=17.0dB */
309 { 180, 1825 }, /* C/N=18.0dB */
310 { 190, 1650 }, /* C/N=19.0dB */
311 { 200, 1485 }, /* C/N=20.0dB */
312 { 210, 1340 }, /* C/N=21.0dB */
313 { 220, 1212 }, /* C/N=22.0dB */
314 { 230, 1100 }, /* C/N=23.0dB */
315 { 240, 1000 }, /* C/N=24.0dB */
316 { 250, 910 }, /* C/N=25.0dB */
317 { 260, 836 }, /* C/N=26.0dB */
318 { 270, 772 }, /* C/N=27.0dB */
319 { 280, 718 }, /* C/N=28.0dB */
320 { 290, 671 }, /* C/N=29.0dB */
321 { 300, 635 }, /* C/N=30.0dB */
322 { 310, 602 }, /* C/N=31.0dB */
323 { 320, 575 }, /* C/N=32.0dB */
324 { 330, 550 }, /* C/N=33.0dB */
325 { 350, 517 }, /* C/N=35.0dB */
326 { 400, 480 }, /* C/N=40.0dB */
327 { 450, 466 }, /* C/N=45.0dB */
328 { 500, 464 }, /* C/N=50.0dB */
329 { 510, 463 }, /* C/N=51.0dB */
332 static const struct slookup padc_lookup
[] = {
333 { 0, 118000 }, /* PADC= +0dBm */
334 { -100, 93600 }, /* PADC= -1dBm */
335 { -200, 74500 }, /* PADC= -2dBm */
336 { -300, 59100 }, /* PADC= -3dBm */
337 { -400, 47000 }, /* PADC= -4dBm */
338 { -500, 37300 }, /* PADC= -5dBm */
339 { -600, 29650 }, /* PADC= -6dBm */
340 { -700, 23520 }, /* PADC= -7dBm */
341 { -900, 14850 }, /* PADC= -9dBm */
342 { -1100, 9380 }, /* PADC=-11dBm */
343 { -1300, 5910 }, /* PADC=-13dBm */
344 { -1500, 3730 }, /* PADC=-15dBm */
345 { -1700, 2354 }, /* PADC=-17dBm */
346 { -1900, 1485 }, /* PADC=-19dBm */
347 { -2000, 1179 }, /* PADC=-20dBm */
348 { -2100, 1000 }, /* PADC=-21dBm */
351 /*********************************************************************
352 * Tracking carrier loop carrier QPSK 1/4 to 8PSK 9/10 long Frame
353 *********************************************************************/
354 static const u8 s2car_loop
[] = {
356 * Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon 10MPoff
357 * 20MPon 20MPoff 30MPon 30MPoff
361 0x0C, 0x3C, 0x0B, 0x3C, 0x2A, 0x2C, 0x2A, 0x1C, 0x3A, 0x3B,
363 0x0C, 0x3C, 0x0B, 0x3C, 0x2A, 0x2C, 0x3A, 0x0C, 0x3A, 0x2B,
365 0x1C, 0x3C, 0x1B, 0x3C, 0x3A, 0x1C, 0x3A, 0x3B, 0x3A, 0x2B,
367 0x0C, 0x1C, 0x2B, 0x1C, 0x0B, 0x2C, 0x0B, 0x0C, 0x2A, 0x2B,
369 0x1C, 0x1C, 0x2B, 0x1C, 0x0B, 0x2C, 0x0B, 0x0C, 0x2A, 0x2B,
371 0x2C, 0x2C, 0x2B, 0x1C, 0x0B, 0x2C, 0x0B, 0x0C, 0x2A, 0x2B,
373 0x3C, 0x2C, 0x3B, 0x2C, 0x1B, 0x1C, 0x1B, 0x3B, 0x3A, 0x1B,
375 0x0D, 0x3C, 0x3B, 0x2C, 0x1B, 0x1C, 0x1B, 0x3B, 0x3A, 0x1B,
377 0x1D, 0x3C, 0x0C, 0x2C, 0x2B, 0x1C, 0x1B, 0x3B, 0x0B, 0x1B,
379 0x3D, 0x0D, 0x0C, 0x2C, 0x2B, 0x0C, 0x2B, 0x2B, 0x0B, 0x0B,
381 0x1E, 0x0D, 0x1C, 0x2C, 0x3B, 0x0C, 0x2B, 0x2B, 0x1B, 0x0B,
383 0x28, 0x09, 0x28, 0x09, 0x28, 0x09, 0x28, 0x08, 0x28, 0x27,
385 0x19, 0x29, 0x19, 0x29, 0x19, 0x29, 0x38, 0x19, 0x28, 0x09,
387 0x1A, 0x0B, 0x1A, 0x3A, 0x0A, 0x2A, 0x39, 0x2A, 0x39, 0x1A,
389 0x2B, 0x2B, 0x1B, 0x1B, 0x0B, 0x1B, 0x1A, 0x0B, 0x1A, 0x1A,
391 0x0C, 0x0C, 0x3B, 0x3B, 0x1B, 0x1B, 0x2A, 0x0B, 0x2A, 0x2A,
393 0x0C, 0x1C, 0x0C, 0x3B, 0x2B, 0x1B, 0x3A, 0x0B, 0x2A, 0x2A,
395 /**********************************************************************
396 * Tracking carrier loop carrier 16APSK 2/3 to 32APSK 9/10 long Frame
397 **********************************************************************/
400 * Modcod 2MPon 2MPoff 5MPon 5MPoff 10MPon 10MPoff 20MPon
401 * 20MPoff 30MPon 30MPoff
405 0x0A, 0x0A, 0x0A, 0x0A, 0x1A, 0x0A, 0x39, 0x0A, 0x29, 0x0A,
407 0x0A, 0x0A, 0x0A, 0x0A, 0x0B, 0x0A, 0x2A, 0x0A, 0x1A, 0x0A,
409 0x0A, 0x0A, 0x0A, 0x0A, 0x1B, 0x0A, 0x3A, 0x0A, 0x2A, 0x0A,
411 0x0A, 0x0A, 0x0A, 0x0A, 0x1B, 0x0A, 0x3A, 0x0A, 0x2A, 0x0A,
413 0x0A, 0x0A, 0x0A, 0x0A, 0x2B, 0x0A, 0x0B, 0x0A, 0x3A, 0x0A,
415 0x0A, 0x0A, 0x0A, 0x0A, 0x2B, 0x0A, 0x0B, 0x0A, 0x3A, 0x0A,
417 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
419 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
421 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
423 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
425 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
428 static u8
get_optim_cloop(struct stv
*state
,
429 enum fe_stv0910_mod_cod mod_cod
, u32 pilots
)
433 if (mod_cod
>= FE_32APSK_910
)
434 i
= ((int)FE_32APSK_910
- (int)FE_QPSK_14
) * 10;
435 else if (mod_cod
>= FE_QPSK_14
)
436 i
= ((int)mod_cod
- (int)FE_QPSK_14
) * 10;
438 if (state
->symbol_rate
<= 3000000)
440 else if (state
->symbol_rate
<= 7000000)
442 else if (state
->symbol_rate
<= 15000000)
444 else if (state
->symbol_rate
<= 25000000)
452 return s2car_loop
[i
];
455 static int get_cur_symbol_rate(struct stv
*state
, u32
*p_symbol_rate
)
472 read_reg(state
, RSTV0910_P2_SFR3
+ state
->regoff
, &symb_freq3
);
473 read_reg(state
, RSTV0910_P2_SFR2
+ state
->regoff
, &symb_freq2
);
474 read_reg(state
, RSTV0910_P2_SFR1
+ state
->regoff
, &symb_freq1
);
475 read_reg(state
, RSTV0910_P2_SFR0
+ state
->regoff
, &symb_freq0
);
476 read_reg(state
, RSTV0910_P2_TMGREG2
+ state
->regoff
, &tim_offs2
);
477 read_reg(state
, RSTV0910_P2_TMGREG1
+ state
->regoff
, &tim_offs1
);
478 read_reg(state
, RSTV0910_P2_TMGREG0
+ state
->regoff
, &tim_offs0
);
480 symbol_rate
= ((u32
)symb_freq3
<< 24) | ((u32
)symb_freq2
<< 16) |
481 ((u32
)symb_freq1
<< 8) | (u32
)symb_freq0
;
482 timing_offset
= ((u32
)tim_offs2
<< 16) | ((u32
)tim_offs1
<< 8) |
485 if ((timing_offset
& (1 << 23)) != 0)
486 timing_offset
|= 0xFF000000; /* Sign extent */
488 symbol_rate
= (u32
)(((u64
)symbol_rate
* state
->base
->mclk
) >> 32);
489 timing_offset
= (s32
)(((s64
)symbol_rate
* (s64
)timing_offset
) >> 29);
491 *p_symbol_rate
= symbol_rate
+ timing_offset
;
496 static int get_signal_parameters(struct stv
*state
)
503 if (state
->receive_mode
== RCVMODE_DVBS2
) {
504 read_reg(state
, RSTV0910_P2_DMDMODCOD
+ state
->regoff
, &tmp
);
505 state
->mod_cod
= (enum fe_stv0910_mod_cod
)((tmp
& 0x7c) >> 2);
506 state
->pilots
= (tmp
& 0x01) != 0;
507 state
->fectype
= (enum dvbs2_fectype
)((tmp
& 0x02) >> 1);
509 } else if (state
->receive_mode
== RCVMODE_DVBS
) {
510 read_reg(state
, RSTV0910_P2_VITCURPUN
+ state
->regoff
, &tmp
);
511 state
->puncture_rate
= FEC_NONE
;
512 switch (tmp
& 0x1F) {
514 state
->puncture_rate
= FEC_1_2
;
517 state
->puncture_rate
= FEC_2_3
;
520 state
->puncture_rate
= FEC_3_4
;
523 state
->puncture_rate
= FEC_5_6
;
526 state
->puncture_rate
= FEC_7_8
;
530 state
->is_standard_broadcast
= 1;
531 state
->feroll_off
= FE_SAT_35
;
536 static int tracking_optimization(struct stv
*state
)
540 read_reg(state
, RSTV0910_P2_DMDCFGMD
+ state
->regoff
, &tmp
);
543 switch (state
->receive_mode
) {
554 write_reg(state
, RSTV0910_P2_DMDCFGMD
+ state
->regoff
, tmp
);
556 if (state
->receive_mode
== RCVMODE_DVBS2
) {
557 /* Disable Reed-Solomon */
558 write_shared_reg(state
,
559 RSTV0910_TSTTSRS
, state
->nr
? 0x02 : 0x01,
562 if (state
->fectype
== DVBS2_64K
) {
563 u8 aclc
= get_optim_cloop(state
, state
->mod_cod
,
566 if (state
->mod_cod
<= FE_QPSK_910
) {
567 write_reg(state
, RSTV0910_P2_ACLC2S2Q
+
568 state
->regoff
, aclc
);
569 } else if (state
->mod_cod
<= FE_8PSK_910
) {
570 write_reg(state
, RSTV0910_P2_ACLC2S2Q
+
571 state
->regoff
, 0x2a);
572 write_reg(state
, RSTV0910_P2_ACLC2S28
+
573 state
->regoff
, aclc
);
574 } else if (state
->mod_cod
<= FE_16APSK_910
) {
575 write_reg(state
, RSTV0910_P2_ACLC2S2Q
+
576 state
->regoff
, 0x2a);
577 write_reg(state
, RSTV0910_P2_ACLC2S216A
+
578 state
->regoff
, aclc
);
579 } else if (state
->mod_cod
<= FE_32APSK_910
) {
580 write_reg(state
, RSTV0910_P2_ACLC2S2Q
+
581 state
->regoff
, 0x2a);
582 write_reg(state
, RSTV0910_P2_ACLC2S232A
+
583 state
->regoff
, aclc
);
590 static s32
table_lookup(const struct slookup
*table
,
591 int table_size
, u32 reg_value
)
595 int imax
= table_size
- 1;
599 /* Assumes Table[0].RegValue > Table[imax].RegValue */
600 if (reg_value
>= table
[0].reg_value
) {
601 value
= table
[0].value
;
602 } else if (reg_value
<= table
[imax
].reg_value
) {
603 value
= table
[imax
].value
;
605 while ((imax
- imin
) > 1) {
606 i
= (imax
+ imin
) / 2;
607 if ((table
[imin
].reg_value
>= reg_value
) &&
608 (reg_value
>= table
[i
].reg_value
))
614 reg_diff
= table
[imax
].reg_value
- table
[imin
].reg_value
;
615 value
= table
[imin
].value
;
617 value
+= ((s32
)(reg_value
- table
[imin
].reg_value
) *
618 (s32
)(table
[imax
].value
619 - table
[imin
].value
))
626 static int get_signal_to_noise(struct stv
*state
, s32
*signal_to_noise
)
632 const struct slookup
*lookup
;
634 *signal_to_noise
= 0;
639 if (state
->receive_mode
== RCVMODE_DVBS2
) {
640 read_reg(state
, RSTV0910_P2_NNOSPLHT1
+ state
->regoff
,
642 read_reg(state
, RSTV0910_P2_NNOSPLHT0
+ state
->regoff
,
644 n_lookup
= ARRAY_SIZE(s2_sn_lookup
);
645 lookup
= s2_sn_lookup
;
647 read_reg(state
, RSTV0910_P2_NNOSDATAT1
+ state
->regoff
,
649 read_reg(state
, RSTV0910_P2_NNOSDATAT0
+ state
->regoff
,
651 n_lookup
= ARRAY_SIZE(s1_sn_lookup
);
652 lookup
= s1_sn_lookup
;
654 data
= (((u16
)data1
) << 8) | (u16
)data0
;
655 *signal_to_noise
= table_lookup(lookup
, n_lookup
, data
);
659 static int get_bit_error_rate_s(struct stv
*state
, u32
*bernumerator
,
664 int status
= read_regs(state
,
665 RSTV0910_P2_ERRCNT12
+ state
->regoff
,
671 if ((regs
[0] & 0x80) == 0) {
672 state
->last_berdenominator
= 1ULL << ((state
->berscale
* 2) +
674 state
->last_bernumerator
= ((u32
)(regs
[0] & 0x7F) << 16) |
675 ((u32
)regs
[1] << 8) | regs
[2];
676 if (state
->last_bernumerator
< 256 && state
->berscale
< 6) {
677 state
->berscale
+= 1;
678 status
= write_reg(state
, RSTV0910_P2_ERRCTRL1
+
680 0x20 | state
->berscale
);
681 } else if (state
->last_bernumerator
> 1024 &&
682 state
->berscale
> 2) {
683 state
->berscale
-= 1;
684 status
= write_reg(state
, RSTV0910_P2_ERRCTRL1
+
685 state
->regoff
, 0x20 |
689 *bernumerator
= state
->last_bernumerator
;
690 *berdenominator
= state
->last_berdenominator
;
694 static u32
dvbs2_nbch(enum dvbs2_mod_cod mod_cod
, enum dvbs2_fectype fectype
)
696 static const u32 nbch
[][2] = {
697 { 0, 0}, /* DUMMY_PLF */
698 {16200, 3240}, /* QPSK_1_4, */
699 {21600, 5400}, /* QPSK_1_3, */
700 {25920, 6480}, /* QPSK_2_5, */
701 {32400, 7200}, /* QPSK_1_2, */
702 {38880, 9720}, /* QPSK_3_5, */
703 {43200, 10800}, /* QPSK_2_3, */
704 {48600, 11880}, /* QPSK_3_4, */
705 {51840, 12600}, /* QPSK_4_5, */
706 {54000, 13320}, /* QPSK_5_6, */
707 {57600, 14400}, /* QPSK_8_9, */
708 {58320, 16000}, /* QPSK_9_10, */
709 {43200, 9720}, /* 8PSK_3_5, */
710 {48600, 10800}, /* 8PSK_2_3, */
711 {51840, 11880}, /* 8PSK_3_4, */
712 {54000, 13320}, /* 8PSK_5_6, */
713 {57600, 14400}, /* 8PSK_8_9, */
714 {58320, 16000}, /* 8PSK_9_10, */
715 {43200, 10800}, /* 16APSK_2_3, */
716 {48600, 11880}, /* 16APSK_3_4, */
717 {51840, 12600}, /* 16APSK_4_5, */
718 {54000, 13320}, /* 16APSK_5_6, */
719 {57600, 14400}, /* 16APSK_8_9, */
720 {58320, 16000}, /* 16APSK_9_10 */
721 {48600, 11880}, /* 32APSK_3_4, */
722 {51840, 12600}, /* 32APSK_4_5, */
723 {54000, 13320}, /* 32APSK_5_6, */
724 {57600, 14400}, /* 32APSK_8_9, */
725 {58320, 16000}, /* 32APSK_9_10 */
728 if (mod_cod
>= DVBS2_QPSK_1_4
&&
729 mod_cod
<= DVBS2_32APSK_9_10
&& fectype
<= DVBS2_16K
)
730 return nbch
[mod_cod
][fectype
];
734 static int get_bit_error_rate_s2(struct stv
*state
, u32
*bernumerator
,
739 int status
= read_regs(state
, RSTV0910_P2_ERRCNT12
+ state
->regoff
,
745 if ((regs
[0] & 0x80) == 0) {
746 state
->last_berdenominator
=
747 dvbs2_nbch((enum dvbs2_mod_cod
)state
->mod_cod
,
749 (state
->berscale
* 2);
750 state
->last_bernumerator
= (((u32
)regs
[0] & 0x7F) << 16) |
751 ((u32
)regs
[1] << 8) | regs
[2];
752 if (state
->last_bernumerator
< 256 && state
->berscale
< 6) {
753 state
->berscale
+= 1;
754 write_reg(state
, RSTV0910_P2_ERRCTRL1
+ state
->regoff
,
755 0x20 | state
->berscale
);
756 } else if (state
->last_bernumerator
> 1024 &&
757 state
->berscale
> 2) {
758 state
->berscale
-= 1;
759 write_reg(state
, RSTV0910_P2_ERRCTRL1
+ state
->regoff
,
760 0x20 | state
->berscale
);
763 *bernumerator
= state
->last_bernumerator
;
764 *berdenominator
= state
->last_berdenominator
;
768 static int get_bit_error_rate(struct stv
*state
, u32
*bernumerator
,
774 switch (state
->receive_mode
) {
776 return get_bit_error_rate_s(state
,
777 bernumerator
, berdenominator
);
779 return get_bit_error_rate_s2(state
,
780 bernumerator
, berdenominator
);
787 static int set_mclock(struct stv
*state
, u32 master_clock
)
791 u32 quartz
= state
->base
->extclk
/ 1000000;
792 u32 fphi
= master_clock
/ 1000000;
793 u32 ndiv
= (fphi
* odf
* idf
) / quartz
;
797 if (ndiv
>= 7 && ndiv
<= 71)
799 else if (ndiv
>= 72 && ndiv
<= 79)
801 else if (ndiv
>= 80 && ndiv
<= 87)
803 else if (ndiv
>= 88 && ndiv
<= 95)
805 else if (ndiv
>= 96 && ndiv
<= 103)
807 else if (ndiv
>= 104 && ndiv
<= 111)
809 else if (ndiv
>= 112 && ndiv
<= 119)
811 else if (ndiv
>= 120 && ndiv
<= 127)
813 else if (ndiv
>= 128 && ndiv
<= 135)
815 else if (ndiv
>= 136 && ndiv
<= 143)
817 else if (ndiv
>= 144 && ndiv
<= 151)
819 else if (ndiv
>= 152 && ndiv
<= 159)
821 else if (ndiv
>= 160 && ndiv
<= 167)
823 else if (ndiv
>= 168 && ndiv
<= 175)
825 else if (ndiv
>= 176 && ndiv
<= 183)
827 else if (ndiv
>= 184 && ndiv
<= 191)
829 else if (ndiv
>= 192 && ndiv
<= 199)
831 else if (ndiv
>= 200 && ndiv
<= 207)
833 else if (ndiv
>= 208 && ndiv
<= 215)
835 else if (ndiv
>= 216 && ndiv
<= 223)
837 else if (ndiv
>= 224 && ndiv
<= 225)
840 write_reg(state
, RSTV0910_NCOARSE
, (cp
<< 3) | idf
);
841 write_reg(state
, RSTV0910_NCOARSE2
, odf
);
842 write_reg(state
, RSTV0910_NCOARSE1
, ndiv
);
844 fvco
= (quartz
* 2 * ndiv
) / idf
;
845 state
->base
->mclk
= fvco
/ (2 * odf
) * 1000000;
850 static int stop(struct stv
*state
)
852 if (state
->started
) {
855 write_reg(state
, RSTV0910_P2_TSCFGH
+ state
->regoff
,
856 state
->tscfgh
| 0x01);
857 read_reg(state
, RSTV0910_P2_PDELCTRL1
+ state
->regoff
, &tmp
);
858 tmp
&= ~0x01; /* release reset DVBS2 packet delin */
859 write_reg(state
, RSTV0910_P2_PDELCTRL1
+ state
->regoff
, tmp
);
861 write_reg(state
, RSTV0910_P2_AGC2O
+ state
->regoff
, 0x5B);
863 write_reg(state
, RSTV0910_P2_DMDISTATE
+ state
->regoff
, 0x5c);
866 state
->receive_mode
= RCVMODE_NONE
;
870 static void set_pls(struct stv
*state
, u32 pls_code
)
872 if (pls_code
== state
->cur_scrambling_code
)
875 /* PLROOT2 bit 2 = gold code */
876 write_reg(state
, RSTV0910_P2_PLROOT0
+ state
->regoff
,
878 write_reg(state
, RSTV0910_P2_PLROOT1
+ state
->regoff
,
879 (pls_code
>> 8) & 0xff);
880 write_reg(state
, RSTV0910_P2_PLROOT2
+ state
->regoff
,
881 0x04 | ((pls_code
>> 16) & 0x03));
882 state
->cur_scrambling_code
= pls_code
;
885 static void set_isi(struct stv
*state
, u32 isi
)
887 if (isi
== NO_STREAM_ID_FILTER
)
889 if (isi
== 0x80000000) {
890 SET_FIELD(FORCE_CONTINUOUS
, 1);
891 SET_FIELD(TSOUT_NOSYNC
, 1);
893 SET_FIELD(FILTER_EN
, 1);
894 write_reg(state
, RSTV0910_P2_ISIENTRY
+ state
->regoff
,
896 write_reg(state
, RSTV0910_P2_ISIBITENA
+ state
->regoff
, 0xff);
898 SET_FIELD(ALGOSWRST
, 1);
899 SET_FIELD(ALGOSWRST
, 0);
902 static void set_stream_modes(struct stv
*state
,
903 struct dtv_frontend_properties
*p
)
905 set_isi(state
, p
->stream_id
);
906 set_pls(state
, p
->scrambling_sequence_index
);
909 static int init_search_param(struct stv
*state
,
910 struct dtv_frontend_properties
*p
)
912 SET_FIELD(FORCE_CONTINUOUS
, 0);
913 SET_FIELD(FRAME_MODE
, 0);
914 SET_FIELD(FILTER_EN
, 0);
915 SET_FIELD(TSOUT_NOSYNC
, 0);
916 SET_FIELD(TSFIFO_EMBINDVB
, 0);
917 SET_FIELD(TSDEL_SYNCBYTE
, 0);
918 SET_REG(UPLCCST0
, 0xe0);
919 SET_FIELD(TSINS_TOKEN
, 0);
920 SET_FIELD(HYSTERESIS_THRESHOLD
, 0);
921 SET_FIELD(ISIOBS_MODE
, 1);
923 set_stream_modes(state
, p
);
927 static int enable_puncture_rate(struct stv
*state
, enum fe_code_rate rate
)
953 return write_reg(state
, RSTV0910_P2_PRVIT
+ state
->regoff
, val
);
956 static int set_vth_default(struct stv
*state
)
958 state
->vth
[0] = 0xd7;
959 state
->vth
[1] = 0x85;
960 state
->vth
[2] = 0x58;
961 state
->vth
[3] = 0x3a;
962 state
->vth
[4] = 0x34;
963 state
->vth
[5] = 0x28;
964 write_reg(state
, RSTV0910_P2_VTH12
+ state
->regoff
+ 0, state
->vth
[0]);
965 write_reg(state
, RSTV0910_P2_VTH12
+ state
->regoff
+ 1, state
->vth
[1]);
966 write_reg(state
, RSTV0910_P2_VTH12
+ state
->regoff
+ 2, state
->vth
[2]);
967 write_reg(state
, RSTV0910_P2_VTH12
+ state
->regoff
+ 3, state
->vth
[3]);
968 write_reg(state
, RSTV0910_P2_VTH12
+ state
->regoff
+ 4, state
->vth
[4]);
969 write_reg(state
, RSTV0910_P2_VTH12
+ state
->regoff
+ 5, state
->vth
[5]);
973 static int set_vth(struct stv
*state
)
975 static const struct slookup vthlookup_table
[] = {
976 {250, 8780}, /* C/N= 1.5dB */
977 {100, 7405}, /* C/N= 4.5dB */
978 {40, 6330}, /* C/N= 6.5dB */
979 {12, 5224}, /* C/N= 8.5dB */
980 {5, 4236} /* C/N=10.5dB */
985 int status
= read_regs(state
,
986 RSTV0910_P2_NNOSDATAT1
+ state
->regoff
,
988 u16 reg_value
= (tmp
[0] << 8) | tmp
[1];
989 s32 vth
= table_lookup(vthlookup_table
, ARRAY_SIZE(vthlookup_table
),
992 for (i
= 0; i
< 6; i
+= 1)
993 if (state
->vth
[i
] > vth
)
996 write_reg(state
, RSTV0910_P2_VTH12
+ state
->regoff
+ 0, state
->vth
[0]);
997 write_reg(state
, RSTV0910_P2_VTH12
+ state
->regoff
+ 1, state
->vth
[1]);
998 write_reg(state
, RSTV0910_P2_VTH12
+ state
->regoff
+ 2, state
->vth
[2]);
999 write_reg(state
, RSTV0910_P2_VTH12
+ state
->regoff
+ 3, state
->vth
[3]);
1000 write_reg(state
, RSTV0910_P2_VTH12
+ state
->regoff
+ 4, state
->vth
[4]);
1001 write_reg(state
, RSTV0910_P2_VTH12
+ state
->regoff
+ 5, state
->vth
[5]);
1005 static int start(struct stv
*state
, struct dtv_frontend_properties
*p
)
1011 if (p
->symbol_rate
< 100000 || p
->symbol_rate
> 70000000)
1014 state
->receive_mode
= RCVMODE_NONE
;
1015 state
->demod_lock_time
= 0;
1019 write_reg(state
, RSTV0910_P2_DMDISTATE
+ state
->regoff
, 0x5C);
1021 init_search_param(state
, p
);
1023 if (p
->symbol_rate
<= 1000000) { /* SR <=1Msps */
1024 state
->demod_timeout
= 3000;
1025 state
->fec_timeout
= 2000;
1026 } else if (p
->symbol_rate
<= 2000000) { /* 1Msps < SR <=2Msps */
1027 state
->demod_timeout
= 2500;
1028 state
->fec_timeout
= 1300;
1029 } else if (p
->symbol_rate
<= 5000000) { /* 2Msps< SR <=5Msps */
1030 state
->demod_timeout
= 1000;
1031 state
->fec_timeout
= 650;
1032 } else if (p
->symbol_rate
<= 10000000) { /* 5Msps< SR <=10Msps */
1033 state
->demod_timeout
= 700;
1034 state
->fec_timeout
= 350;
1035 } else if (p
->symbol_rate
< 20000000) { /* 10Msps< SR <=20Msps */
1036 state
->demod_timeout
= 400;
1037 state
->fec_timeout
= 200;
1038 } else { /* SR >=20Msps */
1039 state
->demod_timeout
= 300;
1040 state
->fec_timeout
= 200;
1043 /* Set the Init Symbol rate */
1044 symb
= muldiv32(p
->symbol_rate
, 65536, state
->base
->mclk
);
1045 write_reg(state
, RSTV0910_P2_SFRINIT1
+ state
->regoff
,
1046 ((symb
>> 8) & 0x7F));
1047 write_reg(state
, RSTV0910_P2_SFRINIT0
+ state
->regoff
, (symb
& 0xFF));
1049 state
->demod_bits
|= 0x80;
1050 write_reg(state
, RSTV0910_P2_DEMOD
+ state
->regoff
, state
->demod_bits
);
1052 /* FE_STV0910_SetSearchStandard */
1053 read_reg(state
, RSTV0910_P2_DMDCFGMD
+ state
->regoff
, ®_dmdcfgmd
);
1054 write_reg(state
, RSTV0910_P2_DMDCFGMD
+ state
->regoff
,
1055 reg_dmdcfgmd
|= 0xC0);
1057 write_shared_reg(state
,
1058 RSTV0910_TSTTSRS
, state
->nr
? 0x02 : 0x01, 0x00);
1061 write_reg(state
, RSTV0910_P2_FECM
+ state
->regoff
, 0x00);
1062 write_reg(state
, RSTV0910_P2_PRVIT
+ state
->regoff
, 0x2F);
1064 enable_puncture_rate(state
, FEC_NONE
);
1066 /* 8PSK 3/5, 8PSK 2/3 Poff tracking optimization WA */
1067 write_reg(state
, RSTV0910_P2_ACLC2S2Q
+ state
->regoff
, 0x0B);
1068 write_reg(state
, RSTV0910_P2_ACLC2S28
+ state
->regoff
, 0x0A);
1069 write_reg(state
, RSTV0910_P2_BCLC2S2Q
+ state
->regoff
, 0x84);
1070 write_reg(state
, RSTV0910_P2_BCLC2S28
+ state
->regoff
, 0x84);
1071 write_reg(state
, RSTV0910_P2_CARHDR
+ state
->regoff
, 0x1C);
1072 write_reg(state
, RSTV0910_P2_CARFREQ
+ state
->regoff
, 0x79);
1074 write_reg(state
, RSTV0910_P2_ACLC2S216A
+ state
->regoff
, 0x29);
1075 write_reg(state
, RSTV0910_P2_ACLC2S232A
+ state
->regoff
, 0x09);
1076 write_reg(state
, RSTV0910_P2_BCLC2S216A
+ state
->regoff
, 0x84);
1077 write_reg(state
, RSTV0910_P2_BCLC2S232A
+ state
->regoff
, 0x84);
1080 * Reset CAR3, bug DVBS2->DVBS1 lock
1081 * Note: The bit is only pulsed -> no lock on shared register needed
1083 write_reg(state
, RSTV0910_TSTRES0
, state
->nr
? 0x04 : 0x08);
1084 write_reg(state
, RSTV0910_TSTRES0
, 0);
1086 set_vth_default(state
);
1088 write_reg(state
, RSTV0910_P2_DMDISTATE
+ state
->regoff
, 0x1F);
1090 write_reg(state
, RSTV0910_P2_CARCFG
+ state
->regoff
, 0x46);
1092 if (p
->symbol_rate
<= 5000000)
1093 freq
= (state
->search_range
/ 2000) + 80;
1095 freq
= (state
->search_range
/ 2000) + 1600;
1096 freq
= (freq
<< 16) / (state
->base
->mclk
/ 1000);
1098 write_reg(state
, RSTV0910_P2_CFRUP1
+ state
->regoff
,
1099 (freq
>> 8) & 0xff);
1100 write_reg(state
, RSTV0910_P2_CFRUP0
+ state
->regoff
, (freq
& 0xff));
1101 /* CFR Low Setting */
1103 write_reg(state
, RSTV0910_P2_CFRLOW1
+ state
->regoff
,
1104 (freq
>> 8) & 0xff);
1105 write_reg(state
, RSTV0910_P2_CFRLOW0
+ state
->regoff
, (freq
& 0xff));
1107 /* init the demod frequency offset to 0 */
1108 write_reg(state
, RSTV0910_P2_CFRINIT1
+ state
->regoff
, 0);
1109 write_reg(state
, RSTV0910_P2_CFRINIT0
+ state
->regoff
, 0);
1111 write_reg(state
, RSTV0910_P2_DMDISTATE
+ state
->regoff
, 0x1F);
1113 write_reg(state
, RSTV0910_P2_DMDISTATE
+ state
->regoff
, 0x15);
1115 state
->demod_lock_time
+= TUNING_DELAY
;
1121 static int init_diseqc(struct stv
*state
)
1123 u16 offs
= state
->nr
? 0x40 : 0; /* Address offset */
1124 u8 freq
= ((state
->base
->mclk
+ 11000 * 32) / (22000 * 32));
1126 /* Disable receiver */
1127 write_reg(state
, RSTV0910_P1_DISRXCFG
+ offs
, 0x00);
1128 write_reg(state
, RSTV0910_P1_DISTXCFG
+ offs
, 0xBA); /* Reset = 1 */
1129 write_reg(state
, RSTV0910_P1_DISTXCFG
+ offs
, 0x3A); /* Reset = 0 */
1130 write_reg(state
, RSTV0910_P1_DISTXF22
+ offs
, freq
);
1134 static int probe(struct stv
*state
)
1138 state
->receive_mode
= RCVMODE_NONE
;
1141 if (read_reg(state
, RSTV0910_MID
, &id
) < 0)
1147 /* Configure the I2C repeater to off */
1148 write_reg(state
, RSTV0910_P1_I2CRPT
, 0x24);
1149 /* Configure the I2C repeater to off */
1150 write_reg(state
, RSTV0910_P2_I2CRPT
, 0x24);
1151 /* Set the I2C to oversampling ratio */
1152 write_reg(state
, RSTV0910_I2CCFG
, 0x88); /* state->i2ccfg */
1154 write_reg(state
, RSTV0910_OUTCFG
, 0x00); /* OUTCFG */
1155 write_reg(state
, RSTV0910_PADCFG
, 0x05); /* RFAGC Pads Dev = 05 */
1156 write_reg(state
, RSTV0910_SYNTCTRL
, 0x02); /* SYNTCTRL */
1157 write_reg(state
, RSTV0910_TSGENERAL
, state
->tsgeneral
); /* TSGENERAL */
1158 write_reg(state
, RSTV0910_CFGEXT
, 0x02); /* CFGEXT */
1161 write_reg(state
, RSTV0910_GENCFG
, 0x14); /* GENCFG */
1163 write_reg(state
, RSTV0910_GENCFG
, 0x15); /* GENCFG */
1165 write_reg(state
, RSTV0910_P1_TNRCFG2
, 0x02); /* IQSWAP = 0 */
1166 write_reg(state
, RSTV0910_P2_TNRCFG2
, 0x82); /* IQSWAP = 1 */
1168 write_reg(state
, RSTV0910_P1_CAR3CFG
, 0x02);
1169 write_reg(state
, RSTV0910_P2_CAR3CFG
, 0x02);
1170 write_reg(state
, RSTV0910_P1_DMDCFG4
, 0x04);
1171 write_reg(state
, RSTV0910_P2_DMDCFG4
, 0x04);
1173 write_reg(state
, RSTV0910_TSTRES0
, 0x80); /* LDPC Reset */
1174 write_reg(state
, RSTV0910_TSTRES0
, 0x00);
1176 write_reg(state
, RSTV0910_P1_TSPIDFLT1
, 0x00);
1177 write_reg(state
, RSTV0910_P2_TSPIDFLT1
, 0x00);
1179 write_reg(state
, RSTV0910_P1_TMGCFG2
, 0x80);
1180 write_reg(state
, RSTV0910_P2_TMGCFG2
, 0x80);
1182 set_mclock(state
, 135000000);
1185 write_reg(state
, RSTV0910_P1_TSCFGH
, state
->tscfgh
| 0x01);
1186 write_reg(state
, RSTV0910_P1_TSCFGH
, state
->tscfgh
);
1187 write_reg(state
, RSTV0910_P1_TSCFGM
, 0xC0); /* Manual speed */
1188 write_reg(state
, RSTV0910_P1_TSCFGL
, 0x20);
1190 write_reg(state
, RSTV0910_P1_TSSPEED
, state
->tsspeed
);
1192 write_reg(state
, RSTV0910_P2_TSCFGH
, state
->tscfgh
| 0x01);
1193 write_reg(state
, RSTV0910_P2_TSCFGH
, state
->tscfgh
);
1194 write_reg(state
, RSTV0910_P2_TSCFGM
, 0xC0); /* Manual speed */
1195 write_reg(state
, RSTV0910_P2_TSCFGL
, 0x20);
1197 write_reg(state
, RSTV0910_P2_TSSPEED
, state
->tsspeed
);
1199 /* Reset stream merger */
1200 write_reg(state
, RSTV0910_P1_TSCFGH
, state
->tscfgh
| 0x01);
1201 write_reg(state
, RSTV0910_P2_TSCFGH
, state
->tscfgh
| 0x01);
1202 write_reg(state
, RSTV0910_P1_TSCFGH
, state
->tscfgh
);
1203 write_reg(state
, RSTV0910_P2_TSCFGH
, state
->tscfgh
);
1205 write_reg(state
, RSTV0910_P1_I2CRPT
, state
->i2crpt
);
1206 write_reg(state
, RSTV0910_P2_I2CRPT
, state
->i2crpt
);
1208 write_reg(state
, RSTV0910_P1_TSINSDELM
, 0x17);
1209 write_reg(state
, RSTV0910_P1_TSINSDELL
, 0xff);
1211 write_reg(state
, RSTV0910_P2_TSINSDELM
, 0x17);
1212 write_reg(state
, RSTV0910_P2_TSINSDELL
, 0xff);
1218 static int gate_ctrl(struct dvb_frontend
*fe
, int enable
)
1220 struct stv
*state
= fe
->demodulator_priv
;
1221 u8 i2crpt
= state
->i2crpt
& ~0x86;
1224 * mutex_lock note: Concurrent I2C gate bus accesses must be
1225 * prevented (STV0910 = dual demod on a single IC with a single I2C
1226 * gate/bus, and two tuners attached), similar to most (if not all)
1227 * other I2C host interfaces/buses.
1229 * enable=1 (open I2C gate) will grab the lock
1230 * enable=0 (close I2C gate) releases the lock
1234 mutex_lock(&state
->base
->i2c_lock
);
1240 if (write_reg(state
, state
->nr
? RSTV0910_P2_I2CRPT
:
1241 RSTV0910_P1_I2CRPT
, i2crpt
) < 0) {
1242 /* don't hold the I2C bus lock on failure */
1243 if (!WARN_ON(!mutex_is_locked(&state
->base
->i2c_lock
)))
1244 mutex_unlock(&state
->base
->i2c_lock
);
1245 dev_err(&state
->base
->i2c
->dev
,
1246 "%s() write_reg failure (enable=%d)\n",
1251 state
->i2crpt
= i2crpt
;
1254 if (!WARN_ON(!mutex_is_locked(&state
->base
->i2c_lock
)))
1255 mutex_unlock(&state
->base
->i2c_lock
);
1259 static void release(struct dvb_frontend
*fe
)
1261 struct stv
*state
= fe
->demodulator_priv
;
1263 state
->base
->count
--;
1264 if (state
->base
->count
== 0) {
1265 list_del(&state
->base
->stvlist
);
1271 static int set_parameters(struct dvb_frontend
*fe
)
1274 struct stv
*state
= fe
->demodulator_priv
;
1275 struct dtv_frontend_properties
*p
= &fe
->dtv_property_cache
;
1278 if (fe
->ops
.tuner_ops
.set_params
)
1279 fe
->ops
.tuner_ops
.set_params(fe
);
1280 state
->symbol_rate
= p
->symbol_rate
;
1281 stat
= start(state
, p
);
1285 static int manage_matype_info(struct stv
*state
)
1287 if (!state
->started
)
1289 if (state
->receive_mode
== RCVMODE_DVBS2
) {
1292 read_regs(state
, RSTV0910_P2_MATSTR1
+ state
->regoff
,
1295 (enum fe_stv0910_roll_off
)(bbheader
[0] & 0x03);
1296 state
->is_vcm
= (bbheader
[0] & 0x10) == 0;
1297 state
->is_standard_broadcast
= (bbheader
[0] & 0xFC) == 0xF0;
1298 } else if (state
->receive_mode
== RCVMODE_DVBS
) {
1300 state
->is_standard_broadcast
= 1;
1301 state
->feroll_off
= FE_SAT_35
;
1306 static int read_snr(struct dvb_frontend
*fe
)
1308 struct stv
*state
= fe
->demodulator_priv
;
1309 struct dtv_frontend_properties
*p
= &fe
->dtv_property_cache
;
1312 if (!get_signal_to_noise(state
, &snrval
)) {
1313 p
->cnr
.stat
[0].scale
= FE_SCALE_DECIBEL
;
1314 p
->cnr
.stat
[0].svalue
= 100 * snrval
; /* fix scale */
1316 p
->cnr
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
1322 static int read_ber(struct dvb_frontend
*fe
)
1324 struct stv
*state
= fe
->demodulator_priv
;
1325 struct dtv_frontend_properties
*p
= &fe
->dtv_property_cache
;
1328 get_bit_error_rate(state
, &n
, &d
);
1330 p
->pre_bit_error
.stat
[0].scale
= FE_SCALE_COUNTER
;
1331 p
->pre_bit_error
.stat
[0].uvalue
= n
;
1332 p
->pre_bit_count
.stat
[0].scale
= FE_SCALE_COUNTER
;
1333 p
->pre_bit_count
.stat
[0].uvalue
= d
;
1338 static void read_signal_strength(struct dvb_frontend
*fe
)
1340 struct stv
*state
= fe
->demodulator_priv
;
1341 struct dtv_frontend_properties
*p
= &state
->fe
.dtv_property_cache
;
1344 s32 padc
, power
= 0;
1347 read_regs(state
, RSTV0910_P2_AGCIQIN1
+ state
->regoff
, reg
, 2);
1349 agc
= (((u32
)reg
[0]) << 8) | reg
[1];
1351 for (i
= 0; i
< 5; i
+= 1) {
1352 read_regs(state
, RSTV0910_P2_POWERI
+ state
->regoff
, reg
, 2);
1353 power
+= (u32
)reg
[0] * (u32
)reg
[0]
1354 + (u32
)reg
[1] * (u32
)reg
[1];
1355 usleep_range(3000, 4000);
1359 padc
= table_lookup(padc_lookup
, ARRAY_SIZE(padc_lookup
), power
) + 352;
1361 p
->strength
.stat
[0].scale
= FE_SCALE_DECIBEL
;
1362 p
->strength
.stat
[0].svalue
= (padc
- agc
);
1365 static int read_status(struct dvb_frontend
*fe
, enum fe_status
*status
)
1367 struct stv
*state
= fe
->demodulator_priv
;
1368 struct dtv_frontend_properties
*p
= &fe
->dtv_property_cache
;
1371 enum receive_mode cur_receive_mode
= RCVMODE_NONE
;
1376 read_reg(state
, RSTV0910_P2_DMDSTATE
+ state
->regoff
, &dmd_state
);
1378 if (dmd_state
& 0x40) {
1379 read_reg(state
, RSTV0910_P2_DSTATUS
+ state
->regoff
, &dstatus
);
1381 cur_receive_mode
= (dmd_state
& 0x20) ?
1382 RCVMODE_DVBS
: RCVMODE_DVBS2
;
1384 if (cur_receive_mode
== RCVMODE_NONE
) {
1387 /* reset signal statistics */
1388 p
->strength
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
1389 p
->cnr
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
1390 p
->pre_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
1391 p
->pre_bit_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
1396 *status
|= (FE_HAS_SIGNAL
1401 if (state
->receive_mode
== RCVMODE_NONE
) {
1402 state
->receive_mode
= cur_receive_mode
;
1403 state
->demod_lock_time
= jiffies
;
1404 state
->first_time_lock
= 1;
1406 get_signal_parameters(state
);
1407 tracking_optimization(state
);
1409 write_reg(state
, RSTV0910_P2_TSCFGH
+ state
->regoff
,
1411 usleep_range(3000, 4000);
1412 write_reg(state
, RSTV0910_P2_TSCFGH
+ state
->regoff
,
1413 state
->tscfgh
| 0x01);
1414 write_reg(state
, RSTV0910_P2_TSCFGH
+ state
->regoff
,
1417 if (dmd_state
& 0x40) {
1418 if (state
->receive_mode
== RCVMODE_DVBS2
) {
1422 RSTV0910_P2_PDELSTATUS1
+ state
->regoff
,
1424 feclock
= (pdelstatus
& 0x02) != 0;
1429 RSTV0910_P2_VSTATUSVIT
+ state
->regoff
,
1431 feclock
= (vstatus
& 0x08) != 0;
1436 *status
|= FE_HAS_LOCK
;
1438 if (state
->first_time_lock
) {
1441 state
->first_time_lock
= 0;
1443 manage_matype_info(state
);
1445 if (state
->receive_mode
== RCVMODE_DVBS2
) {
1447 * FSTV0910_P2_MANUALSX_ROLLOFF,
1448 * FSTV0910_P2_MANUALS2_ROLLOFF = 0
1450 state
->demod_bits
&= ~0x84;
1452 RSTV0910_P2_DEMOD
+ state
->regoff
,
1455 RSTV0910_P2_PDELCTRL2
+ state
->regoff
,
1457 /* reset DVBS2 packet delinator error counter */
1460 RSTV0910_P2_PDELCTRL2
+ state
->regoff
,
1462 /* reset DVBS2 packet delinator error counter */
1465 RSTV0910_P2_PDELCTRL2
+ state
->regoff
,
1468 state
->berscale
= 2;
1469 state
->last_bernumerator
= 0;
1470 state
->last_berdenominator
= 1;
1471 /* force to PRE BCH Rate */
1473 RSTV0910_P2_ERRCTRL1
+ state
->regoff
,
1474 BER_SRC_S2
| state
->berscale
);
1476 state
->berscale
= 2;
1477 state
->last_bernumerator
= 0;
1478 state
->last_berdenominator
= 1;
1479 /* force to PRE RS Rate */
1481 RSTV0910_P2_ERRCTRL1
+ state
->regoff
,
1482 BER_SRC_S
| state
->berscale
);
1484 /* Reset the Total packet counter */
1486 RSTV0910_P2_FBERCPT4
+ state
->regoff
, 0x00);
1488 * Reset the packet Error counter2 (and Set it to
1489 * infinite error count mode)
1492 RSTV0910_P2_ERRCTRL2
+ state
->regoff
, 0xc1);
1494 set_vth_default(state
);
1495 if (state
->receive_mode
== RCVMODE_DVBS
)
1496 enable_puncture_rate(state
,
1497 state
->puncture_rate
);
1500 /* Use highest signaled ModCod for quality */
1501 if (state
->is_vcm
) {
1503 enum fe_stv0910_mod_cod mod_cod
;
1505 read_reg(state
, RSTV0910_P2_DMDMODCOD
+ state
->regoff
,
1507 mod_cod
= (enum fe_stv0910_mod_cod
)((tmp
& 0x7c) >> 2);
1509 if (mod_cod
> state
->mod_cod
)
1510 state
->mod_cod
= mod_cod
;
1514 /* read signal statistics */
1516 /* read signal strength */
1517 read_signal_strength(fe
);
1519 /* read carrier/noise on FE_HAS_CARRIER */
1520 if (*status
& FE_HAS_CARRIER
)
1523 p
->cnr
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
1526 if (*status
& FE_HAS_VITERBI
) {
1529 p
->pre_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
1530 p
->pre_bit_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
1536 static int get_frontend(struct dvb_frontend
*fe
,
1537 struct dtv_frontend_properties
*p
)
1539 struct stv
*state
= fe
->demodulator_priv
;
1543 if (state
->receive_mode
== RCVMODE_DVBS2
) {
1545 const enum fe_modulation modcod2mod
[0x20] = {
1546 QPSK
, QPSK
, QPSK
, QPSK
,
1547 QPSK
, QPSK
, QPSK
, QPSK
,
1548 QPSK
, QPSK
, QPSK
, QPSK
,
1549 PSK_8
, PSK_8
, PSK_8
, PSK_8
,
1550 PSK_8
, PSK_8
, APSK_16
, APSK_16
,
1551 APSK_16
, APSK_16
, APSK_16
, APSK_16
,
1552 APSK_32
, APSK_32
, APSK_32
, APSK_32
,
1555 const enum fe_code_rate modcod2fec
[0x20] = {
1556 FEC_NONE
, FEC_NONE
, FEC_NONE
, FEC_2_5
,
1557 FEC_1_2
, FEC_3_5
, FEC_2_3
, FEC_3_4
,
1558 FEC_4_5
, FEC_5_6
, FEC_8_9
, FEC_9_10
,
1559 FEC_3_5
, FEC_2_3
, FEC_3_4
, FEC_5_6
,
1560 FEC_8_9
, FEC_9_10
, FEC_2_3
, FEC_3_4
,
1561 FEC_4_5
, FEC_5_6
, FEC_8_9
, FEC_9_10
,
1562 FEC_3_4
, FEC_4_5
, FEC_5_6
, FEC_8_9
,
1565 read_reg(state
, RSTV0910_P2_DMDMODCOD
+ state
->regoff
, &tmp
);
1566 mc
= ((tmp
& 0x7c) >> 2);
1567 p
->pilot
= (tmp
& 0x01) ? PILOT_ON
: PILOT_OFF
;
1568 p
->modulation
= modcod2mod
[mc
];
1569 p
->fec_inner
= modcod2fec
[mc
];
1570 } else if (state
->receive_mode
== RCVMODE_DVBS
) {
1571 read_reg(state
, RSTV0910_P2_VITCURPUN
+ state
->regoff
, &tmp
);
1572 switch (tmp
& 0x1F) {
1574 p
->fec_inner
= FEC_1_2
;
1577 p
->fec_inner
= FEC_2_3
;
1580 p
->fec_inner
= FEC_3_4
;
1583 p
->fec_inner
= FEC_5_6
;
1586 p
->fec_inner
= FEC_7_8
;
1589 p
->fec_inner
= FEC_NONE
;
1592 p
->rolloff
= ROLLOFF_35
;
1595 if (state
->receive_mode
!= RCVMODE_NONE
) {
1596 get_cur_symbol_rate(state
, &symbolrate
);
1597 p
->symbol_rate
= symbolrate
;
1602 static int tune(struct dvb_frontend
*fe
, bool re_tune
,
1603 unsigned int mode_flags
,
1604 unsigned int *delay
, enum fe_status
*status
)
1606 struct stv
*state
= fe
->demodulator_priv
;
1610 r
= set_parameters(fe
);
1613 state
->tune_time
= jiffies
;
1616 r
= read_status(fe
, status
);
1620 if (*status
& FE_HAS_LOCK
)
1627 static enum dvbfe_algo
get_algo(struct dvb_frontend
*fe
)
1629 return DVBFE_ALGO_HW
;
1632 static int set_tone(struct dvb_frontend
*fe
, enum fe_sec_tone_mode tone
)
1634 struct stv
*state
= fe
->demodulator_priv
;
1635 u16 offs
= state
->nr
? 0x40 : 0;
1639 return write_reg(state
, RSTV0910_P1_DISTXCFG
+ offs
, 0x38);
1641 return write_reg(state
, RSTV0910_P1_DISTXCFG
+ offs
, 0x3a);
1648 static int wait_dis(struct stv
*state
, u8 flag
, u8 val
)
1652 u16 offs
= state
->nr
? 0x40 : 0;
1654 for (i
= 0; i
< 10; i
++) {
1655 read_reg(state
, RSTV0910_P1_DISTXSTATUS
+ offs
, &stat
);
1656 if ((stat
& flag
) == val
)
1658 usleep_range(10000, 11000);
1663 static int send_master_cmd(struct dvb_frontend
*fe
,
1664 struct dvb_diseqc_master_cmd
*cmd
)
1666 struct stv
*state
= fe
->demodulator_priv
;
1669 SET_FIELD(DISEQC_MODE
, 2);
1670 SET_FIELD(DIS_PRECHARGE
, 1);
1671 for (i
= 0; i
< cmd
->msg_len
; i
++) {
1672 wait_dis(state
, 0x40, 0x00);
1673 SET_REG(DISTXFIFO
, cmd
->msg
[i
]);
1675 SET_FIELD(DIS_PRECHARGE
, 0);
1676 wait_dis(state
, 0x20, 0x20);
1680 static int send_burst(struct dvb_frontend
*fe
, enum fe_sec_mini_cmd burst
)
1682 struct stv
*state
= fe
->demodulator_priv
;
1685 if (burst
== SEC_MINI_A
) {
1686 SET_FIELD(DISEQC_MODE
, 3);
1689 SET_FIELD(DISEQC_MODE
, 2);
1693 SET_FIELD(DIS_PRECHARGE
, 1);
1694 wait_dis(state
, 0x40, 0x00);
1695 SET_REG(DISTXFIFO
, value
);
1696 SET_FIELD(DIS_PRECHARGE
, 0);
1697 wait_dis(state
, 0x20, 0x20);
1702 static int sleep(struct dvb_frontend
*fe
)
1704 struct stv
*state
= fe
->demodulator_priv
;
1710 static const struct dvb_frontend_ops stv0910_ops
= {
1711 .delsys
= { SYS_DVBS
, SYS_DVBS2
, SYS_DSS
},
1713 .name
= "ST STV0910",
1714 .frequency_min_hz
= 950 * MHz
,
1715 .frequency_max_hz
= 2150 * MHz
,
1716 .symbol_rate_min
= 100000,
1717 .symbol_rate_max
= 70000000,
1718 .caps
= FE_CAN_INVERSION_AUTO
|
1721 FE_CAN_2G_MODULATION
|
1726 .i2c_gate_ctrl
= gate_ctrl
,
1727 .set_frontend
= set_parameters
,
1728 .get_frontend_algo
= get_algo
,
1729 .get_frontend
= get_frontend
,
1731 .read_status
= read_status
,
1732 .set_tone
= set_tone
,
1734 .diseqc_send_master_cmd
= send_master_cmd
,
1735 .diseqc_send_burst
= send_burst
,
1738 static struct stv_base
*match_base(struct i2c_adapter
*i2c
, u8 adr
)
1742 list_for_each_entry(p
, &stvlist
, stvlist
)
1743 if (p
->i2c
== i2c
&& p
->adr
== adr
)
1748 static void stv0910_init_stats(struct stv
*state
)
1750 struct dtv_frontend_properties
*p
= &state
->fe
.dtv_property_cache
;
1752 p
->strength
.len
= 1;
1753 p
->strength
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
1755 p
->cnr
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
1756 p
->pre_bit_error
.len
= 1;
1757 p
->pre_bit_error
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
1758 p
->pre_bit_count
.len
= 1;
1759 p
->pre_bit_count
.stat
[0].scale
= FE_SCALE_NOT_AVAILABLE
;
1762 struct dvb_frontend
*stv0910_attach(struct i2c_adapter
*i2c
,
1763 struct stv0910_cfg
*cfg
,
1767 struct stv_base
*base
;
1769 state
= kzalloc(sizeof(*state
), GFP_KERNEL
);
1773 state
->tscfgh
= 0x20 | (cfg
->parallel
? 0 : 0x40);
1774 state
->tsgeneral
= (cfg
->parallel
== 2) ? 0x02 : 0x00;
1775 state
->i2crpt
= 0x0A | ((cfg
->rptlvl
& 0x07) << 4);
1776 /* use safe tsspeed value if unspecified through stv0910_cfg */
1777 state
->tsspeed
= (cfg
->tsspeed
? cfg
->tsspeed
: 0x28);
1779 state
->regoff
= state
->nr
? 0 : 0x200;
1780 state
->search_range
= 16000000;
1781 state
->demod_bits
= 0x10; /* Inversion : Auto with reset to 0 */
1782 state
->receive_mode
= RCVMODE_NONE
;
1783 state
->cur_scrambling_code
= (~0U);
1784 state
->single
= cfg
->single
? 1 : 0;
1786 base
= match_base(i2c
, cfg
->adr
);
1791 base
= kzalloc(sizeof(*base
), GFP_KERNEL
);
1795 base
->adr
= cfg
->adr
;
1797 base
->extclk
= cfg
->clk
? cfg
->clk
: 30000000;
1799 mutex_init(&base
->i2c_lock
);
1800 mutex_init(&base
->reg_lock
);
1802 if (probe(state
) < 0) {
1803 dev_info(&i2c
->dev
, "No demod found at adr %02X on %s\n",
1804 cfg
->adr
, dev_name(&i2c
->dev
));
1808 list_add(&base
->stvlist
, &stvlist
);
1810 state
->fe
.ops
= stv0910_ops
;
1811 state
->fe
.demodulator_priv
= state
;
1814 dev_info(&i2c
->dev
, "%s demod found at adr %02X on %s\n",
1815 state
->fe
.ops
.info
.name
, cfg
->adr
, dev_name(&i2c
->dev
));
1817 stv0910_init_stats(state
);
1825 EXPORT_SYMBOL_GPL(stv0910_attach
);
1827 MODULE_DESCRIPTION("ST STV0910 multistandard frontend driver");
1828 MODULE_AUTHOR("Ralph and Marcus Metzler, Manfred Voelkel");
1829 MODULE_LICENSE("GPL v2");