~ubuntu-branches/ubuntu/precise/linux-ti-omap4/precise

« back to all changes in this revision

Viewing changes to drivers/media/dvb/frontends/stv0367.c

  • Committer: Bazaar Package Importer
  • Author(s): Paolo Pisati
  • Date: 2011-06-29 15:23:51 UTC
  • mfrom: (26.1.1 natty-proposed)
  • Revision ID: james.westby@ubuntu.com-20110629152351-xs96tm303d95rpbk
Tags: 3.0.0-1200.2
* Rebased against 3.0.0-6.7
* BSP from TI based on 3.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * stv0367.c
 
3
 *
 
4
 * Driver for ST STV0367 DVB-T & DVB-C demodulator IC.
 
5
 *
 
6
 * Copyright (C) ST Microelectronics.
 
7
 * Copyright (C) 2010,2011 NetUP Inc.
 
8
 * Copyright (C) 2010,2011 Igor M. Liplianin <liplianin@netup.ru>
 
9
 *
 
10
 * This program is free software; you can redistribute it and/or modify
 
11
 * it under the terms of the GNU General Public License as published by
 
12
 * the Free Software Foundation; either version 2 of the License, or
 
13
 * (at your option) any later version.
 
14
 *
 
15
 * This program is distributed in the hope that it will be useful,
 
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
18
 *
 
19
 * GNU General Public License for more details.
 
20
 *
 
21
 * You should have received a copy of the GNU General Public License
 
22
 * along with this program; if not, write to the Free Software
 
23
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
24
 */
 
25
 
 
26
#include <linux/kernel.h>
 
27
#include <linux/module.h>
 
28
#include <linux/string.h>
 
29
#include <linux/slab.h>
 
30
#include <linux/i2c.h>
 
31
 
 
32
#include "stv0367.h"
 
33
#include "stv0367_regs.h"
 
34
#include "stv0367_priv.h"
 
35
 
 
36
static int stvdebug;
 
37
module_param_named(debug, stvdebug, int, 0644);
 
38
 
 
39
static int i2cdebug;
 
40
module_param_named(i2c_debug, i2cdebug, int, 0644);
 
41
 
 
42
#define dprintk(args...) \
 
43
        do { \
 
44
                if (stvdebug) \
 
45
                        printk(KERN_DEBUG args); \
 
46
        } while (0)
 
47
        /* DVB-C */
 
48
 
 
49
struct stv0367cab_state {
 
50
        enum stv0367_cab_signal_type    state;
 
51
        u32     mclk;
 
52
        u32     adc_clk;
 
53
        s32     search_range;
 
54
        s32     derot_offset;
 
55
        /* results */
 
56
        int locked;                     /* channel found                */
 
57
        u32 freq_khz;                   /* found frequency (in kHz)     */
 
58
        u32 symbol_rate;                /* found symbol rate (in Bds)   */
 
59
        enum stv0367cab_mod modulation; /* modulation                   */
 
60
        fe_spectral_inversion_t spect_inv; /* Spectrum Inversion        */
 
61
};
 
62
 
 
63
struct stv0367ter_state {
 
64
        /* DVB-T */
 
65
        enum stv0367_ter_signal_type state;
 
66
        enum stv0367_ter_if_iq_mode if_iq_mode;
 
67
        enum stv0367_ter_mode mode;/* mode 2K or 8K */
 
68
        fe_guard_interval_t guard;
 
69
        enum stv0367_ter_hierarchy hierarchy;
 
70
        u32 frequency;
 
71
        fe_spectral_inversion_t  sense; /*  current search spectrum */
 
72
        u8  force; /* force mode/guard */
 
73
        u8  bw; /* channel width 6, 7 or 8 in MHz */
 
74
        u8  pBW; /* channel width used during previous lock */
 
75
        u32 pBER;
 
76
        u32 pPER;
 
77
        u32 ucblocks;
 
78
        s8  echo_pos; /* echo position */
 
79
        u8  first_lock;
 
80
        u8  unlock_counter;
 
81
        u32 agc_val;
 
82
};
 
83
 
 
84
struct stv0367_state {
 
85
        struct dvb_frontend fe;
 
86
        struct i2c_adapter *i2c;
 
87
        /* config settings */
 
88
        const struct stv0367_config *config;
 
89
        u8 chip_id;
 
90
        /* DVB-C */
 
91
        struct stv0367cab_state *cab_state;
 
92
        /* DVB-T */
 
93
        struct stv0367ter_state *ter_state;
 
94
};
 
95
 
 
96
struct st_register {
 
97
        u16     addr;
 
98
        u8      value;
 
99
};
 
100
 
 
101
/* values for STV4100 XTAL=30M int clk=53.125M*/
 
102
static struct st_register def0367ter[STV0367TER_NBREGS] = {
 
103
        {R367TER_ID,            0x60},
 
104
        {R367TER_I2CRPT,        0xa0},
 
105
        /* {R367TER_I2CRPT,     0x22},*/
 
106
        {R367TER_TOPCTRL,       0x00},/* for xc5000; was 0x02 */
 
107
        {R367TER_IOCFG0,        0x40},
 
108
        {R367TER_DAC0R,         0x00},
 
109
        {R367TER_IOCFG1,        0x00},
 
110
        {R367TER_DAC1R,         0x00},
 
111
        {R367TER_IOCFG2,        0x62},
 
112
        {R367TER_SDFR,          0x00},
 
113
        {R367TER_STATUS,        0xf8},
 
114
        {R367TER_AUX_CLK,       0x0a},
 
115
        {R367TER_FREESYS1,      0x00},
 
116
        {R367TER_FREESYS2,      0x00},
 
117
        {R367TER_FREESYS3,      0x00},
 
118
        {R367TER_GPIO_CFG,      0x55},
 
119
        {R367TER_GPIO_CMD,      0x00},
 
120
        {R367TER_AGC2MAX,       0xff},
 
121
        {R367TER_AGC2MIN,       0x00},
 
122
        {R367TER_AGC1MAX,       0xff},
 
123
        {R367TER_AGC1MIN,       0x00},
 
124
        {R367TER_AGCR,          0xbc},
 
125
        {R367TER_AGC2TH,        0x00},
 
126
        {R367TER_AGC12C,        0x00},
 
127
        {R367TER_AGCCTRL1,      0x85},
 
128
        {R367TER_AGCCTRL2,      0x1f},
 
129
        {R367TER_AGC1VAL1,      0x00},
 
130
        {R367TER_AGC1VAL2,      0x00},
 
131
        {R367TER_AGC2VAL1,      0x6f},
 
132
        {R367TER_AGC2VAL2,      0x05},
 
133
        {R367TER_AGC2PGA,       0x00},
 
134
        {R367TER_OVF_RATE1,     0x00},
 
135
        {R367TER_OVF_RATE2,     0x00},
 
136
        {R367TER_GAIN_SRC1,     0xaa},/* for xc5000; was 0x2b */
 
137
        {R367TER_GAIN_SRC2,     0xd6},/* for xc5000; was 0x04 */
 
138
        {R367TER_INC_DEROT1,    0x55},
 
139
        {R367TER_INC_DEROT2,    0x55},
 
140
        {R367TER_PPM_CPAMP_DIR, 0x2c},
 
141
        {R367TER_PPM_CPAMP_INV, 0x00},
 
142
        {R367TER_FREESTFE_1,    0x00},
 
143
        {R367TER_FREESTFE_2,    0x1c},
 
144
        {R367TER_DCOFFSET,      0x00},
 
145
        {R367TER_EN_PROCESS,    0x05},
 
146
        {R367TER_SDI_SMOOTHER,  0x80},
 
147
        {R367TER_FE_LOOP_OPEN,  0x1c},
 
148
        {R367TER_FREQOFF1,      0x00},
 
149
        {R367TER_FREQOFF2,      0x00},
 
150
        {R367TER_FREQOFF3,      0x00},
 
151
        {R367TER_TIMOFF1,       0x00},
 
152
        {R367TER_TIMOFF2,       0x00},
 
153
        {R367TER_EPQ,           0x02},
 
154
        {R367TER_EPQAUTO,       0x01},
 
155
        {R367TER_SYR_UPDATE,    0xf5},
 
156
        {R367TER_CHPFREE,       0x00},
 
157
        {R367TER_PPM_STATE_MAC, 0x23},
 
158
        {R367TER_INR_THRESHOLD, 0xff},
 
159
        {R367TER_EPQ_TPS_ID_CELL, 0xf9},
 
160
        {R367TER_EPQ_CFG,       0x00},
 
161
        {R367TER_EPQ_STATUS,    0x01},
 
162
        {R367TER_AUTORELOCK,    0x81},
 
163
        {R367TER_BER_THR_VMSB,  0x00},
 
164
        {R367TER_BER_THR_MSB,   0x00},
 
165
        {R367TER_BER_THR_LSB,   0x00},
 
166
        {R367TER_CCD,           0x83},
 
167
        {R367TER_SPECTR_CFG,    0x00},
 
168
        {R367TER_CHC_DUMMY,     0x18},
 
169
        {R367TER_INC_CTL,       0x88},
 
170
        {R367TER_INCTHRES_COR1, 0xb4},
 
171
        {R367TER_INCTHRES_COR2, 0x96},
 
172
        {R367TER_INCTHRES_DET1, 0x0e},
 
173
        {R367TER_INCTHRES_DET2, 0x11},
 
174
        {R367TER_IIR_CELLNB,    0x8d},
 
175
        {R367TER_IIRCX_COEFF1_MSB, 0x00},
 
176
        {R367TER_IIRCX_COEFF1_LSB, 0x00},
 
177
        {R367TER_IIRCX_COEFF2_MSB, 0x09},
 
178
        {R367TER_IIRCX_COEFF2_LSB, 0x18},
 
179
        {R367TER_IIRCX_COEFF3_MSB, 0x14},
 
180
        {R367TER_IIRCX_COEFF3_LSB, 0x9c},
 
181
        {R367TER_IIRCX_COEFF4_MSB, 0x00},
 
182
        {R367TER_IIRCX_COEFF4_LSB, 0x00},
 
183
        {R367TER_IIRCX_COEFF5_MSB, 0x36},
 
184
        {R367TER_IIRCX_COEFF5_LSB, 0x42},
 
185
        {R367TER_FEPATH_CFG,    0x00},
 
186
        {R367TER_PMC1_FUNC,     0x65},
 
187
        {R367TER_PMC1_FOR,      0x00},
 
188
        {R367TER_PMC2_FUNC,     0x00},
 
189
        {R367TER_STATUS_ERR_DA, 0xe0},
 
190
        {R367TER_DIG_AGC_R,     0xfe},
 
191
        {R367TER_COMAGC_TARMSB, 0x0b},
 
192
        {R367TER_COM_AGC_TAR_ENMODE, 0x41},
 
193
        {R367TER_COM_AGC_CFG,   0x3e},
 
194
        {R367TER_COM_AGC_GAIN1, 0x39},
 
195
        {R367TER_AUT_AGC_TARGETMSB, 0x0b},
 
196
        {R367TER_LOCK_DET_MSB,  0x01},
 
197
        {R367TER_AGCTAR_LOCK_LSBS, 0x40},
 
198
        {R367TER_AUT_GAIN_EN,   0xf4},
 
199
        {R367TER_AUT_CFG,       0xf0},
 
200
        {R367TER_LOCKN,         0x23},
 
201
        {R367TER_INT_X_3,       0x00},
 
202
        {R367TER_INT_X_2,       0x03},
 
203
        {R367TER_INT_X_1,       0x8d},
 
204
        {R367TER_INT_X_0,       0xa0},
 
205
        {R367TER_MIN_ERRX_MSB,  0x00},
 
206
        {R367TER_COR_CTL,       0x23},
 
207
        {R367TER_COR_STAT,      0xf6},
 
208
        {R367TER_COR_INTEN,     0x00},
 
209
        {R367TER_COR_INTSTAT,   0x3f},
 
210
        {R367TER_COR_MODEGUARD, 0x03},
 
211
        {R367TER_AGC_CTL,       0x08},
 
212
        {R367TER_AGC_MANUAL1,   0x00},
 
213
        {R367TER_AGC_MANUAL2,   0x00},
 
214
        {R367TER_AGC_TARG,      0x16},
 
215
        {R367TER_AGC_GAIN1,     0x53},
 
216
        {R367TER_AGC_GAIN2,     0x1d},
 
217
        {R367TER_RESERVED_1,    0x00},
 
218
        {R367TER_RESERVED_2,    0x00},
 
219
        {R367TER_RESERVED_3,    0x00},
 
220
        {R367TER_CAS_CTL,       0x44},
 
221
        {R367TER_CAS_FREQ,      0xb3},
 
222
        {R367TER_CAS_DAGCGAIN,  0x12},
 
223
        {R367TER_SYR_CTL,       0x04},
 
224
        {R367TER_SYR_STAT,      0x10},
 
225
        {R367TER_SYR_NCO1,      0x00},
 
226
        {R367TER_SYR_NCO2,      0x00},
 
227
        {R367TER_SYR_OFFSET1,   0x00},
 
228
        {R367TER_SYR_OFFSET2,   0x00},
 
229
        {R367TER_FFT_CTL,       0x00},
 
230
        {R367TER_SCR_CTL,       0x70},
 
231
        {R367TER_PPM_CTL1,      0xf8},
 
232
        {R367TER_TRL_CTL,       0x14},/* for xc5000; was 0xac */
 
233
        {R367TER_TRL_NOMRATE1,  0xae},/* for xc5000; was 0x1e */
 
234
        {R367TER_TRL_NOMRATE2,  0x56},/* for xc5000; was 0x58 */
 
235
        {R367TER_TRL_TIME1,     0x1d},
 
236
        {R367TER_TRL_TIME2,     0xfc},
 
237
        {R367TER_CRL_CTL,       0x24},
 
238
        {R367TER_CRL_FREQ1,     0xad},
 
239
        {R367TER_CRL_FREQ2,     0x9d},
 
240
        {R367TER_CRL_FREQ3,     0xff},
 
241
        {R367TER_CHC_CTL,       0x01},
 
242
        {R367TER_CHC_SNR,       0xf0},
 
243
        {R367TER_BDI_CTL,       0x00},
 
244
        {R367TER_DMP_CTL,       0x00},
 
245
        {R367TER_TPS_RCVD1,     0x30},
 
246
        {R367TER_TPS_RCVD2,     0x02},
 
247
        {R367TER_TPS_RCVD3,     0x01},
 
248
        {R367TER_TPS_RCVD4,     0x00},
 
249
        {R367TER_TPS_ID_CELL1,  0x00},
 
250
        {R367TER_TPS_ID_CELL2,  0x00},
 
251
        {R367TER_TPS_RCVD5_SET1, 0x02},
 
252
        {R367TER_TPS_SET2,      0x02},
 
253
        {R367TER_TPS_SET3,      0x01},
 
254
        {R367TER_TPS_CTL,       0x00},
 
255
        {R367TER_CTL_FFTOSNUM,  0x34},
 
256
        {R367TER_TESTSELECT,    0x09},
 
257
        {R367TER_MSC_REV,       0x0a},
 
258
        {R367TER_PIR_CTL,       0x00},
 
259
        {R367TER_SNR_CARRIER1,  0xa1},
 
260
        {R367TER_SNR_CARRIER2,  0x9a},
 
261
        {R367TER_PPM_CPAMP,     0x2c},
 
262
        {R367TER_TSM_AP0,       0x00},
 
263
        {R367TER_TSM_AP1,       0x00},
 
264
        {R367TER_TSM_AP2 ,      0x00},
 
265
        {R367TER_TSM_AP3,       0x00},
 
266
        {R367TER_TSM_AP4,       0x00},
 
267
        {R367TER_TSM_AP5,       0x00},
 
268
        {R367TER_TSM_AP6,       0x00},
 
269
        {R367TER_TSM_AP7,       0x00},
 
270
        {R367TER_TSTRES,        0x00},
 
271
        {R367TER_ANACTRL,       0x0D},/* PLL stoped, restart at init!!! */
 
272
        {R367TER_TSTBUS,        0x00},
 
273
        {R367TER_TSTRATE,       0x00},
 
274
        {R367TER_CONSTMODE,     0x01},
 
275
        {R367TER_CONSTCARR1,    0x00},
 
276
        {R367TER_CONSTCARR2,    0x00},
 
277
        {R367TER_ICONSTEL,      0x0a},
 
278
        {R367TER_QCONSTEL,      0x15},
 
279
        {R367TER_TSTBISTRES0,   0x00},
 
280
        {R367TER_TSTBISTRES1,   0x00},
 
281
        {R367TER_TSTBISTRES2,   0x28},
 
282
        {R367TER_TSTBISTRES3,   0x00},
 
283
        {R367TER_RF_AGC1,       0xff},
 
284
        {R367TER_RF_AGC2,       0x83},
 
285
        {R367TER_ANADIGCTRL,    0x19},
 
286
        {R367TER_PLLMDIV,       0x01},/* for xc5000; was 0x0c */
 
287
        {R367TER_PLLNDIV,       0x06},/* for xc5000; was 0x55 */
 
288
        {R367TER_PLLSETUP,      0x18},
 
289
        {R367TER_DUAL_AD12,     0x0C},/* for xc5000 AGC voltage 1.6V */
 
290
        {R367TER_TSTBIST,       0x00},
 
291
        {R367TER_PAD_COMP_CTRL, 0x00},
 
292
        {R367TER_PAD_COMP_WR,   0x00},
 
293
        {R367TER_PAD_COMP_RD,   0xe0},
 
294
        {R367TER_SYR_TARGET_FFTADJT_MSB, 0x00},
 
295
        {R367TER_SYR_TARGET_FFTADJT_LSB, 0x00},
 
296
        {R367TER_SYR_TARGET_CHCADJT_MSB, 0x00},
 
297
        {R367TER_SYR_TARGET_CHCADJT_LSB, 0x00},
 
298
        {R367TER_SYR_FLAG,      0x00},
 
299
        {R367TER_CRL_TARGET1,   0x00},
 
300
        {R367TER_CRL_TARGET2,   0x00},
 
301
        {R367TER_CRL_TARGET3,   0x00},
 
302
        {R367TER_CRL_TARGET4,   0x00},
 
303
        {R367TER_CRL_FLAG,      0x00},
 
304
        {R367TER_TRL_TARGET1,   0x00},
 
305
        {R367TER_TRL_TARGET2,   0x00},
 
306
        {R367TER_TRL_CHC,       0x00},
 
307
        {R367TER_CHC_SNR_TARG,  0x00},
 
308
        {R367TER_TOP_TRACK,     0x00},
 
309
        {R367TER_TRACKER_FREE1, 0x00},
 
310
        {R367TER_ERROR_CRL1,    0x00},
 
311
        {R367TER_ERROR_CRL2,    0x00},
 
312
        {R367TER_ERROR_CRL3,    0x00},
 
313
        {R367TER_ERROR_CRL4,    0x00},
 
314
        {R367TER_DEC_NCO1,      0x2c},
 
315
        {R367TER_DEC_NCO2,      0x0f},
 
316
        {R367TER_DEC_NCO3,      0x20},
 
317
        {R367TER_SNR,           0xf1},
 
318
        {R367TER_SYR_FFTADJ1,   0x00},
 
319
        {R367TER_SYR_FFTADJ2,   0x00},
 
320
        {R367TER_SYR_CHCADJ1,   0x00},
 
321
        {R367TER_SYR_CHCADJ2,   0x00},
 
322
        {R367TER_SYR_OFF,       0x00},
 
323
        {R367TER_PPM_OFFSET1,   0x00},
 
324
        {R367TER_PPM_OFFSET2,   0x03},
 
325
        {R367TER_TRACKER_FREE2, 0x00},
 
326
        {R367TER_DEBG_LT10,     0x00},
 
327
        {R367TER_DEBG_LT11,     0x00},
 
328
        {R367TER_DEBG_LT12,     0x00},
 
329
        {R367TER_DEBG_LT13,     0x00},
 
330
        {R367TER_DEBG_LT14,     0x00},
 
331
        {R367TER_DEBG_LT15,     0x00},
 
332
        {R367TER_DEBG_LT16,     0x00},
 
333
        {R367TER_DEBG_LT17,     0x00},
 
334
        {R367TER_DEBG_LT18,     0x00},
 
335
        {R367TER_DEBG_LT19,     0x00},
 
336
        {R367TER_DEBG_LT1A,     0x00},
 
337
        {R367TER_DEBG_LT1B,     0x00},
 
338
        {R367TER_DEBG_LT1C,     0x00},
 
339
        {R367TER_DEBG_LT1D,     0x00},
 
340
        {R367TER_DEBG_LT1E,     0x00},
 
341
        {R367TER_DEBG_LT1F,     0x00},
 
342
        {R367TER_RCCFGH,        0x00},
 
343
        {R367TER_RCCFGM,        0x00},
 
344
        {R367TER_RCCFGL,        0x00},
 
345
        {R367TER_RCINSDELH,     0x00},
 
346
        {R367TER_RCINSDELM,     0x00},
 
347
        {R367TER_RCINSDELL,     0x00},
 
348
        {R367TER_RCSTATUS,      0x00},
 
349
        {R367TER_RCSPEED,       0x6f},
 
350
        {R367TER_RCDEBUGM,      0xe7},
 
351
        {R367TER_RCDEBUGL,      0x9b},
 
352
        {R367TER_RCOBSCFG,      0x00},
 
353
        {R367TER_RCOBSM,        0x00},
 
354
        {R367TER_RCOBSL,        0x00},
 
355
        {R367TER_RCFECSPY,      0x00},
 
356
        {R367TER_RCFSPYCFG,     0x00},
 
357
        {R367TER_RCFSPYDATA,    0x00},
 
358
        {R367TER_RCFSPYOUT,     0x00},
 
359
        {R367TER_RCFSTATUS,     0x00},
 
360
        {R367TER_RCFGOODPACK,   0x00},
 
361
        {R367TER_RCFPACKCNT,    0x00},
 
362
        {R367TER_RCFSPYMISC,    0x00},
 
363
        {R367TER_RCFBERCPT4,    0x00},
 
364
        {R367TER_RCFBERCPT3,    0x00},
 
365
        {R367TER_RCFBERCPT2,    0x00},
 
366
        {R367TER_RCFBERCPT1,    0x00},
 
367
        {R367TER_RCFBERCPT0,    0x00},
 
368
        {R367TER_RCFBERERR2,    0x00},
 
369
        {R367TER_RCFBERERR1,    0x00},
 
370
        {R367TER_RCFBERERR0,    0x00},
 
371
        {R367TER_RCFSTATESM,    0x00},
 
372
        {R367TER_RCFSTATESL,    0x00},
 
373
        {R367TER_RCFSPYBER,     0x00},
 
374
        {R367TER_RCFSPYDISTM,   0x00},
 
375
        {R367TER_RCFSPYDISTL,   0x00},
 
376
        {R367TER_RCFSPYOBS7,    0x00},
 
377
        {R367TER_RCFSPYOBS6,    0x00},
 
378
        {R367TER_RCFSPYOBS5,    0x00},
 
379
        {R367TER_RCFSPYOBS4,    0x00},
 
380
        {R367TER_RCFSPYOBS3,    0x00},
 
381
        {R367TER_RCFSPYOBS2,    0x00},
 
382
        {R367TER_RCFSPYOBS1,    0x00},
 
383
        {R367TER_RCFSPYOBS0,    0x00},
 
384
        {R367TER_TSGENERAL,     0x00},
 
385
        {R367TER_RC1SPEED,      0x6f},
 
386
        {R367TER_TSGSTATUS,     0x18},
 
387
        {R367TER_FECM,          0x01},
 
388
        {R367TER_VTH12,         0xff},
 
389
        {R367TER_VTH23,         0xa1},
 
390
        {R367TER_VTH34,         0x64},
 
391
        {R367TER_VTH56,         0x40},
 
392
        {R367TER_VTH67,         0x00},
 
393
        {R367TER_VTH78,         0x2c},
 
394
        {R367TER_VITCURPUN,     0x12},
 
395
        {R367TER_VERROR,        0x01},
 
396
        {R367TER_PRVIT,         0x3f},
 
397
        {R367TER_VAVSRVIT,      0x00},
 
398
        {R367TER_VSTATUSVIT,    0xbd},
 
399
        {R367TER_VTHINUSE,      0xa1},
 
400
        {R367TER_KDIV12,        0x20},
 
401
        {R367TER_KDIV23,        0x40},
 
402
        {R367TER_KDIV34,        0x20},
 
403
        {R367TER_KDIV56,        0x30},
 
404
        {R367TER_KDIV67,        0x00},
 
405
        {R367TER_KDIV78,        0x30},
 
406
        {R367TER_SIGPOWER,      0x54},
 
407
        {R367TER_DEMAPVIT,      0x40},
 
408
        {R367TER_VITSCALE,      0x00},
 
409
        {R367TER_FFEC1PRG,      0x00},
 
410
        {R367TER_FVITCURPUN,    0x12},
 
411
        {R367TER_FVERROR,       0x01},
 
412
        {R367TER_FVSTATUSVIT,   0xbd},
 
413
        {R367TER_DEBUG_LT1,     0x00},
 
414
        {R367TER_DEBUG_LT2,     0x00},
 
415
        {R367TER_DEBUG_LT3,     0x00},
 
416
        {R367TER_TSTSFMET,      0x00},
 
417
        {R367TER_SELOUT,        0x00},
 
418
        {R367TER_TSYNC,         0x00},
 
419
        {R367TER_TSTERR,        0x00},
 
420
        {R367TER_TSFSYNC,       0x00},
 
421
        {R367TER_TSTSFERR,      0x00},
 
422
        {R367TER_TSTTSSF1,      0x01},
 
423
        {R367TER_TSTTSSF2,      0x1f},
 
424
        {R367TER_TSTTSSF3,      0x00},
 
425
        {R367TER_TSTTS1,        0x00},
 
426
        {R367TER_TSTTS2,        0x1f},
 
427
        {R367TER_TSTTS3,        0x01},
 
428
        {R367TER_TSTTS4,        0x00},
 
429
        {R367TER_TSTTSRC,       0x00},
 
430
        {R367TER_TSTTSRS,       0x00},
 
431
        {R367TER_TSSTATEM,      0xb0},
 
432
        {R367TER_TSSTATEL,      0x40},
 
433
        {R367TER_TSCFGH,        0xC0},
 
434
        {R367TER_TSCFGM,        0xc0},/* for xc5000; was 0x00 */
 
435
        {R367TER_TSCFGL,        0x20},
 
436
        {R367TER_TSSYNC,        0x00},
 
437
        {R367TER_TSINSDELH,     0x00},
 
438
        {R367TER_TSINSDELM,     0x00},
 
439
        {R367TER_TSINSDELL,     0x00},
 
440
        {R367TER_TSDIVN,        0x03},
 
441
        {R367TER_TSDIVPM,       0x00},
 
442
        {R367TER_TSDIVPL,       0x00},
 
443
        {R367TER_TSDIVQM,       0x00},
 
444
        {R367TER_TSDIVQL,       0x00},
 
445
        {R367TER_TSDILSTKM,     0x00},
 
446
        {R367TER_TSDILSTKL,     0x00},
 
447
        {R367TER_TSSPEED,       0x40},/* for xc5000; was 0x6f */
 
448
        {R367TER_TSSTATUS,      0x81},
 
449
        {R367TER_TSSTATUS2,     0x6a},
 
450
        {R367TER_TSBITRATEM,    0x0f},
 
451
        {R367TER_TSBITRATEL,    0xc6},
 
452
        {R367TER_TSPACKLENM,    0x00},
 
453
        {R367TER_TSPACKLENL,    0xfc},
 
454
        {R367TER_TSBLOCLENM,    0x0a},
 
455
        {R367TER_TSBLOCLENL,    0x80},
 
456
        {R367TER_TSDLYH,        0x90},
 
457
        {R367TER_TSDLYM,        0x68},
 
458
        {R367TER_TSDLYL,        0x01},
 
459
        {R367TER_TSNPDAV,       0x00},
 
460
        {R367TER_TSBUFSTATH,    0x00},
 
461
        {R367TER_TSBUFSTATM,    0x00},
 
462
        {R367TER_TSBUFSTATL,    0x00},
 
463
        {R367TER_TSDEBUGM,      0xcf},
 
464
        {R367TER_TSDEBUGL,      0x1e},
 
465
        {R367TER_TSDLYSETH,     0x00},
 
466
        {R367TER_TSDLYSETM,     0x68},
 
467
        {R367TER_TSDLYSETL,     0x00},
 
468
        {R367TER_TSOBSCFG,      0x00},
 
469
        {R367TER_TSOBSM,        0x47},
 
470
        {R367TER_TSOBSL,        0x1f},
 
471
        {R367TER_ERRCTRL1,      0x95},
 
472
        {R367TER_ERRCNT1H,      0x80},
 
473
        {R367TER_ERRCNT1M,      0x00},
 
474
        {R367TER_ERRCNT1L,      0x00},
 
475
        {R367TER_ERRCTRL2,      0x95},
 
476
        {R367TER_ERRCNT2H,      0x00},
 
477
        {R367TER_ERRCNT2M,      0x00},
 
478
        {R367TER_ERRCNT2L,      0x00},
 
479
        {R367TER_FECSPY,        0x88},
 
480
        {R367TER_FSPYCFG,       0x2c},
 
481
        {R367TER_FSPYDATA,      0x3a},
 
482
        {R367TER_FSPYOUT,       0x06},
 
483
        {R367TER_FSTATUS,       0x61},
 
484
        {R367TER_FGOODPACK,     0xff},
 
485
        {R367TER_FPACKCNT,      0xff},
 
486
        {R367TER_FSPYMISC,      0x66},
 
487
        {R367TER_FBERCPT4,      0x00},
 
488
        {R367TER_FBERCPT3,      0x00},
 
489
        {R367TER_FBERCPT2,      0x36},
 
490
        {R367TER_FBERCPT1,      0x36},
 
491
        {R367TER_FBERCPT0,      0x14},
 
492
        {R367TER_FBERERR2,      0x00},
 
493
        {R367TER_FBERERR1,      0x03},
 
494
        {R367TER_FBERERR0,      0x28},
 
495
        {R367TER_FSTATESM,      0x00},
 
496
        {R367TER_FSTATESL,      0x02},
 
497
        {R367TER_FSPYBER,       0x00},
 
498
        {R367TER_FSPYDISTM,     0x01},
 
499
        {R367TER_FSPYDISTL,     0x9f},
 
500
        {R367TER_FSPYOBS7,      0xc9},
 
501
        {R367TER_FSPYOBS6,      0x99},
 
502
        {R367TER_FSPYOBS5,      0x08},
 
503
        {R367TER_FSPYOBS4,      0xec},
 
504
        {R367TER_FSPYOBS3,      0x01},
 
505
        {R367TER_FSPYOBS2,      0x0f},
 
506
        {R367TER_FSPYOBS1,      0xf5},
 
507
        {R367TER_FSPYOBS0,      0x08},
 
508
        {R367TER_SFDEMAP,       0x40},
 
509
        {R367TER_SFERROR,       0x00},
 
510
        {R367TER_SFAVSR,        0x30},
 
511
        {R367TER_SFECSTATUS,    0xcc},
 
512
        {R367TER_SFKDIV12,      0x20},
 
513
        {R367TER_SFKDIV23,      0x40},
 
514
        {R367TER_SFKDIV34,      0x20},
 
515
        {R367TER_SFKDIV56,      0x20},
 
516
        {R367TER_SFKDIV67,      0x00},
 
517
        {R367TER_SFKDIV78,      0x20},
 
518
        {R367TER_SFDILSTKM,     0x00},
 
519
        {R367TER_SFDILSTKL,     0x00},
 
520
        {R367TER_SFSTATUS,      0xb5},
 
521
        {R367TER_SFDLYH,        0x90},
 
522
        {R367TER_SFDLYM,        0x60},
 
523
        {R367TER_SFDLYL,        0x01},
 
524
        {R367TER_SFDLYSETH,     0xc0},
 
525
        {R367TER_SFDLYSETM,     0x60},
 
526
        {R367TER_SFDLYSETL,     0x00},
 
527
        {R367TER_SFOBSCFG,      0x00},
 
528
        {R367TER_SFOBSM,        0x47},
 
529
        {R367TER_SFOBSL,        0x05},
 
530
        {R367TER_SFECINFO,      0x40},
 
531
        {R367TER_SFERRCTRL,     0x74},
 
532
        {R367TER_SFERRCNTH,     0x80},
 
533
        {R367TER_SFERRCNTM ,    0x00},
 
534
        {R367TER_SFERRCNTL,     0x00},
 
535
        {R367TER_SYMBRATEM,     0x2f},
 
536
        {R367TER_SYMBRATEL,     0x50},
 
537
        {R367TER_SYMBSTATUS,    0x7f},
 
538
        {R367TER_SYMBCFG,       0x00},
 
539
        {R367TER_SYMBFIFOM,     0xf4},
 
540
        {R367TER_SYMBFIFOL,     0x0d},
 
541
        {R367TER_SYMBOFFSM,     0xf0},
 
542
        {R367TER_SYMBOFFSL,     0x2d},
 
543
        {R367TER_DEBUG_LT4,     0x00},
 
544
        {R367TER_DEBUG_LT5,     0x00},
 
545
        {R367TER_DEBUG_LT6,     0x00},
 
546
        {R367TER_DEBUG_LT7,     0x00},
 
547
        {R367TER_DEBUG_LT8,     0x00},
 
548
        {R367TER_DEBUG_LT9,     0x00},
 
549
};
 
550
 
 
551
#define RF_LOOKUP_TABLE_SIZE  31
 
552
#define RF_LOOKUP_TABLE2_SIZE 16
 
553
/* RF Level (for RF AGC->AGC1) Lookup Table, depends on the board and tuner.*/
 
554
s32 stv0367cab_RF_LookUp1[RF_LOOKUP_TABLE_SIZE][RF_LOOKUP_TABLE_SIZE] = {
 
555
        {/*AGC1*/
 
556
                48, 50, 51, 53, 54, 56, 57, 58, 60, 61, 62, 63,
 
557
                64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75,
 
558
                76, 77, 78, 80, 83, 85, 88,
 
559
        }, {/*RF(dbm)*/
 
560
                22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
 
561
                34, 35, 36, 37, 38, 39, 41, 42, 43, 44, 46, 47,
 
562
                49, 50, 52, 53, 54, 55, 56,
 
563
        }
 
564
};
 
565
/* RF Level (for IF AGC->AGC2) Lookup Table, depends on the board and tuner.*/
 
566
s32 stv0367cab_RF_LookUp2[RF_LOOKUP_TABLE2_SIZE][RF_LOOKUP_TABLE2_SIZE] = {
 
567
        {/*AGC2*/
 
568
                28, 29, 31, 32, 34, 35, 36, 37,
 
569
                38, 39, 40, 41, 42, 43, 44, 45,
 
570
        }, {/*RF(dbm)*/
 
571
                57, 58, 59, 60, 61, 62, 63, 64,
 
572
                65, 66, 67, 68, 69, 70, 71, 72,
 
573
        }
 
574
};
 
575
 
 
576
static struct st_register def0367cab[STV0367CAB_NBREGS] = {
 
577
        {R367CAB_ID,            0x60},
 
578
        {R367CAB_I2CRPT,        0xa0},
 
579
        /*{R367CAB_I2CRPT,      0x22},*/
 
580
        {R367CAB_TOPCTRL,       0x10},
 
581
        {R367CAB_IOCFG0,        0x80},
 
582
        {R367CAB_DAC0R,         0x00},
 
583
        {R367CAB_IOCFG1,        0x00},
 
584
        {R367CAB_DAC1R,         0x00},
 
585
        {R367CAB_IOCFG2,        0x00},
 
586
        {R367CAB_SDFR,          0x00},
 
587
        {R367CAB_AUX_CLK,       0x00},
 
588
        {R367CAB_FREESYS1,      0x00},
 
589
        {R367CAB_FREESYS2,      0x00},
 
590
        {R367CAB_FREESYS3,      0x00},
 
591
        {R367CAB_GPIO_CFG,      0x55},
 
592
        {R367CAB_GPIO_CMD,      0x01},
 
593
        {R367CAB_TSTRES,        0x00},
 
594
        {R367CAB_ANACTRL,       0x0d},/* was 0x00 need to check - I.M.L.*/
 
595
        {R367CAB_TSTBUS,        0x00},
 
596
        {R367CAB_RF_AGC1,       0xea},
 
597
        {R367CAB_RF_AGC2,       0x82},
 
598
        {R367CAB_ANADIGCTRL,    0x0b},
 
599
        {R367CAB_PLLMDIV,       0x01},
 
600
        {R367CAB_PLLNDIV,       0x08},
 
601
        {R367CAB_PLLSETUP,      0x18},
 
602
        {R367CAB_DUAL_AD12,     0x0C}, /* for xc5000 AGC voltage 1.6V */
 
603
        {R367CAB_TSTBIST,       0x00},
 
604
        {R367CAB_CTRL_1,        0x00},
 
605
        {R367CAB_CTRL_2,        0x03},
 
606
        {R367CAB_IT_STATUS1,    0x2b},
 
607
        {R367CAB_IT_STATUS2,    0x08},
 
608
        {R367CAB_IT_EN1,        0x00},
 
609
        {R367CAB_IT_EN2,        0x00},
 
610
        {R367CAB_CTRL_STATUS,   0x04},
 
611
        {R367CAB_TEST_CTL,      0x00},
 
612
        {R367CAB_AGC_CTL,       0x73},
 
613
        {R367CAB_AGC_IF_CFG,    0x50},
 
614
        {R367CAB_AGC_RF_CFG,    0x00},
 
615
        {R367CAB_AGC_PWM_CFG,   0x03},
 
616
        {R367CAB_AGC_PWR_REF_L, 0x5a},
 
617
        {R367CAB_AGC_PWR_REF_H, 0x00},
 
618
        {R367CAB_AGC_RF_TH_L,   0xff},
 
619
        {R367CAB_AGC_RF_TH_H,   0x07},
 
620
        {R367CAB_AGC_IF_LTH_L,  0x00},
 
621
        {R367CAB_AGC_IF_LTH_H,  0x08},
 
622
        {R367CAB_AGC_IF_HTH_L,  0xff},
 
623
        {R367CAB_AGC_IF_HTH_H,  0x07},
 
624
        {R367CAB_AGC_PWR_RD_L,  0xa0},
 
625
        {R367CAB_AGC_PWR_RD_M,  0xe9},
 
626
        {R367CAB_AGC_PWR_RD_H,  0x03},
 
627
        {R367CAB_AGC_PWM_IFCMD_L,       0xe4},
 
628
        {R367CAB_AGC_PWM_IFCMD_H,       0x00},
 
629
        {R367CAB_AGC_PWM_RFCMD_L,       0xff},
 
630
        {R367CAB_AGC_PWM_RFCMD_H,       0x07},
 
631
        {R367CAB_IQDEM_CFG,     0x01},
 
632
        {R367CAB_MIX_NCO_LL,    0x22},
 
633
        {R367CAB_MIX_NCO_HL,    0x96},
 
634
        {R367CAB_MIX_NCO_HH,    0x55},
 
635
        {R367CAB_SRC_NCO_LL,    0xff},
 
636
        {R367CAB_SRC_NCO_LH,    0x0c},
 
637
        {R367CAB_SRC_NCO_HL,    0xf5},
 
638
        {R367CAB_SRC_NCO_HH,    0x20},
 
639
        {R367CAB_IQDEM_GAIN_SRC_L,      0x06},
 
640
        {R367CAB_IQDEM_GAIN_SRC_H,      0x01},
 
641
        {R367CAB_IQDEM_DCRM_CFG_LL,     0xfe},
 
642
        {R367CAB_IQDEM_DCRM_CFG_LH,     0xff},
 
643
        {R367CAB_IQDEM_DCRM_CFG_HL,     0x0f},
 
644
        {R367CAB_IQDEM_DCRM_CFG_HH,     0x00},
 
645
        {R367CAB_IQDEM_ADJ_COEFF0,      0x34},
 
646
        {R367CAB_IQDEM_ADJ_COEFF1,      0xae},
 
647
        {R367CAB_IQDEM_ADJ_COEFF2,      0x46},
 
648
        {R367CAB_IQDEM_ADJ_COEFF3,      0x77},
 
649
        {R367CAB_IQDEM_ADJ_COEFF4,      0x96},
 
650
        {R367CAB_IQDEM_ADJ_COEFF5,      0x69},
 
651
        {R367CAB_IQDEM_ADJ_COEFF6,      0xc7},
 
652
        {R367CAB_IQDEM_ADJ_COEFF7,      0x01},
 
653
        {R367CAB_IQDEM_ADJ_EN,  0x04},
 
654
        {R367CAB_IQDEM_ADJ_AGC_REF,     0x94},
 
655
        {R367CAB_ALLPASSFILT1,  0xc9},
 
656
        {R367CAB_ALLPASSFILT2,  0x2d},
 
657
        {R367CAB_ALLPASSFILT3,  0xa3},
 
658
        {R367CAB_ALLPASSFILT4,  0xfb},
 
659
        {R367CAB_ALLPASSFILT5,  0xf6},
 
660
        {R367CAB_ALLPASSFILT6,  0x45},
 
661
        {R367CAB_ALLPASSFILT7,  0x6f},
 
662
        {R367CAB_ALLPASSFILT8,  0x7e},
 
663
        {R367CAB_ALLPASSFILT9,  0x05},
 
664
        {R367CAB_ALLPASSFILT10, 0x0a},
 
665
        {R367CAB_ALLPASSFILT11, 0x51},
 
666
        {R367CAB_TRL_AGC_CFG,   0x20},
 
667
        {R367CAB_TRL_LPF_CFG,   0x28},
 
668
        {R367CAB_TRL_LPF_ACQ_GAIN,      0x44},
 
669
        {R367CAB_TRL_LPF_TRK_GAIN,      0x22},
 
670
        {R367CAB_TRL_LPF_OUT_GAIN,      0x03},
 
671
        {R367CAB_TRL_LOCKDET_LTH,       0x04},
 
672
        {R367CAB_TRL_LOCKDET_HTH,       0x11},
 
673
        {R367CAB_TRL_LOCKDET_TRGVAL,    0x20},
 
674
        {R367CAB_IQ_QAM,        0x01},
 
675
        {R367CAB_FSM_STATE,     0xa0},
 
676
        {R367CAB_FSM_CTL,       0x08},
 
677
        {R367CAB_FSM_STS,       0x0c},
 
678
        {R367CAB_FSM_SNR0_HTH,  0x00},
 
679
        {R367CAB_FSM_SNR1_HTH,  0x00},
 
680
        {R367CAB_FSM_SNR2_HTH,  0x23},/* 0x00 */
 
681
        {R367CAB_FSM_SNR0_LTH,  0x00},
 
682
        {R367CAB_FSM_SNR1_LTH,  0x00},
 
683
        {R367CAB_FSM_EQA1_HTH,  0x00},
 
684
        {R367CAB_FSM_TEMPO,     0x32},
 
685
        {R367CAB_FSM_CONFIG,    0x03},
 
686
        {R367CAB_EQU_I_TESTTAP_L,       0x11},
 
687
        {R367CAB_EQU_I_TESTTAP_M,       0x00},
 
688
        {R367CAB_EQU_I_TESTTAP_H,       0x00},
 
689
        {R367CAB_EQU_TESTAP_CFG,        0x00},
 
690
        {R367CAB_EQU_Q_TESTTAP_L,       0xff},
 
691
        {R367CAB_EQU_Q_TESTTAP_M,       0x00},
 
692
        {R367CAB_EQU_Q_TESTTAP_H,       0x00},
 
693
        {R367CAB_EQU_TAP_CTRL,  0x00},
 
694
        {R367CAB_EQU_CTR_CRL_CONTROL_L, 0x11},
 
695
        {R367CAB_EQU_CTR_CRL_CONTROL_H, 0x05},
 
696
        {R367CAB_EQU_CTR_HIPOW_L,       0x00},
 
697
        {R367CAB_EQU_CTR_HIPOW_H,       0x00},
 
698
        {R367CAB_EQU_I_EQU_LO,  0xef},
 
699
        {R367CAB_EQU_I_EQU_HI,  0x00},
 
700
        {R367CAB_EQU_Q_EQU_LO,  0xee},
 
701
        {R367CAB_EQU_Q_EQU_HI,  0x00},
 
702
        {R367CAB_EQU_MAPPER,    0xc5},
 
703
        {R367CAB_EQU_SWEEP_RATE,        0x80},
 
704
        {R367CAB_EQU_SNR_LO,    0x64},
 
705
        {R367CAB_EQU_SNR_HI,    0x03},
 
706
        {R367CAB_EQU_GAMMA_LO,  0x00},
 
707
        {R367CAB_EQU_GAMMA_HI,  0x00},
 
708
        {R367CAB_EQU_ERR_GAIN,  0x36},
 
709
        {R367CAB_EQU_RADIUS,    0xaa},
 
710
        {R367CAB_EQU_FFE_MAINTAP,       0x00},
 
711
        {R367CAB_EQU_FFE_LEAKAGE,       0x63},
 
712
        {R367CAB_EQU_FFE_MAINTAP_POS,   0xdf},
 
713
        {R367CAB_EQU_GAIN_WIDE, 0x88},
 
714
        {R367CAB_EQU_GAIN_NARROW,       0x41},
 
715
        {R367CAB_EQU_CTR_LPF_GAIN,      0xd1},
 
716
        {R367CAB_EQU_CRL_LPF_GAIN,      0xa7},
 
717
        {R367CAB_EQU_GLOBAL_GAIN,       0x06},
 
718
        {R367CAB_EQU_CRL_LD_SEN,        0x85},
 
719
        {R367CAB_EQU_CRL_LD_VAL,        0xe2},
 
720
        {R367CAB_EQU_CRL_TFR,   0x20},
 
721
        {R367CAB_EQU_CRL_BISTH_LO,      0x00},
 
722
        {R367CAB_EQU_CRL_BISTH_HI,      0x00},
 
723
        {R367CAB_EQU_SWEEP_RANGE_LO,    0x00},
 
724
        {R367CAB_EQU_SWEEP_RANGE_HI,    0x00},
 
725
        {R367CAB_EQU_CRL_LIMITER,       0x40},
 
726
        {R367CAB_EQU_MODULUS_MAP,       0x90},
 
727
        {R367CAB_EQU_PNT_GAIN,  0xa7},
 
728
        {R367CAB_FEC_AC_CTR_0,  0x16},
 
729
        {R367CAB_FEC_AC_CTR_1,  0x0b},
 
730
        {R367CAB_FEC_AC_CTR_2,  0x88},
 
731
        {R367CAB_FEC_AC_CTR_3,  0x02},
 
732
        {R367CAB_FEC_STATUS,    0x12},
 
733
        {R367CAB_RS_COUNTER_0,  0x7d},
 
734
        {R367CAB_RS_COUNTER_1,  0xd0},
 
735
        {R367CAB_RS_COUNTER_2,  0x19},
 
736
        {R367CAB_RS_COUNTER_3,  0x0b},
 
737
        {R367CAB_RS_COUNTER_4,  0xa3},
 
738
        {R367CAB_RS_COUNTER_5,  0x00},
 
739
        {R367CAB_BERT_0,        0x01},
 
740
        {R367CAB_BERT_1,        0x25},
 
741
        {R367CAB_BERT_2,        0x41},
 
742
        {R367CAB_BERT_3,        0x39},
 
743
        {R367CAB_OUTFORMAT_0,   0xc2},
 
744
        {R367CAB_OUTFORMAT_1,   0x22},
 
745
        {R367CAB_SMOOTHER_2,    0x28},
 
746
        {R367CAB_TSMF_CTRL_0,   0x01},
 
747
        {R367CAB_TSMF_CTRL_1,   0xc6},
 
748
        {R367CAB_TSMF_CTRL_3,   0x43},
 
749
        {R367CAB_TS_ON_ID_0,    0x00},
 
750
        {R367CAB_TS_ON_ID_1,    0x00},
 
751
        {R367CAB_TS_ON_ID_2,    0x00},
 
752
        {R367CAB_TS_ON_ID_3,    0x00},
 
753
        {R367CAB_RE_STATUS_0,   0x00},
 
754
        {R367CAB_RE_STATUS_1,   0x00},
 
755
        {R367CAB_RE_STATUS_2,   0x00},
 
756
        {R367CAB_RE_STATUS_3,   0x00},
 
757
        {R367CAB_TS_STATUS_0,   0x00},
 
758
        {R367CAB_TS_STATUS_1,   0x00},
 
759
        {R367CAB_TS_STATUS_2,   0xa0},
 
760
        {R367CAB_TS_STATUS_3,   0x00},
 
761
        {R367CAB_T_O_ID_0,      0x00},
 
762
        {R367CAB_T_O_ID_1,      0x00},
 
763
        {R367CAB_T_O_ID_2,      0x00},
 
764
        {R367CAB_T_O_ID_3,      0x00},
 
765
};
 
766
 
 
767
static
 
768
int stv0367_writeregs(struct stv0367_state *state, u16 reg, u8 *data, int len)
 
769
{
 
770
        u8 buf[len + 2];
 
771
        struct i2c_msg msg = {
 
772
                .addr = state->config->demod_address,
 
773
                .flags = 0,
 
774
                .buf = buf,
 
775
                .len = len + 2
 
776
        };
 
777
        int ret;
 
778
 
 
779
        buf[0] = MSB(reg);
 
780
        buf[1] = LSB(reg);
 
781
        memcpy(buf + 2, data, len);
 
782
 
 
783
        if (i2cdebug)
 
784
                printk(KERN_DEBUG "%s: %02x: %02x\n", __func__, reg, buf[2]);
 
785
 
 
786
        ret = i2c_transfer(state->i2c, &msg, 1);
 
787
        if (ret != 1)
 
788
                printk(KERN_ERR "%s: i2c write error!\n", __func__);
 
789
 
 
790
        return (ret != 1) ? -EREMOTEIO : 0;
 
791
}
 
792
 
 
793
static int stv0367_writereg(struct stv0367_state *state, u16 reg, u8 data)
 
794
{
 
795
        return stv0367_writeregs(state, reg, &data, 1);
 
796
}
 
797
 
 
798
static u8 stv0367_readreg(struct stv0367_state *state, u16 reg)
 
799
{
 
800
        u8 b0[] = { 0, 0 };
 
801
        u8 b1[] = { 0 };
 
802
        struct i2c_msg msg[] = {
 
803
                {
 
804
                        .addr = state->config->demod_address,
 
805
                        .flags = 0,
 
806
                        .buf = b0,
 
807
                        .len = 2
 
808
                }, {
 
809
                        .addr = state->config->demod_address,
 
810
                        .flags = I2C_M_RD,
 
811
                        .buf = b1,
 
812
                        .len = 1
 
813
                }
 
814
        };
 
815
        int ret;
 
816
 
 
817
        b0[0] = MSB(reg);
 
818
        b0[1] = LSB(reg);
 
819
 
 
820
        ret = i2c_transfer(state->i2c, msg, 2);
 
821
        if (ret != 2)
 
822
                printk(KERN_ERR "%s: i2c read error\n", __func__);
 
823
 
 
824
        if (i2cdebug)
 
825
                printk(KERN_DEBUG "%s: %02x: %02x\n", __func__, reg, b1[0]);
 
826
 
 
827
        return b1[0];
 
828
}
 
829
 
 
830
static void extract_mask_pos(u32 label, u8 *mask, u8 *pos)
 
831
{
 
832
        u8 position = 0, i = 0;
 
833
 
 
834
        (*mask) = label & 0xff;
 
835
 
 
836
        while ((position == 0) && (i < 8)) {
 
837
                position = ((*mask) >> i) & 0x01;
 
838
                i++;
 
839
        }
 
840
 
 
841
        (*pos) = (i - 1);
 
842
}
 
843
 
 
844
static void stv0367_writebits(struct stv0367_state *state, u32 label, u8 val)
 
845
{
 
846
        u8 reg, mask, pos;
 
847
 
 
848
        reg = stv0367_readreg(state, (label >> 16) & 0xffff);
 
849
        extract_mask_pos(label, &mask, &pos);
 
850
 
 
851
        val = mask & (val << pos);
 
852
 
 
853
        reg = (reg & (~mask)) | val;
 
854
        stv0367_writereg(state, (label >> 16) & 0xffff, reg);
 
855
 
 
856
}
 
857
 
 
858
static void stv0367_setbits(u8 *reg, u32 label, u8 val)
 
859
{
 
860
        u8 mask, pos;
 
861
 
 
862
        extract_mask_pos(label, &mask, &pos);
 
863
 
 
864
        val = mask & (val << pos);
 
865
 
 
866
        (*reg) = ((*reg) & (~mask)) | val;
 
867
}
 
868
 
 
869
static u8 stv0367_readbits(struct stv0367_state *state, u32 label)
 
870
{
 
871
        u8 val = 0xff;
 
872
        u8 mask, pos;
 
873
 
 
874
        extract_mask_pos(label, &mask, &pos);
 
875
 
 
876
        val = stv0367_readreg(state, label >> 16);
 
877
        val = (val & mask) >> pos;
 
878
 
 
879
        return val;
 
880
}
 
881
 
 
882
u8 stv0367_getbits(u8 reg, u32 label)
 
883
{
 
884
        u8 mask, pos;
 
885
 
 
886
        extract_mask_pos(label, &mask, &pos);
 
887
 
 
888
        return (reg & mask) >> pos;
 
889
}
 
890
 
 
891
static int stv0367ter_gate_ctrl(struct dvb_frontend *fe, int enable)
 
892
{
 
893
        struct stv0367_state *state = fe->demodulator_priv;
 
894
        u8 tmp = stv0367_readreg(state, R367TER_I2CRPT);
 
895
 
 
896
        dprintk("%s:\n", __func__);
 
897
 
 
898
        if (enable) {
 
899
                stv0367_setbits(&tmp, F367TER_STOP_ENABLE, 0);
 
900
                stv0367_setbits(&tmp, F367TER_I2CT_ON, 1);
 
901
        } else {
 
902
                stv0367_setbits(&tmp, F367TER_STOP_ENABLE, 1);
 
903
                stv0367_setbits(&tmp, F367TER_I2CT_ON, 0);
 
904
        }
 
905
 
 
906
        stv0367_writereg(state, R367TER_I2CRPT, tmp);
 
907
 
 
908
        return 0;
 
909
}
 
910
 
 
911
static u32 stv0367_get_tuner_freq(struct dvb_frontend *fe)
 
912
{
 
913
        struct dvb_frontend_ops *frontend_ops = NULL;
 
914
        struct dvb_tuner_ops    *tuner_ops = NULL;
 
915
        u32 freq = 0;
 
916
        int err = 0;
 
917
 
 
918
        dprintk("%s:\n", __func__);
 
919
 
 
920
 
 
921
        if (&fe->ops)
 
922
                frontend_ops = &fe->ops;
 
923
        if (&frontend_ops->tuner_ops)
 
924
                tuner_ops = &frontend_ops->tuner_ops;
 
925
        if (tuner_ops->get_frequency) {
 
926
                err = tuner_ops->get_frequency(fe, &freq);
 
927
                if (err < 0) {
 
928
                        printk(KERN_ERR "%s: Invalid parameter\n", __func__);
 
929
                        return err;
 
930
                }
 
931
 
 
932
                dprintk("%s: frequency=%d\n", __func__, freq);
 
933
 
 
934
        } else
 
935
                return -1;
 
936
 
 
937
        return freq;
 
938
}
 
939
 
 
940
static u16 CellsCoeffs_8MHz_367cofdm[3][6][5] = {
 
941
        {
 
942
                {0x10EF, 0xE205, 0x10EF, 0xCE49, 0x6DA7}, /* CELL 1 COEFFS 27M*/
 
943
                {0x2151, 0xc557, 0x2151, 0xc705, 0x6f93}, /* CELL 2 COEFFS */
 
944
                {0x2503, 0xc000, 0x2503, 0xc375, 0x7194}, /* CELL 3 COEFFS */
 
945
                {0x20E9, 0xca94, 0x20e9, 0xc153, 0x7194}, /* CELL 4 COEFFS */
 
946
                {0x06EF, 0xF852, 0x06EF, 0xC057, 0x7207}, /* CELL 5 COEFFS */
 
947
                {0x0000, 0x0ECC, 0x0ECC, 0x0000, 0x3647} /* CELL 6 COEFFS */
 
948
        }, {
 
949
                {0x10A0, 0xE2AF, 0x10A1, 0xCE76, 0x6D6D}, /* CELL 1 COEFFS 25M*/
 
950
                {0x20DC, 0xC676, 0x20D9, 0xC80A, 0x6F29},
 
951
                {0x2532, 0xC000, 0x251D, 0xC391, 0x706F},
 
952
                {0x1F7A, 0xCD2B, 0x2032, 0xC15E, 0x711F},
 
953
                {0x0698, 0xFA5E, 0x0568, 0xC059, 0x7193},
 
954
                {0x0000, 0x0918, 0x149C, 0x0000, 0x3642} /* CELL 6 COEFFS */
 
955
        }, {
 
956
                {0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, /* 30M */
 
957
                {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
 
958
                {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
 
959
                {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
 
960
                {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
 
961
                {0x0000, 0x0000, 0x0000, 0x0000, 0x0000}
 
962
        }
 
963
};
 
964
 
 
965
static u16 CellsCoeffs_7MHz_367cofdm[3][6][5] = {
 
966
        {
 
967
                {0x12CA, 0xDDAF, 0x12CA, 0xCCEB, 0x6FB1}, /* CELL 1 COEFFS 27M*/
 
968
                {0x2329, 0xC000, 0x2329, 0xC6B0, 0x725F}, /* CELL 2 COEFFS */
 
969
                {0x2394, 0xC000, 0x2394, 0xC2C7, 0x7410}, /* CELL 3 COEFFS */
 
970
                {0x251C, 0xC000, 0x251C, 0xC103, 0x74D9}, /* CELL 4 COEFFS */
 
971
                {0x0804, 0xF546, 0x0804, 0xC040, 0x7544}, /* CELL 5 COEFFS */
 
972
                {0x0000, 0x0CD9, 0x0CD9, 0x0000, 0x370A} /* CELL 6 COEFFS */
 
973
        }, {
 
974
                {0x1285, 0xDE47, 0x1285, 0xCD17, 0x6F76}, /*25M*/
 
975
                {0x234C, 0xC000, 0x2348, 0xC6DA, 0x7206},
 
976
                {0x23B4, 0xC000, 0x23AC, 0xC2DB, 0x73B3},
 
977
                {0x253D, 0xC000, 0x25B6, 0xC10B, 0x747F},
 
978
                {0x0721, 0xF79C, 0x065F, 0xC041, 0x74EB},
 
979
                {0x0000, 0x08FA, 0x1162, 0x0000, 0x36FF}
 
980
        }, {
 
981
                {0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, /* 30M */
 
982
                {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
 
983
                {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
 
984
                {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
 
985
                {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
 
986
                {0x0000, 0x0000, 0x0000, 0x0000, 0x0000}
 
987
        }
 
988
};
 
989
 
 
990
static u16 CellsCoeffs_6MHz_367cofdm[3][6][5] = {
 
991
        {
 
992
                {0x1699, 0xD5B8, 0x1699, 0xCBC3, 0x713B}, /* CELL 1 COEFFS 27M*/
 
993
                {0x2245, 0xC000, 0x2245, 0xC568, 0x74D5}, /* CELL 2 COEFFS */
 
994
                {0x227F, 0xC000, 0x227F, 0xC1FC, 0x76C6}, /* CELL 3 COEFFS */
 
995
                {0x235E, 0xC000, 0x235E, 0xC0A7, 0x778A}, /* CELL 4 COEFFS */
 
996
                {0x0ECB, 0xEA0B, 0x0ECB, 0xC027, 0x77DD}, /* CELL 5 COEFFS */
 
997
                {0x0000, 0x0B68, 0x0B68, 0x0000, 0xC89A}, /* CELL 6 COEFFS */
 
998
        }, {
 
999
                {0x1655, 0xD64E, 0x1658, 0xCBEF, 0x70FE}, /*25M*/
 
1000
                {0x225E, 0xC000, 0x2256, 0xC589, 0x7489},
 
1001
                {0x2293, 0xC000, 0x2295, 0xC209, 0x767E},
 
1002
                {0x2377, 0xC000, 0x23AA, 0xC0AB, 0x7746},
 
1003
                {0x0DC7, 0xEBC8, 0x0D07, 0xC027, 0x7799},
 
1004
                {0x0000, 0x0888, 0x0E9C, 0x0000, 0x3757}
 
1005
 
 
1006
        }, {
 
1007
                {0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, /* 30M */
 
1008
                {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
 
1009
                {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
 
1010
                {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
 
1011
                {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
 
1012
                {0x0000, 0x0000, 0x0000, 0x0000, 0x0000}
 
1013
        }
 
1014
};
 
1015
 
 
1016
static u32 stv0367ter_get_mclk(struct stv0367_state *state, u32 ExtClk_Hz)
 
1017
{
 
1018
        u32 mclk_Hz = 0; /* master clock frequency (Hz) */
 
1019
        u32 m, n, p;
 
1020
 
 
1021
        dprintk("%s:\n", __func__);
 
1022
 
 
1023
        if (stv0367_readbits(state, F367TER_BYPASS_PLLXN) == 0) {
 
1024
                n = (u32)stv0367_readbits(state, F367TER_PLL_NDIV);
 
1025
                if (n == 0)
 
1026
                        n = n + 1;
 
1027
 
 
1028
                m = (u32)stv0367_readbits(state, F367TER_PLL_MDIV);
 
1029
                if (m == 0)
 
1030
                        m = m + 1;
 
1031
 
 
1032
                p = (u32)stv0367_readbits(state, F367TER_PLL_PDIV);
 
1033
                if (p > 5)
 
1034
                        p = 5;
 
1035
 
 
1036
                mclk_Hz = ((ExtClk_Hz / 2) * n) / (m * (1 << p));
 
1037
 
 
1038
                dprintk("N=%d M=%d P=%d mclk_Hz=%d ExtClk_Hz=%d\n",
 
1039
                                n, m, p, mclk_Hz, ExtClk_Hz);
 
1040
        } else
 
1041
                mclk_Hz = ExtClk_Hz;
 
1042
 
 
1043
        dprintk("%s: mclk_Hz=%d\n", __func__, mclk_Hz);
 
1044
 
 
1045
        return mclk_Hz;
 
1046
}
 
1047
 
 
1048
static int stv0367ter_filt_coeff_init(struct stv0367_state *state,
 
1049
                                u16 CellsCoeffs[3][6][5], u32 DemodXtal)
 
1050
{
 
1051
        int i, j, k, freq;
 
1052
 
 
1053
        dprintk("%s:\n", __func__);
 
1054
 
 
1055
        freq = stv0367ter_get_mclk(state, DemodXtal);
 
1056
 
 
1057
        if (freq == 53125000)
 
1058
                k = 1; /* equivalent to Xtal 25M on 362*/
 
1059
        else if (freq == 54000000)
 
1060
                k = 0; /* equivalent to Xtal 27M on 362*/
 
1061
        else if (freq == 52500000)
 
1062
                k = 2; /* equivalent to Xtal 30M on 362*/
 
1063
        else
 
1064
                return 0;
 
1065
 
 
1066
        for (i = 1; i <= 6; i++) {
 
1067
                stv0367_writebits(state, F367TER_IIR_CELL_NB, i - 1);
 
1068
 
 
1069
                for (j = 1; j <= 5; j++) {
 
1070
                        stv0367_writereg(state,
 
1071
                                (R367TER_IIRCX_COEFF1_MSB + 2 * (j - 1)),
 
1072
                                MSB(CellsCoeffs[k][i-1][j-1]));
 
1073
                        stv0367_writereg(state,
 
1074
                                (R367TER_IIRCX_COEFF1_LSB + 2 * (j - 1)),
 
1075
                                LSB(CellsCoeffs[k][i-1][j-1]));
 
1076
                }
 
1077
        }
 
1078
 
 
1079
        return 1;
 
1080
 
 
1081
}
 
1082
 
 
1083
static void stv0367ter_agc_iir_lock_detect_set(struct stv0367_state *state)
 
1084
{
 
1085
        dprintk("%s:\n", __func__);
 
1086
 
 
1087
        stv0367_writebits(state, F367TER_LOCK_DETECT_LSB, 0x00);
 
1088
 
 
1089
        /* Lock detect 1 */
 
1090
        stv0367_writebits(state, F367TER_LOCK_DETECT_CHOICE, 0x00);
 
1091
        stv0367_writebits(state, F367TER_LOCK_DETECT_MSB, 0x06);
 
1092
        stv0367_writebits(state, F367TER_AUT_AGC_TARGET_LSB, 0x04);
 
1093
 
 
1094
        /* Lock detect 2 */
 
1095
        stv0367_writebits(state, F367TER_LOCK_DETECT_CHOICE, 0x01);
 
1096
        stv0367_writebits(state, F367TER_LOCK_DETECT_MSB, 0x06);
 
1097
        stv0367_writebits(state, F367TER_AUT_AGC_TARGET_LSB, 0x04);
 
1098
 
 
1099
        /* Lock detect 3 */
 
1100
        stv0367_writebits(state, F367TER_LOCK_DETECT_CHOICE, 0x02);
 
1101
        stv0367_writebits(state, F367TER_LOCK_DETECT_MSB, 0x01);
 
1102
        stv0367_writebits(state, F367TER_AUT_AGC_TARGET_LSB, 0x00);
 
1103
 
 
1104
        /* Lock detect 4 */
 
1105
        stv0367_writebits(state, F367TER_LOCK_DETECT_CHOICE, 0x03);
 
1106
        stv0367_writebits(state, F367TER_LOCK_DETECT_MSB, 0x01);
 
1107
        stv0367_writebits(state, F367TER_AUT_AGC_TARGET_LSB, 0x00);
 
1108
 
 
1109
}
 
1110
 
 
1111
static int stv0367_iir_filt_init(struct stv0367_state *state, u8 Bandwidth,
 
1112
                                                        u32 DemodXtalValue)
 
1113
{
 
1114
        dprintk("%s:\n", __func__);
 
1115
 
 
1116
        stv0367_writebits(state, F367TER_NRST_IIR, 0);
 
1117
 
 
1118
        switch (Bandwidth) {
 
1119
        case 6:
 
1120
                if (!stv0367ter_filt_coeff_init(state,
 
1121
                                CellsCoeffs_6MHz_367cofdm,
 
1122
                                DemodXtalValue))
 
1123
                        return 0;
 
1124
                break;
 
1125
        case 7:
 
1126
                if (!stv0367ter_filt_coeff_init(state,
 
1127
                                CellsCoeffs_7MHz_367cofdm,
 
1128
                                DemodXtalValue))
 
1129
                        return 0;
 
1130
                break;
 
1131
        case 8:
 
1132
                if (!stv0367ter_filt_coeff_init(state,
 
1133
                                CellsCoeffs_8MHz_367cofdm,
 
1134
                                DemodXtalValue))
 
1135
                        return 0;
 
1136
                break;
 
1137
        default:
 
1138
                return 0;
 
1139
        }
 
1140
 
 
1141
        stv0367_writebits(state, F367TER_NRST_IIR, 1);
 
1142
 
 
1143
        return 1;
 
1144
}
 
1145
 
 
1146
static void stv0367ter_agc_iir_rst(struct stv0367_state *state)
 
1147
{
 
1148
 
 
1149
        u8 com_n;
 
1150
 
 
1151
        dprintk("%s:\n", __func__);
 
1152
 
 
1153
        com_n = stv0367_readbits(state, F367TER_COM_N);
 
1154
 
 
1155
        stv0367_writebits(state, F367TER_COM_N, 0x07);
 
1156
 
 
1157
        stv0367_writebits(state, F367TER_COM_SOFT_RSTN, 0x00);
 
1158
        stv0367_writebits(state, F367TER_COM_AGC_ON, 0x00);
 
1159
 
 
1160
        stv0367_writebits(state, F367TER_COM_SOFT_RSTN, 0x01);
 
1161
        stv0367_writebits(state, F367TER_COM_AGC_ON, 0x01);
 
1162
 
 
1163
        stv0367_writebits(state, F367TER_COM_N, com_n);
 
1164
 
 
1165
}
 
1166
 
 
1167
static int stv0367ter_duration(s32 mode, int tempo1, int tempo2, int tempo3)
 
1168
{
 
1169
        int local_tempo = 0;
 
1170
        switch (mode) {
 
1171
        case 0:
 
1172
                local_tempo = tempo1;
 
1173
                break;
 
1174
        case 1:
 
1175
                local_tempo = tempo2;
 
1176
                break ;
 
1177
 
 
1178
        case 2:
 
1179
                local_tempo = tempo3;
 
1180
                break;
 
1181
 
 
1182
        default:
 
1183
                break;
 
1184
        }
 
1185
        /*      msleep(local_tempo);  */
 
1186
        return local_tempo;
 
1187
}
 
1188
 
 
1189
static enum
 
1190
stv0367_ter_signal_type stv0367ter_check_syr(struct stv0367_state *state)
 
1191
{
 
1192
        int wd = 100;
 
1193
        unsigned short int SYR_var;
 
1194
        s32 SYRStatus;
 
1195
 
 
1196
        dprintk("%s:\n", __func__);
 
1197
 
 
1198
        SYR_var = stv0367_readbits(state, F367TER_SYR_LOCK);
 
1199
 
 
1200
        while ((!SYR_var) && (wd > 0)) {
 
1201
                usleep_range(2000, 3000);
 
1202
                wd -= 2;
 
1203
                SYR_var = stv0367_readbits(state, F367TER_SYR_LOCK);
 
1204
        }
 
1205
 
 
1206
        if (!SYR_var)
 
1207
                SYRStatus = FE_TER_NOSYMBOL;
 
1208
        else
 
1209
                SYRStatus =  FE_TER_SYMBOLOK;
 
1210
 
 
1211
        dprintk("stv0367ter_check_syr SYRStatus %s\n",
 
1212
                                SYR_var == 0 ? "No Symbol" : "OK");
 
1213
 
 
1214
        return SYRStatus;
 
1215
}
 
1216
 
 
1217
static enum
 
1218
stv0367_ter_signal_type stv0367ter_check_cpamp(struct stv0367_state *state,
 
1219
                                                                s32 FFTmode)
 
1220
{
 
1221
 
 
1222
        s32  CPAMPvalue = 0, CPAMPStatus, CPAMPMin;
 
1223
        int wd = 0;
 
1224
 
 
1225
        dprintk("%s:\n", __func__);
 
1226
 
 
1227
        switch (FFTmode) {
 
1228
        case 0: /*2k mode*/
 
1229
                CPAMPMin = 20;
 
1230
                wd = 10;
 
1231
                break;
 
1232
        case 1: /*8k mode*/
 
1233
                CPAMPMin = 80;
 
1234
                wd = 55;
 
1235
                break;
 
1236
        case 2: /*4k mode*/
 
1237
                CPAMPMin = 40;
 
1238
                wd = 30;
 
1239
                break;
 
1240
        default:
 
1241
                CPAMPMin = 0xffff;  /*drives to NOCPAMP */
 
1242
                break;
 
1243
        }
 
1244
 
 
1245
        dprintk("%s: CPAMPMin=%d wd=%d\n", __func__, CPAMPMin, wd);
 
1246
 
 
1247
        CPAMPvalue = stv0367_readbits(state, F367TER_PPM_CPAMP_DIRECT);
 
1248
        while ((CPAMPvalue < CPAMPMin) && (wd > 0)) {
 
1249
                usleep_range(1000, 2000);
 
1250
                wd -= 1;
 
1251
                CPAMPvalue = stv0367_readbits(state, F367TER_PPM_CPAMP_DIRECT);
 
1252
                /*dprintk("CPAMPvalue= %d at wd=%d\n",CPAMPvalue,wd); */
 
1253
        }
 
1254
        dprintk("******last CPAMPvalue= %d at wd=%d\n", CPAMPvalue, wd);
 
1255
        if (CPAMPvalue < CPAMPMin) {
 
1256
                CPAMPStatus = FE_TER_NOCPAMP;
 
1257
                printk(KERN_ERR "CPAMP failed\n");
 
1258
        } else {
 
1259
                printk(KERN_ERR "CPAMP OK !\n");
 
1260
                CPAMPStatus = FE_TER_CPAMPOK;
 
1261
        }
 
1262
 
 
1263
        return CPAMPStatus;
 
1264
}
 
1265
 
 
1266
enum
 
1267
stv0367_ter_signal_type stv0367ter_lock_algo(struct stv0367_state *state)
 
1268
{
 
1269
        enum stv0367_ter_signal_type ret_flag;
 
1270
        short int wd, tempo;
 
1271
        u8 try, u_var1 = 0, u_var2 = 0, u_var3 = 0, u_var4 = 0, mode, guard;
 
1272
        u8 tmp, tmp2;
 
1273
 
 
1274
        dprintk("%s:\n", __func__);
 
1275
 
 
1276
        if (state == NULL)
 
1277
                return FE_TER_SWNOK;
 
1278
 
 
1279
        try = 0;
 
1280
        do {
 
1281
                ret_flag = FE_TER_LOCKOK;
 
1282
 
 
1283
                stv0367_writebits(state, F367TER_CORE_ACTIVE, 0);
 
1284
 
 
1285
                if (state->config->if_iq_mode != 0)
 
1286
                        stv0367_writebits(state, F367TER_COM_N, 0x07);
 
1287
 
 
1288
                stv0367_writebits(state, F367TER_GUARD, 3);/* suggest 2k 1/4 */
 
1289
                stv0367_writebits(state, F367TER_MODE, 0);
 
1290
                stv0367_writebits(state, F367TER_SYR_TR_DIS, 0);
 
1291
                usleep_range(5000, 10000);
 
1292
 
 
1293
                stv0367_writebits(state, F367TER_CORE_ACTIVE, 1);
 
1294
 
 
1295
 
 
1296
                if (stv0367ter_check_syr(state) == FE_TER_NOSYMBOL)
 
1297
                        return FE_TER_NOSYMBOL;
 
1298
                else { /*
 
1299
                        if chip locked on wrong mode first try,
 
1300
                        it must lock correctly second try */
 
1301
                        mode = stv0367_readbits(state, F367TER_SYR_MODE);
 
1302
                        if (stv0367ter_check_cpamp(state, mode) ==
 
1303
                                                        FE_TER_NOCPAMP) {
 
1304
                                if (try == 0)
 
1305
                                        ret_flag = FE_TER_NOCPAMP;
 
1306
 
 
1307
                        }
 
1308
                }
 
1309
 
 
1310
                try++;
 
1311
        } while ((try < 10) && (ret_flag != FE_TER_LOCKOK));
 
1312
 
 
1313
        tmp  = stv0367_readreg(state, R367TER_SYR_STAT);
 
1314
        tmp2 = stv0367_readreg(state, R367TER_STATUS);
 
1315
        dprintk("state=%p\n", state);
 
1316
        dprintk("LOCK OK! mode=%d SYR_STAT=0x%x R367TER_STATUS=0x%x\n",
 
1317
                                                        mode, tmp, tmp2);
 
1318
 
 
1319
        tmp  = stv0367_readreg(state, R367TER_PRVIT);
 
1320
        tmp2 = stv0367_readreg(state, R367TER_I2CRPT);
 
1321
        dprintk("PRVIT=0x%x I2CRPT=0x%x\n", tmp, tmp2);
 
1322
 
 
1323
        tmp  = stv0367_readreg(state, R367TER_GAIN_SRC1);
 
1324
        dprintk("GAIN_SRC1=0x%x\n", tmp);
 
1325
 
 
1326
        if ((mode != 0) && (mode != 1) && (mode != 2))
 
1327
                return FE_TER_SWNOK;
 
1328
 
 
1329
        /*guard=stv0367_readbits(state,F367TER_SYR_GUARD); */
 
1330
 
 
1331
        /*suppress EPQ auto for SYR_GARD 1/16 or 1/32
 
1332
        and set channel predictor in automatic */
 
1333
#if 0
 
1334
        switch (guard) {
 
1335
 
 
1336
        case 0:
 
1337
        case 1:
 
1338
                stv0367_writebits(state, F367TER_AUTO_LE_EN, 0);
 
1339
                stv0367_writereg(state, R367TER_CHC_CTL, 0x01);
 
1340
                break;
 
1341
        case 2:
 
1342
        case 3:
 
1343
                stv0367_writebits(state, F367TER_AUTO_LE_EN, 1);
 
1344
                stv0367_writereg(state, R367TER_CHC_CTL, 0x11);
 
1345
                break;
 
1346
 
 
1347
        default:
 
1348
                return FE_TER_SWNOK;
 
1349
        }
 
1350
#endif
 
1351
 
 
1352
        /*reset fec an reedsolo FOR 367 only*/
 
1353
        stv0367_writebits(state, F367TER_RST_SFEC, 1);
 
1354
        stv0367_writebits(state, F367TER_RST_REEDSOLO, 1);
 
1355
        usleep_range(1000, 2000);
 
1356
        stv0367_writebits(state, F367TER_RST_SFEC, 0);
 
1357
        stv0367_writebits(state, F367TER_RST_REEDSOLO, 0);
 
1358
 
 
1359
        u_var1 = stv0367_readbits(state, F367TER_LK);
 
1360
        u_var2 = stv0367_readbits(state, F367TER_PRF);
 
1361
        u_var3 = stv0367_readbits(state, F367TER_TPS_LOCK);
 
1362
        /*      u_var4=stv0367_readbits(state,F367TER_TSFIFO_LINEOK); */
 
1363
 
 
1364
        wd = stv0367ter_duration(mode, 125, 500, 250);
 
1365
        tempo = stv0367ter_duration(mode, 4, 16, 8);
 
1366
 
 
1367
        /*while ( ((!u_var1)||(!u_var2)||(!u_var3)||(!u_var4))  && (wd>=0)) */
 
1368
        while (((!u_var1) || (!u_var2) || (!u_var3)) && (wd >= 0)) {
 
1369
                usleep_range(1000 * tempo, 1000 * (tempo + 1));
 
1370
                wd -= tempo;
 
1371
                u_var1 = stv0367_readbits(state, F367TER_LK);
 
1372
                u_var2 = stv0367_readbits(state, F367TER_PRF);
 
1373
                u_var3 = stv0367_readbits(state, F367TER_TPS_LOCK);
 
1374
                /*u_var4=stv0367_readbits(state, F367TER_TSFIFO_LINEOK); */
 
1375
        }
 
1376
 
 
1377
        if (!u_var1)
 
1378
                return FE_TER_NOLOCK;
 
1379
 
 
1380
 
 
1381
        if (!u_var2)
 
1382
                return FE_TER_NOPRFOUND;
 
1383
 
 
1384
        if (!u_var3)
 
1385
                return FE_TER_NOTPS;
 
1386
 
 
1387
        guard = stv0367_readbits(state, F367TER_SYR_GUARD);
 
1388
        stv0367_writereg(state, R367TER_CHC_CTL, 0x11);
 
1389
        switch (guard) {
 
1390
        case 0:
 
1391
        case 1:
 
1392
                stv0367_writebits(state, F367TER_AUTO_LE_EN, 0);
 
1393
                /*stv0367_writereg(state,R367TER_CHC_CTL, 0x1);*/
 
1394
                stv0367_writebits(state, F367TER_SYR_FILTER, 0);
 
1395
                break;
 
1396
        case 2:
 
1397
        case 3:
 
1398
                stv0367_writebits(state, F367TER_AUTO_LE_EN, 1);
 
1399
                /*stv0367_writereg(state,R367TER_CHC_CTL, 0x11);*/
 
1400
                stv0367_writebits(state, F367TER_SYR_FILTER, 1);
 
1401
                break;
 
1402
 
 
1403
        default:
 
1404
                return FE_TER_SWNOK;
 
1405
        }
 
1406
 
 
1407
        /* apply Sfec workaround if 8K 64QAM CR!=1/2*/
 
1408
        if ((stv0367_readbits(state, F367TER_TPS_CONST) == 2) &&
 
1409
                        (mode == 1) &&
 
1410
                        (stv0367_readbits(state, F367TER_TPS_HPCODE) != 0)) {
 
1411
                stv0367_writereg(state, R367TER_SFDLYSETH, 0xc0);
 
1412
                stv0367_writereg(state, R367TER_SFDLYSETM, 0x60);
 
1413
                stv0367_writereg(state, R367TER_SFDLYSETL, 0x0);
 
1414
        } else
 
1415
                stv0367_writereg(state, R367TER_SFDLYSETH, 0x0);
 
1416
 
 
1417
        wd = stv0367ter_duration(mode, 125, 500, 250);
 
1418
        u_var4 = stv0367_readbits(state, F367TER_TSFIFO_LINEOK);
 
1419
 
 
1420
        while ((!u_var4) && (wd >= 0)) {
 
1421
                usleep_range(1000 * tempo, 1000 * (tempo + 1));
 
1422
                wd -= tempo;
 
1423
                u_var4 = stv0367_readbits(state, F367TER_TSFIFO_LINEOK);
 
1424
        }
 
1425
 
 
1426
        if (!u_var4)
 
1427
                return FE_TER_NOLOCK;
 
1428
 
 
1429
        /* for 367 leave COM_N at 0x7 for IQ_mode*/
 
1430
        /*if(ter_state->if_iq_mode!=FE_TER_NORMAL_IF_TUNER) {
 
1431
                tempo=0;
 
1432
                while ((stv0367_readbits(state,F367TER_COM_USEGAINTRK)!=1) &&
 
1433
                (stv0367_readbits(state,F367TER_COM_AGCLOCK)!=1)&&(tempo<100)) {
 
1434
                        ChipWaitOrAbort(state,1);
 
1435
                        tempo+=1;
 
1436
                }
 
1437
 
 
1438
                stv0367_writebits(state,F367TER_COM_N,0x17);
 
1439
        } */
 
1440
 
 
1441
        stv0367_writebits(state, F367TER_SYR_TR_DIS, 1);
 
1442
 
 
1443
        dprintk("FE_TER_LOCKOK !!!\n");
 
1444
 
 
1445
        return  FE_TER_LOCKOK;
 
1446
 
 
1447
}
 
1448
 
 
1449
static void stv0367ter_set_ts_mode(struct stv0367_state *state,
 
1450
                                        enum stv0367_ts_mode PathTS)
 
1451
{
 
1452
 
 
1453
        dprintk("%s:\n", __func__);
 
1454
 
 
1455
        if (state == NULL)
 
1456
                return;
 
1457
 
 
1458
        stv0367_writebits(state, F367TER_TS_DIS, 0);
 
1459
        switch (PathTS) {
 
1460
        default:
 
1461
                /*for removing warning :default we can assume in parallel mode*/
 
1462
        case STV0367_PARALLEL_PUNCT_CLOCK:
 
1463
                stv0367_writebits(state, F367TER_TSFIFO_SERIAL, 0);
 
1464
                stv0367_writebits(state, F367TER_TSFIFO_DVBCI, 0);
 
1465
                break;
 
1466
        case STV0367_SERIAL_PUNCT_CLOCK:
 
1467
                stv0367_writebits(state, F367TER_TSFIFO_SERIAL, 1);
 
1468
                stv0367_writebits(state, F367TER_TSFIFO_DVBCI, 1);
 
1469
                break;
 
1470
        }
 
1471
}
 
1472
 
 
1473
static void stv0367ter_set_clk_pol(struct stv0367_state *state,
 
1474
                                        enum stv0367_clk_pol clock)
 
1475
{
 
1476
 
 
1477
        dprintk("%s:\n", __func__);
 
1478
 
 
1479
        if (state == NULL)
 
1480
                return;
 
1481
 
 
1482
        switch (clock) {
 
1483
        case STV0367_RISINGEDGE_CLOCK:
 
1484
                stv0367_writebits(state, F367TER_TS_BYTE_CLK_INV, 1);
 
1485
                break;
 
1486
        case STV0367_FALLINGEDGE_CLOCK:
 
1487
                stv0367_writebits(state, F367TER_TS_BYTE_CLK_INV, 0);
 
1488
                break;
 
1489
                /*case FE_TER_CLOCK_POLARITY_DEFAULT:*/
 
1490
        default:
 
1491
                stv0367_writebits(state, F367TER_TS_BYTE_CLK_INV, 0);
 
1492
                break;
 
1493
        }
 
1494
}
 
1495
 
 
1496
#if 0
 
1497
static void stv0367ter_core_sw(struct stv0367_state *state)
 
1498
{
 
1499
 
 
1500
        dprintk("%s:\n", __func__);
 
1501
 
 
1502
        stv0367_writebits(state, F367TER_CORE_ACTIVE, 0);
 
1503
        stv0367_writebits(state, F367TER_CORE_ACTIVE, 1);
 
1504
        msleep(350);
 
1505
}
 
1506
#endif
 
1507
static int stv0367ter_standby(struct dvb_frontend *fe, u8 standby_on)
 
1508
{
 
1509
        struct stv0367_state *state = fe->demodulator_priv;
 
1510
 
 
1511
        dprintk("%s:\n", __func__);
 
1512
 
 
1513
        if (standby_on) {
 
1514
                stv0367_writebits(state, F367TER_STDBY, 1);
 
1515
                stv0367_writebits(state, F367TER_STDBY_FEC, 1);
 
1516
                stv0367_writebits(state, F367TER_STDBY_CORE, 1);
 
1517
        } else {
 
1518
                stv0367_writebits(state, F367TER_STDBY, 0);
 
1519
                stv0367_writebits(state, F367TER_STDBY_FEC, 0);
 
1520
                stv0367_writebits(state, F367TER_STDBY_CORE, 0);
 
1521
        }
 
1522
 
 
1523
        return 0;
 
1524
}
 
1525
 
 
1526
static int stv0367ter_sleep(struct dvb_frontend *fe)
 
1527
{
 
1528
        return stv0367ter_standby(fe, 1);
 
1529
}
 
1530
 
 
1531
int stv0367ter_init(struct dvb_frontend *fe)
 
1532
{
 
1533
        struct stv0367_state *state = fe->demodulator_priv;
 
1534
        struct stv0367ter_state *ter_state = state->ter_state;
 
1535
        int i;
 
1536
 
 
1537
        dprintk("%s:\n", __func__);
 
1538
 
 
1539
        ter_state->pBER = 0;
 
1540
 
 
1541
        for (i = 0; i < STV0367TER_NBREGS; i++)
 
1542
                stv0367_writereg(state, def0367ter[i].addr,
 
1543
                                        def0367ter[i].value);
 
1544
 
 
1545
        switch (state->config->xtal) {
 
1546
                /*set internal freq to 53.125MHz */
 
1547
        case 25000000:
 
1548
                stv0367_writereg(state, R367TER_PLLMDIV, 0xa);
 
1549
                stv0367_writereg(state, R367TER_PLLNDIV, 0x55);
 
1550
                stv0367_writereg(state, R367TER_PLLSETUP, 0x18);
 
1551
                break;
 
1552
        default:
 
1553
        case 27000000:
 
1554
                dprintk("FE_STV0367TER_SetCLKgen for 27Mhz\n");
 
1555
                stv0367_writereg(state, R367TER_PLLMDIV, 0x1);
 
1556
                stv0367_writereg(state, R367TER_PLLNDIV, 0x8);
 
1557
                stv0367_writereg(state, R367TER_PLLSETUP, 0x18);
 
1558
                break;
 
1559
        case 30000000:
 
1560
                stv0367_writereg(state, R367TER_PLLMDIV, 0xc);
 
1561
                stv0367_writereg(state, R367TER_PLLNDIV, 0x55);
 
1562
                stv0367_writereg(state, R367TER_PLLSETUP, 0x18);
 
1563
                break;
 
1564
        }
 
1565
 
 
1566
        stv0367_writereg(state, R367TER_I2CRPT, 0xa0);
 
1567
        stv0367_writereg(state, R367TER_ANACTRL, 0x00);
 
1568
 
 
1569
        /*Set TS1 and TS2 to serial or parallel mode */
 
1570
        stv0367ter_set_ts_mode(state, state->config->ts_mode);
 
1571
        stv0367ter_set_clk_pol(state, state->config->clk_pol);
 
1572
 
 
1573
        state->chip_id = stv0367_readreg(state, R367TER_ID);
 
1574
        ter_state->first_lock = 0;
 
1575
        ter_state->unlock_counter = 2;
 
1576
 
 
1577
        return 0;
 
1578
}
 
1579
 
 
1580
static int stv0367ter_algo(struct dvb_frontend *fe,
 
1581
                                struct dvb_frontend_parameters *param)
 
1582
{
 
1583
        struct stv0367_state *state = fe->demodulator_priv;
 
1584
        struct stv0367ter_state *ter_state = state->ter_state;
 
1585
        int offset = 0, tempo = 0;
 
1586
        u8 u_var;
 
1587
        u8 /*constell,*/ counter, tps_rcvd[2];
 
1588
        s8 step;
 
1589
        s32 timing_offset = 0;
 
1590
        u32 trl_nomrate = 0, InternalFreq = 0, temp = 0;
 
1591
 
 
1592
        dprintk("%s:\n", __func__);
 
1593
 
 
1594
        ter_state->frequency = param->frequency;
 
1595
        ter_state->force = FE_TER_FORCENONE
 
1596
                        + stv0367_readbits(state, F367TER_FORCE) * 2;
 
1597
        ter_state->if_iq_mode = state->config->if_iq_mode;
 
1598
        switch (state->config->if_iq_mode) {
 
1599
        case FE_TER_NORMAL_IF_TUNER:  /* Normal IF mode */
 
1600
                dprintk("ALGO: FE_TER_NORMAL_IF_TUNER selected\n");
 
1601
                stv0367_writebits(state, F367TER_TUNER_BB, 0);
 
1602
                stv0367_writebits(state, F367TER_LONGPATH_IF, 0);
 
1603
                stv0367_writebits(state, F367TER_DEMUX_SWAP, 0);
 
1604
                break;
 
1605
        case FE_TER_LONGPATH_IF_TUNER:  /* Long IF mode */
 
1606
                dprintk("ALGO: FE_TER_LONGPATH_IF_TUNER selected\n");
 
1607
                stv0367_writebits(state, F367TER_TUNER_BB, 0);
 
1608
                stv0367_writebits(state, F367TER_LONGPATH_IF, 1);
 
1609
                stv0367_writebits(state, F367TER_DEMUX_SWAP, 1);
 
1610
                break;
 
1611
        case FE_TER_IQ_TUNER:  /* IQ mode */
 
1612
                dprintk("ALGO: FE_TER_IQ_TUNER selected\n");
 
1613
                stv0367_writebits(state, F367TER_TUNER_BB, 1);
 
1614
                stv0367_writebits(state, F367TER_PPM_INVSEL, 0);
 
1615
                break;
 
1616
        default:
 
1617
                printk(KERN_ERR "ALGO: wrong TUNER type selected\n");
 
1618
                return -EINVAL;
 
1619
        }
 
1620
 
 
1621
        usleep_range(5000, 7000);
 
1622
 
 
1623
        switch (param->inversion) {
 
1624
        case INVERSION_AUTO:
 
1625
        default:
 
1626
                dprintk("%s: inversion AUTO\n", __func__);
 
1627
                if (ter_state->if_iq_mode == FE_TER_IQ_TUNER)
 
1628
                        stv0367_writebits(state, F367TER_IQ_INVERT,
 
1629
                                                ter_state->sense);
 
1630
                else
 
1631
                        stv0367_writebits(state, F367TER_INV_SPECTR,
 
1632
                                                ter_state->sense);
 
1633
 
 
1634
                break;
 
1635
        case INVERSION_ON:
 
1636
        case INVERSION_OFF:
 
1637
                if (ter_state->if_iq_mode == FE_TER_IQ_TUNER)
 
1638
                        stv0367_writebits(state, F367TER_IQ_INVERT,
 
1639
                                                param->inversion);
 
1640
                else
 
1641
                        stv0367_writebits(state, F367TER_INV_SPECTR,
 
1642
                                                param->inversion);
 
1643
 
 
1644
                break;
 
1645
        }
 
1646
 
 
1647
        if ((ter_state->if_iq_mode != FE_TER_NORMAL_IF_TUNER) &&
 
1648
                                (ter_state->pBW != ter_state->bw)) {
 
1649
                stv0367ter_agc_iir_lock_detect_set(state);
 
1650
 
 
1651
                /*set fine agc target to 180 for LPIF or IQ mode*/
 
1652
                /* set Q_AGCTarget */
 
1653
                stv0367_writebits(state, F367TER_SEL_IQNTAR, 1);
 
1654
                stv0367_writebits(state, F367TER_AUT_AGC_TARGET_MSB, 0xB);
 
1655
                /*stv0367_writebits(state,AUT_AGC_TARGET_LSB,0x04); */
 
1656
 
 
1657
                /* set Q_AGCTarget */
 
1658
                stv0367_writebits(state, F367TER_SEL_IQNTAR, 0);
 
1659
                stv0367_writebits(state, F367TER_AUT_AGC_TARGET_MSB, 0xB);
 
1660
                /*stv0367_writebits(state,AUT_AGC_TARGET_LSB,0x04); */
 
1661
 
 
1662
                if (!stv0367_iir_filt_init(state, ter_state->bw,
 
1663
                                                state->config->xtal))
 
1664
                        return -EINVAL;
 
1665
                /*set IIR filter once for 6,7 or 8MHz BW*/
 
1666
                ter_state->pBW = ter_state->bw;
 
1667
 
 
1668
                stv0367ter_agc_iir_rst(state);
 
1669
        }
 
1670
 
 
1671
        if (ter_state->hierarchy == FE_TER_HIER_LOW_PRIO)
 
1672
                stv0367_writebits(state, F367TER_BDI_LPSEL, 0x01);
 
1673
        else
 
1674
                stv0367_writebits(state, F367TER_BDI_LPSEL, 0x00);
 
1675
 
 
1676
        InternalFreq = stv0367ter_get_mclk(state, state->config->xtal) / 1000;
 
1677
        temp = (int)
 
1678
                ((((ter_state->bw * 64 * (1 << 15) * 100)
 
1679
                                                / (InternalFreq)) * 10) / 7);
 
1680
 
 
1681
        stv0367_writebits(state, F367TER_TRL_NOMRATE_LSB, temp % 2);
 
1682
        temp = temp / 2;
 
1683
        stv0367_writebits(state, F367TER_TRL_NOMRATE_HI, temp / 256);
 
1684
        stv0367_writebits(state, F367TER_TRL_NOMRATE_LO, temp % 256);
 
1685
 
 
1686
        temp = stv0367_readbits(state, F367TER_TRL_NOMRATE_HI) * 512 +
 
1687
                        stv0367_readbits(state, F367TER_TRL_NOMRATE_LO) * 2 +
 
1688
                        stv0367_readbits(state, F367TER_TRL_NOMRATE_LSB);
 
1689
        temp = (int)(((1 << 17) * ter_state->bw * 1000) / (7 * (InternalFreq)));
 
1690
        stv0367_writebits(state, F367TER_GAIN_SRC_HI, temp / 256);
 
1691
        stv0367_writebits(state, F367TER_GAIN_SRC_LO, temp % 256);
 
1692
        temp = stv0367_readbits(state, F367TER_GAIN_SRC_HI) * 256 +
 
1693
                        stv0367_readbits(state, F367TER_GAIN_SRC_LO);
 
1694
 
 
1695
        temp = (int)
 
1696
                ((InternalFreq - state->config->if_khz) * (1 << 16)
 
1697
                                                        / (InternalFreq));
 
1698
 
 
1699
        dprintk("DEROT temp=0x%x\n", temp);
 
1700
        stv0367_writebits(state, F367TER_INC_DEROT_HI, temp / 256);
 
1701
        stv0367_writebits(state, F367TER_INC_DEROT_LO, temp % 256);
 
1702
 
 
1703
        ter_state->echo_pos = 0;
 
1704
        ter_state->ucblocks = 0; /* liplianin */
 
1705
        ter_state->pBER = 0; /* liplianin */
 
1706
        stv0367_writebits(state, F367TER_LONG_ECHO, ter_state->echo_pos);
 
1707
 
 
1708
        if (stv0367ter_lock_algo(state) != FE_TER_LOCKOK)
 
1709
                return 0;
 
1710
 
 
1711
        ter_state->state = FE_TER_LOCKOK;
 
1712
        /* update results */
 
1713
        tps_rcvd[0] = stv0367_readreg(state, R367TER_TPS_RCVD2);
 
1714
        tps_rcvd[1] = stv0367_readreg(state, R367TER_TPS_RCVD3);
 
1715
 
 
1716
        ter_state->mode = stv0367_readbits(state, F367TER_SYR_MODE);
 
1717
        ter_state->guard = stv0367_readbits(state, F367TER_SYR_GUARD);
 
1718
 
 
1719
        ter_state->first_lock = 1; /* we know sense now :) */
 
1720
 
 
1721
        ter_state->agc_val =
 
1722
                        (stv0367_readbits(state, F367TER_AGC1_VAL_LO) << 16) +
 
1723
                        (stv0367_readbits(state, F367TER_AGC1_VAL_HI) << 24) +
 
1724
                        stv0367_readbits(state, F367TER_AGC2_VAL_LO) +
 
1725
                        (stv0367_readbits(state, F367TER_AGC2_VAL_HI) << 8);
 
1726
 
 
1727
        /* Carrier offset calculation */
 
1728
        stv0367_writebits(state, F367TER_FREEZE, 1);
 
1729
        offset = (stv0367_readbits(state, F367TER_CRL_FOFFSET_VHI) << 16) ;
 
1730
        offset += (stv0367_readbits(state, F367TER_CRL_FOFFSET_HI) << 8);
 
1731
        offset += (stv0367_readbits(state, F367TER_CRL_FOFFSET_LO));
 
1732
        stv0367_writebits(state, F367TER_FREEZE, 0);
 
1733
        if (offset > 8388607)
 
1734
                offset -= 16777216;
 
1735
 
 
1736
        offset = offset * 2 / 16384;
 
1737
 
 
1738
        if (ter_state->mode == FE_TER_MODE_2K)
 
1739
                offset = (offset * 4464) / 1000;/*** 1 FFT BIN=4.464khz***/
 
1740
        else if (ter_state->mode == FE_TER_MODE_4K)
 
1741
                offset = (offset * 223) / 100;/*** 1 FFT BIN=2.23khz***/
 
1742
        else  if (ter_state->mode == FE_TER_MODE_8K)
 
1743
                offset = (offset * 111) / 100;/*** 1 FFT BIN=1.1khz***/
 
1744
 
 
1745
        if (stv0367_readbits(state, F367TER_PPM_INVSEL) == 1) {
 
1746
                if ((stv0367_readbits(state, F367TER_INV_SPECTR) ==
 
1747
                                (stv0367_readbits(state,
 
1748
                                        F367TER_STATUS_INV_SPECRUM) == 1)))
 
1749
                        offset = offset * -1;
 
1750
        }
 
1751
 
 
1752
        if (ter_state->bw == 6)
 
1753
                offset = (offset * 6) / 8;
 
1754
        else if (ter_state->bw == 7)
 
1755
                offset = (offset * 7) / 8;
 
1756
 
 
1757
        ter_state->frequency += offset;
 
1758
 
 
1759
        tempo = 10;  /* exit even if timing_offset stays null */
 
1760
        while ((timing_offset == 0) && (tempo > 0)) {
 
1761
                usleep_range(10000, 20000);     /*was 20ms  */
 
1762
                /* fine tuning of timing offset if required */
 
1763
                timing_offset = stv0367_readbits(state, F367TER_TRL_TOFFSET_LO)
 
1764
                                + 256 * stv0367_readbits(state,
 
1765
                                                        F367TER_TRL_TOFFSET_HI);
 
1766
                if (timing_offset >= 32768)
 
1767
                        timing_offset -= 65536;
 
1768
                trl_nomrate = (512 * stv0367_readbits(state,
 
1769
                                                        F367TER_TRL_NOMRATE_HI)
 
1770
                        + stv0367_readbits(state, F367TER_TRL_NOMRATE_LO) * 2
 
1771
                        + stv0367_readbits(state, F367TER_TRL_NOMRATE_LSB));
 
1772
 
 
1773
                timing_offset = ((signed)(1000000 / trl_nomrate) *
 
1774
                                                        timing_offset) / 2048;
 
1775
                tempo--;
 
1776
        }
 
1777
 
 
1778
        if (timing_offset <= 0) {
 
1779
                timing_offset = (timing_offset - 11) / 22;
 
1780
                step = -1;
 
1781
        } else {
 
1782
                timing_offset = (timing_offset + 11) / 22;
 
1783
                step = 1;
 
1784
        }
 
1785
 
 
1786
        for (counter = 0; counter < abs(timing_offset); counter++) {
 
1787
                trl_nomrate += step;
 
1788
                stv0367_writebits(state, F367TER_TRL_NOMRATE_LSB,
 
1789
                                                trl_nomrate % 2);
 
1790
                stv0367_writebits(state, F367TER_TRL_NOMRATE_LO,
 
1791
                                                trl_nomrate / 2);
 
1792
                usleep_range(1000, 2000);
 
1793
        }
 
1794
 
 
1795
        usleep_range(5000, 6000);
 
1796
        /* unlocks could happen in case of trl centring big step,
 
1797
        then a core off/on restarts demod */
 
1798
        u_var = stv0367_readbits(state, F367TER_LK);
 
1799
 
 
1800
        if (!u_var) {
 
1801
                stv0367_writebits(state, F367TER_CORE_ACTIVE, 0);
 
1802
                msleep(20);
 
1803
                stv0367_writebits(state, F367TER_CORE_ACTIVE, 1);
 
1804
        }
 
1805
 
 
1806
        return 0;
 
1807
}
 
1808
 
 
1809
static int stv0367ter_set_frontend(struct dvb_frontend *fe,
 
1810
                                struct dvb_frontend_parameters *param)
 
1811
{
 
1812
        struct dvb_ofdm_parameters *op = &param->u.ofdm;
 
1813
        struct stv0367_state *state = fe->demodulator_priv;
 
1814
        struct stv0367ter_state *ter_state = state->ter_state;
 
1815
 
 
1816
        /*u8 trials[2]; */
 
1817
        s8 num_trials, index;
 
1818
        u8 SenseTrials[] = { INVERSION_ON, INVERSION_OFF };
 
1819
 
 
1820
        stv0367ter_init(fe);
 
1821
 
 
1822
        if (fe->ops.tuner_ops.set_params) {
 
1823
                if (fe->ops.i2c_gate_ctrl)
 
1824
                        fe->ops.i2c_gate_ctrl(fe, 1);
 
1825
                fe->ops.tuner_ops.set_params(fe, param);
 
1826
                if (fe->ops.i2c_gate_ctrl)
 
1827
                        fe->ops.i2c_gate_ctrl(fe, 0);
 
1828
        }
 
1829
 
 
1830
        switch (op->transmission_mode) {
 
1831
        default:
 
1832
        case TRANSMISSION_MODE_AUTO:
 
1833
        case TRANSMISSION_MODE_2K:
 
1834
                ter_state->mode = FE_TER_MODE_2K;
 
1835
                break;
 
1836
/*      case TRANSMISSION_MODE_4K:
 
1837
                pLook.mode = FE_TER_MODE_4K;
 
1838
                break;*/
 
1839
        case TRANSMISSION_MODE_8K:
 
1840
                ter_state->mode = FE_TER_MODE_8K;
 
1841
                break;
 
1842
        }
 
1843
 
 
1844
        switch (op->guard_interval) {
 
1845
        default:
 
1846
        case GUARD_INTERVAL_1_32:
 
1847
        case GUARD_INTERVAL_1_16:
 
1848
        case GUARD_INTERVAL_1_8:
 
1849
        case GUARD_INTERVAL_1_4:
 
1850
                ter_state->guard = op->guard_interval;
 
1851
                break;
 
1852
        case GUARD_INTERVAL_AUTO:
 
1853
                ter_state->guard = GUARD_INTERVAL_1_32;
 
1854
                break;
 
1855
        }
 
1856
 
 
1857
        switch (op->bandwidth) {
 
1858
        case BANDWIDTH_6_MHZ:
 
1859
                ter_state->bw = FE_TER_CHAN_BW_6M;
 
1860
                break;
 
1861
        case BANDWIDTH_7_MHZ:
 
1862
                ter_state->bw = FE_TER_CHAN_BW_7M;
 
1863
                break;
 
1864
        case BANDWIDTH_8_MHZ:
 
1865
        default:
 
1866
                ter_state->bw = FE_TER_CHAN_BW_8M;
 
1867
        }
 
1868
 
 
1869
        ter_state->hierarchy = FE_TER_HIER_NONE;
 
1870
 
 
1871
        switch (param->inversion) {
 
1872
        case INVERSION_OFF:
 
1873
        case INVERSION_ON:
 
1874
                num_trials = 1;
 
1875
                break;
 
1876
        default:
 
1877
                num_trials = 2;
 
1878
                if (ter_state->first_lock)
 
1879
                        num_trials = 1;
 
1880
                break;
 
1881
        }
 
1882
 
 
1883
        ter_state->state = FE_TER_NOLOCK;
 
1884
        index = 0;
 
1885
 
 
1886
        while (((index) < num_trials) && (ter_state->state != FE_TER_LOCKOK)) {
 
1887
                if (!ter_state->first_lock) {
 
1888
                        if (param->inversion == INVERSION_AUTO)
 
1889
                                ter_state->sense = SenseTrials[index];
 
1890
 
 
1891
                }
 
1892
                stv0367ter_algo(fe,/* &pLook, result,*/ param);
 
1893
 
 
1894
                if ((ter_state->state == FE_TER_LOCKOK) &&
 
1895
                                (param->inversion == INVERSION_AUTO) &&
 
1896
                                                                (index == 1)) {
 
1897
                        /* invert spectrum sense */
 
1898
                        SenseTrials[index] = SenseTrials[0];
 
1899
                        SenseTrials[(index + 1) % 2] = (SenseTrials[1] + 1) % 2;
 
1900
                }
 
1901
 
 
1902
                index++;
 
1903
        }
 
1904
 
 
1905
        return 0;
 
1906
}
 
1907
 
 
1908
static int stv0367ter_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
 
1909
{
 
1910
        struct stv0367_state *state = fe->demodulator_priv;
 
1911
        struct stv0367ter_state *ter_state = state->ter_state;
 
1912
        u32 errs = 0;
 
1913
 
 
1914
        /*wait for counting completion*/
 
1915
        if (stv0367_readbits(state, F367TER_SFERRC_OLDVALUE) == 0) {
 
1916
                errs =
 
1917
                        ((u32)stv0367_readbits(state, F367TER_ERR_CNT1)
 
1918
                        * (1 << 16))
 
1919
                        + ((u32)stv0367_readbits(state, F367TER_ERR_CNT1_HI)
 
1920
                        * (1 << 8))
 
1921
                        + ((u32)stv0367_readbits(state, F367TER_ERR_CNT1_LO));
 
1922
                ter_state->ucblocks = errs;
 
1923
        }
 
1924
 
 
1925
        (*ucblocks) = ter_state->ucblocks;
 
1926
 
 
1927
        return 0;
 
1928
}
 
1929
 
 
1930
static int stv0367ter_get_frontend(struct dvb_frontend *fe,
 
1931
                                  struct dvb_frontend_parameters *param)
 
1932
{
 
1933
        struct stv0367_state *state = fe->demodulator_priv;
 
1934
        struct stv0367ter_state *ter_state = state->ter_state;
 
1935
        struct dvb_ofdm_parameters *op = &param->u.ofdm;
 
1936
        struct dtv_frontend_properties *c = &fe->dtv_property_cache;
 
1937
 
 
1938
        int error = 0;
 
1939
        enum stv0367_ter_mode mode;
 
1940
        int constell = 0,/* snr = 0,*/ Data = 0;
 
1941
 
 
1942
        param->frequency = stv0367_get_tuner_freq(fe);
 
1943
        if ((int)param->frequency < 0)
 
1944
                param->frequency = c->frequency;
 
1945
 
 
1946
        constell = stv0367_readbits(state, F367TER_TPS_CONST);
 
1947
        if (constell == 0)
 
1948
                op->constellation = QPSK;
 
1949
        else if (constell == 1)
 
1950
                op->constellation = QAM_16;
 
1951
        else
 
1952
                op->constellation = QAM_64;
 
1953
 
 
1954
        param->inversion = stv0367_readbits(state, F367TER_INV_SPECTR);
 
1955
 
 
1956
        /* Get the Hierarchical mode */
 
1957
        Data = stv0367_readbits(state, F367TER_TPS_HIERMODE);
 
1958
 
 
1959
        switch (Data) {
 
1960
        case 0:
 
1961
                op->hierarchy_information = HIERARCHY_NONE;
 
1962
                break;
 
1963
        case 1:
 
1964
                op->hierarchy_information = HIERARCHY_1;
 
1965
                break;
 
1966
        case 2:
 
1967
                op->hierarchy_information = HIERARCHY_2;
 
1968
                break;
 
1969
        case 3:
 
1970
                op->hierarchy_information = HIERARCHY_4;
 
1971
                break;
 
1972
        default:
 
1973
                op->hierarchy_information = HIERARCHY_AUTO;
 
1974
                break; /* error */
 
1975
        }
 
1976
 
 
1977
        /* Get the FEC Rate */
 
1978
        if (ter_state->hierarchy == FE_TER_HIER_LOW_PRIO)
 
1979
                Data = stv0367_readbits(state, F367TER_TPS_LPCODE);
 
1980
        else
 
1981
                Data = stv0367_readbits(state, F367TER_TPS_HPCODE);
 
1982
 
 
1983
        switch (Data) {
 
1984
        case 0:
 
1985
                op->code_rate_HP = FEC_1_2;
 
1986
                break;
 
1987
        case 1:
 
1988
                op->code_rate_HP = FEC_2_3;
 
1989
                break;
 
1990
        case 2:
 
1991
                op->code_rate_HP = FEC_3_4;
 
1992
                break;
 
1993
        case 3:
 
1994
                op->code_rate_HP = FEC_5_6;
 
1995
                break;
 
1996
        case 4:
 
1997
                op->code_rate_HP = FEC_7_8;
 
1998
                break;
 
1999
        default:
 
2000
                op->code_rate_HP = FEC_AUTO;
 
2001
                break; /* error */
 
2002
        }
 
2003
 
 
2004
        mode = stv0367_readbits(state, F367TER_SYR_MODE);
 
2005
 
 
2006
        switch (mode) {
 
2007
        case FE_TER_MODE_2K:
 
2008
                op->transmission_mode = TRANSMISSION_MODE_2K;
 
2009
                break;
 
2010
/*      case FE_TER_MODE_4K:
 
2011
                op->transmission_mode = TRANSMISSION_MODE_4K;
 
2012
                break;*/
 
2013
        case FE_TER_MODE_8K:
 
2014
                op->transmission_mode = TRANSMISSION_MODE_8K;
 
2015
                break;
 
2016
        default:
 
2017
                op->transmission_mode = TRANSMISSION_MODE_AUTO;
 
2018
        }
 
2019
 
 
2020
        op->guard_interval = stv0367_readbits(state, F367TER_SYR_GUARD);
 
2021
 
 
2022
        return error;
 
2023
}
 
2024
 
 
2025
static int stv0367ter_read_snr(struct dvb_frontend *fe, u16 *snr)
 
2026
{
 
2027
        struct stv0367_state *state = fe->demodulator_priv;
 
2028
        u32 snru32 = 0;
 
2029
        int cpt = 0;
 
2030
        u8 cut = stv0367_readbits(state, F367TER_IDENTIFICATIONREG);
 
2031
 
 
2032
        while (cpt < 10) {
 
2033
                usleep_range(2000, 3000);
 
2034
                if (cut == 0x50) /*cut 1.0 cut 1.1*/
 
2035
                        snru32 += stv0367_readbits(state, F367TER_CHCSNR) / 4;
 
2036
                else /*cu2.0*/
 
2037
                        snru32 += 125 * stv0367_readbits(state, F367TER_CHCSNR);
 
2038
 
 
2039
                cpt++;
 
2040
        }
 
2041
 
 
2042
        snru32 /= 10;/*average on 10 values*/
 
2043
 
 
2044
        *snr = snru32 / 1000;
 
2045
 
 
2046
        return 0;
 
2047
}
 
2048
 
 
2049
#if 0
 
2050
static int stv0367ter_status(struct dvb_frontend *fe)
 
2051
{
 
2052
 
 
2053
        struct stv0367_state *state = fe->demodulator_priv;
 
2054
        struct stv0367ter_state *ter_state = state->ter_state;
 
2055
        int locked = FALSE;
 
2056
 
 
2057
        locked = (stv0367_readbits(state, F367TER_LK));
 
2058
        if (!locked)
 
2059
                ter_state->unlock_counter += 1;
 
2060
        else
 
2061
                ter_state->unlock_counter = 0;
 
2062
 
 
2063
        if (ter_state->unlock_counter > 2) {
 
2064
                if (!stv0367_readbits(state, F367TER_TPS_LOCK) ||
 
2065
                                (!stv0367_readbits(state, F367TER_LK))) {
 
2066
                        stv0367_writebits(state, F367TER_CORE_ACTIVE, 0);
 
2067
                        usleep_range(2000, 3000);
 
2068
                        stv0367_writebits(state, F367TER_CORE_ACTIVE, 1);
 
2069
                        msleep(350);
 
2070
                        locked = (stv0367_readbits(state, F367TER_TPS_LOCK)) &&
 
2071
                                        (stv0367_readbits(state, F367TER_LK));
 
2072
                }
 
2073
 
 
2074
        }
 
2075
 
 
2076
        return locked;
 
2077
}
 
2078
#endif
 
2079
static int stv0367ter_read_status(struct dvb_frontend *fe, fe_status_t *status)
 
2080
{
 
2081
        struct stv0367_state *state = fe->demodulator_priv;
 
2082
 
 
2083
        dprintk("%s:\n", __func__);
 
2084
 
 
2085
        *status = 0;
 
2086
 
 
2087
        if (stv0367_readbits(state, F367TER_LK)) {
 
2088
                *status |= FE_HAS_LOCK;
 
2089
                dprintk("%s: stv0367 has locked\n", __func__);
 
2090
        }
 
2091
 
 
2092
        return 0;
 
2093
}
 
2094
 
 
2095
static int stv0367ter_read_ber(struct dvb_frontend *fe, u32 *ber)
 
2096
{
 
2097
        struct stv0367_state *state = fe->demodulator_priv;
 
2098
        struct stv0367ter_state *ter_state = state->ter_state;
 
2099
        u32 Errors = 0, tber = 0, temporary = 0;
 
2100
        int abc = 0, def = 0;
 
2101
 
 
2102
 
 
2103
        /*wait for counting completion*/
 
2104
        if (stv0367_readbits(state, F367TER_SFERRC_OLDVALUE) == 0)
 
2105
                Errors = ((u32)stv0367_readbits(state, F367TER_SFEC_ERR_CNT)
 
2106
                        * (1 << 16))
 
2107
                        + ((u32)stv0367_readbits(state, F367TER_SFEC_ERR_CNT_HI)
 
2108
                        * (1 << 8))
 
2109
                        + ((u32)stv0367_readbits(state,
 
2110
                                                F367TER_SFEC_ERR_CNT_LO));
 
2111
        /*measurement not completed, load previous value*/
 
2112
        else {
 
2113
                tber = ter_state->pBER;
 
2114
                return 0;
 
2115
        }
 
2116
 
 
2117
        abc = stv0367_readbits(state, F367TER_SFEC_ERR_SOURCE);
 
2118
        def = stv0367_readbits(state, F367TER_SFEC_NUM_EVENT);
 
2119
 
 
2120
        if (Errors == 0) {
 
2121
                tber = 0;
 
2122
        } else if (abc == 0x7) {
 
2123
                if (Errors <= 4) {
 
2124
                        temporary = (Errors * 1000000000) / (8 * (1 << 14));
 
2125
                        temporary =  temporary;
 
2126
                } else if (Errors <= 42) {
 
2127
                        temporary = (Errors * 100000000) / (8 * (1 << 14));
 
2128
                        temporary = temporary * 10;
 
2129
                } else if (Errors <= 429) {
 
2130
                        temporary = (Errors * 10000000) / (8 * (1 << 14));
 
2131
                        temporary = temporary * 100;
 
2132
                } else if (Errors <= 4294) {
 
2133
                        temporary = (Errors * 1000000) / (8 * (1 << 14));
 
2134
                        temporary = temporary * 1000;
 
2135
                } else if (Errors <= 42949) {
 
2136
                        temporary = (Errors * 100000) / (8 * (1 << 14));
 
2137
                        temporary = temporary * 10000;
 
2138
                } else if (Errors <= 429496) {
 
2139
                        temporary = (Errors * 10000) / (8 * (1 << 14));
 
2140
                        temporary = temporary * 100000;
 
2141
                } else { /*if (Errors<4294967) 2^22 max error*/
 
2142
                        temporary = (Errors * 1000) / (8 * (1 << 14));
 
2143
                        temporary = temporary * 100000; /* still to *10 */
 
2144
                }
 
2145
 
 
2146
                /* Byte error*/
 
2147
                if (def == 2)
 
2148
                        /*tber=Errors/(8*(1 <<14));*/
 
2149
                        tber = temporary;
 
2150
                else if (def == 3)
 
2151
                        /*tber=Errors/(8*(1 <<16));*/
 
2152
                        tber = temporary / 4;
 
2153
                else if (def == 4)
 
2154
                        /*tber=Errors/(8*(1 <<18));*/
 
2155
                        tber = temporary / 16;
 
2156
                else if (def == 5)
 
2157
                        /*tber=Errors/(8*(1 <<20));*/
 
2158
                        tber = temporary / 64;
 
2159
                else if (def == 6)
 
2160
                        /*tber=Errors/(8*(1 <<22));*/
 
2161
                        tber = temporary / 256;
 
2162
                else
 
2163
                        /* should not pass here*/
 
2164
                        tber = 0;
 
2165
 
 
2166
                if ((Errors < 4294967) && (Errors > 429496))
 
2167
                        tber *= 10;
 
2168
 
 
2169
        }
 
2170
 
 
2171
        /* save actual value */
 
2172
        ter_state->pBER = tber;
 
2173
 
 
2174
        (*ber) = tber;
 
2175
 
 
2176
        return 0;
 
2177
}
 
2178
#if 0
 
2179
static u32 stv0367ter_get_per(struct stv0367_state *state)
 
2180
{
 
2181
        struct stv0367ter_state *ter_state = state->ter_state;
 
2182
        u32 Errors = 0, Per = 0, temporary = 0;
 
2183
        int abc = 0, def = 0, cpt = 0;
 
2184
 
 
2185
        while (((stv0367_readbits(state, F367TER_SFERRC_OLDVALUE) == 1) &&
 
2186
                        (cpt < 400)) || ((Errors == 0) && (cpt < 400))) {
 
2187
                usleep_range(1000, 2000);
 
2188
                Errors = ((u32)stv0367_readbits(state, F367TER_ERR_CNT1)
 
2189
                        * (1 << 16))
 
2190
                        + ((u32)stv0367_readbits(state, F367TER_ERR_CNT1_HI)
 
2191
                        * (1 << 8))
 
2192
                        + ((u32)stv0367_readbits(state, F367TER_ERR_CNT1_LO));
 
2193
                cpt++;
 
2194
        }
 
2195
        abc = stv0367_readbits(state, F367TER_ERR_SRC1);
 
2196
        def = stv0367_readbits(state, F367TER_NUM_EVT1);
 
2197
 
 
2198
        if (Errors == 0)
 
2199
                Per = 0;
 
2200
        else if (abc == 0x9) {
 
2201
                if (Errors <= 4) {
 
2202
                        temporary = (Errors * 1000000000) / (8 * (1 << 8));
 
2203
                        temporary =  temporary;
 
2204
                } else if (Errors <= 42) {
 
2205
                        temporary = (Errors * 100000000) / (8 * (1 << 8));
 
2206
                        temporary = temporary * 10;
 
2207
                } else if (Errors <= 429) {
 
2208
                        temporary = (Errors * 10000000) / (8 * (1 << 8));
 
2209
                        temporary = temporary * 100;
 
2210
                } else if (Errors <= 4294) {
 
2211
                        temporary = (Errors * 1000000) / (8 * (1 << 8));
 
2212
                        temporary = temporary * 1000;
 
2213
                } else if (Errors <= 42949) {
 
2214
                        temporary = (Errors * 100000) / (8 * (1 << 8));
 
2215
                        temporary = temporary * 10000;
 
2216
                } else { /*if(Errors<=429496)  2^16 errors max*/
 
2217
                        temporary = (Errors * 10000) / (8 * (1 << 8));
 
2218
                        temporary = temporary * 100000;
 
2219
                }
 
2220
 
 
2221
                /* pkt error*/
 
2222
                if (def == 2)
 
2223
                        /*Per=Errors/(1 << 8);*/
 
2224
                        Per = temporary;
 
2225
                else if (def == 3)
 
2226
                        /*Per=Errors/(1 << 10);*/
 
2227
                        Per = temporary / 4;
 
2228
                else if (def == 4)
 
2229
                        /*Per=Errors/(1 << 12);*/
 
2230
                        Per = temporary / 16;
 
2231
                else if (def == 5)
 
2232
                        /*Per=Errors/(1 << 14);*/
 
2233
                        Per = temporary / 64;
 
2234
                else if (def == 6)
 
2235
                        /*Per=Errors/(1 << 16);*/
 
2236
                        Per = temporary / 256;
 
2237
                else
 
2238
                        Per = 0;
 
2239
 
 
2240
        }
 
2241
        /* save actual value */
 
2242
        ter_state->pPER = Per;
 
2243
 
 
2244
        return Per;
 
2245
}
 
2246
#endif
 
2247
static int stv0367_get_tune_settings(struct dvb_frontend *fe,
 
2248
                                        struct dvb_frontend_tune_settings
 
2249
                                        *fe_tune_settings)
 
2250
{
 
2251
        fe_tune_settings->min_delay_ms = 1000;
 
2252
        fe_tune_settings->step_size = 0;
 
2253
        fe_tune_settings->max_drift = 0;
 
2254
 
 
2255
        return 0;
 
2256
}
 
2257
 
 
2258
static void stv0367_release(struct dvb_frontend *fe)
 
2259
{
 
2260
        struct stv0367_state *state = fe->demodulator_priv;
 
2261
 
 
2262
        kfree(state->ter_state);
 
2263
        kfree(state->cab_state);
 
2264
        kfree(state);
 
2265
}
 
2266
 
 
2267
static struct dvb_frontend_ops stv0367ter_ops = {
 
2268
        .info = {
 
2269
                .name                   = "ST STV0367 DVB-T",
 
2270
                .type                   = FE_OFDM,
 
2271
                .frequency_min          = 47000000,
 
2272
                .frequency_max          = 862000000,
 
2273
                .frequency_stepsize     = 15625,
 
2274
                .frequency_tolerance    = 0,
 
2275
                .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |
 
2276
                        FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
 
2277
                        FE_CAN_FEC_AUTO |
 
2278
                        FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
 
2279
                        FE_CAN_QAM_128 | FE_CAN_QAM_256 | FE_CAN_QAM_AUTO |
 
2280
                        FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_RECOVER |
 
2281
                        FE_CAN_INVERSION_AUTO |
 
2282
                        FE_CAN_MUTE_TS
 
2283
        },
 
2284
        .release = stv0367_release,
 
2285
        .init = stv0367ter_init,
 
2286
        .sleep = stv0367ter_sleep,
 
2287
        .i2c_gate_ctrl = stv0367ter_gate_ctrl,
 
2288
        .set_frontend = stv0367ter_set_frontend,
 
2289
        .get_frontend = stv0367ter_get_frontend,
 
2290
        .get_tune_settings = stv0367_get_tune_settings,
 
2291
        .read_status = stv0367ter_read_status,
 
2292
        .read_ber = stv0367ter_read_ber,/* too slow */
 
2293
/*      .read_signal_strength = stv0367_read_signal_strength,*/
 
2294
        .read_snr = stv0367ter_read_snr,
 
2295
        .read_ucblocks = stv0367ter_read_ucblocks,
 
2296
};
 
2297
 
 
2298
struct dvb_frontend *stv0367ter_attach(const struct stv0367_config *config,
 
2299
                                   struct i2c_adapter *i2c)
 
2300
{
 
2301
        struct stv0367_state *state = NULL;
 
2302
        struct stv0367ter_state *ter_state = NULL;
 
2303
 
 
2304
        /* allocate memory for the internal state */
 
2305
        state = kzalloc(sizeof(struct stv0367_state), GFP_KERNEL);
 
2306
        if (state == NULL)
 
2307
                goto error;
 
2308
        ter_state = kzalloc(sizeof(struct stv0367ter_state), GFP_KERNEL);
 
2309
        if (ter_state == NULL)
 
2310
                goto error;
 
2311
 
 
2312
        /* setup the state */
 
2313
        state->i2c = i2c;
 
2314
        state->config = config;
 
2315
        state->ter_state = ter_state;
 
2316
        state->fe.ops = stv0367ter_ops;
 
2317
        state->fe.demodulator_priv = state;
 
2318
        state->chip_id = stv0367_readreg(state, 0xf000);
 
2319
 
 
2320
        dprintk("%s: chip_id = 0x%x\n", __func__, state->chip_id);
 
2321
 
 
2322
        /* check if the demod is there */
 
2323
        if ((state->chip_id != 0x50) && (state->chip_id != 0x60))
 
2324
                goto error;
 
2325
 
 
2326
        return &state->fe;
 
2327
 
 
2328
error:
 
2329
        kfree(ter_state);
 
2330
        kfree(state);
 
2331
        return NULL;
 
2332
}
 
2333
EXPORT_SYMBOL(stv0367ter_attach);
 
2334
 
 
2335
static int stv0367cab_gate_ctrl(struct dvb_frontend *fe, int enable)
 
2336
{
 
2337
        struct stv0367_state *state = fe->demodulator_priv;
 
2338
 
 
2339
        dprintk("%s:\n", __func__);
 
2340
 
 
2341
        stv0367_writebits(state, F367CAB_I2CT_ON, (enable > 0) ? 1 : 0);
 
2342
 
 
2343
        return 0;
 
2344
}
 
2345
 
 
2346
static u32 stv0367cab_get_mclk(struct dvb_frontend *fe, u32 ExtClk_Hz)
 
2347
{
 
2348
        struct stv0367_state *state = fe->demodulator_priv;
 
2349
        u32 mclk_Hz = 0;/* master clock frequency (Hz) */
 
2350
        u32 M, N, P;
 
2351
 
 
2352
 
 
2353
        if (stv0367_readbits(state, F367CAB_BYPASS_PLLXN) == 0) {
 
2354
                N = (u32)stv0367_readbits(state, F367CAB_PLL_NDIV);
 
2355
                if (N == 0)
 
2356
                        N = N + 1;
 
2357
 
 
2358
                M = (u32)stv0367_readbits(state, F367CAB_PLL_MDIV);
 
2359
                if (M == 0)
 
2360
                        M = M + 1;
 
2361
 
 
2362
                P = (u32)stv0367_readbits(state, F367CAB_PLL_PDIV);
 
2363
 
 
2364
                if (P > 5)
 
2365
                        P = 5;
 
2366
 
 
2367
                mclk_Hz = ((ExtClk_Hz / 2) * N) / (M * (1 << P));
 
2368
                dprintk("stv0367cab_get_mclk BYPASS_PLLXN mclk_Hz=%d\n",
 
2369
                                                                mclk_Hz);
 
2370
        } else
 
2371
                mclk_Hz = ExtClk_Hz;
 
2372
 
 
2373
        dprintk("stv0367cab_get_mclk final mclk_Hz=%d\n", mclk_Hz);
 
2374
 
 
2375
        return mclk_Hz;
 
2376
}
 
2377
 
 
2378
static u32 stv0367cab_get_adc_freq(struct dvb_frontend *fe, u32 ExtClk_Hz)
 
2379
{
 
2380
        u32 ADCClk_Hz = ExtClk_Hz;
 
2381
 
 
2382
        ADCClk_Hz = stv0367cab_get_mclk(fe, ExtClk_Hz);
 
2383
 
 
2384
        return ADCClk_Hz;
 
2385
}
 
2386
 
 
2387
enum stv0367cab_mod stv0367cab_SetQamSize(struct stv0367_state *state,
 
2388
                                        u32 SymbolRate,
 
2389
                                        enum stv0367cab_mod QAMSize)
 
2390
{
 
2391
        /* Set QAM size */
 
2392
        stv0367_writebits(state, F367CAB_QAM_MODE, QAMSize);
 
2393
 
 
2394
        /* Set Registers settings specific to the QAM size */
 
2395
        switch (QAMSize) {
 
2396
        case FE_CAB_MOD_QAM4:
 
2397
                stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
 
2398
                break;
 
2399
        case FE_CAB_MOD_QAM16:
 
2400
                stv0367_writereg(state, R367CAB_AGC_PWR_REF_L, 0x64);
 
2401
                stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
 
2402
                stv0367_writereg(state, R367CAB_FSM_STATE, 0x90);
 
2403
                stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
 
2404
                stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa7);
 
2405
                stv0367_writereg(state, R367CAB_EQU_CRL_LD_SEN, 0x95);
 
2406
                stv0367_writereg(state, R367CAB_EQU_CRL_LIMITER, 0x40);
 
2407
                stv0367_writereg(state, R367CAB_EQU_PNT_GAIN, 0x8a);
 
2408
                break;
 
2409
        case FE_CAB_MOD_QAM32:
 
2410
                stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
 
2411
                stv0367_writereg(state, R367CAB_AGC_PWR_REF_L, 0x6e);
 
2412
                stv0367_writereg(state, R367CAB_FSM_STATE, 0xb0);
 
2413
                stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
 
2414
                stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xb7);
 
2415
                stv0367_writereg(state, R367CAB_EQU_CRL_LD_SEN, 0x9d);
 
2416
                stv0367_writereg(state, R367CAB_EQU_CRL_LIMITER, 0x7f);
 
2417
                stv0367_writereg(state, R367CAB_EQU_PNT_GAIN, 0xa7);
 
2418
                break;
 
2419
        case FE_CAB_MOD_QAM64:
 
2420
                stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x82);
 
2421
                stv0367_writereg(state, R367CAB_AGC_PWR_REF_L, 0x5a);
 
2422
                if (SymbolRate > 45000000) {
 
2423
                        stv0367_writereg(state, R367CAB_FSM_STATE, 0xb0);
 
2424
                        stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
 
2425
                        stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa5);
 
2426
                } else if (SymbolRate > 25000000) {
 
2427
                        stv0367_writereg(state, R367CAB_FSM_STATE, 0xa0);
 
2428
                        stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
 
2429
                        stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa6);
 
2430
                } else {
 
2431
                        stv0367_writereg(state, R367CAB_FSM_STATE, 0xa0);
 
2432
                        stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xd1);
 
2433
                        stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa7);
 
2434
                }
 
2435
                stv0367_writereg(state, R367CAB_EQU_CRL_LD_SEN, 0x95);
 
2436
                stv0367_writereg(state, R367CAB_EQU_CRL_LIMITER, 0x40);
 
2437
                stv0367_writereg(state, R367CAB_EQU_PNT_GAIN, 0x99);
 
2438
                break;
 
2439
        case FE_CAB_MOD_QAM128:
 
2440
                stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
 
2441
                stv0367_writereg(state, R367CAB_AGC_PWR_REF_L, 0x76);
 
2442
                stv0367_writereg(state, R367CAB_FSM_STATE, 0x90);
 
2443
                stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xb1);
 
2444
                if (SymbolRate > 45000000)
 
2445
                        stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa7);
 
2446
                else if (SymbolRate > 25000000)
 
2447
                        stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa6);
 
2448
                else
 
2449
                        stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0x97);
 
2450
 
 
2451
                stv0367_writereg(state, R367CAB_EQU_CRL_LD_SEN, 0x8e);
 
2452
                stv0367_writereg(state, R367CAB_EQU_CRL_LIMITER, 0x7f);
 
2453
                stv0367_writereg(state, R367CAB_EQU_PNT_GAIN, 0xa7);
 
2454
                break;
 
2455
        case FE_CAB_MOD_QAM256:
 
2456
                stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x94);
 
2457
                stv0367_writereg(state, R367CAB_AGC_PWR_REF_L, 0x5a);
 
2458
                stv0367_writereg(state, R367CAB_FSM_STATE, 0xa0);
 
2459
                if (SymbolRate > 45000000)
 
2460
                        stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
 
2461
                else if (SymbolRate > 25000000)
 
2462
                        stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
 
2463
                else
 
2464
                        stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xd1);
 
2465
 
 
2466
                stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa7);
 
2467
                stv0367_writereg(state, R367CAB_EQU_CRL_LD_SEN, 0x85);
 
2468
                stv0367_writereg(state, R367CAB_EQU_CRL_LIMITER, 0x40);
 
2469
                stv0367_writereg(state, R367CAB_EQU_PNT_GAIN, 0xa7);
 
2470
                break;
 
2471
        case FE_CAB_MOD_QAM512:
 
2472
                stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
 
2473
                break;
 
2474
        case FE_CAB_MOD_QAM1024:
 
2475
                stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
 
2476
                break;
 
2477
        default:
 
2478
                break;
 
2479
        }
 
2480
 
 
2481
        return QAMSize;
 
2482
}
 
2483
 
 
2484
static u32 stv0367cab_set_derot_freq(struct stv0367_state *state,
 
2485
                                        u32 adc_hz, s32 derot_hz)
 
2486
{
 
2487
        u32 sampled_if = 0;
 
2488
        u32 adc_khz;
 
2489
 
 
2490
        adc_khz = adc_hz / 1000;
 
2491
 
 
2492
        dprintk("%s: adc_hz=%d derot_hz=%d\n", __func__, adc_hz, derot_hz);
 
2493
 
 
2494
        if (adc_khz != 0) {
 
2495
                if (derot_hz < 1000000)
 
2496
                        derot_hz = adc_hz / 4; /* ZIF operation */
 
2497
                if (derot_hz > adc_hz)
 
2498
                        derot_hz = derot_hz - adc_hz;
 
2499
                sampled_if = (u32)derot_hz / 1000;
 
2500
                sampled_if *= 32768;
 
2501
                sampled_if /= adc_khz;
 
2502
                sampled_if *= 256;
 
2503
        }
 
2504
 
 
2505
        if (sampled_if > 8388607)
 
2506
                sampled_if = 8388607;
 
2507
 
 
2508
        dprintk("%s: sampled_if=0x%x\n", __func__, sampled_if);
 
2509
 
 
2510
        stv0367_writereg(state, R367CAB_MIX_NCO_LL, sampled_if);
 
2511
        stv0367_writereg(state, R367CAB_MIX_NCO_HL, (sampled_if >> 8));
 
2512
        stv0367_writebits(state, F367CAB_MIX_NCO_INC_HH, (sampled_if >> 16));
 
2513
 
 
2514
        return derot_hz;
 
2515
}
 
2516
 
 
2517
static u32 stv0367cab_get_derot_freq(struct stv0367_state *state, u32 adc_hz)
 
2518
{
 
2519
        u32 sampled_if;
 
2520
 
 
2521
        sampled_if = stv0367_readbits(state, F367CAB_MIX_NCO_INC_LL) +
 
2522
                        (stv0367_readbits(state, F367CAB_MIX_NCO_INC_HL) << 8) +
 
2523
                        (stv0367_readbits(state, F367CAB_MIX_NCO_INC_HH) << 16);
 
2524
 
 
2525
        sampled_if /= 256;
 
2526
        sampled_if *= (adc_hz / 1000);
 
2527
        sampled_if += 1;
 
2528
        sampled_if /= 32768;
 
2529
 
 
2530
        return sampled_if;
 
2531
}
 
2532
 
 
2533
static u32 stv0367cab_set_srate(struct stv0367_state *state, u32 adc_hz,
 
2534
                        u32 mclk_hz, u32 SymbolRate,
 
2535
                        enum stv0367cab_mod QAMSize)
 
2536
{
 
2537
        u32 QamSizeCorr = 0;
 
2538
        u32 u32_tmp = 0, u32_tmp1 = 0;
 
2539
        u32 adp_khz;
 
2540
 
 
2541
        dprintk("%s:\n", __func__);
 
2542
 
 
2543
        /* Set Correction factor of SRC gain */
 
2544
        switch (QAMSize) {
 
2545
        case FE_CAB_MOD_QAM4:
 
2546
                QamSizeCorr = 1110;
 
2547
                break;
 
2548
        case FE_CAB_MOD_QAM16:
 
2549
                QamSizeCorr = 1032;
 
2550
                break;
 
2551
        case FE_CAB_MOD_QAM32:
 
2552
                QamSizeCorr =  954;
 
2553
                break;
 
2554
        case FE_CAB_MOD_QAM64:
 
2555
                QamSizeCorr =  983;
 
2556
                break;
 
2557
        case FE_CAB_MOD_QAM128:
 
2558
                QamSizeCorr =  957;
 
2559
                break;
 
2560
        case FE_CAB_MOD_QAM256:
 
2561
                QamSizeCorr =  948;
 
2562
                break;
 
2563
        case FE_CAB_MOD_QAM512:
 
2564
                QamSizeCorr =    0;
 
2565
                break;
 
2566
        case FE_CAB_MOD_QAM1024:
 
2567
                QamSizeCorr =  944;
 
2568
                break;
 
2569
        default:
 
2570
                break;
 
2571
        }
 
2572
 
 
2573
        /* Transfer ratio calculation */
 
2574
        if (adc_hz != 0) {
 
2575
                u32_tmp = 256 * SymbolRate;
 
2576
                u32_tmp = u32_tmp / adc_hz;
 
2577
        }
 
2578
        stv0367_writereg(state, R367CAB_EQU_CRL_TFR, (u8)u32_tmp);
 
2579
 
 
2580
        /* Symbol rate and SRC gain calculation */
 
2581
        adp_khz = (mclk_hz >> 1) / 1000;/* TRL works at half the system clock */
 
2582
        if (adp_khz != 0) {
 
2583
                u32_tmp = SymbolRate;
 
2584
                u32_tmp1 = SymbolRate;
 
2585
 
 
2586
                if (u32_tmp < 2097152) { /* 2097152 = 2^21 */
 
2587
                        /* Symbol rate calculation */
 
2588
                        u32_tmp *= 2048; /* 2048 = 2^11 */
 
2589
                        u32_tmp = u32_tmp / adp_khz;
 
2590
                        u32_tmp = u32_tmp * 16384; /* 16384 = 2^14 */
 
2591
                        u32_tmp /= 125 ; /* 125 = 1000/2^3 */
 
2592
                        u32_tmp = u32_tmp * 8; /* 8 = 2^3 */
 
2593
 
 
2594
                        /* SRC Gain Calculation */
 
2595
                        u32_tmp1 *= 2048; /* *2*2^10 */
 
2596
                        u32_tmp1 /= 439; /* *2/878 */
 
2597
                        u32_tmp1 *= 256; /* *2^8 */
 
2598
                        u32_tmp1 = u32_tmp1 / adp_khz; /* /(AdpClk in kHz) */
 
2599
                        u32_tmp1 *= QamSizeCorr * 9; /* *1000*corr factor */
 
2600
                        u32_tmp1 = u32_tmp1 / 10000000;
 
2601
 
 
2602
                } else if (u32_tmp < 4194304) { /* 4194304 = 2**22 */
 
2603
                        /* Symbol rate calculation */
 
2604
                        u32_tmp *= 1024 ; /* 1024 = 2**10 */
 
2605
                        u32_tmp = u32_tmp / adp_khz;
 
2606
                        u32_tmp = u32_tmp * 16384; /* 16384 = 2**14 */
 
2607
                        u32_tmp /= 125 ; /* 125 = 1000/2**3 */
 
2608
                        u32_tmp = u32_tmp * 16; /* 16 = 2**4 */
 
2609
 
 
2610
                        /* SRC Gain Calculation */
 
2611
                        u32_tmp1 *= 1024; /* *2*2^9 */
 
2612
                        u32_tmp1 /= 439; /* *2/878 */
 
2613
                        u32_tmp1 *= 256; /* *2^8 */
 
2614
                        u32_tmp1 = u32_tmp1 / adp_khz; /* /(AdpClk in kHz)*/
 
2615
                        u32_tmp1 *= QamSizeCorr * 9; /* *1000*corr factor */
 
2616
                        u32_tmp1 = u32_tmp1 / 5000000;
 
2617
                } else if (u32_tmp < 8388607) { /* 8388607 = 2**23 */
 
2618
                        /* Symbol rate calculation */
 
2619
                        u32_tmp *= 512 ; /* 512 = 2**9 */
 
2620
                        u32_tmp = u32_tmp / adp_khz;
 
2621
                        u32_tmp = u32_tmp * 16384; /* 16384 = 2**14 */
 
2622
                        u32_tmp /= 125 ; /* 125 = 1000/2**3 */
 
2623
                        u32_tmp = u32_tmp * 32; /* 32 = 2**5 */
 
2624
 
 
2625
                        /* SRC Gain Calculation */
 
2626
                        u32_tmp1 *= 512; /* *2*2^8 */
 
2627
                        u32_tmp1 /= 439; /* *2/878 */
 
2628
                        u32_tmp1 *= 256; /* *2^8 */
 
2629
                        u32_tmp1 = u32_tmp1 / adp_khz; /* /(AdpClk in kHz) */
 
2630
                        u32_tmp1 *= QamSizeCorr * 9; /* *1000*corr factor */
 
2631
                        u32_tmp1 = u32_tmp1 / 2500000;
 
2632
                } else {
 
2633
                        /* Symbol rate calculation */
 
2634
                        u32_tmp *= 256 ; /* 256 = 2**8 */
 
2635
                        u32_tmp = u32_tmp / adp_khz;
 
2636
                        u32_tmp = u32_tmp * 16384; /* 16384 = 2**13 */
 
2637
                        u32_tmp /= 125 ; /* 125 = 1000/2**3 */
 
2638
                        u32_tmp = u32_tmp * 64; /* 64 = 2**6 */
 
2639
 
 
2640
                        /* SRC Gain Calculation */
 
2641
                        u32_tmp1 *= 256; /* 2*2^7 */
 
2642
                        u32_tmp1 /= 439; /* *2/878 */
 
2643
                        u32_tmp1 *= 256; /* *2^8 */
 
2644
                        u32_tmp1 = u32_tmp1 / adp_khz; /* /(AdpClk in kHz) */
 
2645
                        u32_tmp1 *= QamSizeCorr * 9; /* *1000*corr factor */
 
2646
                        u32_tmp1 = u32_tmp1 / 1250000;
 
2647
                }
 
2648
        }
 
2649
#if 0
 
2650
        /* Filters' coefficients are calculated and written
 
2651
        into registers only if the filters are enabled */
 
2652
        if (stv0367_readbits(state, F367CAB_ADJ_EN)) {
 
2653
                stv0367cab_SetIirAdjacentcoefficient(state, mclk_hz,
 
2654
                                                                SymbolRate);
 
2655
                /* AllPass filter must be enabled
 
2656
                when the adjacents filter is used */
 
2657
                stv0367_writebits(state, F367CAB_ALLPASSFILT_EN, 1);
 
2658
                stv0367cab_SetAllPasscoefficient(state, mclk_hz, SymbolRate);
 
2659
        } else
 
2660
                /* AllPass filter must be disabled
 
2661
                when the adjacents filter is not used */
 
2662
#endif
 
2663
        stv0367_writebits(state, F367CAB_ALLPASSFILT_EN, 0);
 
2664
 
 
2665
        stv0367_writereg(state, R367CAB_SRC_NCO_LL, u32_tmp);
 
2666
        stv0367_writereg(state, R367CAB_SRC_NCO_LH, (u32_tmp >> 8));
 
2667
        stv0367_writereg(state, R367CAB_SRC_NCO_HL, (u32_tmp >> 16));
 
2668
        stv0367_writereg(state, R367CAB_SRC_NCO_HH, (u32_tmp >> 24));
 
2669
 
 
2670
        stv0367_writereg(state, R367CAB_IQDEM_GAIN_SRC_L, u32_tmp1 & 0x00ff);
 
2671
        stv0367_writebits(state, F367CAB_GAIN_SRC_HI, (u32_tmp1 >> 8) & 0x00ff);
 
2672
 
 
2673
        return SymbolRate ;
 
2674
}
 
2675
 
 
2676
static u32 stv0367cab_GetSymbolRate(struct stv0367_state *state, u32 mclk_hz)
 
2677
{
 
2678
        u32 regsym;
 
2679
        u32 adp_khz;
 
2680
 
 
2681
        regsym = stv0367_readreg(state, R367CAB_SRC_NCO_LL) +
 
2682
                (stv0367_readreg(state, R367CAB_SRC_NCO_LH) << 8) +
 
2683
                (stv0367_readreg(state, R367CAB_SRC_NCO_HL) << 16) +
 
2684
                (stv0367_readreg(state, R367CAB_SRC_NCO_HH) << 24);
 
2685
 
 
2686
        adp_khz = (mclk_hz >> 1) / 1000;/* TRL works at half the system clock */
 
2687
 
 
2688
        if (regsym < 134217728) {               /* 134217728L = 2**27*/
 
2689
                regsym = regsym * 32;           /* 32 = 2**5 */
 
2690
                regsym = regsym / 32768;        /* 32768L = 2**15 */
 
2691
                regsym = adp_khz * regsym;      /* AdpClk in kHz */
 
2692
                regsym = regsym / 128;          /* 128 = 2**7 */
 
2693
                regsym *= 125 ;                 /* 125 = 1000/2**3 */
 
2694
                regsym /= 2048 ;                /* 2048 = 2**11 */
 
2695
        } else if (regsym < 268435456) {        /* 268435456L = 2**28 */
 
2696
                regsym = regsym * 16;           /* 16 = 2**4 */
 
2697
                regsym = regsym / 32768;        /* 32768L = 2**15 */
 
2698
                regsym = adp_khz * regsym;      /* AdpClk in kHz */
 
2699
                regsym = regsym / 128;          /* 128 = 2**7 */
 
2700
                regsym *= 125 ;                 /* 125 = 1000/2**3*/
 
2701
                regsym /= 1024 ;                /* 256 = 2**10*/
 
2702
        } else if (regsym < 536870912) {        /* 536870912L = 2**29*/
 
2703
                regsym = regsym * 8;            /* 8 = 2**3 */
 
2704
                regsym = regsym / 32768;        /* 32768L = 2**15 */
 
2705
                regsym = adp_khz * regsym;      /* AdpClk in kHz */
 
2706
                regsym = regsym / 128;          /* 128 = 2**7 */
 
2707
                regsym *= 125 ;                 /* 125 = 1000/2**3 */
 
2708
                regsym /= 512 ;                 /* 128 = 2**9 */
 
2709
        } else {
 
2710
                regsym = regsym * 4;            /* 4 = 2**2 */
 
2711
                regsym = regsym / 32768;        /* 32768L = 2**15 */
 
2712
                regsym = adp_khz * regsym;      /* AdpClk in kHz */
 
2713
                regsym = regsym / 128;          /* 128 = 2**7 */
 
2714
                regsym *= 125 ;                 /* 125 = 1000/2**3 */
 
2715
                regsym /= 256 ;                 /* 64 = 2**8 */
 
2716
        }
 
2717
 
 
2718
        return regsym;
 
2719
}
 
2720
 
 
2721
static int stv0367cab_read_status(struct dvb_frontend *fe, fe_status_t *status)
 
2722
{
 
2723
        struct stv0367_state *state = fe->demodulator_priv;
 
2724
 
 
2725
        dprintk("%s:\n", __func__);
 
2726
 
 
2727
        *status = 0;
 
2728
 
 
2729
        if (stv0367_readbits(state, F367CAB_QAMFEC_LOCK)) {
 
2730
                *status |= FE_HAS_LOCK;
 
2731
                dprintk("%s: stv0367 has locked\n", __func__);
 
2732
        }
 
2733
 
 
2734
        return 0;
 
2735
}
 
2736
 
 
2737
static int stv0367cab_standby(struct dvb_frontend *fe, u8 standby_on)
 
2738
{
 
2739
        struct stv0367_state *state = fe->demodulator_priv;
 
2740
 
 
2741
        dprintk("%s:\n", __func__);
 
2742
 
 
2743
        if (standby_on) {
 
2744
                stv0367_writebits(state, F367CAB_BYPASS_PLLXN, 0x03);
 
2745
                stv0367_writebits(state, F367CAB_STDBY_PLLXN, 0x01);
 
2746
                stv0367_writebits(state, F367CAB_STDBY, 1);
 
2747
                stv0367_writebits(state, F367CAB_STDBY_CORE, 1);
 
2748
                stv0367_writebits(state, F367CAB_EN_BUFFER_I, 0);
 
2749
                stv0367_writebits(state, F367CAB_EN_BUFFER_Q, 0);
 
2750
                stv0367_writebits(state, F367CAB_POFFQ, 1);
 
2751
                stv0367_writebits(state, F367CAB_POFFI, 1);
 
2752
        } else {
 
2753
                stv0367_writebits(state, F367CAB_STDBY_PLLXN, 0x00);
 
2754
                stv0367_writebits(state, F367CAB_BYPASS_PLLXN, 0x00);
 
2755
                stv0367_writebits(state, F367CAB_STDBY, 0);
 
2756
                stv0367_writebits(state, F367CAB_STDBY_CORE, 0);
 
2757
                stv0367_writebits(state, F367CAB_EN_BUFFER_I, 1);
 
2758
                stv0367_writebits(state, F367CAB_EN_BUFFER_Q, 1);
 
2759
                stv0367_writebits(state, F367CAB_POFFQ, 0);
 
2760
                stv0367_writebits(state, F367CAB_POFFI, 0);
 
2761
        }
 
2762
 
 
2763
        return 0;
 
2764
}
 
2765
 
 
2766
static int stv0367cab_sleep(struct dvb_frontend *fe)
 
2767
{
 
2768
        return stv0367cab_standby(fe, 1);
 
2769
}
 
2770
 
 
2771
int stv0367cab_init(struct dvb_frontend *fe)
 
2772
{
 
2773
        struct stv0367_state *state = fe->demodulator_priv;
 
2774
        struct stv0367cab_state *cab_state = state->cab_state;
 
2775
        int i;
 
2776
 
 
2777
        dprintk("%s:\n", __func__);
 
2778
 
 
2779
        for (i = 0; i < STV0367CAB_NBREGS; i++)
 
2780
                stv0367_writereg(state, def0367cab[i].addr,
 
2781
                                                def0367cab[i].value);
 
2782
 
 
2783
        switch (state->config->ts_mode) {
 
2784
        case STV0367_DVBCI_CLOCK:
 
2785
                dprintk("Setting TSMode = STV0367_DVBCI_CLOCK\n");
 
2786
                stv0367_writebits(state, F367CAB_OUTFORMAT, 0x03);
 
2787
                break;
 
2788
        case STV0367_SERIAL_PUNCT_CLOCK:
 
2789
        case STV0367_SERIAL_CONT_CLOCK:
 
2790
                stv0367_writebits(state, F367CAB_OUTFORMAT, 0x01);
 
2791
                break;
 
2792
        case STV0367_PARALLEL_PUNCT_CLOCK:
 
2793
        case STV0367_OUTPUTMODE_DEFAULT:
 
2794
                stv0367_writebits(state, F367CAB_OUTFORMAT, 0x00);
 
2795
                break;
 
2796
        }
 
2797
 
 
2798
        switch (state->config->clk_pol) {
 
2799
        case STV0367_RISINGEDGE_CLOCK:
 
2800
                stv0367_writebits(state, F367CAB_CLK_POLARITY, 0x00);
 
2801
                break;
 
2802
        case STV0367_FALLINGEDGE_CLOCK:
 
2803
        case STV0367_CLOCKPOLARITY_DEFAULT:
 
2804
                stv0367_writebits(state, F367CAB_CLK_POLARITY, 0x01);
 
2805
                break;
 
2806
        }
 
2807
 
 
2808
        stv0367_writebits(state, F367CAB_SYNC_STRIP, 0x00);
 
2809
 
 
2810
        stv0367_writebits(state, F367CAB_CT_NBST, 0x01);
 
2811
 
 
2812
        stv0367_writebits(state, F367CAB_TS_SWAP, 0x01);
 
2813
 
 
2814
        stv0367_writebits(state, F367CAB_FIFO_BYPASS, 0x00);
 
2815
 
 
2816
        stv0367_writereg(state, R367CAB_ANACTRL, 0x00);/*PLL enabled and used */
 
2817
 
 
2818
        cab_state->mclk = stv0367cab_get_mclk(fe, state->config->xtal);
 
2819
        cab_state->adc_clk = stv0367cab_get_adc_freq(fe, state->config->xtal);
 
2820
 
 
2821
        return 0;
 
2822
}
 
2823
static
 
2824
enum stv0367_cab_signal_type stv0367cab_algo(struct stv0367_state *state,
 
2825
                                struct dvb_frontend_parameters *param)
 
2826
{
 
2827
        struct dvb_qam_parameters *op = &param->u.qam;
 
2828
        struct stv0367cab_state *cab_state = state->cab_state;
 
2829
        enum stv0367_cab_signal_type signalType = FE_CAB_NOAGC;
 
2830
        u32     QAMFEC_Lock, QAM_Lock, u32_tmp,
 
2831
                LockTime, TRLTimeOut, AGCTimeOut, CRLSymbols,
 
2832
                CRLTimeOut, EQLTimeOut, DemodTimeOut, FECTimeOut;
 
2833
        u8      TrackAGCAccum;
 
2834
        s32     tmp;
 
2835
 
 
2836
        dprintk("%s:\n", __func__);
 
2837
 
 
2838
        /* Timeouts calculation */
 
2839
        /* A max lock time of 25 ms is allowed for delayed AGC */
 
2840
        AGCTimeOut = 25;
 
2841
        /* 100000 symbols needed by the TRL as a maximum value */
 
2842
        TRLTimeOut = 100000000 / op->symbol_rate;
 
2843
        /* CRLSymbols is the needed number of symbols to achieve a lock
 
2844
           within [-4%, +4%] of the symbol rate.
 
2845
           CRL timeout is calculated
 
2846
           for a lock within [-search_range, +search_range].
 
2847
           EQL timeout can be changed depending on
 
2848
           the micro-reflections we want to handle.
 
2849
           A characterization must be performed
 
2850
           with these echoes to get new timeout values.
 
2851
        */
 
2852
        switch (op->modulation) {
 
2853
        case QAM_16:
 
2854
                CRLSymbols = 150000;
 
2855
                EQLTimeOut = 100;
 
2856
                break;
 
2857
        case QAM_32:
 
2858
                CRLSymbols = 250000;
 
2859
                EQLTimeOut = 100;
 
2860
                break;
 
2861
        case QAM_64:
 
2862
                CRLSymbols = 200000;
 
2863
                EQLTimeOut = 100;
 
2864
                break;
 
2865
        case QAM_128:
 
2866
                CRLSymbols = 250000;
 
2867
                EQLTimeOut = 100;
 
2868
                break;
 
2869
        case QAM_256:
 
2870
                CRLSymbols = 250000;
 
2871
                EQLTimeOut = 100;
 
2872
                break;
 
2873
        default:
 
2874
                CRLSymbols = 200000;
 
2875
                EQLTimeOut = 100;
 
2876
                break;
 
2877
        }
 
2878
#if 0
 
2879
        if (pIntParams->search_range < 0) {
 
2880
                CRLTimeOut = (25 * CRLSymbols *
 
2881
                                (-pIntParams->search_range / 1000)) /
 
2882
                                        (pIntParams->symbol_rate / 1000);
 
2883
        } else
 
2884
#endif
 
2885
        CRLTimeOut = (25 * CRLSymbols * (cab_state->search_range / 1000)) /
 
2886
                                        (op->symbol_rate / 1000);
 
2887
 
 
2888
        CRLTimeOut = (1000 * CRLTimeOut) / op->symbol_rate;
 
2889
        /* Timeouts below 50ms are coerced */
 
2890
        if (CRLTimeOut < 50)
 
2891
                CRLTimeOut = 50;
 
2892
        /* A maximum of 100 TS packets is needed to get FEC lock even in case
 
2893
        the spectrum inversion needs to be changed.
 
2894
           This is equal to 20 ms in case of the lowest symbol rate of 0.87Msps
 
2895
        */
 
2896
        FECTimeOut = 20;
 
2897
        DemodTimeOut = AGCTimeOut + TRLTimeOut + CRLTimeOut + EQLTimeOut;
 
2898
 
 
2899
        dprintk("%s: DemodTimeOut=%d\n", __func__, DemodTimeOut);
 
2900
 
 
2901
        /* Reset the TRL to ensure nothing starts until the
 
2902
           AGC is stable which ensures a better lock time
 
2903
        */
 
2904
        stv0367_writereg(state, R367CAB_CTRL_1, 0x04);
 
2905
        /* Set AGC accumulation time to minimum and lock threshold to maximum
 
2906
        in order to speed up the AGC lock */
 
2907
        TrackAGCAccum = stv0367_readbits(state, F367CAB_AGC_ACCUMRSTSEL);
 
2908
        stv0367_writebits(state, F367CAB_AGC_ACCUMRSTSEL, 0x0);
 
2909
        /* Modulus Mapper is disabled */
 
2910
        stv0367_writebits(state, F367CAB_MODULUSMAP_EN, 0);
 
2911
        /* Disable the sweep function */
 
2912
        stv0367_writebits(state, F367CAB_SWEEP_EN, 0);
 
2913
        /* The sweep function is never used, Sweep rate must be set to 0 */
 
2914
        /* Set the derotator frequency in Hz */
 
2915
        stv0367cab_set_derot_freq(state, cab_state->adc_clk,
 
2916
                (1000 * (s32)state->config->if_khz + cab_state->derot_offset));
 
2917
        /* Disable the Allpass Filter when the symbol rate is out of range */
 
2918
        if ((op->symbol_rate > 10800000) | (op->symbol_rate < 1800000)) {
 
2919
                stv0367_writebits(state, F367CAB_ADJ_EN, 0);
 
2920
                stv0367_writebits(state, F367CAB_ALLPASSFILT_EN, 0);
 
2921
        }
 
2922
#if 0
 
2923
        /* Check if the tuner is locked */
 
2924
        tuner_lock = stv0367cab_tuner_get_status(fe);
 
2925
        if (tuner_lock == 0)
 
2926
                return FE_367CAB_NOTUNER;
 
2927
#endif
 
2928
        /* Relase the TRL to start demodulator acquisition */
 
2929
        /* Wait for QAM lock */
 
2930
        LockTime = 0;
 
2931
        stv0367_writereg(state, R367CAB_CTRL_1, 0x00);
 
2932
        do {
 
2933
                QAM_Lock = stv0367_readbits(state, F367CAB_FSM_STATUS);
 
2934
                if ((LockTime >= (DemodTimeOut - EQLTimeOut)) &&
 
2935
                                                        (QAM_Lock == 0x04))
 
2936
                        /*
 
2937
                         * We don't wait longer, the frequency/phase offset
 
2938
                         * must be too big
 
2939
                         */
 
2940
                        LockTime = DemodTimeOut;
 
2941
                else if ((LockTime >= (AGCTimeOut + TRLTimeOut)) &&
 
2942
                                                        (QAM_Lock == 0x02))
 
2943
                        /*
 
2944
                         * We don't wait longer, either there is no signal or
 
2945
                         * it is not the right symbol rate or it is an analog
 
2946
                         * carrier
 
2947
                         */
 
2948
                {
 
2949
                        LockTime = DemodTimeOut;
 
2950
                        u32_tmp = stv0367_readbits(state,
 
2951
                                                F367CAB_AGC_PWR_WORD_LO) +
 
2952
                                        (stv0367_readbits(state,
 
2953
                                                F367CAB_AGC_PWR_WORD_ME) << 8) +
 
2954
                                        (stv0367_readbits(state,
 
2955
                                                F367CAB_AGC_PWR_WORD_HI) << 16);
 
2956
                        if (u32_tmp >= 131072)
 
2957
                                u32_tmp = 262144 - u32_tmp;
 
2958
                        u32_tmp = u32_tmp / (1 << (11 - stv0367_readbits(state,
 
2959
                                                        F367CAB_AGC_IF_BWSEL)));
 
2960
 
 
2961
                        if (u32_tmp < stv0367_readbits(state,
 
2962
                                                F367CAB_AGC_PWRREF_LO) +
 
2963
                                        256 * stv0367_readbits(state,
 
2964
                                                F367CAB_AGC_PWRREF_HI) - 10)
 
2965
                                QAM_Lock = 0x0f;
 
2966
                } else {
 
2967
                        usleep_range(10000, 20000);
 
2968
                        LockTime += 10;
 
2969
                }
 
2970
                dprintk("QAM_Lock=0x%x LockTime=%d\n", QAM_Lock, LockTime);
 
2971
                tmp = stv0367_readreg(state, R367CAB_IT_STATUS1);
 
2972
 
 
2973
                dprintk("R367CAB_IT_STATUS1=0x%x\n", tmp);
 
2974
 
 
2975
        } while (((QAM_Lock != 0x0c) && (QAM_Lock != 0x0b)) &&
 
2976
                                                (LockTime < DemodTimeOut));
 
2977
 
 
2978
        dprintk("QAM_Lock=0x%x\n", QAM_Lock);
 
2979
 
 
2980
        tmp = stv0367_readreg(state, R367CAB_IT_STATUS1);
 
2981
        dprintk("R367CAB_IT_STATUS1=0x%x\n", tmp);
 
2982
        tmp = stv0367_readreg(state, R367CAB_IT_STATUS2);
 
2983
        dprintk("R367CAB_IT_STATUS2=0x%x\n", tmp);
 
2984
 
 
2985
        tmp  = stv0367cab_get_derot_freq(state, cab_state->adc_clk);
 
2986
        dprintk("stv0367cab_get_derot_freq=0x%x\n", tmp);
 
2987
 
 
2988
        if ((QAM_Lock == 0x0c) || (QAM_Lock == 0x0b)) {
 
2989
                /* Wait for FEC lock */
 
2990
                LockTime = 0;
 
2991
                do {
 
2992
                        usleep_range(5000, 7000);
 
2993
                        LockTime += 5;
 
2994
                        QAMFEC_Lock = stv0367_readbits(state,
 
2995
                                                        F367CAB_QAMFEC_LOCK);
 
2996
                } while (!QAMFEC_Lock && (LockTime < FECTimeOut));
 
2997
        } else
 
2998
                QAMFEC_Lock = 0;
 
2999
 
 
3000
        if (QAMFEC_Lock) {
 
3001
                signalType = FE_CAB_DATAOK;
 
3002
                cab_state->modulation = op->modulation;
 
3003
                cab_state->spect_inv = stv0367_readbits(state,
 
3004
                                                        F367CAB_QUAD_INV);
 
3005
#if 0
 
3006
/* not clear for me */
 
3007
                if (state->config->if_khz != 0) {
 
3008
                        if (state->config->if_khz > cab_state->adc_clk / 1000) {
 
3009
                                cab_state->freq_khz =
 
3010
                                        FE_Cab_TunerGetFrequency(pIntParams->hTuner)
 
3011
                                - stv0367cab_get_derot_freq(state, cab_state->adc_clk)
 
3012
                                - cab_state->adc_clk / 1000 + state->config->if_khz;
 
3013
                        } else {
 
3014
                                cab_state->freq_khz =
 
3015
                                                FE_Cab_TunerGetFrequency(pIntParams->hTuner)
 
3016
                                                - stv0367cab_get_derot_freq(state, cab_state->adc_clk)
 
3017
                                                                                + state->config->if_khz;
 
3018
                        }
 
3019
                } else {
 
3020
                        cab_state->freq_khz =
 
3021
                                FE_Cab_TunerGetFrequency(pIntParams->hTuner) +
 
3022
                                stv0367cab_get_derot_freq(state,
 
3023
                                                        cab_state->adc_clk) -
 
3024
                                cab_state->adc_clk / 4000;
 
3025
                }
 
3026
#endif
 
3027
                cab_state->symbol_rate = stv0367cab_GetSymbolRate(state,
 
3028
                                                        cab_state->mclk);
 
3029
                cab_state->locked = 1;
 
3030
 
 
3031
                /* stv0367_setbits(state, F367CAB_AGC_ACCUMRSTSEL,7);*/
 
3032
        } else {
 
3033
                switch (QAM_Lock) {
 
3034
                case 1:
 
3035
                        signalType = FE_CAB_NOAGC;
 
3036
                        break;
 
3037
                case 2:
 
3038
                        signalType = FE_CAB_NOTIMING;
 
3039
                        break;
 
3040
                case 3:
 
3041
                        signalType = FE_CAB_TIMINGOK;
 
3042
                        break;
 
3043
                case 4:
 
3044
                        signalType = FE_CAB_NOCARRIER;
 
3045
                        break;
 
3046
                case 5:
 
3047
                        signalType = FE_CAB_CARRIEROK;
 
3048
                        break;
 
3049
                case 7:
 
3050
                        signalType = FE_CAB_NOBLIND;
 
3051
                        break;
 
3052
                case 8:
 
3053
                        signalType = FE_CAB_BLINDOK;
 
3054
                        break;
 
3055
                case 10:
 
3056
                        signalType = FE_CAB_NODEMOD;
 
3057
                        break;
 
3058
                case 11:
 
3059
                        signalType = FE_CAB_DEMODOK;
 
3060
                        break;
 
3061
                case 12:
 
3062
                        signalType = FE_CAB_DEMODOK;
 
3063
                        break;
 
3064
                case 13:
 
3065
                        signalType = FE_CAB_NODEMOD;
 
3066
                        break;
 
3067
                case 14:
 
3068
                        signalType = FE_CAB_NOBLIND;
 
3069
                        break;
 
3070
                case 15:
 
3071
                        signalType = FE_CAB_NOSIGNAL;
 
3072
                        break;
 
3073
                default:
 
3074
                        break;
 
3075
                }
 
3076
 
 
3077
        }
 
3078
 
 
3079
        /* Set the AGC control values to tracking values */
 
3080
        stv0367_writebits(state, F367CAB_AGC_ACCUMRSTSEL, TrackAGCAccum);
 
3081
        return signalType;
 
3082
}
 
3083
 
 
3084
static int stv0367cab_set_frontend(struct dvb_frontend *fe,
 
3085
                                struct dvb_frontend_parameters *param)
 
3086
{
 
3087
        struct stv0367_state *state = fe->demodulator_priv;
 
3088
        struct stv0367cab_state *cab_state = state->cab_state;
 
3089
        struct dvb_qam_parameters *op = &param->u.qam;
 
3090
        enum stv0367cab_mod QAMSize = 0;
 
3091
 
 
3092
        dprintk("%s: freq = %d, srate = %d\n", __func__,
 
3093
                                        param->frequency, op->symbol_rate);
 
3094
 
 
3095
        cab_state->derot_offset = 0;
 
3096
 
 
3097
        switch (op->modulation) {
 
3098
        case QAM_16:
 
3099
                QAMSize = FE_CAB_MOD_QAM16;
 
3100
                break;
 
3101
        case QAM_32:
 
3102
                QAMSize = FE_CAB_MOD_QAM32;
 
3103
                break;
 
3104
        case QAM_64:
 
3105
                QAMSize = FE_CAB_MOD_QAM64;
 
3106
                break;
 
3107
        case QAM_128:
 
3108
                QAMSize = FE_CAB_MOD_QAM128;
 
3109
                break;
 
3110
        case QAM_256:
 
3111
                QAMSize = FE_CAB_MOD_QAM256;
 
3112
                break;
 
3113
        default:
 
3114
                break;
 
3115
        }
 
3116
 
 
3117
        stv0367cab_init(fe);
 
3118
 
 
3119
        /* Tuner Frequency Setting */
 
3120
        if (fe->ops.tuner_ops.set_params) {
 
3121
                if (fe->ops.i2c_gate_ctrl)
 
3122
                        fe->ops.i2c_gate_ctrl(fe, 1);
 
3123
                fe->ops.tuner_ops.set_params(fe, param);
 
3124
                if (fe->ops.i2c_gate_ctrl)
 
3125
                        fe->ops.i2c_gate_ctrl(fe, 0);
 
3126
        }
 
3127
 
 
3128
        stv0367cab_SetQamSize(
 
3129
                        state,
 
3130
                        op->symbol_rate,
 
3131
                        QAMSize);
 
3132
 
 
3133
        stv0367cab_set_srate(state,
 
3134
                        cab_state->adc_clk,
 
3135
                        cab_state->mclk,
 
3136
                        op->symbol_rate,
 
3137
                        QAMSize);
 
3138
        /* Search algorithm launch, [-1.1*RangeOffset, +1.1*RangeOffset] scan */
 
3139
        cab_state->state = stv0367cab_algo(state, param);
 
3140
        return 0;
 
3141
}
 
3142
 
 
3143
static int stv0367cab_get_frontend(struct dvb_frontend *fe,
 
3144
                                  struct dvb_frontend_parameters *param)
 
3145
{
 
3146
        struct stv0367_state *state = fe->demodulator_priv;
 
3147
        struct stv0367cab_state *cab_state = state->cab_state;
 
3148
        struct dvb_qam_parameters *op = &param->u.qam;
 
3149
 
 
3150
        enum stv0367cab_mod QAMSize;
 
3151
 
 
3152
        dprintk("%s:\n", __func__);
 
3153
 
 
3154
        op->symbol_rate = stv0367cab_GetSymbolRate(state, cab_state->mclk);
 
3155
 
 
3156
        QAMSize = stv0367_readbits(state, F367CAB_QAM_MODE);
 
3157
        switch (QAMSize) {
 
3158
        case FE_CAB_MOD_QAM16:
 
3159
                op->modulation = QAM_16;
 
3160
                break;
 
3161
        case FE_CAB_MOD_QAM32:
 
3162
                op->modulation = QAM_32;
 
3163
                break;
 
3164
        case FE_CAB_MOD_QAM64:
 
3165
                op->modulation = QAM_64;
 
3166
                break;
 
3167
        case FE_CAB_MOD_QAM128:
 
3168
                op->modulation = QAM_128;
 
3169
                break;
 
3170
        case QAM_256:
 
3171
                op->modulation = QAM_256;
 
3172
                break;
 
3173
        default:
 
3174
                break;
 
3175
        }
 
3176
 
 
3177
        param->frequency = stv0367_get_tuner_freq(fe);
 
3178
 
 
3179
        dprintk("%s: tuner frequency = %d\n", __func__, param->frequency);
 
3180
 
 
3181
        if (state->config->if_khz == 0) {
 
3182
                param->frequency +=
 
3183
                        (stv0367cab_get_derot_freq(state, cab_state->adc_clk) -
 
3184
                        cab_state->adc_clk / 4000);
 
3185
                return 0;
 
3186
        }
 
3187
 
 
3188
        if (state->config->if_khz > cab_state->adc_clk / 1000)
 
3189
                param->frequency += (state->config->if_khz
 
3190
                        - stv0367cab_get_derot_freq(state, cab_state->adc_clk)
 
3191
                        - cab_state->adc_clk / 1000);
 
3192
        else
 
3193
                param->frequency += (state->config->if_khz
 
3194
                        - stv0367cab_get_derot_freq(state, cab_state->adc_clk));
 
3195
 
 
3196
        return 0;
 
3197
}
 
3198
 
 
3199
#if 0
 
3200
void stv0367cab_GetErrorCount(state, enum stv0367cab_mod QAMSize,
 
3201
                        u32 symbol_rate, FE_367qam_Monitor *Monitor_results)
 
3202
{
 
3203
        stv0367cab_OptimiseNByteAndGetBER(state, QAMSize, symbol_rate, Monitor_results);
 
3204
        stv0367cab_GetPacketsCount(state, Monitor_results);
 
3205
 
 
3206
        return;
 
3207
}
 
3208
 
 
3209
static int stv0367cab_read_ber(struct dvb_frontend *fe, u32 *ber)
 
3210
{
 
3211
        struct stv0367_state *state = fe->demodulator_priv;
 
3212
 
 
3213
        return 0;
 
3214
}
 
3215
#endif
 
3216
static s32 stv0367cab_get_rf_lvl(struct stv0367_state *state)
 
3217
{
 
3218
        s32 rfLevel = 0;
 
3219
        s32 RfAgcPwm = 0, IfAgcPwm = 0;
 
3220
        u8 i;
 
3221
 
 
3222
        stv0367_writebits(state, F367CAB_STDBY_ADCGP, 0x0);
 
3223
 
 
3224
        RfAgcPwm =
 
3225
                (stv0367_readbits(state, F367CAB_RF_AGC1_LEVEL_LO) & 0x03) +
 
3226
                (stv0367_readbits(state, F367CAB_RF_AGC1_LEVEL_HI) << 2);
 
3227
        RfAgcPwm = 100 * RfAgcPwm / 1023;
 
3228
 
 
3229
        IfAgcPwm =
 
3230
                stv0367_readbits(state, F367CAB_AGC_IF_PWMCMD_LO) +
 
3231
                (stv0367_readbits(state, F367CAB_AGC_IF_PWMCMD_HI) << 8);
 
3232
        if (IfAgcPwm >= 2048)
 
3233
                IfAgcPwm -= 2048;
 
3234
        else
 
3235
                IfAgcPwm += 2048;
 
3236
 
 
3237
        IfAgcPwm = 100 * IfAgcPwm / 4095;
 
3238
 
 
3239
        /* For DTT75467 on NIM */
 
3240
        if (RfAgcPwm < 90  && IfAgcPwm < 28) {
 
3241
                for (i = 0; i < RF_LOOKUP_TABLE_SIZE; i++) {
 
3242
                        if (RfAgcPwm <= stv0367cab_RF_LookUp1[0][i]) {
 
3243
                                rfLevel = (-1) * stv0367cab_RF_LookUp1[1][i];
 
3244
                                break;
 
3245
                        }
 
3246
                }
 
3247
                if (i == RF_LOOKUP_TABLE_SIZE)
 
3248
                        rfLevel = -56;
 
3249
        } else { /*if IF AGC>10*/
 
3250
                for (i = 0; i < RF_LOOKUP_TABLE2_SIZE; i++) {
 
3251
                        if (IfAgcPwm <= stv0367cab_RF_LookUp2[0][i]) {
 
3252
                                rfLevel = (-1) * stv0367cab_RF_LookUp2[1][i];
 
3253
                                break;
 
3254
                        }
 
3255
                }
 
3256
                if (i == RF_LOOKUP_TABLE2_SIZE)
 
3257
                        rfLevel = -72;
 
3258
        }
 
3259
        return rfLevel;
 
3260
}
 
3261
 
 
3262
static int stv0367cab_read_strength(struct dvb_frontend *fe, u16 *strength)
 
3263
{
 
3264
        struct stv0367_state *state = fe->demodulator_priv;
 
3265
 
 
3266
        s32 signal =  stv0367cab_get_rf_lvl(state);
 
3267
 
 
3268
        dprintk("%s: signal=%d dBm\n", __func__, signal);
 
3269
 
 
3270
        if (signal <= -72)
 
3271
                *strength = 65535;
 
3272
        else
 
3273
                *strength = (22 + signal) * (-1311);
 
3274
 
 
3275
        dprintk("%s: strength=%d\n", __func__, (*strength));
 
3276
 
 
3277
        return 0;
 
3278
}
 
3279
 
 
3280
static int stv0367cab_read_snr(struct dvb_frontend *fe, u16 *snr)
 
3281
{
 
3282
        struct stv0367_state *state = fe->demodulator_priv;
 
3283
        u32 noisepercentage;
 
3284
        enum stv0367cab_mod QAMSize;
 
3285
        u32 regval = 0, temp = 0;
 
3286
        int power, i;
 
3287
 
 
3288
        QAMSize = stv0367_readbits(state, F367CAB_QAM_MODE);
 
3289
        switch (QAMSize) {
 
3290
        case FE_CAB_MOD_QAM4:
 
3291
                power = 21904;
 
3292
                break;
 
3293
        case FE_CAB_MOD_QAM16:
 
3294
                power = 20480;
 
3295
                break;
 
3296
        case FE_CAB_MOD_QAM32:
 
3297
                power = 23040;
 
3298
                break;
 
3299
        case FE_CAB_MOD_QAM64:
 
3300
                power = 21504;
 
3301
                break;
 
3302
        case FE_CAB_MOD_QAM128:
 
3303
                power = 23616;
 
3304
                break;
 
3305
        case FE_CAB_MOD_QAM256:
 
3306
                power = 21760;
 
3307
                break;
 
3308
        case FE_CAB_MOD_QAM512:
 
3309
                power = 1;
 
3310
                break;
 
3311
        case FE_CAB_MOD_QAM1024:
 
3312
                power = 21280;
 
3313
                break;
 
3314
        default:
 
3315
                power = 1;
 
3316
                break;
 
3317
        }
 
3318
 
 
3319
        for (i = 0; i < 10; i++) {
 
3320
                regval += (stv0367_readbits(state, F367CAB_SNR_LO)
 
3321
                        + 256 * stv0367_readbits(state, F367CAB_SNR_HI));
 
3322
        }
 
3323
 
 
3324
        regval /= 10; /*for average over 10 times in for loop above*/
 
3325
        if (regval != 0) {
 
3326
                temp = power
 
3327
                        * (1 << (3 + stv0367_readbits(state, F367CAB_SNR_PER)));
 
3328
                temp /= regval;
 
3329
        }
 
3330
 
 
3331
        /* table values, not needed to calculate logarithms */
 
3332
        if (temp >= 5012)
 
3333
                noisepercentage = 100;
 
3334
        else if (temp >= 3981)
 
3335
                noisepercentage = 93;
 
3336
        else if (temp >= 3162)
 
3337
                noisepercentage = 86;
 
3338
        else if (temp >= 2512)
 
3339
                noisepercentage = 79;
 
3340
        else if (temp >= 1995)
 
3341
                noisepercentage = 72;
 
3342
        else if (temp >= 1585)
 
3343
                noisepercentage = 65;
 
3344
        else if (temp >= 1259)
 
3345
                noisepercentage = 58;
 
3346
        else if (temp >= 1000)
 
3347
                noisepercentage = 50;
 
3348
        else if (temp >= 794)
 
3349
                noisepercentage = 43;
 
3350
        else if (temp >= 501)
 
3351
                noisepercentage = 36;
 
3352
        else if (temp >= 316)
 
3353
                noisepercentage = 29;
 
3354
        else if (temp >= 200)
 
3355
                noisepercentage = 22;
 
3356
        else if (temp >= 158)
 
3357
                noisepercentage = 14;
 
3358
        else if (temp >= 126)
 
3359
                noisepercentage = 7;
 
3360
        else
 
3361
                noisepercentage = 0;
 
3362
 
 
3363
        dprintk("%s: noisepercentage=%d\n", __func__, noisepercentage);
 
3364
 
 
3365
        *snr = (noisepercentage * 65535) / 100;
 
3366
 
 
3367
        return 0;
 
3368
}
 
3369
 
 
3370
static int stv0367cab_read_ucblcks(struct dvb_frontend *fe, u32 *ucblocks)
 
3371
{
 
3372
        struct stv0367_state *state = fe->demodulator_priv;
 
3373
        int corrected, tscount;
 
3374
 
 
3375
        *ucblocks = (stv0367_readreg(state, R367CAB_RS_COUNTER_5) << 8)
 
3376
                        | stv0367_readreg(state, R367CAB_RS_COUNTER_4);
 
3377
        corrected = (stv0367_readreg(state, R367CAB_RS_COUNTER_3) << 8)
 
3378
                        | stv0367_readreg(state, R367CAB_RS_COUNTER_2);
 
3379
        tscount = (stv0367_readreg(state, R367CAB_RS_COUNTER_2) << 8)
 
3380
                        | stv0367_readreg(state, R367CAB_RS_COUNTER_1);
 
3381
 
 
3382
        dprintk("%s: uncorrected blocks=%d corrected blocks=%d tscount=%d\n",
 
3383
                                __func__, *ucblocks, corrected, tscount);
 
3384
 
 
3385
        return 0;
 
3386
};
 
3387
 
 
3388
static struct dvb_frontend_ops stv0367cab_ops = {
 
3389
        .info = {
 
3390
                .name = "ST STV0367 DVB-C",
 
3391
                .type = FE_QAM,
 
3392
                .frequency_min = 47000000,
 
3393
                .frequency_max = 862000000,
 
3394
                .frequency_stepsize = 62500,
 
3395
                .symbol_rate_min = 870000,
 
3396
                .symbol_rate_max = 11700000,
 
3397
                .caps = 0x400 |/* FE_CAN_QAM_4 */
 
3398
                        FE_CAN_QAM_16 | FE_CAN_QAM_32  |
 
3399
                        FE_CAN_QAM_64 | FE_CAN_QAM_128 |
 
3400
                        FE_CAN_QAM_256 | FE_CAN_FEC_AUTO
 
3401
        },
 
3402
        .release                                = stv0367_release,
 
3403
        .init                                   = stv0367cab_init,
 
3404
        .sleep                                  = stv0367cab_sleep,
 
3405
        .i2c_gate_ctrl                          = stv0367cab_gate_ctrl,
 
3406
        .set_frontend                           = stv0367cab_set_frontend,
 
3407
        .get_frontend                           = stv0367cab_get_frontend,
 
3408
        .read_status                            = stv0367cab_read_status,
 
3409
/*      .read_ber                               = stv0367cab_read_ber, */
 
3410
        .read_signal_strength                   = stv0367cab_read_strength,
 
3411
        .read_snr                               = stv0367cab_read_snr,
 
3412
        .read_ucblocks                          = stv0367cab_read_ucblcks,
 
3413
        .get_tune_settings                      = stv0367_get_tune_settings,
 
3414
};
 
3415
 
 
3416
struct dvb_frontend *stv0367cab_attach(const struct stv0367_config *config,
 
3417
                                   struct i2c_adapter *i2c)
 
3418
{
 
3419
        struct stv0367_state *state = NULL;
 
3420
        struct stv0367cab_state *cab_state = NULL;
 
3421
 
 
3422
        /* allocate memory for the internal state */
 
3423
        state = kzalloc(sizeof(struct stv0367_state), GFP_KERNEL);
 
3424
        if (state == NULL)
 
3425
                goto error;
 
3426
        cab_state = kzalloc(sizeof(struct stv0367cab_state), GFP_KERNEL);
 
3427
        if (cab_state == NULL)
 
3428
                goto error;
 
3429
 
 
3430
        /* setup the state */
 
3431
        state->i2c = i2c;
 
3432
        state->config = config;
 
3433
        cab_state->search_range = 280000;
 
3434
        state->cab_state = cab_state;
 
3435
        state->fe.ops = stv0367cab_ops;
 
3436
        state->fe.demodulator_priv = state;
 
3437
        state->chip_id = stv0367_readreg(state, 0xf000);
 
3438
 
 
3439
        dprintk("%s: chip_id = 0x%x\n", __func__, state->chip_id);
 
3440
 
 
3441
        /* check if the demod is there */
 
3442
        if ((state->chip_id != 0x50) && (state->chip_id != 0x60))
 
3443
                goto error;
 
3444
 
 
3445
        return &state->fe;
 
3446
 
 
3447
error:
 
3448
        kfree(cab_state);
 
3449
        kfree(state);
 
3450
        return NULL;
 
3451
}
 
3452
EXPORT_SYMBOL(stv0367cab_attach);
 
3453
 
 
3454
MODULE_PARM_DESC(debug, "Set debug");
 
3455
MODULE_PARM_DESC(i2c_debug, "Set i2c debug");
 
3456
 
 
3457
MODULE_AUTHOR("Igor M. Liplianin");
 
3458
MODULE_DESCRIPTION("ST STV0367 DVB-C/T demodulator driver");
 
3459
MODULE_LICENSE("GPL");